mev-4.0.01/source/org/tigr/microarray/mev/script/ScriptManager.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2004, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4  */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * ScriptManager.java
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created on February 28, 2004, 12:16 AM
2 26 Feb 07 jari 9  */
2 26 Feb 07 jari 10
2 26 Feb 07 jari 11 package org.tigr.microarray.mev.script;
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 import java.awt.Frame;
2 26 Feb 07 jari 14 import java.awt.Insets;
2 26 Feb 07 jari 15 import java.io.BufferedWriter;
2 26 Feb 07 jari 16 import java.io.File;
2 26 Feb 07 jari 17 import java.io.FileWriter;
2 26 Feb 07 jari 18 import java.io.IOException;
2 26 Feb 07 jari 19 import java.io.Serializable;
2 26 Feb 07 jari 20 import java.util.Enumeration;
2 26 Feb 07 jari 21 import java.util.Hashtable;
2 26 Feb 07 jari 22 import java.util.Vector;
2 26 Feb 07 jari 23
2 26 Feb 07 jari 24 import javax.swing.Action;
2 26 Feb 07 jari 25 import javax.swing.JFileChooser;
2 26 Feb 07 jari 26 import javax.swing.JFrame;
2 26 Feb 07 jari 27 import javax.swing.JOptionPane;
2 26 Feb 07 jari 28 import javax.swing.JTextPane;
2 26 Feb 07 jari 29 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 30
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.DetectionFilter;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.FoldFilter;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.SetDetectionFilterDialog;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.SetFoldFilterDialog;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.SetLowerCutoffsDialog;
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.SetPercentageCutoffsDialog;
2 26 Feb 07 jari 37 import org.tigr.microarray.mev.TMEV;
2 26 Feb 07 jari 38 import org.tigr.microarray.mev.action.ActionManager;
2 26 Feb 07 jari 39 import org.tigr.microarray.mev.cluster.algorithm.Algorithm;
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.gui.LeafInfo;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.Progress;
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.script.scriptGUI.CentroidEntropyRankingInitDialog;
2 26 Feb 07 jari 48 import org.tigr.microarray.mev.script.scriptGUI.DiversityRankingInitDialog;
2 26 Feb 07 jari 49 import org.tigr.microarray.mev.script.scriptGUI.IScriptGUI;
2 26 Feb 07 jari 50 import org.tigr.microarray.mev.script.scriptGUI.ScriptAlgorithmInitDialog;
2 26 Feb 07 jari 51 import org.tigr.microarray.mev.script.scriptGUI.ScriptAttributeDialog;
2 26 Feb 07 jari 52 import org.tigr.microarray.mev.script.scriptGUI.ScriptTable;
2 26 Feb 07 jari 53 import org.tigr.microarray.mev.script.scriptGUI.ScriptTreeViewer;
2 26 Feb 07 jari 54 import org.tigr.microarray.mev.script.scriptGUI.ScriptXMLViewer;
2 26 Feb 07 jari 55 import org.tigr.microarray.mev.script.util.AlgorithmNode;
2 26 Feb 07 jari 56 import org.tigr.microarray.mev.script.util.ErrorLog;
2 26 Feb 07 jari 57 import org.tigr.microarray.mev.script.util.ParameterAttributes;
2 26 Feb 07 jari 58 import org.tigr.microarray.mev.script.util.ParameterValidator;
2 26 Feb 07 jari 59 import org.tigr.microarray.mev.script.util.ScriptConstants;
2 26 Feb 07 jari 60 import org.tigr.microarray.mev.script.util.ScriptNode;
2 26 Feb 07 jari 61 import org.tigr.microarray.mev.script.util.ScriptRunner;
2 26 Feb 07 jari 62 import org.tigr.microarray.mev.script.util.ScriptTree;
2 26 Feb 07 jari 63
2 26 Feb 07 jari 64
2 26 Feb 07 jari 65 /** The ScriptManager class acts as a conduit to facilitate interaction between
2 26 Feb 07 jari 66  * the objects below the script package and the rest of MeV including data structures
2 26 Feb 07 jari 67  * and gui aspects.  The interactions are primarily parameter fetching and script
2 26 Feb 07 jari 68  * execution via classe that interface with <CODE>IScripGUI</CODE> implementaions
2 26 Feb 07 jari 69  * which are algorithms within MeV which implement scripting support as specified in
2 26 Feb 07 jari 70  * the interface.
2 26 Feb 07 jari 71  * @author braisted
2 26 Feb 07 jari 72  */
2 26 Feb 07 jari 73 public class ScriptManager implements Serializable {
2 26 Feb 07 jari 74     public static final long serialVersionUID = 10001020103010001L;
2 26 Feb 07 jari 75     
2 26 Feb 07 jari 76     /** Holds the Mev' ResultTree script mount point.
2 26 Feb 07 jari 77      */
2 26 Feb 07 jari 78     private DefaultMutableTreeNode scriptManagerNode;
2 26 Feb 07 jari 79     /** Mev's <CODE>ActionManager</CODE>. Supports algorithm interactions.
2 26 Feb 07 jari 80      */
2 26 Feb 07 jari 81     private ActionManager actionManager;
2 26 Feb 07 jari 82     /** Contains multiple script objects.
2 26 Feb 07 jari 83      */
2 26 Feb 07 jari 84     private ScriptTable table;
2 26 Feb 07 jari 85     /** Count of current scripts.
2 26 Feb 07 jari 86      */
2 26 Feb 07 jari 87     private int scriptNum;
2 26 Feb 07 jari 88     /** MeV's framework communication conduit.
2 26 Feb 07 jari 89      */
2 26 Feb 07 jari 90     private IFramework framework;
2 26 Feb 07 jari 91     /** Validation support class.
2 26 Feb 07 jari 92      */
2 26 Feb 07 jari 93     private ParameterValidator validator;
2 26 Feb 07 jari 94     /** Progress meter.
2 26 Feb 07 jari 95      */
2 26 Feb 07 jari 96     private Progress progress;
2 26 Feb 07 jari 97     /** Vector data structure of current scripts.
2 26 Feb 07 jari 98      */
2 26 Feb 07 jari 99     private Vector scripts;
2 26 Feb 07 jari 100     
2 26 Feb 07 jari 101     /** Creates a new instance of ScriptManager
2 26 Feb 07 jari 102      * @param framework MeV's main framework object.  This framework is MeV's
2 26 Feb 07 jari 103      * analog to scripting's ScriptManager as it serves as a
2 26 Feb 07 jari 104      * communication conduit.
2 26 Feb 07 jari 105      * @param scriptNode This is the <CODE>DefaultMutableTreeNode</CODE> associated with script activities that will
2 26 Feb 07 jari 106      * exist on the <CODE>ResultTree</CODE> object.  The refer.
2 26 Feb 07 jari 107      *
2 26 Feb 07 jari 108      * @param manager MeV's <CODE>ActionManager</CODE>.  This permits access to MeV's algorithm GUI
2 26 Feb 07 jari 109      * implementations which optionally implement <CODE>IScriptGUI</CODE> to support scripting.
2 26 Feb 07 jari 110      */
2 26 Feb 07 jari 111     public ScriptManager(IFramework framework, DefaultMutableTreeNode scriptNode, ActionManager manager) {
2 26 Feb 07 jari 112         this.framework = framework;
2 26 Feb 07 jari 113         this.actionManager = manager;
2 26 Feb 07 jari 114         this.scriptManagerNode = scriptNode;
2 26 Feb 07 jari 115         scripts = new Vector();
2 26 Feb 07 jari 116         scriptNum = 1;
2 26 Feb 07 jari 117     }
2 26 Feb 07 jari 118     
2 26 Feb 07 jari 119     /** Default Constructor.
2 26 Feb 07 jari 120      */
2 26 Feb 07 jari 121     public ScriptManager() {
2 26 Feb 07 jari 122         
2 26 Feb 07 jari 123     }
2 26 Feb 07 jari 124     
2 26 Feb 07 jari 125     /** Loads a script following File selection.
2 26 Feb 07 jari 126      */
2 26 Feb 07 jari 127     public void loadScript() {
2 26 Feb 07 jari 128         JFileChooser chooser = new JFileChooser(TMEV.getFile("data/scripts/"));
2 26 Feb 07 jari 129         chooser.setMultiSelectionEnabled(false);
2 26 Feb 07 jari 130         boolean loadState;
2 26 Feb 07 jari 131         if( chooser.showOpenDialog(framework.getFrame()) == JFileChooser.APPROVE_OPTION ) {
2 26 Feb 07 jari 132             loadXML(chooser.getSelectedFile());
2 26 Feb 07 jari 133         }
2 26 Feb 07 jari 134     }
2 26 Feb 07 jari 135     
2 26 Feb 07 jari 136     
2 26 Feb 07 jari 137     /** Loads the XML script specified by File object.
2 26 Feb 07 jari 138      * Note that real-time validation occurs on loading the script.
2 26 Feb 07 jari 139      * @param file XML file object.
2 26 Feb 07 jari 140      */
2 26 Feb 07 jari 141     public void loadXML(File file) {
2 26 Feb 07 jari 142         Thread thread = new Thread(new ThreadHandler(file));
2 26 Feb 07 jari 143         thread.setPriority(Thread.MIN_PRIORITY);
2 26 Feb 07 jari 144         this.progress = new Progress(framework.getFrame(), "Script Loading and Validation", null);
2 26 Feb 07 jari 145         this.progress.show();
2 26 Feb 07 jari 146         thread.start();
2 26 Feb 07 jari 147     }
2 26 Feb 07 jari 148     
2 26 Feb 07 jari 149     
2 26 Feb 07 jari 150     
2 26 Feb 07 jari 151     /** Internal class to handle thread for script loading.
2 26 Feb 07 jari 152      */
2 26 Feb 07 jari 153     public class ThreadHandler implements Runnable {
2 26 Feb 07 jari 154         private final File file;
2 26 Feb 07 jari 155         public ThreadHandler(File f) {
2 26 Feb 07 jari 156             file = f;
2 26 Feb 07 jari 157         }
2 26 Feb 07 jari 158         public void run() {
2 26 Feb 07 jari 159             loadScript(file);
2 26 Feb 07 jari 160         }
2 26 Feb 07 jari 161     }
2 26 Feb 07 jari 162     
2 26 Feb 07 jari 163     
2 26 Feb 07 jari 164     /** Supports script loading called from a thread.
2 26 Feb 07 jari 165      * @param inputFile
2 26 Feb 07 jari 166      * @return  */
2 26 Feb 07 jari 167     private boolean loadScript(File inputFile) {
2 26 Feb 07 jari 168         
2 26 Feb 07 jari 169         ScriptDocument newScriptDoc = new ScriptDocument(scriptNum, inputFile.getPath(), this);
2 26 Feb 07 jari 170         ErrorLog errorLog = newScriptDoc.getErrorLog();
2 26 Feb 07 jari 171         boolean validationErrors = false;
2 26 Feb 07 jari 172         
2 26 Feb 07 jari 173         try {
2 26 Feb 07 jari 174             newScriptDoc.loadXMLFile(inputFile, this.progress);
2 26 Feb 07 jari 175             
2 26 Feb 07 jari 176             //if loaded with errors get the error log from the document
2 26 Feb 07 jari 177             if(newScriptDoc.getErrorCount() > 0) {
2 26 Feb 07 jari 178                 if(errorLog.hasErrors() || errorLog.hasFatalErrors()) {
2 26 Feb 07 jari 179                     validationErrors = true;
2 26 Feb 07 jari 180                     progress.dispose();
2 26 Feb 07 jari 181                 }
2 26 Feb 07 jari 182                 errorLog.reportAllListings();
2 26 Feb 07 jari 183             }
2 26 Feb 07 jari 184         } catch (Exception e) {
2 26 Feb 07 jari 185             //catch non parse errors such as IO errors
2 26 Feb 07 jari 186             JOptionPane.showMessageDialog(framework.getFrame(), "Script loading has been aborted due to parse errors.",
2 26 Feb 07 jari 187             "Script Parse Error", JOptionPane.INFORMATION_MESSAGE);
2 26 Feb 07 jari 188             
2 26 Feb 07 jari 189             progress.dispose();
2 26 Feb 07 jari 190             return false;
2 26 Feb 07 jari 191         }
2 26 Feb 07 jari 192         
2 26 Feb 07 jari 193         //Exit if there were validation or fatal errors.
2 26 Feb 07 jari 194         if(validationErrors) {
2 26 Feb 07 jari 195             JOptionPane.showMessageDialog(framework.getFrame(), "Script loading has been aborted.  If the script has been \n"+
2 26 Feb 07 jari 196             "repaired to correct the errors you can attempt to load it again.", "Script Validation Error", JOptionPane.INFORMATION_MESSAGE);
2 26 Feb 07 jari 197             return false;
2 26 Feb 07 jari 198         }
2 26 Feb 07 jari 199         
2 26 Feb 07 jari 200         newScriptDoc.setDocumentFileName(inputFile.getPath());
2 26 Feb 07 jari 201         
2 26 Feb 07 jari 202         if(validator == null) {
2 26 Feb 07 jari 203             //construct a parameter validator
2 26 Feb 07 jari 204             validator = new ParameterValidator();
2 26 Feb 07 jari 205             validator.loadParameterConstraints();
2 26 Feb 07 jari 206         }
2 26 Feb 07 jari 207         
2 26 Feb 07 jari 208         ScriptTree tree = new ScriptTree(newScriptDoc, this);
2 26 Feb 07 jari 209         if(!validateParameters(tree, errorLog)) {
2 26 Feb 07 jari 210             this.progress.dispose();
2 26 Feb 07 jari 211             JOptionPane.showMessageDialog(framework.getFrame(), "Script loading has been aborted.  If the script has been \n"+
2 26 Feb 07 jari 212             "repaired to correct the errors you can attempt to load it again.", "Parmameter Validataion Error", JOptionPane.INFORMATION_MESSAGE);
2 26 Feb 07 jari 213             return false;
2 26 Feb 07 jari 214         }
2 26 Feb 07 jari 215         
2 26 Feb 07 jari 216         //Construct the table if needed
2 26 Feb 07 jari 217         if(table == null) {
2 26 Feb 07 jari 218             table = new ScriptTable(this, scripts);
2 26 Feb 07 jari 219             DefaultMutableTreeNode tableNode = new DefaultMutableTreeNode(new LeafInfo("Script Table", table));
2 26 Feb 07 jari 220             framework.addNode(scriptManagerNode,tableNode);
2 26 Feb 07 jari 221         }
2 26 Feb 07 jari 222         
2 26 Feb 07 jari 223         ScriptTreeViewer treeViewer = new ScriptTreeViewer(tree, this);
2 26 Feb 07 jari 224         ScriptXMLViewer xmlViewer = new ScriptXMLViewer(newScriptDoc, this);
2 26 Feb 07 jari 225         
2 26 Feb 07 jari 226         DefaultMutableTreeNode scriptNode = new DefaultMutableTreeNode(new LeafInfo("Script ("+scriptNum+")"));
2 26 Feb 07 jari 227         DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(new LeafInfo("Script Tree Viewer", treeViewer));
2 26 Feb 07 jari 228         DefaultMutableTreeNode xmlNode = new DefaultMutableTreeNode(new LeafInfo("Script XML Viewer", xmlViewer));
2 26 Feb 07 jari 229         
2 26 Feb 07 jari 230         scriptNode.add(treeNode);
2 26 Feb 07 jari 231         scriptNode.add(xmlNode);
2 26 Feb 07 jari 232         
2 26 Feb 07 jari 233         scripts.add(new Script(newScriptDoc, tree, xmlViewer));
2 26 Feb 07 jari 234         
2 26 Feb 07 jari 235         framework.addNode(scriptManagerNode, scriptNode);
2 26 Feb 07 jari 236         framework.setTreeNode(treeNode);
2 26 Feb 07 jari 237         scriptNum++;
2 26 Feb 07 jari 238         
2 26 Feb 07 jari 239         validator.checkAlgorithmsForDataDependance(tree, this);
2 26 Feb 07 jari 240         
2 26 Feb 07 jari 241         return true;
2 26 Feb 07 jari 242     }
2 26 Feb 07 jari 243     
2 26 Feb 07 jari 244     /** Prompts for a new script object to be created.
2 26 Feb 07 jari 245      * Initialized structures are put in place.
2 26 Feb 07 jari 246      */
2 26 Feb 07 jari 247     public void addNewScript() {
2 26 Feb 07 jari 248         ScriptDocument newScriptDoc;
2 26 Feb 07 jari 249         ScriptAttributeDialog dialog = new ScriptAttributeDialog();
2 26 Feb 07 jari 250         if(dialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 251             newScriptDoc = new ScriptDocument(scriptNum, dialog.getName(), dialog.getFormattedDescription(), dialog.getDate(), this);
2 26 Feb 07 jari 252             
2 26 Feb 07 jari 253             if(table == null) {
2 26 Feb 07 jari 254                 table = new ScriptTable(this, scripts);
2 26 Feb 07 jari 255                 DefaultMutableTreeNode tableNode = new DefaultMutableTreeNode(new LeafInfo("Script Table", table));
2 26 Feb 07 jari 256                 framework.addNode(scriptManagerNode,tableNode);
2 26 Feb 07 jari 257                 
2 26 Feb 07 jari 258                 //construct a parameter validator
2 26 Feb 07 jari 259                 validator = new ParameterValidator();
2 26 Feb 07 jari 260                 validator.loadParameterConstraints();
2 26 Feb 07 jari 261             }
2 26 Feb 07 jari 262             
2 26 Feb 07 jari 263             ScriptTree tree = new ScriptTree(newScriptDoc, this);
2 26 Feb 07 jari 264             ScriptTreeViewer treeViewer = new ScriptTreeViewer(tree, this);
2 26 Feb 07 jari 265             ScriptXMLViewer xmlViewer = new ScriptXMLViewer(newScriptDoc, this);
2 26 Feb 07 jari 266             
2 26 Feb 07 jari 267             DefaultMutableTreeNode scriptNode = new DefaultMutableTreeNode(new LeafInfo("Script ("+scriptNum+")"));
2 26 Feb 07 jari 268             DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(new LeafInfo("Script Tree Viewer", treeViewer));
2 26 Feb 07 jari 269             DefaultMutableTreeNode xmlNode = new DefaultMutableTreeNode(new LeafInfo("Script XML Viewer", xmlViewer));
2 26 Feb 07 jari 270             
2 26 Feb 07 jari 271             scripts.add(new Script(newScriptDoc, tree, xmlViewer));
2 26 Feb 07 jari 272             
2 26 Feb 07 jari 273             scriptNode.add(treeNode);
2 26 Feb 07 jari 274             scriptNode.add(xmlNode);
2 26 Feb 07 jari 275             
2 26 Feb 07 jari 276             framework.addNode(scriptManagerNode, scriptNode);
2 26 Feb 07 jari 277             framework.setTreeNode(treeNode);
2 26 Feb 07 jari 278             
2 26 Feb 07 jari 279             scriptNum++;
2 26 Feb 07 jari 280         }
2 26 Feb 07 jari 281     }
2 26 Feb 07 jari 282     
2 26 Feb 07 jari 283     /** Provides the next Script ID number.
2 26 Feb 07 jari 284      */
2 26 Feb 07 jari 285     public int getNextScriptID() {
2 26 Feb 07 jari 286         scriptNum++;
2 26 Feb 07 jari 287         return scriptNum;
2 26 Feb 07 jari 288     }
2 26 Feb 07 jari 289     
2 26 Feb 07 jari 290     
2 26 Feb 07 jari 291     /** Saves the script to a file to be specified via a prompt.
2 26 Feb 07 jari 292      * @param doc <CODE>ScriptDocument</CODE> to save.
2 26 Feb 07 jari 293      */
2 26 Feb 07 jari 294     public void saveScript(ScriptDocument doc) {
2 26 Feb 07 jari 295         JFileChooser chooser = new JFileChooser(TMEV.getFile("data/scripts/"));
2 26 Feb 07 jari 296         if(chooser.showSaveDialog(new JFrame()) == JFileChooser.APPROVE_OPTION) {
2 26 Feb 07 jari 297             try {
2 26 Feb 07 jari 298                 writeScript(chooser.getSelectedFile(), doc);
2 26 Feb 07 jari 299             } catch (IOException ioe) {
2 26 Feb 07 jari 300                 JOptionPane.showMessageDialog(new JFrame(), "An error occured while saving the script to file", "Save Error", JOptionPane.WARNING_MESSAGE);
2 26 Feb 07 jari 301             }
2 26 Feb 07 jari 302         }
2 26 Feb 07 jari 303     }
2 26 Feb 07 jari 304     
2 26 Feb 07 jari 305     
2 26 Feb 07 jari 306     /** Supports script output to specified File.
2 26 Feb 07 jari 307      * @param file Output file
2 26 Feb 07 jari 308      * @param doc <CODE>ScriptDocument</CODE> to output.
2 26 Feb 07 jari 309      * @throws IOException
2 26 Feb 07 jari 310      */
2 26 Feb 07 jari 311     private void writeScript(File file, ScriptDocument doc) throws IOException {
2 26 Feb 07 jari 312         BufferedWriter bfr = new BufferedWriter( new FileWriter(file));
2 26 Feb 07 jari 313         bfr.write(doc.toString());
2 26 Feb 07 jari 314         bfr.flush();
2 26 Feb 07 jari 315         bfr.close();
2 26 Feb 07 jari 316     }
2 26 Feb 07 jari 317     
2 26 Feb 07 jari 318     
2 26 Feb 07 jari 319     /** Prompts the user to select a new algorithm to add during script
2 26 Feb 07 jari 320      * creation.  Then the method returns the collection of parameters.
2 26 Feb 07 jari 321      * @param parentNodeOutputClass Parent input data class used to restrict options to
2 26 Feb 07 jari 322      * appropriate algorithms.
2 26 Feb 07 jari 323      * @return
2 26 Feb 07 jari 324      */
2 26 Feb 07 jari 325     public AlgorithmData getAlgorithm(String parentNodeOutputClass) {
2 26 Feb 07 jari 326         
2 26 Feb 07 jari 327         AlgorithmData data = null;
2 26 Feb 07 jari 328         
2 26 Feb 07 jari 329         if(this.framework.getData().getFeaturesCount() == 0) {
2 26 Feb 07 jari 330             JTextPane pane = new JTextPane();
2 26 Feb 07 jari 331             pane.setContentType("text/html");
2 26 Feb 07 jari 332             //pane.setBackground(Color.lightGray);
2 26 Feb 07 jari 333             pane.setMargin(new Insets(5,15,15,15));
2 26 Feb 07 jari 334             // pane.setBorder(BorderFactory.createLineBorder(Color.black));
2 26 Feb 07 jari 335             String text = "<html><center><h2>Expression Data Unavailable</h2></center><hr size=3>";
2 26 Feb 07 jari 336             text += "<center>Expression data has not been loaded.  Some algorithms require information about the <br> " +
2 26 Feb 07 jari 337             "number and order of loaded experiments in order to set parameters such as group assignments. <br><br>" +
2 26 Feb 07 jari 338             "<b>Please load data before proceeding with script construction.</b></center></html>";
2 26 Feb 07 jari 339             pane.setText(text);
2 26 Feb 07 jari 340             
2 26 Feb 07 jari 341             JOptionPane.showMessageDialog(framework.getFrame(), pane, "Data Unavailable", JOptionPane.INFORMATION_MESSAGE);
2 26 Feb 07 jari 342             
2 26 Feb 07 jari 343             return null;
2 26 Feb 07 jari 344         }
2 26 Feb 07 jari 345         int dataType = framework.getData().getDataType();
2 26 Feb 07 jari 346         boolean isAffy = false;
2 26 Feb 07 jari 347         if( dataType == IData.DATA_TYPE_AFFY_ABS
2 26 Feb 07 jari 348         || dataType == IData.DATA_TYPE_AFFY_REF
2 26 Feb 07 jari 349         || dataType == IData.DATA_TYPE_AFFY_MEAN
2 26 Feb 07 jari 350         || dataType == IData.DATA_TYPE_AFFY_MEDIAN) {
2 26 Feb 07 jari 351             isAffy = true;
2 26 Feb 07 jari 352         }
2 26 Feb 07 jari 353         
2 26 Feb 07 jari 354         ScriptAlgorithmInitDialog dialog = new ScriptAlgorithmInitDialog(actionManager, parentNodeOutputClass, isAffy);
2 26 Feb 07 jari 355         
2 26 Feb 07 jari 356         if(dialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 357             String algName = dialog.getAlgorithmName();
2 26 Feb 07 jari 358             String algType = dialog.getAlgorithmType();
2 26 Feb 07 jari 359             
2 26 Feb 07 jari 360             
2 26 Feb 07 jari 361             if(algType.equals(ScriptConstants.ALGORITHM_TYPE_CLUSTER)) {
2 26 Feb 07 jari 362                 int algIndex = dialog.getAlgorithmIndex();
2 26 Feb 07 jari 363                 Action action = actionManager.getAction(ActionManager.ANALYSIS_ACTION+String.valueOf(algIndex));
2 26 Feb 07 jari 364                 if(action == null){
2 26 Feb 07 jari 365                     return null;
2 26 Feb 07 jari 366                 }
2 26 Feb 07 jari 367                 String className = (String)action.getValue(ActionManager.PARAMETER);
2 26 Feb 07 jari 368                 try {
2 26 Feb 07 jari 369                     Class clazz = Class.forName(className);
2 26 Feb 07 jari 370                     IScriptGUI gui = (IScriptGUI)clazz.newInstance();
2 26 Feb 07 jari 371                     data = gui.getScriptParameters(framework);
2 26 Feb 07 jari 372                 } catch (Exception e) {
2 26 Feb 07 jari 373                     JOptionPane.showMessageDialog(framework.getFrame(), "Can't retrieve script parameters for the "+algName+ " algorithm", "Script Parameter Error", JOptionPane.WARNING_MESSAGE);
2 26 Feb 07 jari 374                     e.printStackTrace();
2 26 Feb 07 jari 375                 }
2 26 Feb 07 jari 376             } else if(algType.equals(ScriptConstants.ALGORITHM_TYPE_ADJUSTMENT)) {
2 26 Feb 07 jari 377                 
2 26 Feb 07 jari 378                 if(algName.equals("Percentage Cutoff")) {
2 26 Feb 07 jari 379                     SetPercentageCutoffsDialog percDialog = new SetPercentageCutoffsDialog(new JFrame(), 0.0f);
2 26 Feb 07 jari 380                     if(percDialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 381                         data = new AlgorithmData();
2 26 Feb 07 jari 382                         data.addParam("name", algName);
2 26 Feb 07 jari 383                         float percentage = percDialog.getPercentageCutoff();
2 26 Feb 07 jari 384                         data.addParam("percent-cutoff", String.valueOf(percentage));
2 26 Feb 07 jari 385                         setAdjustmentOutput(data);
2 26 Feb 07 jari 386                     }
2 26 Feb 07 jari 387                 } else if(algName.equals("Lower Cutoffs")) {
2 26 Feb 07 jari 388                     SetLowerCutoffsDialog lowerDialog = new SetLowerCutoffsDialog(new JFrame(), 0.0f, 0.0f);
2 26 Feb 07 jari 389                     if(lowerDialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 390                         data = new AlgorithmData();
2 26 Feb 07 jari 391                         data.addParam("name", algName);
2 26 Feb 07 jari 392                         data.addParam("cy3-lower-cutoff", String.valueOf(lowerDialog.getLowerCY3Cutoff()));
2 26 Feb 07 jari 393                         data.addParam("cy5-lower-cutoff", String.valueOf(lowerDialog.getLowerCY5Cutoff()));
2 26 Feb 07 jari 394                         setAdjustmentOutput(data);
2 26 Feb 07 jari 395                     }
2 26 Feb 07 jari 396                 } else if(algName.equals("Detection Filter")) {
2 26 Feb 07 jari 397                     data = new AlgorithmData();
2 26 Feb 07 jari 398                     
2 26 Feb 07 jari 399                     IData idata = framework.getData();
2 26 Feb 07 jari 400                     int featuresCount = idata.getFeaturesCount();
2 26 Feb 07 jari 401                     String [] expNames = new String[featuresCount];
2 26 Feb 07 jari 402                     for(int i = 0; i < expNames.length; i++) {
2 26 Feb 07 jari 403                         expNames[i] = idata.getSampleName(i);
2 26 Feb 07 jari 404                     }
2 26 Feb 07 jari 405                     SetDetectionFilterDialog sdfd = new SetDetectionFilterDialog(new JFrame(), expNames, new DetectionFilter(expNames));
2 26 Feb 07 jari 406                     if(sdfd.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 407                         DetectionFilter detFilter = sdfd.getDetectionFilter();
2 26 Feb 07 jari 408                         
2 26 Feb 07 jari 409                         int [] groupMemb = new int[featuresCount];
2 26 Feb 07 jari 410                         int [] numReq = new int[featuresCount];
2 26 Feb 07 jari 411                         
2 26 Feb 07 jari 412                         for(int i=0; i<groupMemb.length; i++) {
2 26 Feb 07 jari 413                             groupMemb[i] = detFilter.get_group_membership(i);
2 26 Feb 07 jari 414                             numReq[i] = detFilter.get_num_required(i);
2 26 Feb 07 jari 415                         }
2 26 Feb 07 jari 416                         data.addParam("name", "Affy Detection Filter");
2 26 Feb 07 jari 417                         data.addIntArray("group-memberships", groupMemb);
2 26 Feb 07 jari 418                         data.addIntArray("number-required", numReq);
2 26 Feb 07 jari 419                         data.addParam("is-required-in-both-groups", String.valueOf(detFilter.get_both()));
2 26 Feb 07 jari 420                         setAdjustmentOutput(data);
2 26 Feb 07 jari 421                     }
2 26 Feb 07 jari 422                 } else if(algName.equals("Fold Filter")) {
2 26 Feb 07 jari 423                     data = new AlgorithmData();
2 26 Feb 07 jari 424                     
2 26 Feb 07 jari 425                     IData idata = framework.getData();
2 26 Feb 07 jari 426                     int featuresCount = idata.getFeaturesCount();
2 26 Feb 07 jari 427                     String [] expNames = new String[featuresCount];
2 26 Feb 07 jari 428                     for(int i = 0; i < expNames.length; i++) {
2 26 Feb 07 jari 429                         expNames[i] = idata.getSampleName(i);
2 26 Feb 07 jari 430                     }
2 26 Feb 07 jari 431                     SetFoldFilterDialog sffd = new SetFoldFilterDialog(new JFrame(), expNames, new FoldFilter(expNames));
2 26 Feb 07 jari 432                     if(sffd.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 433                         FoldFilter foldFilter = sffd.getFoldFilter();
2 26 Feb 07 jari 434                         
2 26 Feb 07 jari 435                         int [] groupMemb = new int[featuresCount];
2 26 Feb 07 jari 436                         int [] numMembers= new int[featuresCount];
2 26 Feb 07 jari 437                         
2 26 Feb 07 jari 438                         for(int i=0; i<groupMemb.length; i++) {
2 26 Feb 07 jari 439                             groupMemb[i] = foldFilter.get_group_membership(i);
2 26 Feb 07 jari 440                             numMembers[i] = foldFilter.get_num_members(i);
2 26 Feb 07 jari 441                         }
2 26 Feb 07 jari 442                         data.addParam("name", "Affy Fold Filter");
2 26 Feb 07 jari 443                         data.addIntArray("group-memberships", groupMemb);
2 26 Feb 07 jari 444                         data.addIntArray("number-of-members", numMembers);
2 26 Feb 07 jari 445                         data.addParam("fold-change", String.valueOf(foldFilter.get_fold_change()));
2 26 Feb 07 jari 446                         data.addParam("divider-string", foldFilter.get_divider());
2 26 Feb 07 jari 447                         setAdjustmentOutput(data);
2 26 Feb 07 jari 448                     }
2 26 Feb 07 jari 449                     
2 26 Feb 07 jari 450                 } else {
2 26 Feb 07 jari 451                     data = new AlgorithmData();
2 26 Feb 07 jari 452                     data.addParam("name", algName);
2 26 Feb 07 jari 453                     setAdjustmentOutput(data);
2 26 Feb 07 jari 454                 }
2 26 Feb 07 jari 455             } else if(algType.equals(ScriptConstants.ALGORITHM_TYPE_CLUSTER_SELECTION)) {
2 26 Feb 07 jari 456                 
2 26 Feb 07 jari 457                 if(algName.equals("Diversity Ranking Cluster Selection")) {
2 26 Feb 07 jari 458                     DiversityRankingInitDialog selectDialog = new DiversityRankingInitDialog(new JFrame());
2 26 Feb 07 jari 459                     if(selectDialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 460                         data = new AlgorithmData();
2 26 Feb 07 jari 461                         data.addParam("name", algName);
2 26 Feb 07 jari 462                         data.addParam("desired-cluster-count", String.valueOf(selectDialog.getClusterNumber()));
2 26 Feb 07 jari 463                         data.addParam("minimum-cluster-size", String.valueOf(selectDialog.getClusterSize()));
2 26 Feb 07 jari 464                         data.addParam("use-centroid-variance", String.valueOf(selectDialog.isCentroidBased()));
2 26 Feb 07 jari 465                         
2 26 Feb 07 jari 466                         int function = this.framework.getDistanceMenu().getDistanceFunction();
2 26 Feb 07 jari 467                         if(function == Algorithm.DEFAULT)
2 26 Feb 07 jari 468                             function = Algorithm.EUCLIDEAN;
2 26 Feb 07 jari 469                         
2 26 Feb 07 jari 470                         data.addParam("distance-function", String.valueOf(function));
2 26 Feb 07 jari 471                         data.addParam("use-absolute", String.valueOf(this.framework.getDistanceMenu().isAbsoluteDistance()));
2 26 Feb 07 jari 472                         
2 26 Feb 07 jari 473                         //indicate if input clusters are genes or exps.
2 26 Feb 07 jari 474                         if(parentNodeOutputClass.equals(ScriptConstants.OUTPUT_DATA_CLASS_GENE_MULTICLUSTER_OUTPUT))
2 26 Feb 07 jari 475                             data.addParam("process-gene-clusters", String.valueOf(true));
2 26 Feb 07 jari 476                         else
2 26 Feb 07 jari 477                             data.addParam("process-gene-clusters", String.valueOf(false));
2 26 Feb 07 jari 478                         
2 26 Feb 07 jari 479                         setSelectionOutput(data);
2 26 Feb 07 jari 480                     }
2 26 Feb 07 jari 481                 } else if(algName.equals("Centroid Entropy/Variance Ranking Cluster Selection")) {
2 26 Feb 07 jari 482                     CentroidEntropyRankingInitDialog entropyDialog = new CentroidEntropyRankingInitDialog(new JFrame());
2 26 Feb 07 jari 483                     if(entropyDialog.showModal() == JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 484                         data = new AlgorithmData();
2 26 Feb 07 jari 485                         data.addParam("name", algName);
2 26 Feb 07 jari 486                         data.addParam("desired-cluster-count", String.valueOf(entropyDialog.getClusterNumber()));
2 26 Feb 07 jari 487                         data.addParam("minimum-cluster-size", String.valueOf(entropyDialog.getClusterSize()));
2 26 Feb 07 jari 488                         data.addParam("use-centroid-variance", String.valueOf(entropyDialog.isVarianceBased()));
2 26 Feb 07 jari 489                         
2 26 Feb 07 jari 490                         int function = this.framework.getDistanceMenu().getDistanceFunction();
2 26 Feb 07 jari 491                         if(function == Algorithm.DEFAULT)
2 26 Feb 07 jari 492                             function = Algorithm.EUCLIDEAN;
2 26 Feb 07 jari 493                         
2 26 Feb 07 jari 494                         data.addParam("distance-function", String.valueOf(function));
2 26 Feb 07 jari 495                         data.addParam("use-absolute", String.valueOf(this.framework.getDistanceMenu().isAbsoluteDistance()));
2 26 Feb 07 jari 496                         
2 26 Feb 07 jari 497                         //indicate if input clusters are genes or exps.
2 26 Feb 07 jari 498                         if(parentNodeOutputClass.equals(ScriptConstants.OUTPUT_DATA_CLASS_GENE_MULTICLUSTER_OUTPUT))
2 26 Feb 07 jari 499                             data.addParam("process-gene-clusters", String.valueOf(true));
2 26 Feb 07 jari 500                         else
2 26 Feb 07 jari 501                             data.addParam("process-gene-clusters", String.valueOf(false));
2 26 Feb 07 jari 502                         
2 26 Feb 07 jari 503                         setSelectionOutput(data);
2 26 Feb 07 jari 504                     }
2 26 Feb 07 jari 505                 }
2 26 Feb 07 jari 506             }
2 26 Feb 07 jari 507         }
2 26 Feb 07 jari 508         
2 26 Feb 07 jari 509         // use for parameter varification dumpParams(data.getParams());
2 26 Feb 07 jari 510         return data;
2 26 Feb 07 jari 511     }
2 26 Feb 07 jari 512     
2 26 Feb 07 jari 513     
2 26 Feb 07 jari 514     /** Adds parameters common to all data adjustment algorithms.
2 26 Feb 07 jari 515      * @param data Parameter container.
2 26 Feb 07 jari 516      */
2 26 Feb 07 jari 517     private void setAdjustmentOutput(AlgorithmData data) {
2 26 Feb 07 jari 518         String [] output_nodes = new String[1];
2 26 Feb 07 jari 519         output_nodes[0] = "Single Adjusted Ouput";
2 26 Feb 07 jari 520         data.addStringArray("output-nodes", output_nodes);
2 26 Feb 07 jari 521         data.addParam("output-class", ScriptConstants.OUTPUT_DATA_CLASS_SINGLE_OUTPUT);
2 26 Feb 07 jari 522         data.addParam("alg-type", ScriptConstants.ALGORITHM_TYPE_ADJUSTMENT);
2 26 Feb 07 jari 523     }
2 26 Feb 07 jari 524     
2 26 Feb 07 jari 525     /** Sets the parameters common to all Cluster Selection algorithms.
2 26 Feb 07 jari 526      * @param data AlgorithmData parameter container.
2 26 Feb 07 jari 527      */
2 26 Feb 07 jari 528     private void setSelectionOutput(AlgorithmData data) {
2 26 Feb 07 jari 529         int clusterCount = data.getParams().getInt("desired-cluster-count");
2 26 Feb 07 jari 530         String [] output_nodes = new String[clusterCount];
2 26 Feb 07 jari 531         for(int i = 0; i < clusterCount; i++)
2 26 Feb 07 jari 532             output_nodes[i] = "Selected Cluster ("+String.valueOf(i+1)+") ";
2 26 Feb 07 jari 533         data.addStringArray("output-nodes", output_nodes);
2 26 Feb 07 jari 534         data.addParam("output-class", ScriptConstants.OUTPUT_DATA_CLASS_CLUSTER_SELECTION_OUTPUT);
2 26 Feb 07 jari 535         data.addParam("alg-type", ScriptConstants.ALGORITHM_TYPE_CLUSTER_SELECTION);
2 26 Feb 07 jari 536     }
2 26 Feb 07 jari 537     
2 26 Feb 07 jari 538     /** Facilitates the jump from the <CODE>ScriptTreeViewer</CODE> to the
2 26 Feb 07 jari 539      * <CODE>ScriptXMLViewer</CODE>.
2 26 Feb 07 jari 540      * @param viewer ScriptTreeViewer object.
2 26 Feb 07 jari 541      * @param node script node on the tree to highlight.
2 26 Feb 07 jari 542      */
2 26 Feb 07 jari 543     public void viewSelectedNodeXML(ScriptTreeViewer viewer, ScriptNode node) {
2 26 Feb 07 jari 544         IViewer iviewer;
2 26 Feb 07 jari 545         ScriptXMLViewer xmlViewer;
2 26 Feb 07 jari 546         DefaultMutableTreeNode viewerNode = getSiblingXMLNode(viewer);
2 26 Feb 07 jari 547         if(viewerNode != null) {
2 26 Feb 07 jari 548             iviewer = ((LeafInfo)(viewerNode.getUserObject())).getViewer();
2 26 Feb 07 jari 549             
2 26 Feb 07 jari 550             if(!(iviewer instanceof ScriptXMLViewer))
2 26 Feb 07 jari 551                 return;
2 26 Feb 07 jari 552             xmlViewer = (ScriptXMLViewer)iviewer;
2 26 Feb 07 jari 553             xmlViewer.update();
2 26 Feb 07 jari 554             if(node instanceof AlgorithmNode)
2 26 Feb 07 jari 555                 xmlViewer.highlightAlgorithmNode((AlgorithmNode)node);
2 26 Feb 07 jari 556             framework.setTreeNode(viewerNode);
2 26 Feb 07 jari 557         }
2 26 Feb 07 jari 558     }
2 26 Feb 07 jari 559     
2 26 Feb 07 jari 560     /** Support retrieval of sibling ScriptXMLViewer given an
2 26 Feb 07 jari 561      * associated tree.
2 26 Feb 07 jari 562      * @param treeViewer ScriptTreeViewer associated with xml view to be delivered.
2 26 Feb 07 jari 563      * @return
2 26 Feb 07 jari 564      */
2 26 Feb 07 jari 565     public DefaultMutableTreeNode getSiblingXMLNode(ScriptTreeViewer treeViewer) {
2 26 Feb 07 jari 566         Enumeration _enum = this.scriptManagerNode.depthFirstEnumeration();
2 26 Feb 07 jari 567         DefaultMutableTreeNode node, treeNode = null;
2 26 Feb 07 jari 568         IViewer viewer;
2 26 Feb 07 jari 569         LeafInfo leaf;
2 26 Feb 07 jari 570         
2 26 Feb 07 jari 571         while(_enum.hasMoreElements()) {
2 26 Feb 07 jari 572             node = (DefaultMutableTreeNode)_enum.nextElement();
2 26 Feb 07 jari 573             if(node.isLeaf()) {
2 26 Feb 07 jari 574                 leaf = (LeafInfo)(node.getUserObject());
2 26 Feb 07 jari 575                 if(leaf != null && leaf.getViewer() != null) {
2 26 Feb 07 jari 576                     viewer = leaf.getViewer();
2 26 Feb 07 jari 577                     if(viewer == treeViewer) {
2 26 Feb 07 jari 578                         treeNode = node;
2 26 Feb 07 jari 579                     }
2 26 Feb 07 jari 580                 }
2 26 Feb 07 jari 581             }
2 26 Feb 07 jari 582         }
2 26 Feb 07 jari 583         if(treeNode != null) {
2 26 Feb 07 jari 584             node = (DefaultMutableTreeNode)treeNode.getParent();
2 26 Feb 07 jari 585             if(node.getChildCount() > 1) {
2 26 Feb 07 jari 586                 node = (DefaultMutableTreeNode)node.getChildAt(1);
2 26 Feb 07 jari 587                 return node;
2 26 Feb 07 jari 588             }
2 26 Feb 07 jari 589         }
2 26 Feb 07 jari 590         return null;
2 26 Feb 07 jari 591     }
2 26 Feb 07 jari 592     
2 26 Feb 07 jari 593     /** Executes the script specified by the ID.
2 26 Feb 07 jari 594      * @param index Source script ID.
2 26 Feb 07 jari 595      */
2 26 Feb 07 jari 596     public void runScript(int index) {
2 26 Feb 07 jari 597         if(index >= scripts.size())
2 26 Feb 07 jari 598             return;
2 26 Feb 07 jari 599         
2 26 Feb 07 jari 600         Script script = (Script)scripts.elementAt(index);
2 26 Feb 07 jari 601         ScriptRunner runner = new ScriptRunner(script, actionManager, framework);
2 26 Feb 07 jari 602         runner.setOutputMode(ScriptConstants.SCRIPT_OUTPUT_MODE_INTERNAL_OUTPUT);
2 26 Feb 07 jari 603         runner.execute();
2 26 Feb 07 jari 604     }
2 26 Feb 07 jari 605     
2 26 Feb 07 jari 606     /** Runs the script contained in the ScriptDocument.
2 26 Feb 07 jari 607      * @param scriptDoc Source script.
2 26 Feb 07 jari 608      */
2 26 Feb 07 jari 609     public void runScript(ScriptDocument scriptDoc) {
2 26 Feb 07 jari 610         Script script = getScriptObjectForDocument(scriptDoc);
2 26 Feb 07 jari 611         if(script == null)
2 26 Feb 07 jari 612             return;
2 26 Feb 07 jari 613         
2 26 Feb 07 jari 614         ScriptRunner runner = new ScriptRunner(script, actionManager, framework);
2 26 Feb 07 jari 615         runner.setOutputMode(ScriptConstants.SCRIPT_OUTPUT_MODE_INTERNAL_OUTPUT);
2 26 Feb 07 jari 616         runner.execute();
2 26 Feb 07 jari 617     }
2 26 Feb 07 jari 618     
2 26 Feb 07 jari 619     /** Delivers a <CODE>Script</CODE> object in the collection that wraps the passed
2 26 Feb 07 jari 620      * <CODE>ScriptDocument</CODE>
2 26 Feb 07 jari 621      * @param doc source document.
2 26 Feb 07 jari 622      * @return
2 26 Feb 07 jari 623      */
2 26 Feb 07 jari 624     public Script getScriptObjectForDocument(ScriptDocument doc) {
2 26 Feb 07 jari 625         Script script;
2 26 Feb 07 jari 626         for(int i = 0; i < scripts.size(); i++) {
2 26 Feb 07 jari 627             script = (Script)(scripts.elementAt(i));
2 26 Feb 07 jari 628             if(script.getScriptDocument() == doc)
2 26 Feb 07 jari 629                 return script;
2 26 Feb 07 jari 630         }
2 26 Feb 07 jari 631         return null;
2 26 Feb 07 jari 632     }
2 26 Feb 07 jari 633     
2 26 Feb 07 jari 634     /** Returns MeV's main frame component
2 26 Feb 07 jari 635      */
2 26 Feb 07 jari 636     public Frame getFrame() {
2 26 Feb 07 jari 637         return this.framework.getFrame();
2 26 Feb 07 jari 638     }
2 26 Feb 07 jari 639     
2 26 Feb 07 jari 640     /** Serves the current experiment object in MeV.  This is the primary
2 26 Feb 07 jari 641      * (initial) data source.
2 26 Feb 07 jari 642      * @return  */
2 26 Feb 07 jari 643     public Experiment getCurrentExperiment() {
2 26 Feb 07 jari 644         return framework.getData().getExperiment();
2 26 Feb 07 jari 645     }
2 26 Feb 07 jari 646     
2 26 Feb 07 jari 647     /** Validates script for parameter rule violations of type or possibly
2 26 Feb 07 jari 648      * range constraints when appropriate.  Return of true signifies valid
2 26 Feb 07 jari 649      * parameters based on current supporting parameter information XML.
2 26 Feb 07 jari 650      * Errors are logged to the passed <CODE>ErrorLog</CODE>.
2 26 Feb 07 jari 651      * @param tree ScriptTree to validate.
2 26 Feb 07 jari 652      * @param log <CODE>ErrorLog</CODE> to collect possible violations.
2 26 Feb 07 jari 653      * @return
2 26 Feb 07 jari 654      */
2 26 Feb 07 jari 655     public boolean validateParameters(ScriptTree tree, ErrorLog log) {
2 26 Feb 07 jari 656         boolean isValid = true;
2 26 Feb 07 jari 657         if(this.validator != null && this.validator.isEnabled()) {
2 26 Feb 07 jari 658             if( ! (validator.validate(this, tree, log)) ) {
2 26 Feb 07 jari 659                 //REPORT ERRORS
2 26 Feb 07 jari 660                 log.reportAllListings();
2 26 Feb 07 jari 661                 isValid = false;
2 26 Feb 07 jari 662             }
2 26 Feb 07 jari 663         } else {
2 26 Feb 07 jari 664             //Report validation disabled
2 26 Feb 07 jari 665             isValid = false;
2 26 Feb 07 jari 666         }
2 26 Feb 07 jari 667         return isValid;
2 26 Feb 07 jari 668     }
2 26 Feb 07 jari 669     
2 26 Feb 07 jari 670     /** Returns a set of valid parameters given a passed algorithm name.
2 26 Feb 07 jari 671      * @param algName Algorithm name.
2 26 Feb 07 jari 672      * @return
2 26 Feb 07 jari 673      */
2 26 Feb 07 jari 674     public String getValidParametersTable(String algName) {
2 26 Feb 07 jari 675         if(validator == null)
2 26 Feb 07 jari 676             return null;
2 26 Feb 07 jari 677         return validator.getValidParameterTable(algName);
2 26 Feb 07 jari 678     }
2 26 Feb 07 jari 679     
2 26 Feb 07 jari 680     /** Returns a Hashtable of valid key value pairs for the algorithm
2 26 Feb 07 jari 681      * @param algName algorithm name
2 26 Feb 07 jari 682      * @return
2 26 Feb 07 jari 683      */
2 26 Feb 07 jari 684     public Hashtable getParameterHash(String algName) {
2 26 Feb 07 jari 685         if(validator == null)
2 26 Feb 07 jari 686             return null;
2 26 Feb 07 jari 687         return validator.getParameterHash(algName);
2 26 Feb 07 jari 688     }
2 26 Feb 07 jari 689     
2 26 Feb 07 jari 690     /** Returns <CODE>ParmaterAttributes</CODE> object for the specified algorithm.
2 26 Feb 07 jari 691      * @param algName Algorithm name
2 26 Feb 07 jari 692      * @param key parameter key
2 26 Feb 07 jari 693      * @return
2 26 Feb 07 jari 694      */
2 26 Feb 07 jari 695     public ParameterAttributes getParameterAttributes(String algName, String key) {
2 26 Feb 07 jari 696         if(validator == null)
2 26 Feb 07 jari 697             return null;
2 26 Feb 07 jari 698         return validator.getParameterAttributes(algName, key);
2 26 Feb 07 jari 699         
2 26 Feb 07 jari 700     }
2 26 Feb 07 jari 701     
2 26 Feb 07 jari 702     
2 26 Feb 07 jari 703         
2 26 Feb 07 jari 704     private void writeObject(java.io.ObjectOutputStream oos) throws java.io.IOException {
2 26 Feb 07 jari 705
2 26 Feb 07 jari 706    // oos.writeObject(actionManager);
2 26 Feb 07 jari 707     //oos.writeObject(table);
2 26 Feb 07 jari 708     oos.writeInt(scriptNum);
2 26 Feb 07 jari 709 //    oos.writeObject(framework);
2 26 Feb 07 jari 710    // oos.writeObject(validator);
2 26 Feb 07 jari 711 //    oos.writeObject(scripts);
2 26 Feb 07 jari 712     
2 26 Feb 07 jari 713     }
2 26 Feb 07 jari 714      
2 26 Feb 07 jari 715    
2 26 Feb 07 jari 716     
2 26 Feb 07 jari 717     private void readObject(java.io.ObjectInputStream ois) throws java.io.IOException, ClassNotFoundException {
2 26 Feb 07 jari 718
2 26 Feb 07 jari 719     //this.actionManager = (ActionManager)ois.readObject();
2 26 Feb 07 jari 720    // this.table = (ScriptTable)ois.readObject();
2 26 Feb 07 jari 721     this.scriptNum = ois.readInt();
2 26 Feb 07 jari 722   //  this.framework = (IFramework)ois.readObject();
2 26 Feb 07 jari 723    // this.scripts = (Vector)ois.readObject();
2 26 Feb 07 jari 724     }  
2 26 Feb 07 jari 725     
2 26 Feb 07 jari 726 }