content: /*
   *    This program is free software; you can redistribute it and/or modify
   *    it under the terms of the GNU General Public License as published by
   *    the Free Software Foundation; either version 2 of the License, or
   *    (at your option) any later version.
   *
   *    This program is distributed in the hope that it will be useful,
   *    but WITHOUT ANY WARRANTY; without even the implied warranty of
   *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *    GNU General Public License for more details.
   *
   *    You should have received a copy of the GNU General Public License
   *    along with this program; if not, write to the Free Software
   *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */
  
  /*
   *    TestSetMaker.java
   *    Copyright (C) 2002 University of Waikato, Hamilton, New Zealand
   *
   */
  
  package weka.gui.beans;
  
  import java.io.Serializable;
  import java.util.Vector;
  
  import weka.core.Instances;
  
  /**
   * Bean that accepts data sets and produces test sets
   *
   * @author <a href="mailto:mhall@cs.waikato.ac.nz">Mark Hall</a>
   * @version $Revision: 7329 $
   */
  public class TestSetMaker
    extends AbstractTestSetProducer 
    implements DataSourceListener, EventConstraints, Serializable, StructureProducer {
  
    /** for serialization */
    private static final long serialVersionUID = -8473882857628061841L;
  
    protected boolean m_receivedStopNotification = false;
    
    /**
     * Get the structure of the output encapsulated in the named
     * event. If the structure can't be determined in advance of
     * seeing input, or this StructureProducer does not generate
     * the named event, null should be returned.
     * 
     * @param eventName the name of the output event that encapsulates
     * the requested output.
     * 
     * @return the structure of the output encapsulated in the named
     * event or null if it can't be determined in advance of seeing input
     * or the named event is not generated by this StructureProduce.
     */
    public Instances getStructure(String eventName) {
      if (!eventName.equals("dataSet")) {
        return null;
      }
      if (m_listenee == null) {
        return null;      
      }
      if (m_listenee != null && m_listenee instanceof StructureProducer) {
        return ((StructureProducer)m_listenee).getStructure("dataSet");
      }
      return null;
    }
  
    public TestSetMaker() {
       m_visual.loadIcons(BeanVisual.ICON_PATH
  		       +"TestSetMaker.gif",
  		       BeanVisual.ICON_PATH
  		       +"TestSetMaker_animated.gif");
      m_visual.setText("TestSetMaker");
    }
  
    /**
     * Set a custom (descriptive) name for this bean
     * 
     * @param name the name to use
     */
    public void setCustomName(String name) {
      m_visual.setText(name);
    }
  
    /**
     * Get the custom (descriptive) name for this bean (if one has been set)
     * 
     * @return the custom name (or the default name)
     */
    public String getCustomName() {
      return m_visual.getText();
    }
  
    /**
     * Global info for this bean
     *
     * @return a <code>String</code> value
     */
    public String globalInfo() {
      return "Designate an incoming data set as a test set.";
    }
  
    /**
     * Accepts and processes a data set event
     *
     * @param e a <code>DataSetEvent</code> value
     */
    public void acceptDataSet(DataSetEvent e) {
      m_receivedStopNotification = false;
      TestSetEvent tse = new TestSetEvent(this, e.getDataSet());
      tse.m_setNumber = 1;
      tse.m_maxSetNumber = 1;
      notifyTestSetProduced(tse);
    }
  
    /**
     * Tells all listeners that a test set is available
     *
     * @param tse a <code>TestSetEvent</code> value
     */
    protected void notifyTestSetProduced(TestSetEvent tse) {
      Vector l;
      synchronized (this) {
        l = (Vector)m_listeners.clone();
      }
      if (l.size() > 0) {
        for(int i = 0; i < l.size(); i++) {
          if (m_receivedStopNotification) {
            if (m_logger != null) {
              m_logger.logMessage("[TestSetMaker] "
                  + statusMessagePrefix() + " stopping.");
              m_logger.statusMessage(statusMessagePrefix()
                  + "INTERRUPTED");
            }
            m_receivedStopNotification = false;
            break;
          }
  	((TestSetListener)l.elementAt(i)).acceptTestSet(tse);
        }
      }
    }
  
    public void stop() {
      // do something
      m_receivedStopNotification = true;
  
      // tell the listenee (upstream bean) to stop
      if (m_listenee instanceof BeanCommon) {
        ((BeanCommon)m_listenee).stop();
      }
    }
    
    /**
     * Returns true if. at this time, the bean is busy with some
     * (i.e. perhaps a worker thread is performing some calculation).
     * 
     * @return true if the bean is busy.
     */
    public boolean isBusy() {
      return false;
    }
  
    /**
     * Returns true, if at the current time, the named event could
     * be generated. Assumes that supplied event names are names of
     * events that could be generated by this bean.
     *
     * @param eventName the name of the event in question
     * @return true if the named event could be generated at this point in
     * time
     */
    public boolean eventGeneratable(String eventName) {
      if (m_listenee == null) {
        return false;
      }
  
      if (m_listenee instanceof EventConstraints) {
        if (!((EventConstraints)m_listenee).eventGeneratable("dataSet")) {
  	return false;
        }
      }
      return true;
    }
    
    private String statusMessagePrefix() {
      return getCustomName() + "$" + hashCode() + "|";
    }
  }
  