mev-4.0.01/source/org/tigr/microarray/mev/script/util/ParameterValidator.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  * ParameterValidator.java
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created on March 27, 2004, 10:19 PM
2 26 Feb 07 jari 9  */
2 26 Feb 07 jari 10
2 26 Feb 07 jari 11 package org.tigr.microarray.mev.script.util;
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 import java.awt.Color;
2 26 Feb 07 jari 14 import java.awt.Dimension;
2 26 Feb 07 jari 15 import java.awt.Insets;
2 26 Feb 07 jari 16 import java.io.File;
2 26 Feb 07 jari 17 import java.util.Hashtable;
2 26 Feb 07 jari 18 import java.util.Iterator;
2 26 Feb 07 jari 19 import java.util.Map;
2 26 Feb 07 jari 20 import java.util.Set;
2 26 Feb 07 jari 21 import java.util.Vector;
2 26 Feb 07 jari 22
2 26 Feb 07 jari 23 import javax.swing.BorderFactory;
2 26 Feb 07 jari 24 import javax.swing.JFrame;
2 26 Feb 07 jari 25 import javax.swing.JOptionPane;
2 26 Feb 07 jari 26 import javax.swing.JScrollPane;
2 26 Feb 07 jari 27 import javax.swing.JTextPane;
2 26 Feb 07 jari 28
2 26 Feb 07 jari 29 import org.apache.xerces.parsers.DOMParser;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.TMEV;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.script.ScriptManager;
2 26 Feb 07 jari 33 import org.w3c.dom.Element;
2 26 Feb 07 jari 34 import org.w3c.dom.NodeList;
2 26 Feb 07 jari 35 import org.xml.sax.SAXException;
2 26 Feb 07 jari 36 import org.xml.sax.SAXParseException;
2 26 Feb 07 jari 37 import org.xml.sax.helpers.DefaultHandler;
2 26 Feb 07 jari 38
2 26 Feb 07 jari 39 /** Facilitates parameter validation. XML file supports validation by supplying
2 26 Feb 07 jari 40  * the parameter details.
2 26 Feb 07 jari 41  * @author braisted
2 26 Feb 07 jari 42  */
2 26 Feb 07 jari 43
2 26 Feb 07 jari 44 //TODO Value Type check, extend to all types, validate range.
2 26 Feb 07 jari 45 //Validte that required are present.
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47
2 26 Feb 07 jari 48 public class ParameterValidator extends DefaultHandler{
2 26 Feb 07 jari 49     
2 26 Feb 07 jari 50     /** Root element for validation XML.
2 26 Feb 07 jari 51      */
2 26 Feb 07 jari 52     Element validationRoot;
2 26 Feb 07 jari 53     /** True if have the val. root.
2 26 Feb 07 jari 54      */
2 26 Feb 07 jari 55     boolean haveValidationRoot;
2 26 Feb 07 jari 56     
2 26 Feb 07 jari 57     /** Creates a new instance of ParameterValidator */
2 26 Feb 07 jari 58     public ParameterValidator() {
2 26 Feb 07 jari 59         //parse validation file
2 26 Feb 07 jari 60         
2 26 Feb 07 jari 61     }
2 26 Feb 07 jari 62     
2 26 Feb 07 jari 63     /** Load the XML ParameterConstraints.
2 26 Feb 07 jari 64      */
2 26 Feb 07 jari 65     public boolean loadParameterConstraints() {
2 26 Feb 07 jari 66
2 26 Feb 07 jari 67         try {
2 26 Feb 07 jari 68             File paramFile = TMEV.getConfigurationFile("ParameterConstraints.xml");
2 26 Feb 07 jari 69             DOMParser parser = new DOMParser();
2 26 Feb 07 jari 70             
2 26 Feb 07 jari 71             parser.setFeature("http://xml.org/sax/features/validation", true);
2 26 Feb 07 jari 72             parser.setErrorHandler(this);
2 26 Feb 07 jari 73             parser.parse(paramFile.toURL().toString());            
2 26 Feb 07 jari 74             validationRoot = parser.getDocument().getDocumentElement();
2 26 Feb 07 jari 75             haveValidationRoot = true;
2 26 Feb 07 jari 76         } catch ( NullPointerException e ) {
2 26 Feb 07 jari 77             haveValidationRoot = false;
2 26 Feb 07 jari 78             JOptionPane.showMessageDialog(new JFrame(), "The parameter validation feature in support of scripting could not be initialized.\n"+
2 26 Feb 07 jari 79             "The constraint file \"ParameterConstraints.xml\" could not be located.\nScript capabilities will operate without full parameter validation",
2 26 Feb 07 jari 80             "Parameter Validation Initialization Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 81             return false;
2 26 Feb 07 jari 82         } catch (Exception e) {
2 26 Feb 07 jari 83             e.printStackTrace();
2 26 Feb 07 jari 84             haveValidationRoot = false;
2 26 Feb 07 jari 85             JOptionPane.showMessageDialog(new JFrame(), "The parameter validation feature in support of scripting could not be initialized properly.\n"+
2 26 Feb 07 jari 86             "\"ParameterConstraints.xml\" contained errors reported in the console window.\nScript capabilities will operate without full parameter validation",
2 26 Feb 07 jari 87             "Parameter Validation Initialization Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 88             return false;
2 26 Feb 07 jari 89         }
2 26 Feb 07 jari 90         return true;
2 26 Feb 07 jari 91     }
2 26 Feb 07 jari 92     
2 26 Feb 07 jari 93     /** True if validator is enabled.
2 26 Feb 07 jari 94      */
2 26 Feb 07 jari 95     public boolean isEnabled() {
2 26 Feb 07 jari 96         return haveValidationRoot;
2 26 Feb 07 jari 97     }
2 26 Feb 07 jari 98     
2 26 Feb 07 jari 99     /**  Returns true if script parameters match the requirements
2 26 Feb 07 jari 100      *  defined in ScriptValidation.xml.  Algorithm parameter keys
2 26 Feb 07 jari 101      *  must match valid keys, value type, and value range as defined.
2 26 Feb 07 jari 102      * @param manager script manager
2 26 Feb 07 jari 103      * @param tree Script tree to validate.
2 26 Feb 07 jari 104      * @param log error log
2 26 Feb 07 jari 105      * @return
2 26 Feb 07 jari 106      */
2 26 Feb 07 jari 107     public boolean validate(ScriptManager manager, ScriptTree tree, ErrorLog log) {
2 26 Feb 07 jari 108         AlgorithmSet [] sets = tree.getAlgorithmSets();
2 26 Feb 07 jari 109         AlgorithmNode node;
2 26 Feb 07 jari 110         boolean isValid = true;
2 26 Feb 07 jari 111         log.reset();
2 26 Feb 07 jari 112
2 26 Feb 07 jari 113         NodeList list = validationRoot.getElementsByTagName("script_algorithm");
2 26 Feb 07 jari 114         
2 26 Feb 07 jari 115         for(int setIndex = 0; setIndex < sets.length; setIndex++) {
2 26 Feb 07 jari 116             for(int algIndex = 0; algIndex < sets[setIndex].getAlgorithmCount(); algIndex++) {
2 26 Feb 07 jari 117                 node = sets[setIndex].getAlgorithmNodeAt(algIndex);
2 26 Feb 07 jari 118                 if( !validateAlgorithm(node, list, log) )
2 26 Feb 07 jari 119                     isValid = false;
2 26 Feb 07 jari 120             }
2 26 Feb 07 jari 121         }
2 26 Feb 07 jari 122         return isValid;
2 26 Feb 07 jari 123     }
2 26 Feb 07 jari 124     
2 26 Feb 07 jari 125     
2 26 Feb 07 jari 126     /*  Validation Points
2 26 Feb 07 jari 127      *  1.) Is key valid?
2 26 Feb 07 jari 128      *  2.) Is value type valid?
2 26 Feb 07 jari 129      *  3.) Is value range ok?
2 26 Feb 07 jari 130      *  4.) Are all known required parameters present?
2 26 Feb 07 jari 131      */
2 26 Feb 07 jari 132     
2 26 Feb 07 jari 133     /** Returns true if the algorithm parameters are valid.
2 26 Feb 07 jari 134      * @param algorithmNode algorithm name to validate
2 26 Feb 07 jari 135      * @param algList algorithm list
2 26 Feb 07 jari 136      * @param log
2 26 Feb 07 jari 137      * @return
2 26 Feb 07 jari 138      */
2 26 Feb 07 jari 139     private boolean validateAlgorithm( AlgorithmNode algorithmNode, NodeList algList, ErrorLog log) {
2 26 Feb 07 jari 140         AlgorithmData data = algorithmNode.getAlgorithmData();
2 26 Feb 07 jari 141         Map map = data.getParams().getMap();
2 26 Feb 07 jari 142         Iterator iter = map.keySet().iterator();
2 26 Feb 07 jari 143         String key;
2 26 Feb 07 jari 144         String value;
2 26 Feb 07 jari 145         String algName = algorithmNode.getAlgorithmName(); //(String)(map.get("name"));
2 26 Feb 07 jari 146         boolean isValid = true;
2 26 Feb 07 jari 147         
2 26 Feb 07 jari 148         //get algorithm name
2 26 Feb 07 jari 149         if(algName == null) {
2 26 Feb 07 jari 150             //Invalid, need algname, report and return false
2 26 Feb 07 jari 151             //REPORT
2 26 Feb 07 jari 152             return false;
2 26 Feb 07 jari 153         }
2 26 Feb 07 jari 154         
2 26 Feb 07 jari 155         //short circuit if algorithm type is an adjustment
2 26 Feb 07 jari 156         if(algorithmNode.getAlgorithmType().equals(ScriptConstants.ALGORITHM_TYPE_ADJUSTMENT))
2 26 Feb 07 jari 157             return true;
2 26 Feb 07 jari 158         
2 26 Feb 07 jari 159         //get algorithm dom Element
2 26 Feb 07 jari 160         Element algElement = getAlgorithmElement(algName, algList);
2 26 Feb 07 jari 161         
2 26 Feb 07 jari 162         if(algElement == null) {
2 26 Feb 07 jari 163             JOptionPane.showMessageDialog(new JFrame(), "The "+algName+" algorithm does not have information to support parameter validation."+
2 26 Feb 07 jari 164                                                       "\nPlease be aware that script loading will proceed without validation of this algorithm.", "Unsupported Parameter Validation",  JOptionPane.WARNING_MESSAGE);
2 26 Feb 07 jari 165             return true;
2 26 Feb 07 jari 166         }
2 26 Feb 07 jari 167         
2 26 Feb 07 jari 168         if(algElement == null) {
2 26 Feb 07 jari 169             //invalid name or no entry in xml
2 26 Feb 07 jari 170             //REPORT
2 26 Feb 07 jari 171             ScriptParameterException spe = createScriptParameterException(algorithmNode, "Parameter constraint information is not available for this algorithm. "+
2 26 Feb 07 jari 172             "The algorithm parameters can not be validated.");
2 26 Feb 07 jari 173             log.recordParameterError(spe);
2 26 Feb 07 jari 174             return false;
2 26 Feb 07 jari 175         }
2 26 Feb 07 jari 176         
2 26 Feb 07 jari 177         Vector missingParameterVector = validateRequiredParameters(map.keySet(), algElement);
2 26 Feb 07 jari 178         
2 26 Feb 07 jari 179         if(missingParameterVector.size() > 0) {
2 26 Feb 07 jari 180             //missing required parameter
2 26 Feb 07 jari 181             //REPORT
2 26 Feb 07 jari 182             for(int i = 0; i < missingParameterVector.size(); i++) {
2 26 Feb 07 jari 183                 ScriptParameterException spe = new ScriptParameterException(algorithmNode.getAlgorithmName(), algorithmNode.getID(),
2 26 Feb 07 jari 184                 algorithmNode.getDataNodeRef(), (String)(missingParameterVector.elementAt(i)), "N/A", "Missing required parameter.");
2 26 Feb 07 jari 185                 log.recordParameterError(spe);
2 26 Feb 07 jari 186             }
2 26 Feb 07 jari 187             isValid = false;
2 26 Feb 07 jari 188         }
2 26 Feb 07 jari 189         
2 26 Feb 07 jari 190         //Test each parameter
2 26 Feb 07 jari 191         while(iter.hasNext()) {
2 26 Feb 07 jari 192             key = (String)(iter.next());
2 26 Feb 07 jari 193             value = (String)(map.get(key));
2 26 Feb 07 jari 194             if(!validateParameter(key, value, algElement, algorithmNode, log)) {
2 26 Feb 07 jari 195                 isValid = false;
2 26 Feb 07 jari 196                 
2 26 Feb 07 jari 197             }
2 26 Feb 07 jari 198         }
2 26 Feb 07 jari 199         return isValid;
2 26 Feb 07 jari 200     }
2 26 Feb 07 jari 201     
2 26 Feb 07 jari 202     
2 26 Feb 07 jari 203     
2 26 Feb 07 jari 204     /** returns the algorithm element given a list and algorithm name
2 26 Feb 07 jari 205      * @param algName algorithm name
2 26 Feb 07 jari 206      * @param algList node list to search
2 26 Feb 07 jari 207      * @return
2 26 Feb 07 jari 208      */
2 26 Feb 07 jari 209     private Element getAlgorithmElement(String algName, NodeList algList) {
2 26 Feb 07 jari 210         Element elem = null;
2 26 Feb 07 jari 211         Element resultElement = null;
2 26 Feb 07 jari 212         String name;
2 26 Feb 07 jari 213         for(int i = 0; i < algList.getLength(); i++) {
2 26 Feb 07 jari 214             elem = (Element)(algList.item(i));
2 26 Feb 07 jari 215             if(elem.getAttribute("name").equals(algName)) {
2 26 Feb 07 jari 216                 resultElement = elem;
2 26 Feb 07 jari 217                 break;
2 26 Feb 07 jari 218             }
2 26 Feb 07 jari 219         }
2 26 Feb 07 jari 220         return resultElement;
2 26 Feb 07 jari 221     }
2 26 Feb 07 jari 222     
2 26 Feb 07 jari 223     /**
2 26 Feb 07 jari 224      *  Returns true if required parameters are present.
2 26 Feb 07 jari 225      */
2 26 Feb 07 jari 226     private Vector validateRequiredParameters(Set keys, Element algElement) {
2 26 Feb 07 jari 227         Vector requiredKeys = new Vector();
2 26 Feb 07 jari 228         NodeList params = algElement.getElementsByTagName("param");
2 26 Feb 07 jari 229         
2 26 Feb 07 jari 230         for(int i = 0; i < params.getLength(); i++) {
2 26 Feb 07 jari 231             if(((Element)(params.item(i))).getAttribute("val_level").equalsIgnoreCase("REQUIRED")) {
2 26 Feb 07 jari 232                 requiredKeys.add(((Element)(params.item(i))).getAttribute("key"));
2 26 Feb 07 jari 233             }
2 26 Feb 07 jari 234         }
2 26 Feb 07 jari 235         
2 26 Feb 07 jari 236         Vector keyVector = new Vector(keys);
2 26 Feb 07 jari 237         Vector missingKeys = new Vector();
2 26 Feb 07 jari 238         for(int i = 0; i < requiredKeys.size(); i++) {
2 26 Feb 07 jari 239             if(!keyVector.contains((String)(requiredKeys.elementAt(i))))
2 26 Feb 07 jari 240                 missingKeys.add(requiredKeys.elementAt(i));
2 26 Feb 07 jari 241         }
2 26 Feb 07 jari 242         
2 26 Feb 07 jari 243         return missingKeys;
2 26 Feb 07 jari 244     }
2 26 Feb 07 jari 245     
2 26 Feb 07 jari 246     /**
2 26 Feb 07 jari 247      * Returns true if key, value type, and value range are valid.
2 26 Feb 07 jari 248      */
2 26 Feb 07 jari 249     private boolean validateParameter(String key, String value, Element algElement, AlgorithmNode algNode, ErrorLog log) {
2 26 Feb 07 jari 250         NodeList paramList = algElement.getElementsByTagName("param");
2 26 Feb 07 jari 251         Element paramElement = getParameterElement(paramList, key);
2 26 Feb 07 jari 252         boolean result = true;
2 26 Feb 07 jari 253         if(paramElement == null) {
2 26 Feb 07 jari 254             //Invalid Key Name, not registered
2 26 Feb 07 jari 255             //REPORT
2 26 Feb 07 jari 256             ScriptParameterException spe = createScriptParameterException(algNode, paramElement, value,
2 26 Feb 07 jari 257             "Invalid key. Key name not recognized.");
2 26 Feb 07 jari 258             log.recordParameterError(spe);
2 26 Feb 07 jari 259             return false;
2 26 Feb 07 jari 260         }
2 26 Feb 07 jari 261         if(!validateValueType(value, paramElement, algElement, log)) {
2 26 Feb 07 jari 262             //value type error
2 26 Feb 07 jari 263             //REPORT
2 26 Feb 07 jari 264             ScriptParameterException spe = createScriptParameterException(algNode, paramElement, value,
2 26 Feb 07 jari 265             "Incorrect value type.");
2 26 Feb 07 jari 266             log.recordParameterError(spe);
2 26 Feb 07 jari 267             result = false;
2 26 Feb 07 jari 268         }
2 26 Feb 07 jari 269         if(!validateValueConstraints(algNode.getAlgorithmName(), key, value)) {
2 26 Feb 07 jari 270             
2 26 Feb 07 jari 271         }
2 26 Feb 07 jari 272         
2 26 Feb 07 jari 273         return result;
2 26 Feb 07 jari 274     }
2 26 Feb 07 jari 275     
2 26 Feb 07 jari 276     /** Creates a script parameter exception
2 26 Feb 07 jari 277      * @return
2 26 Feb 07 jari 278      * @param algNode algorithm node
2 26 Feb 07 jari 279      * @param paramElement parameter element
2 26 Feb 07 jari 280      * @param currValue value
2 26 Feb 07 jari 281      * @param message exception message
2 26 Feb 07 jari 282      */
2 26 Feb 07 jari 283     private ScriptParameterException createScriptParameterException(AlgorithmNode algNode, Element paramElement, String currValue, String message) {
2 26 Feb 07 jari 284         ScriptParameterException spe = new ScriptParameterException(algNode.getAlgorithmName(), algNode.getID(),
2 26 Feb 07 jari 285         algNode.getDataNodeRef(), paramElement.getAttribute("key"), currValue, message);
2 26 Feb 07 jari 286         return spe;
2 26 Feb 07 jari 287     }
2 26 Feb 07 jari 288     
2 26 Feb 07 jari 289     /** Create exception
2 26 Feb 07 jari 290      * @param algNode algorithm node
2 26 Feb 07 jari 291      * @param message exception message
2 26 Feb 07 jari 292      * @return
2 26 Feb 07 jari 293      */
2 26 Feb 07 jari 294     private ScriptParameterException createScriptParameterException(AlgorithmNode algNode, String message) {
2 26 Feb 07 jari 295         ScriptParameterException spe = new ScriptParameterException(algNode.getAlgorithmName(), algNode.getID(),
2 26 Feb 07 jari 296         algNode.getDataNodeRef(), "N/A", "N/A", message);
2 26 Feb 07 jari 297         return spe;
2 26 Feb 07 jari 298     }
2 26 Feb 07 jari 299     
2 26 Feb 07 jari 300     /** Returns the parameter element given a node list
2 26 Feb 07 jari 301      * and the parameter key.
2 26 Feb 07 jari 302      * @param list list
2 26 Feb 07 jari 303      * @param key key to search on.
2 26 Feb 07 jari 304      * @return
2 26 Feb 07 jari 305      */
2 26 Feb 07 jari 306     private Element getParameterElement(NodeList list, String key) {
2 26 Feb 07 jari 307         Element elem = null;
2 26 Feb 07 jari 308         for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 309             elem = (Element)(list.item(i));
2 26 Feb 07 jari 310             if(elem.getAttribute("key").equals(key)) {
2 26 Feb 07 jari 311                 break;
2 26 Feb 07 jari 312             }
2 26 Feb 07 jari 313         }
2 26 Feb 07 jari 314         return elem;
2 26 Feb 07 jari 315     }
2 26 Feb 07 jari 316     
2 26 Feb 07 jari 317     /** Validate type
2 26 Feb 07 jari 318      * @param value value
2 26 Feb 07 jari 319      * @param paramElement parameter element
2 26 Feb 07 jari 320      * @param algElement algorithm element
2 26 Feb 07 jari 321      * @param log error log
2 26 Feb 07 jari 322      * @return
2 26 Feb 07 jari 323      */
2 26 Feb 07 jari 324     private boolean validateValueType(String value, Element paramElement, Element algElement, ErrorLog log) {
2 26 Feb 07 jari 325         String type = paramElement.getAttribute("value_type");
2 26 Feb 07 jari 326         boolean isValid = true;
2 26 Feb 07 jari 327         try {
2 26 Feb 07 jari 328             if(type.equals("boolean")) {
2 26 Feb 07 jari 329                 if(!value.equals("true") && !value.equals("false"))
2 26 Feb 07 jari 330                     isValid = true;
2 26 Feb 07 jari 331             } else if(type.equals("int")){
2 26 Feb 07 jari 332                 Integer.parseInt(value);
2 26 Feb 07 jari 333             } else if(type.equals("long")){
2 26 Feb 07 jari 334                 Long.parseLong(value);
2 26 Feb 07 jari 335             } else if(type.equals("float")) {
2 26 Feb 07 jari 336                 Float.parseFloat(value);
2 26 Feb 07 jari 337             } else if(type.equals("double")) {
2 26 Feb 07 jari 338                 Double.parseDouble(value);
2 26 Feb 07 jari 339             }
2 26 Feb 07 jari 340         } catch (NumberFormatException nfe) {
2 26 Feb 07 jari 341             //REPORT TYPE mismatched value type;
2 26 Feb 07 jari 342             return false;
2 26 Feb 07 jari 343         }
2 26 Feb 07 jari 344         return isValid;
2 26 Feb 07 jari 345     }
2 26 Feb 07 jari 346     
2 26 Feb 07 jari 347     /** Validate value's constraints
2 26 Feb 07 jari 348      * @param algName Algorithm name
2 26 Feb 07 jari 349      * @param key key for parameter to validate
2 26 Feb 07 jari 350      * @param value value to check
2 26 Feb 07 jari 351      * @return
2 26 Feb 07 jari 352      */
2 26 Feb 07 jari 353     private boolean validateValueConstraints(String algName, String key, String value) {
2 26 Feb 07 jari 354        
2 26 Feb 07 jari 355         ParameterAttributes atts = this.getParameterAttributes(algName, key);
2 26 Feb 07 jari 356         
2 26 Feb 07 jari 357         if(atts == null || !atts.hasConstraints())  //if no info on key or no constraints for found param then return true
2 26 Feb 07 jari 358             return true;
2 26 Feb 07 jari 359         
2 26 Feb 07 jari 360         return checkConstraints(value, atts.getValueType(), atts.getMin(), atts.getMax());
2 26 Feb 07 jari 361     }
2 26 Feb 07 jari 362     
2 26 Feb 07 jari 363     
2 26 Feb 07 jari 364     /** Check the value against constraints. Returns true if
2 26 Feb 07 jari 365      * passes.
2 26 Feb 07 jari 366      * @param val Value
2 26 Feb 07 jari 367      * @param type Type attribute
2 26 Feb 07 jari 368      * @param min min
2 26 Feb 07 jari 369      * @param max max
2 26 Feb 07 jari 370      * @return
2 26 Feb 07 jari 371      */
2 26 Feb 07 jari 372     private boolean checkConstraints(String val, String type, String min, String max) {
2 26 Feb 07 jari 373         if(type.equals("int")){
2 26 Feb 07 jari 374             int value = Integer.parseInt(val);
2 26 Feb 07 jari 375             if(!min.equals("") && !max.equals(""))
2 26 Feb 07 jari 376                 return (value >= Integer.parseInt(min) && value <= Integer.parseInt(max));
2 26 Feb 07 jari 377             else if(!max.equals(""))
2 26 Feb 07 jari 378                 return (value <= Integer.parseInt(max));
2 26 Feb 07 jari 379             else if(!min.equals(""))
2 26 Feb 07 jari 380                 return (value >= Integer.parseInt(min));
2 26 Feb 07 jari 381             return true;
2 26 Feb 07 jari 382         } else if(type.equals("float")){
2 26 Feb 07 jari 383             float value = Float.parseFloat(val);
2 26 Feb 07 jari 384             if(!min.equals("") && !max.equals(""))
2 26 Feb 07 jari 385                 return (value >= Float.parseFloat(min) && value <= Float.parseFloat(max));
2 26 Feb 07 jari 386             else if(!max.equals(""))
2 26 Feb 07 jari 387                 return (value <= Float.parseFloat(max));
2 26 Feb 07 jari 388             else if(!min.equals(""))
2 26 Feb 07 jari 389                 return (value >= Float.parseFloat(min));
2 26 Feb 07 jari 390             return true;
2 26 Feb 07 jari 391         } else if(type.equals("long")){
2 26 Feb 07 jari 392             long value = Long.parseLong(val);
2 26 Feb 07 jari 393             if(!min.equals("") && !max.equals(""))
2 26 Feb 07 jari 394                 return (value >= Long.parseLong(min) && value <= Long.parseLong(max));
2 26 Feb 07 jari 395             else if(!max.equals(""))
2 26 Feb 07 jari 396                 return (value <= Long.parseLong(max));
2 26 Feb 07 jari 397             else if(!min.equals(""))
2 26 Feb 07 jari 398                 return (value >= Long.parseLong(min));
2 26 Feb 07 jari 399             return true;
2 26 Feb 07 jari 400         } else if(type.equals("double")){
2 26 Feb 07 jari 401             double value = Double.parseDouble(val);
2 26 Feb 07 jari 402             if(!min.equals("") && !max.equals(""))
2 26 Feb 07 jari 403                 return (value >= Double.parseDouble(min) && value <= Double.parseDouble(max));
2 26 Feb 07 jari 404             else if(!max.equals(""))
2 26 Feb 07 jari 405                 return (value <= Double.parseDouble(max));
2 26 Feb 07 jari 406             else if(!min.equals(""))
2 26 Feb 07 jari 407                 return (value >= Double.parseDouble(min));
2 26 Feb 07 jari 408             return true;
2 26 Feb 07 jari 409         }
2 26 Feb 07 jari 410         return true;
2 26 Feb 07 jari 411     }
2 26 Feb 07 jari 412     
2 26 Feb 07 jari 413     /** Returns an html string table of valid parameters
2 26 Feb 07 jari 414      * for the algorithm named.
2 26 Feb 07 jari 415      * @return
2 26 Feb 07 jari 416      * @param algName algorithm name */
2 26 Feb 07 jari 417     public String getValidParameterTable(String algName) {
2 26 Feb 07 jari 418         if(!isEnabled())
2 26 Feb 07 jari 419             return null;
2 26 Feb 07 jari 420         
2 26 Feb 07 jari 421         String table = null;
2 26 Feb 07 jari 422         String key;
2 26 Feb 07 jari 423         String valueType;
2 26 Feb 07 jari 424         String min;
2 26 Feb 07 jari 425         String max;
2 26 Feb 07 jari 426         String valStatus;
2 26 Feb 07 jari 427         
2 26 Feb 07 jari 428         Element algElement= findAlgorithmElement(algName);
2 26 Feb 07 jari 429         
2 26 Feb 07 jari 430         Element paramElement;
2 26 Feb 07 jari 431         Element constraint;
2 26 Feb 07 jari 432         if(algElement != null) {
2 26 Feb 07 jari 433             Element paramList = (Element)(algElement.getElementsByTagName("param_list").item(0));
2 26 Feb 07 jari 434             if(paramList == null)
2 26 Feb 07 jari 435                 return null;
2 26 Feb 07 jari 436             
2 26 Feb 07 jari 437             NodeList params = paramList.getElementsByTagName("param");
2 26 Feb 07 jari 438             
2 26 Feb 07 jari 439             table = "";
2 26 Feb 07 jari 440             table = "<h2>Valid Script Parameters for "+algName+"</h2>";
2 26 Feb 07 jari 441             table+= "<p>Note: Parameters that are not listed as \"Always\" required usually depend on the value of"+
2 26 Feb 07 jari 442             " other entered parameters to determine if they are required.</p>";
2 26 Feb 07 jari 443             
2 26 Feb 07 jari 444             table+="<table border=3><th>Key</th><th>Value Type</th><th>Min</th><th>Max</th><th>Required</th>";
2 26 Feb 07 jari 445             
2 26 Feb 07 jari 446             for(int i = 0; i < params.getLength(); i++ ) {
2 26 Feb 07 jari 447                 paramElement = (Element)(params.item(i));
2 26 Feb 07 jari 448                 NodeList constraintList =  paramElement.getElementsByTagName("constraint");
2 26 Feb 07 jari 449                 
2 26 Feb 07 jari 450                 key = paramElement.getAttribute("key");
2 26 Feb 07 jari 451                 valueType = paramElement.getAttribute("value_type");
2 26 Feb 07 jari 452                 valStatus = paramElement.getAttribute("val_level");
2 26 Feb 07 jari 453                 min = " ";
2 26 Feb 07 jari 454                 max = " ";
2 26 Feb 07 jari 455                 if(constraintList != null && constraintList.getLength() > 0) {
2 26 Feb 07 jari 456                     constraint = (Element)(constraintList.item(0));
2 26 Feb 07 jari 457                     min = constraint.getAttribute("min");
2 26 Feb 07 jari 458                     max = constraint.getAttribute("max");
2 26 Feb 07 jari 459                 }
2 26 Feb 07 jari 460                 table+="<tr><td>"+key+"</td><td>"+valueType+"</td><td>"+min+"</td><td>"+max+"</td><td>"+ (valStatus.equalsIgnoreCase("REQUIRED") ? "Always" : "Dependent") +"</td></tr>";
2 26 Feb 07 jari 461             }
2 26 Feb 07 jari 462             table += "</table>";
2 26 Feb 07 jari 463         }
2 26 Feb 07 jari 464         return table;
2 26 Feb 07 jari 465     }
2 26 Feb 07 jari 466     
2 26 Feb 07 jari 467     
2 26 Feb 07 jari 468     
2 26 Feb 07 jari 469     /** returns a hash table for specified algorithm.
2 26 Feb 07 jari 470      * @param algName algorithm name
2 26 Feb 07 jari 471      * @return
2 26 Feb 07 jari 472      */
2 26 Feb 07 jari 473     public Hashtable getParameterHash(String algName) {
2 26 Feb 07 jari 474
2 26 Feb 07 jari 475         Element algElement = findAlgorithmElement(algName);
2 26 Feb 07 jari 476         if(algElement == null) {
2 26 Feb 07 jari 477             return null;
2 26 Feb 07 jari 478         }
2 26 Feb 07 jari 479         
2 26 Feb 07 jari 480         Element paramList = (Element)(algElement.getElementsByTagName("param_list").item(0));
2 26 Feb 07 jari 481         Hashtable paramHash = new Hashtable();
2 26 Feb 07 jari 482         NodeList list = paramList.getElementsByTagName("param");
2 26 Feb 07 jari 483         
2 26 Feb 07 jari 484         String key;
2 26 Feb 07 jari 485         String valueType;
2 26 Feb 07 jari 486         String valueRequirements;
2 26 Feb 07 jari 487         boolean hasConstraints;
2 26 Feb 07 jari 488         String min;
2 26 Feb 07 jari 489         String max;
2 26 Feb 07 jari 490         
2 26 Feb 07 jari 491         Element paramElement;
2 26 Feb 07 jari 492         NodeList constrList;
2 26 Feb 07 jari 493         
2 26 Feb 07 jari 494         ParameterAttributes attr;
2 26 Feb 07 jari 495         Element constrElement;
2 26 Feb 07 jari 496         
2 26 Feb 07 jari 497         for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 498             paramElement = (Element)(list.item(i));
2 26 Feb 07 jari 499             
2 26 Feb 07 jari 500             key = paramElement.getAttribute("key");
2 26 Feb 07 jari 501             valueType = paramElement.getAttribute("value_type");
2 26 Feb 07 jari 502             valueRequirements = paramElement.getAttribute("val_level");
2 26 Feb 07 jari 503             
2 26 Feb 07 jari 504             constrList = null;
2 26 Feb 07 jari 505             constrList = paramElement.getElementsByTagName("constraint");
2 26 Feb 07 jari 506             if(constrList == null || constrList.getLength() == 0) {
2 26 Feb 07 jari 507                 attr = new ParameterAttributes(key, valueType, valueRequirements);
2 26 Feb 07 jari 508             } else {
2 26 Feb 07 jari 509                 constrElement = (Element)(constrList.item(0));
2 26 Feb 07 jari 510                 min = constrElement.getAttribute("min");
2 26 Feb 07 jari 511                 max = constrElement.getAttribute("max");
2 26 Feb 07 jari 512                 attr = new ParameterAttributes(key, valueType, valueRequirements, min, max);
2 26 Feb 07 jari 513             }
2 26 Feb 07 jari 514             paramHash.put(key, attr);
2 26 Feb 07 jari 515         }
2 26 Feb 07 jari 516         return paramHash;
2 26 Feb 07 jari 517     }
2 26 Feb 07 jari 518     
2 26 Feb 07 jari 519     
2 26 Feb 07 jari 520     
2 26 Feb 07 jari 521     /** Returns a <CODE>ParameterAttributes</CODE> object for algorithm and
2 26 Feb 07 jari 522      * specified key.
2 26 Feb 07 jari 523      * @param algName
2 26 Feb 07 jari 524      * @param key
2 26 Feb 07 jari 525      * @return
2 26 Feb 07 jari 526      */
2 26 Feb 07 jari 527     public ParameterAttributes getParameterAttributes(String algName, String key) {
2 26 Feb 07 jari 528         Hashtable hash = getParameterHash(algName);
2 26 Feb 07 jari 529         if(hash == null)
2 26 Feb 07 jari 530             return null;
2 26 Feb 07 jari 531         
2 26 Feb 07 jari 532         return (ParameterAttributes)(hash.get(key));
2 26 Feb 07 jari 533     }
2 26 Feb 07 jari 534
2 26 Feb 07 jari 535     /** Displays a dialog warning that loaded algorithms are dependent on the specific data
2 26 Feb 07 jari 536      * set.  Parameters such as grouping experiments is an example
2 26 Feb 07 jari 537      * @param tree the script tree to evaluate
2 26 Feb 07 jari 538      * @param manager the script manager     
2 26 Feb 07 jari 539      */
2 26 Feb 07 jari 540        public void checkAlgorithmsForDataDependance(ScriptTree tree, ScriptManager manager) {
2 26 Feb 07 jari 541         AlgorithmSet [] algSet = tree.getAlgorithmSets();        
2 26 Feb 07 jari 542         Element algElement;
2 26 Feb 07 jari 543         String algName;
2 26 Feb 07 jari 544         Vector algNames = new Vector();
2 26 Feb 07 jari 545         for(int i = 0; i < algSet.length; i++) {
2 26 Feb 07 jari 546             for(int j = 0; j < algSet[i].getAlgorithmCount(); j++) {
2 26 Feb 07 jari 547                 algName = algSet[i].getAlgorithmNodeAt(j).getAlgorithmName();
2 26 Feb 07 jari 548                 algElement = findAlgorithmElement(algName);
2 26 Feb 07 jari 549                 if(algElement != null) {
2 26 Feb 07 jari 550                     if(algElement.getAttribute("input_data_dep").equals("true")) {
2 26 Feb 07 jari 551                         if(!algNames.contains(algName))
2 26 Feb 07 jari 552                             algNames.addElement(algName);
2 26 Feb 07 jari 553                     }
2 26 Feb 07 jari 554                 }
2 26 Feb 07 jari 555             }
2 26 Feb 07 jari 556         }
2 26 Feb 07 jari 557         if(algNames.size() > 0) {
2 26 Feb 07 jari 558             JTextPane pane = new JTextPane();
2 26 Feb 07 jari 559             pane.setContentType("text/html");
2 26 Feb 07 jari 560             pane.setEditable(false);
2 26 Feb 07 jari 561             pane.setMargin(new Insets(10,10,10,5));
2 26 Feb 07 jari 562             String text = "<html><center><h2>Data Dependent Script Algorithms</h2></center>";
2 26 Feb 07 jari 563             text += "<hr size=3>The processing of the following algorithm";
2 26 Feb 07 jari 564             if(algNames.size() == 1)
2 26 Feb 07 jari 565                 text += " is ";
2 26 Feb 07 jari 566             else
2 26 Feb 07 jari 567                 text+= "s are ";
2 26 Feb 07 jari 568             text+= "dependent on the number and order of the loaded experiments.<br>";
2 26 Feb 07 jari 569             text+= "<center><b>";
2 26 Feb 07 jari 570             for(int i = 0 ; i < algNames.size(); i++) {                
2 26 Feb 07 jari 571                 text+= ((String)(algNames.elementAt(i)))+"<br>";
2 26 Feb 07 jari 572             }   
2 26 Feb 07 jari 573            text+= "</b><br></center>";
2 26 Feb 07 jari 574            text+= "Please verify that the data set (number of loaded experiments and their order) is appropriate for the listed algorithms.</html>";
2 26 Feb 07 jari 575            pane.setText(text);
2 26 Feb 07 jari 576                       
2 26 Feb 07 jari 577            JScrollPane scroll = new JScrollPane(pane);
2 26 Feb 07 jari 578            scroll.setViewportBorder(BorderFactory.createLineBorder(Color.black));
2 26 Feb 07 jari 579            scroll.getViewport().setViewSize(new Dimension(450, 275));
2 26 Feb 07 jari 580           
2 26 Feb 07 jari 581            scroll.setPreferredSize(new Dimension(450, 275));
2 26 Feb 07 jari 582            JOptionPane.showMessageDialog(manager.getFrame(), scroll, "Data Set Dependent Algorithms", JOptionPane.PLAIN_MESSAGE);
2 26 Feb 07 jari 583         }
2 26 Feb 07 jari 584     }
2 26 Feb 07 jari 585        
2 26 Feb 07 jari 586     
2 26 Feb 07 jari 587     /** Returns the algorithm element given an algorithm name
2 26 Feb 07 jari 588      * @param algName
2 26 Feb 07 jari 589      * @return
2 26 Feb 07 jari 590      */
2 26 Feb 07 jari 591     private Element findAlgorithmElement(String algName) {
2 26 Feb 07 jari 592         NodeList list = validationRoot.getElementsByTagName("script_algorithm");
2 26 Feb 07 jari 593         Element algElement = null;
2 26 Feb 07 jari 594         String algElementName;
2 26 Feb 07 jari 595         for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 596             algElementName = null;
2 26 Feb 07 jari 597             algElement = (Element)(list.item(i));
2 26 Feb 07 jari 598             algElementName = algElement.getAttribute("name");
2 26 Feb 07 jari 599             if(algElementName != null && algElementName.equals(algName))
2 26 Feb 07 jari 600                 return algElement;
2 26 Feb 07 jari 601         }
2 26 Feb 07 jari 602         return null;
2 26 Feb 07 jari 603     }
2 26 Feb 07 jari 604     
2 26 Feb 07 jari 605     
2 26 Feb 07 jari 606     
2 26 Feb 07 jari 607     //  WARNING Event Handler
2 26 Feb 07 jari 608     /** records a warning
2 26 Feb 07 jari 609      * @param e
2 26 Feb 07 jari 610      * @throws SAXException
2 26 Feb 07 jari 611      */
2 26 Feb 07 jari 612     public void warning(SAXParseException e)
2 26 Feb 07 jari 613     throws SAXException {
2 26 Feb 07 jari 614         
2 26 Feb 07 jari 615     }
2 26 Feb 07 jari 616     
2 26 Feb 07 jari 617     //  ERROR Event Handler
2 26 Feb 07 jari 618     /** records a warning.
2 26 Feb 07 jari 619      */
2 26 Feb 07 jari 620     public void error(SAXParseException e)
2 26 Feb 07 jari 621     throws SAXException {
2 26 Feb 07 jari 622     }
2 26 Feb 07 jari 623     
2 26 Feb 07 jari 624     //  FATAL ERROR Event Handler
2 26 Feb 07 jari 625     /** records a fatal error
2 26 Feb 07 jari 626      */
2 26 Feb 07 jari 627     public void fatalError(SAXParseException e)
2 26 Feb 07 jari 628     throws SAXException {
2 26 Feb 07 jari 629     }
2 26 Feb 07 jari 630     
2 26 Feb 07 jari 631 }