/*
* 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.
*/
/*
* DataGeneratorPanel.java
* Copyright (C) 2005 University of Waikato, Hamilton, New Zealand
*
*/
package weka.gui.explorer;
import weka.core.Instances;
import weka.core.OptionHandler;
import weka.core.Utils;
import weka.datagenerators.DataGenerator;
import weka.gui.GenericObjectEditor;
import weka.gui.Logger;
import weka.gui.PropertyPanel;
import weka.gui.SysErrLog;
import java.awt.BorderLayout;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
* A panel for generating artificial data via DataGenerators.
*
* @author FracPete (fracpete at waikato dot ac dot nz)
* @version $Revision: 1.4 $
*/
public class DataGeneratorPanel
extends JPanel {
/** for serialization */
private static final long serialVersionUID = -2520408165350629380L;
/** the GOE for the generators */
protected GenericObjectEditor m_GeneratorEditor = new GenericObjectEditor();
/** the generated Instances */
protected Instances m_Instances = null;
/** the generated output (as text) */
protected StringWriter m_Output = new StringWriter();
/** The destination for log/status messages */
protected Logger m_Log = new SysErrLog();
/** register the classes */
static {
GenericObjectEditor.registerEditors();
}
/**
* creates the panel
*/
public DataGeneratorPanel() {
setLayout(new BorderLayout());
add(new PropertyPanel(m_GeneratorEditor), BorderLayout.CENTER);
// editor
m_GeneratorEditor.setClassType(DataGenerator.class);
m_GeneratorEditor.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent e) {
repaint();
}
});
// set default generator
setGenerator(null);
}
/**
* Sets the Logger to receive informational messages
*
* @param value the Logger that will now get info messages
*/
public void setLog(Logger value) {
m_Log = value;
}
/**
* returns the generated instances, null if the process was cancelled.
*
* @return the generated Instances
*/
public Instances getInstances() {
return m_Instances;
}
/**
* returns the generated output as text
*
* @return the generated output
*/
public String getOutput() {
return m_Output.toString();
}
/**
* sets the generator to use initially
*
* @param value the data generator to use
*/
public void setGenerator(DataGenerator value) {
if (value != null)
m_GeneratorEditor.setValue(value);
else
m_GeneratorEditor.setValue(
new weka.datagenerators.classifiers.classification.RDG1());
}
/**
* returns the currently selected DataGenerator
*
* @return the current data generator
*/
public DataGenerator getGenerator() {
return (DataGenerator) m_GeneratorEditor.getValue();
}
/**
* generates the instances, returns TRUE if successful
*
* @return TRUE if successful
* @see #getInstances()
*/
public boolean execute() {
DataGenerator generator;
boolean result;
String relName;
String cname;
String cmd;
result = true;
generator = (DataGenerator) m_GeneratorEditor.getValue();
relName = generator.getRelationName();
cname = generator.getClass().getName().replaceAll(".*\\.", "");
cmd = generator.getClass().getName();
if (generator instanceof OptionHandler)
cmd += " " + Utils.joinOptions(((OptionHandler) generator).getOptions());
try {
m_Log.logMessage("Started " + cname);
m_Log.logMessage("Command: " + cmd);
m_Output = new StringWriter();
generator.setOutput(new PrintWriter(m_Output));
DataGenerator.makeData(generator, generator.getOptions());
m_Instances = new Instances(new StringReader(getOutput()));
m_Log.logMessage("Finished " + cname);
}
catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(
this, "Error generating data:\n" + e.getMessage(),
"Error", JOptionPane.ERROR_MESSAGE);
m_Instances = null;
m_Output = new StringWriter();
result = false;
}
generator.setRelationName(relName);
return result;
}
}