mev-4.0.01/source/org/tigr/microarray/mev/script/util/DocumentBase.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  * ScriptHandler.java
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created on February 14, 2004, 10:44 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.io.File;
2 26 Feb 07 jari 14 import java.io.FileWriter;
2 26 Feb 07 jari 15 import java.io.IOException;
2 26 Feb 07 jari 16 import java.io.Serializable;
2 26 Feb 07 jari 17 import java.io.Writer;
2 26 Feb 07 jari 18 import java.util.Enumeration;
2 26 Feb 07 jari 19 import java.util.Hashtable;
2 26 Feb 07 jari 20 import java.util.Iterator;
2 26 Feb 07 jari 21 import java.util.Map;
2 26 Feb 07 jari 22 import java.util.Set;
2 26 Feb 07 jari 23 import java.util.StringTokenizer;
2 26 Feb 07 jari 24 import java.util.Vector;
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26 import org.apache.xerces.dom.DOMImplementationImpl;
2 26 Feb 07 jari 27 import org.apache.xerces.parsers.DOMParser;
2 26 Feb 07 jari 28 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.Progress;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.script.ScriptManager;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.script.event.ScriptDocumentEvent;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.script.event.ScriptEventListener;
2 26 Feb 07 jari 34 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 35 import org.w3c.dom.Comment;
2 26 Feb 07 jari 36 import org.w3c.dom.Document;
2 26 Feb 07 jari 37 import org.w3c.dom.DocumentType;
2 26 Feb 07 jari 38 import org.w3c.dom.Element;
2 26 Feb 07 jari 39 import org.w3c.dom.NamedNodeMap;
2 26 Feb 07 jari 40 import org.w3c.dom.Node;
2 26 Feb 07 jari 41 import org.w3c.dom.NodeList;
2 26 Feb 07 jari 42 import org.w3c.dom.Text;
2 26 Feb 07 jari 43 import org.xml.sax.SAXException;
2 26 Feb 07 jari 44 import org.xml.sax.SAXParseException;
2 26 Feb 07 jari 45 import org.xml.sax.helpers.DefaultHandler;
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47
2 26 Feb 07 jari 48
2 26 Feb 07 jari 49 /** DocumentBase is the base class for <CODE>ScriptDocument</CODE> objects
2 26 Feb 07 jari 50  * and maintains core function for DOM creation, modification, and output.
2 26 Feb 07 jari 51  * @author braisted
2 26 Feb 07 jari 52  */
2 26 Feb 07 jari 53 public class DocumentBase extends DefaultHandler implements Serializable {
2 26 Feb 07 jari 54     public static final long serialVersionUID = 1000102010302010001L;    
2 26 Feb 07 jari 55     /** Current verson to append
2 26 Feb 07 jari 56      */
2 26 Feb 07 jari 57     protected String tm4ScriptVersion = "1.0";
2 26 Feb 07 jari 58     /** script version
2 26 Feb 07 jari 59      */
2 26 Feb 07 jari 60     protected String mevScriptVersion = "1.0";
2 26 Feb 07 jari 61     /** <CODE>ScriptManager</CODE> to be used as a outward communication mode.
2 26 Feb 07 jari 62      */
2 26 Feb 07 jari 63     protected ScriptManager manager;
2 26 Feb 07 jari 64     
2 26 Feb 07 jari 65     /** XML Document
2 26 Feb 07 jari 66      */
2 26 Feb 07 jari 67     protected Document document;
2 26 Feb 07 jari 68     /** Script text string.  This is kept current for fast rendering.
2 26 Feb 07 jari 69      */
2 26 Feb 07 jari 70     protected String scriptText;
2 26 Feb 07 jari 71     /** Root element
2 26 Feb 07 jari 72      */
2 26 Feb 07 jari 73     protected Element root;
2 26 Feb 07 jari 74     /** mev Element
2 26 Feb 07 jari 75      */
2 26 Feb 07 jari 76     protected Element mevElement;
2 26 Feb 07 jari 77     /** Primary data element
2 26 Feb 07 jari 78      */
2 26 Feb 07 jari 79     protected Element primaryDataElement;
2 26 Feb 07 jari 80     /** main comment element.
2 26 Feb 07 jari 81      */
2 26 Feb 07 jari 82     protected Element commentElement;
2 26 Feb 07 jari 83     
2 26 Feb 07 jari 84     /** Analysis element.
2 26 Feb 07 jari 85      */
2 26 Feb 07 jari 86     protected Element analysisElement;
2 26 Feb 07 jari 87     
2 26 Feb 07 jari 88     /** Data id incrementer.  Increases as document grows.
2 26 Feb 07 jari 89      */
2 26 Feb 07 jari 90     protected int currDataID = 1;
2 26 Feb 07 jari 91     /** <CODE>AlgorithmSet</CODE> ID incrementer to increase during
2 26 Feb 07 jari 92      * script expansion.
2 26 Feb 07 jari 93      */
2 26 Feb 07 jari 94     protected int currAlgSetID = 1;
2 26 Feb 07 jari 95     /** Line separator for script rendering.
2 26 Feb 07 jari 96      */
2 26 Feb 07 jari 97     protected String lineSeparator = System.getProperty("line.separator");
2 26 Feb 07 jari 98     /** Indent.
2 26 Feb 07 jari 99      */
2 26 Feb 07 jari 100     protected String indent = "   ";
2 26 Feb 07 jari 101     
2 26 Feb 07 jari 102     /** Records number of errors found on validation.
2 26 Feb 07 jari 103      */
2 26 Feb 07 jari 104     protected int parseErrors = 0;
2 26 Feb 07 jari 105     /** The <CODE>ErrorLog</CODE> object dedicated to this object.
2 26 Feb 07 jari 106      */
2 26 Feb 07 jari 107     protected ErrorLog errorLog;
2 26 Feb 07 jari 108     
2 26 Feb 07 jari 109     /** Script listner vector.  This will permit update events
2 26 Feb 07 jari 110      * to be handled correctly.
2 26 Feb 07 jari 111      */
2 26 Feb 07 jari 112     private Vector listeners;
2 26 Feb 07 jari 113     protected boolean parsedScript = false;
2 26 Feb 07 jari 114
2 26 Feb 07 jari 115     /** Inidicates if the text string represenation is current
2 26 Feb 07 jari 116      */
2 26 Feb 07 jari 117     protected boolean isTextCurrent = false;
2 26 Feb 07 jari 118     
2 26 Feb 07 jari 119      
2 26 Feb 07 jari 120     /** Creates a new instance of DocumentBase
2 26 Feb 07 jari 121      * @param manager <CODE>ScriptManager</CODE> object.
2 26 Feb 07 jari 122      */
2 26 Feb 07 jari 123     public DocumentBase(ScriptManager manager) {
2 26 Feb 07 jari 124         this.manager = manager;
2 26 Feb 07 jari 125         errorLog = new ErrorLog(manager);
2 26 Feb 07 jari 126         listeners = new Vector();
2 26 Feb 07 jari 127         
2 26 Feb 07 jari 128         DOMImplementationImpl impl = new DOMImplementationImpl();
2 26 Feb 07 jari 129         DocumentType docType = impl.createDocumentType("TM4ML",null,"../../config/mev_script_dtd.dtd");
2 26 Feb 07 jari 130         
2 26 Feb 07 jari 131         document = impl.createDocument(null, "TM4ML", docType);
2 26 Feb 07 jari 132         
2 26 Feb 07 jari 133         root = document.getDocumentElement();
2 26 Feb 07 jari 134         root.setAttribute("version", tm4ScriptVersion);
2 26 Feb 07 jari 135         
2 26 Feb 07 jari 136         mevElement = document.createElement("mev");
2 26 Feb 07 jari 137         mevElement.setAttribute("version", mevScriptVersion);
2 26 Feb 07 jari 138         root.appendChild(mevElement);
2 26 Feb 07 jari 139         
2 26 Feb 07 jari 140         analysisElement = document.createElement("analysis");
2 26 Feb 07 jari 141         primaryDataElement = document.createElement("primary_data");
2 26 Feb 07 jari 142         primaryDataElement.setAttribute("id", "1");
2 26 Feb 07 jari 143         
2 26 Feb 07 jari 144         createAlgorithmSet(1); //default algoritm set
2 26 Feb 07 jari 145         
2 26 Feb 07 jari 146         //Element fileListElement = document.createElement("file_list");
2 26 Feb 07 jari 147         //primaryDataElement.appendChild(fileListElement);
2 26 Feb 07 jari 148         
2 26 Feb 07 jari 149         mevElement.appendChild(primaryDataElement);
2 26 Feb 07 jari 150         mevElement.appendChild(analysisElement);
2 26 Feb 07 jari 151         
2 26 Feb 07 jari 152         scriptText = new String("");
2 26 Feb 07 jari 153         updateScript();
2 26 Feb 07 jari 154         
2 26 Feb 07 jari 155         // Element rootElement = new Element("tm4");
2 26 Feb 07 jari 156         // document = new Document(rootElement);
2 26 Feb 07 jari 157     }
2 26 Feb 07 jari 158     
2 26 Feb 07 jari 159     
2 26 Feb 07 jari 160     /** Creates a new instance of DocumentBase.
2 26 Feb 07 jari 161      * @param date creation datae
2 26 Feb 07 jari 162      * @param name name attribute
2 26 Feb 07 jari 163      * @param description Description attribute.
2 26 Feb 07 jari 164      * @param manager ScriptManager.
2 26 Feb 07 jari 165      */
2 26 Feb 07 jari 166     public DocumentBase(String date, String name, String description, ScriptManager  manager) {
2 26 Feb 07 jari 167         this.manager = manager;
2 26 Feb 07 jari 168         errorLog = new ErrorLog(manager);
2 26 Feb 07 jari 169         listeners = new Vector();
2 26 Feb 07 jari 170         
2 26 Feb 07 jari 171         DOMImplementationImpl impl = new DOMImplementationImpl();
2 26 Feb 07 jari 172         DocumentType docType = impl.createDocumentType("TM4ML",null,"../../config/mev_script_dtd.dtd");
2 26 Feb 07 jari 173         
2 26 Feb 07 jari 174         document = impl.createDocument(null, "TM4ML", docType);
2 26 Feb 07 jari 175         
2 26 Feb 07 jari 176         root = document.getDocumentElement();
2 26 Feb 07 jari 177         root.setAttribute("version", tm4ScriptVersion);
2 26 Feb 07 jari 178         
2 26 Feb 07 jari 179         
2 26 Feb 07 jari 180         mevElement = document.createElement("mev");
2 26 Feb 07 jari 181         mevElement.setAttribute("version", mevScriptVersion);
2 26 Feb 07 jari 182         root.appendChild(mevElement);
2 26 Feb 07 jari 183         
2 26 Feb 07 jari 184         if(date != null) {
2 26 Feb 07 jari 185             setDateComment(date);
2 26 Feb 07 jari 186         }
2 26 Feb 07 jari 187         
2 26 Feb 07 jari 188         if(name != null) {
2 26 Feb 07 jari 189             setNameComment(name);
2 26 Feb 07 jari 190         }
2 26 Feb 07 jari 191         
2 26 Feb 07 jari 192         if(description != null) {
2 26 Feb 07 jari 193             setDescriptionComment(description);
2 26 Feb 07 jari 194         }
2 26 Feb 07 jari 195         
2 26 Feb 07 jari 196         analysisElement = document.createElement("analysis");
2 26 Feb 07 jari 197         primaryDataElement = document.createElement("primary_data");
2 26 Feb 07 jari 198         primaryDataElement.setAttribute("id", "1");
2 26 Feb 07 jari 199         
2 26 Feb 07 jari 200         createAlgorithmSet(1); //default algoritm set
2 26 Feb 07 jari 201         
2 26 Feb 07 jari 202         mevElement.appendChild(primaryDataElement);
2 26 Feb 07 jari 203         mevElement.appendChild(analysisElement);
2 26 Feb 07 jari 204         
2 26 Feb 07 jari 205         scriptText = new String("");
2 26 Feb 07 jari 206         updateScript();
2 26 Feb 07 jari 207     }
2 26 Feb 07 jari 208     
2 26 Feb 07 jari 209     /** Copy constructor
2 26 Feb 07 jari 210      * @param base base object to copy
2 26 Feb 07 jari 211      */    
2 26 Feb 07 jari 212     public DocumentBase(DocumentBase base) {
2 26 Feb 07 jari 213         this.manager = base.getManager();
2 26 Feb 07 jari 214         this.document = copyDocument(base.getDocument());
2 26 Feb 07 jari 215     }
2 26 Feb 07 jari 216     
2 26 Feb 07 jari 217     
2 26 Feb 07 jari 218     /** Constructs a copy of the document passed
2 26 Feb 07 jari 219      * @param doc Document to copy
2 26 Feb 07 jari 220      * @return
2 26 Feb 07 jari 221      */    
2 26 Feb 07 jari 222     private Document copyDocument(Document doc) {
2 26 Feb 07 jari 223         DOMImplementationImpl impl = new DOMImplementationImpl();
2 26 Feb 07 jari 224         DocumentType docType = impl.createDocumentType("TM4ML",null,"../../config/mev_script_dtd.dtd");
2 26 Feb 07 jari 225         
2 26 Feb 07 jari 226         Document newDoc =  impl.createDocument(null, "TM4ML", docType);
2 26 Feb 07 jari 227         copyChildren(doc.getDocumentElement(), newDoc.getDocumentElement(), newDoc);
2 26 Feb 07 jari 228         isTextCurrent = false;
2 26 Feb 07 jari 229         return newDoc;
2 26 Feb 07 jari 230     }
2 26 Feb 07 jari 231     
2 26 Feb 07 jari 232     /** Recursive method to copy document children, used as
2 26 Feb 07 jari 233      * a Document copy utility.
2 26 Feb 07 jari 234      * @param docElement Document Element to use as source for
2 26 Feb 07 jari 235      * children to copy
2 26 Feb 07 jari 236      * @param newElement destination element for copied children
2 26 Feb 07 jari 237      * @param newDoc New Document to import new nodes.
2 26 Feb 07 jari 238      */    
2 26 Feb 07 jari 239     private void copyChildren(org.w3c.dom.Node docElement, org.w3c.dom.Node newElement, org.w3c.dom.Document newDoc) {
2 26 Feb 07 jari 240         NodeList nodes = docElement.getChildNodes();
2 26 Feb 07 jari 241         org.w3c.dom.Node newNode;
2 26 Feb 07 jari 242         org.w3c.dom.Node oldNode;
2 26 Feb 07 jari 243         
2 26 Feb 07 jari 244         for(int i = 0; i < nodes.getLength(); i++) {
2 26 Feb 07 jari 245             oldNode = (org.w3c.dom.Node)(nodes.item(i));
2 26 Feb 07 jari 246
2 26 Feb 07 jari 247             newNode = newDoc.importNode(oldNode, false);
2 26 Feb 07 jari 248             newElement.appendChild(newNode);
2 26 Feb 07 jari 249             
2 26 Feb 07 jari 250             if(oldNode.hasChildNodes())
2 26 Feb 07 jari 251                 copyChildren(oldNode, newNode, newDoc);
2 26 Feb 07 jari 252         }
2 26 Feb 07 jari 253         isTextCurrent = false;
2 26 Feb 07 jari 254     }
2 26 Feb 07 jari 255     
2 26 Feb 07 jari 256     
2 26 Feb 07 jari 257     /** Set the Document object.
2 26 Feb 07 jari 258      * @param doc source Document
2 26 Feb 07 jari 259      */
2 26 Feb 07 jari 260     public void setDocument(Document doc) {
2 26 Feb 07 jari 261         document = doc;
2 26 Feb 07 jari 262         updateScript();
2 26 Feb 07 jari 263     }
2 26 Feb 07 jari 264     
2 26 Feb 07 jari 265     /** Returns the base Document.
2 26 Feb 07 jari 266      */
2 26 Feb 07 jari 267     public Document getDocument() {
2 26 Feb 07 jari 268         return this.document;
2 26 Feb 07 jari 269     }
2 26 Feb 07 jari 270     
2 26 Feb 07 jari 271     
2 26 Feb 07 jari 272     /** Returns the <CODE>ScriptManager</CODE> for the script
2 26 Feb 07 jari 273      */
2 26 Feb 07 jari 274     public ScriptManager getManager() {
2 26 Feb 07 jari 275         return this.manager;
2 26 Feb 07 jari 276     }
2 26 Feb 07 jari 277     
2 26 Feb 07 jari 278     /** Sets the date
2 26 Feb 07 jari 279      * @param comment Date comment
2 26 Feb 07 jari 280      */
2 26 Feb 07 jari 281     public void setDateComment(String comment) {
2 26 Feb 07 jari 282         Comment nameElement = document.createComment(" Original Script Creation Date: " + comment +" ");
2 26 Feb 07 jari 283         mevElement.appendChild(nameElement);
2 26 Feb 07 jari 284         updateScript();
2 26 Feb 07 jari 285     }
2 26 Feb 07 jari 286     
2 26 Feb 07 jari 287     /** Sets name comment.
2 26 Feb 07 jari 288      * @param comment name
2 26 Feb 07 jari 289      */
2 26 Feb 07 jari 290     public void setNameComment(String comment) {
2 26 Feb 07 jari 291         Comment nameElement = document.createComment(" Script Name: " + comment+" ");
2 26 Feb 07 jari 292         mevElement.appendChild(nameElement);
2 26 Feb 07 jari 293         updateScript();
2 26 Feb 07 jari 294     }
2 26 Feb 07 jari 295     
2 26 Feb 07 jari 296     /** Sets description comment
2 26 Feb 07 jari 297      * @param comment description
2 26 Feb 07 jari 298      */
2 26 Feb 07 jari 299     public void setDescriptionComment(String comment) {
2 26 Feb 07 jari 300         Comment dElement = document.createComment(" Script Description: "+ comment + " ");
2 26 Feb 07 jari 301         mevElement.appendChild(dElement);
2 26 Feb 07 jari 302         updateScript();
2 26 Feb 07 jari 303     }
2 26 Feb 07 jari 304     
2 26 Feb 07 jari 305     
2 26 Feb 07 jari 306     /** Creates a new algorithm set with the provided data id.
2 26 Feb 07 jari 307      * @param dataRef Data reference ID.
2 26 Feb 07 jari 308      * @return
2 26 Feb 07 jari 309      */
2 26 Feb 07 jari 310     private Element createAlgorithmSet(int dataRef){
2 26 Feb 07 jari 311         Element algSetElement = document.createElement("alg_set");
2 26 Feb 07 jari 312         algSetElement.setAttribute("set_id", String.valueOf(currAlgSetID));
2 26 Feb 07 jari 313         algSetElement.setAttribute("input_data_ref", String.valueOf(dataRef));
2 26 Feb 07 jari 314         analysisElement.appendChild(algSetElement);
2 26 Feb 07 jari 315         //updateScript();
2 26 Feb 07 jari 316         currAlgSetID++;
2 26 Feb 07 jari 317         isTextCurrent = false;
2 26 Feb 07 jari 318         return algSetElement;
2 26 Feb 07 jari 319     }
2 26 Feb 07 jari 320     
2 26 Feb 07 jari 321     /** Returns an algorithm set by ID
2 26 Feb 07 jari 322      * @param setID id
2 26 Feb 07 jari 323      * @return
2 26 Feb 07 jari 324      */
2 26 Feb 07 jari 325     private Element getAlgorithmSetByID(int setID){
2 26 Feb 07 jari 326         String id = String.valueOf(setID);
2 26 Feb 07 jari 327         NodeList elements = analysisElement.getElementsByTagName("alg_set");
2 26 Feb 07 jari 328         
2 26 Feb 07 jari 329         for(int i = 0; i < elements.getLength(); i++) {
2 26 Feb 07 jari 330             if(id.equals(((Element)elements.item(i)).getAttribute("set_id")))
2 26 Feb 07 jari 331                 return (Element)elements.item(i);
2 26 Feb 07 jari 332         }
2 26 Feb 07 jari 333         return null;
2 26 Feb 07 jari 334     }
2 26 Feb 07 jari 335     
2 26 Feb 07 jari 336     
2 26 Feb 07 jari 337     /** Returns an algorithm set by id
2 26 Feb 07 jari 338      * @param dataRef ref (data id)
2 26 Feb 07 jari 339      * @return
2 26 Feb 07 jari 340      */
2 26 Feb 07 jari 341     private Element getAlgorithmSetByDataRef(int dataRef) {
2 26 Feb 07 jari 342         int setID = -1;
2 26 Feb 07 jari 343         String dataID = String.valueOf(dataRef);
2 26 Feb 07 jari 344         //if data ref. is to primary data return default alg set
2 26 Feb 07 jari 345         if(dataRef == 1)
2 26 Feb 07 jari 346             return getAlgorithmSetByID(1);
2 26 Feb 07 jari 347         
2 26 Feb 07 jari 348         NodeList list = document.getElementsByTagName("algorithm");
2 26 Feb 07 jari 349         Node algNode = null, node;
2 26 Feb 07 jari 350         for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 351             node = list.item(i);
2 26 Feb 07 jari 352             if(dataID.equals(((Element)node).getAttribute("input_data_ref"))){
2 26 Feb 07 jari 353                 algNode = node;
2 26 Feb 07 jari 354                 break;
2 26 Feb 07 jari 355             }
2 26 Feb 07 jari 356         }
2 26 Feb 07 jari 357         
2 26 Feb 07 jari 358         //the data node has no algs on it, create an alg set, pass the current id back
2 26 Feb 07 jari 359         if(algNode == null) {
2 26 Feb 07 jari 360             return this.createAlgorithmSet(dataRef);
2 26 Feb 07 jari 361         } else {
2 26 Feb 07 jari 362             return (Element)algNode.getParentNode();
2 26 Feb 07 jari 363         }
2 26 Feb 07 jari 364     }
2 26 Feb 07 jari 365     
2 26 Feb 07 jari 366     
2 26 Feb 07 jari 367     
2 26 Feb 07 jari 368     
2 26 Feb 07 jari 369     //need to get an algorithm ID, and get or make an alg set ref.
2 26 Feb 07 jari 370     
2 26 Feb 07 jari 371     /** Returns true if algorithm is appended.  This is a primary method for
2 26 Feb 07 jari 372      * script expansion.
2 26 Feb 07 jari 373      * @param data AlgorithmData with parameters.
2 26 Feb 07 jari 374      * @param inputDataRef Input data reference (ID)
2 26 Feb 07 jari 375      * @return
2 26 Feb 07 jari 376      */
2 26 Feb 07 jari 377     public boolean appendAlgorithm(AlgorithmData data, int inputDataRef) {
2 26 Feb 07 jari 378         
2 26 Feb 07 jari 379         Element algElement = document.createElement("algorithm");
2 26 Feb 07 jari 380         Element currElement;
2 26 Feb 07 jari 381         boolean added = false;
2 26 Feb 07 jari 382         
2 26 Feb 07 jari 383         Element algSetElement = this.getAlgorithmSetByDataRef(inputDataRef);
2 26 Feb 07 jari 384         
2 26 Feb 07 jari 385         if(algSetElement == null) {
2 26 Feb 07 jari 386             return false;
2 26 Feb 07 jari 387         }
2 26 Feb 07 jari 388         
2 26 Feb 07 jari 389         Text nameText, keyText, valueText;
2 26 Feb 07 jari 390         
2 26 Feb 07 jari 391         AlgorithmParameters params = data.getParams();
2 26 Feb 07 jari 392         String name = params.getString("name");
2 26 Feb 07 jari 393         String alg_type = params.getString("alg-type");
2 26 Feb 07 jari 394         int algID = algSetElement.getElementsByTagName("algorithm").getLength()+1;
2 26 Feb 07 jari 395         
2 26 Feb 07 jari 396         if(name != null){
2 26 Feb 07 jari 397             //set attributes, name and input ref
2 26 Feb 07 jari 398             algElement.setAttribute("alg_name", name);
2 26 Feb 07 jari 399             algElement.setAttribute("input_data_ref", String.valueOf(inputDataRef));
2 26 Feb 07 jari 400             algElement.setAttribute("alg_id", String.valueOf(algID));
2 26 Feb 07 jari 401             algElement.setAttribute("alg_type", String.valueOf(alg_type));
2 26 Feb 07 jari 402             //add parameter list with params
2 26 Feb 07 jari 403             addParameterList(algElement, params);
2 26 Feb 07 jari 404             
2 26 Feb 07 jari 405             //add matrices (or arrays, one dim matrices)
2 26 Feb 07 jari 406             Element matrices = document.createElement("mlist");
2 26 Feb 07 jari 407             
2 26 Feb 07 jari 408             //Int arrays
2 26 Feb 07 jari 409             Map map = data.getIntArrays();
2 26 Feb 07 jari 410             if(map.size() > 0) {
2 26 Feb 07 jari 411                 addIntArrays(map, matrices);
2 26 Feb 07 jari 412             }
2 26 Feb 07 jari 413             
2 26 Feb 07 jari 414             //String arrays
2 26 Feb 07 jari 415             map = data.getStringArrays();
2 26 Feb 07 jari 416             if(map.size() > 0) {
2 26 Feb 07 jari 417                 addStringArrays(map, matrices);
2 26 Feb 07 jari 418             }
2 26 Feb 07 jari 419             
2 26 Feb 07 jari 420             //matrices
2 26 Feb 07 jari 421             map = data.getMatrixes();
2 26 Feb 07 jari 422             if(map.size() > 0) {
2 26 Feb 07 jari 423                 addMatrices(map, matrices);
2 26 Feb 07 jari 424             }
2 26 Feb 07 jari 425             
2 26 Feb 07 jari 426             //if there are matrices, add them
2 26 Feb 07 jari 427             if(matrices.getChildNodes().getLength() > 0)
2 26 Feb 07 jari 428                 algElement.appendChild(matrices);
2 26 Feb 07 jari 429             
2 26 Feb 07 jari 430             //add output nodes
2 26 Feb 07 jari 431             String [] outputNodes = data.getStringArray("output-nodes");
2 26 Feb 07 jari 432             Element outputNodeElement, dataElement;
2 26 Feb 07 jari 433             String outputClass;
2 26 Feb 07 jari 434             if(outputNodes != null){
2 26 Feb 07 jari 435                 
2 26 Feb 07 jari 436                 outputNodeElement = document.createElement("output_data");
2 26 Feb 07 jari 437                 outputClass = data.getParams().getString("output-class");
2 26 Feb 07 jari 438                 if(outputClass != null)
2 26 Feb 07 jari 439                     outputNodeElement.setAttribute("output_class", outputClass);
2 26 Feb 07 jari 440                 for(int i = 0; i < outputNodes.length; i++) {
2 26 Feb 07 jari 441                     currDataID++;
2 26 Feb 07 jari 442                     dataElement = document.createElement("data_node");
2 26 Feb 07 jari 443                     dataElement.setAttribute("data_node_id", String.valueOf(this.currDataID));
2 26 Feb 07 jari 444                     dataElement.setAttribute("name", outputNodes[i]);
2 26 Feb 07 jari 445                     outputNodeElement.appendChild(dataElement);
2 26 Feb 07 jari 446                 }
2 26 Feb 07 jari 447                 algElement.appendChild(outputNodeElement);
2 26 Feb 07 jari 448             }
2 26 Feb 07 jari 449         }
2 26 Feb 07 jari 450         algSetElement.appendChild(algElement);
2 26 Feb 07 jari 451         added = true;
2 26 Feb 07 jari 452         
2 26 Feb 07 jari 453         //don't automatically update text until needed -- Test 01.12.2005 --
2 26 Feb 07 jari 454         //updateScript();
2 26 Feb 07 jari 455
2 26 Feb 07 jari 456         //set isTextCurrent to no to force update later
2 26 Feb 07 jari 457         isTextCurrent = false;
2 26 Feb 07 jari 458
2 26 Feb 07 jari 459         fireScriptEvent();
2 26 Feb 07 jari 460         return added;
2 26 Feb 07 jari 461     }
2 26 Feb 07 jari 462     
2 26 Feb 07 jari 463     
2 26 Feb 07 jari 464     /** Adds the parameter list to the model.
2 26 Feb 07 jari 465      * @param algElement Algorithm to recieve
2 26 Feb 07 jari 466      * @param params AlgorithmParameters
2 26 Feb 07 jari 467      */
2 26 Feb 07 jari 468     private void addParameterList(Element algElement, AlgorithmParameters params) {
2 26 Feb 07 jari 469         Map paramMap = params.getMap();
2 26 Feb 07 jari 470         String key = "", value = "";
2 26 Feb 07 jari 471         Element paramsElement, paramElement, keyElement, valueElement;
2 26 Feb 07 jari 472         
2 26 Feb 07 jari 473         if(paramMap.size() > 1) {
2 26 Feb 07 jari 474             Set keySet = paramMap.keySet();
2 26 Feb 07 jari 475             Iterator iter = keySet.iterator();
2 26 Feb 07 jari 476             paramsElement = document.createElement("plist");
2 26 Feb 07 jari 477             
2 26 Feb 07 jari 478             while(iter.hasNext()){
2 26 Feb 07 jari 479                 key = (String)iter.next();
2 26 Feb 07 jari 480                 value = ((String)(paramMap.get(key)));
2 26 Feb 07 jari 481                 
2 26 Feb 07 jari 482                 //if key points to control data move on
2 26 Feb 07 jari 483                 if(key.equals("name") || key.equals("output-class") || key.equals("alg-type"))
2 26 Feb 07 jari 484                     continue;
2 26 Feb 07 jari 485                 
2 26 Feb 07 jari 486                 //make a param element
2 26 Feb 07 jari 487                 paramElement = document.createElement("param");
2 26 Feb 07 jari 488                 
2 26 Feb 07 jari 489                 //set key and value attributes
2 26 Feb 07 jari 490                 paramElement.setAttribute("key", key);
2 26 Feb 07 jari 491                 paramElement.setAttribute("value", value);
2 26 Feb 07 jari 492                 
2 26 Feb 07 jari 493                 //append param to params
2 26 Feb 07 jari 494                 paramsElement.appendChild(paramElement);
2 26 Feb 07 jari 495             }
2 26 Feb 07 jari 496             algElement.appendChild(paramsElement);
2 26 Feb 07 jari 497         }
2 26 Feb 07 jari 498     }
2 26 Feb 07 jari 499     
2 26 Feb 07 jari 500     
2 26 Feb 07 jari 501     /** Adds integer arrays
2 26 Feb 07 jari 502      * @param map Map of the values.
2 26 Feb 07 jari 503      * @param mlist Matrix list Element
2 26 Feb 07 jari 504      */
2 26 Feb 07 jari 505     private void addIntArrays(Map map, Element mlist) {
2 26 Feb 07 jari 506         Object [] arrayObjectNames = map.keySet().toArray();
2 26 Feb 07 jari 507         Element matrixElement, elementElement;
2 26 Feb 07 jari 508         int [] currentArray;
2 26 Feb 07 jari 509         
2 26 Feb 07 jari 510         String [] arrayNames = new String[arrayObjectNames.length];
2 26 Feb 07 jari 511         
2 26 Feb 07 jari 512         for (int i = 0; i < arrayNames.length; i++)
2 26 Feb 07 jari 513             arrayNames[i] = (String)arrayObjectNames[i];
2 26 Feb 07 jari 514         
2 26 Feb 07 jari 515         
2 26 Feb 07 jari 516         for(int i = 0; i < arrayNames.length; i++) {
2 26 Feb 07 jari 517             currentArray = (int [])map.get(arrayNames[i]);
2 26 Feb 07 jari 518             
2 26 Feb 07 jari 519             matrixElement = document.createElement("matrix");
2 26 Feb 07 jari 520             matrixElement.setAttribute("name", arrayNames[i]);
2 26 Feb 07 jari 521             matrixElement.setAttribute("type", "int-array");
2 26 Feb 07 jari 522             matrixElement.setAttribute("row_dim", String.valueOf(currentArray.length));
2 26 Feb 07 jari 523             matrixElement.setAttribute("col_dim", "1");
2 26 Feb 07 jari 524             
2 26 Feb 07 jari 525             for(int j = 0; j < currentArray.length; j++){
2 26 Feb 07 jari 526                 elementElement = document.createElement("element");
2 26 Feb 07 jari 527                 elementElement.setAttribute("row", String.valueOf(j));
2 26 Feb 07 jari 528                 elementElement.setAttribute("col", "0");
2 26 Feb 07 jari 529                 elementElement.setAttribute("value", String.valueOf(currentArray[j]));
2 26 Feb 07 jari 530                 matrixElement.appendChild(elementElement);
2 26 Feb 07 jari 531             }
2 26 Feb 07 jari 532             
2 26 Feb 07 jari 533             mlist.appendChild(matrixElement);
2 26 Feb 07 jari 534         }
2 26 Feb 07 jari 535     }
2 26 Feb 07 jari 536     
2 26 Feb 07 jari 537     /** Add String arrays to the model
2 26 Feb 07 jari 538      * @param map value map
2 26 Feb 07 jari 539      * @param mlist Matrix list element.
2 26 Feb 07 jari 540      */
2 26 Feb 07 jari 541     private void addStringArrays(Map map, Element mlist) {
2 26 Feb 07 jari 542         Object [] arrayObjectNames = map.keySet().toArray();
2 26 Feb 07 jari 543         Element matrixElement, elementElement;
2 26 Feb 07 jari 544         String [] currentArray;
2 26 Feb 07 jari 545         
2 26 Feb 07 jari 546         String key;
2 26 Feb 07 jari 547         
2 26 Feb 07 jari 548         Vector arrayNames = new Vector();
2 26 Feb 07 jari 549         
2 26 Feb 07 jari 550         for (int i = 0; i < arrayObjectNames.length; i++) {
2 26 Feb 07 jari 551             key = (String)arrayObjectNames[i];
2 26 Feb 07 jari 552             if(!(key.equals("output-nodes")))
2 26 Feb 07 jari 553                 arrayNames.add(key);
2 26 Feb 07 jari 554         }
2 26 Feb 07 jari 555         
2 26 Feb 07 jari 556         if(arrayNames.size() < 1)
2 26 Feb 07 jari 557             return;
2 26 Feb 07 jari 558         
2 26 Feb 07 jari 559         for(int i = 0; i < arrayNames.size(); i++) {
2 26 Feb 07 jari 560             currentArray = (String [])map.get((String)(arrayNames.elementAt(i)));
2 26 Feb 07 jari 561             
2 26 Feb 07 jari 562             matrixElement = document.createElement("matrix");
2 26 Feb 07 jari 563             matrixElement.setAttribute("name", ((String)arrayNames.elementAt(i)));
2 26 Feb 07 jari 564             matrixElement.setAttribute("type", "string-array");
2 26 Feb 07 jari 565             matrixElement.setAttribute("row_dim", String.valueOf(currentArray.length));
2 26 Feb 07 jari 566             matrixElement.setAttribute("col_dim", "1");
2 26 Feb 07 jari 567             
2 26 Feb 07 jari 568             for(int j = 0; j < currentArray.length; j++){
2 26 Feb 07 jari 569                 elementElement = document.createElement("element");
2 26 Feb 07 jari 570                 elementElement.setAttribute("row", String.valueOf(j));
2 26 Feb 07 jari 571                 elementElement.setAttribute("col", "0");
2 26 Feb 07 jari 572                 elementElement.setAttribute("value", currentArray[j]);
2 26 Feb 07 jari 573                 matrixElement.appendChild(elementElement);
2 26 Feb 07 jari 574             }
2 26 Feb 07 jari 575             
2 26 Feb 07 jari 576             mlist.appendChild(matrixElement);
2 26 Feb 07 jari 577         }
2 26 Feb 07 jari 578     }
2 26 Feb 07 jari 579     
2 26 Feb 07 jari 580     /** Adds matices.
2 26 Feb 07 jari 581      * @param map Matrix refs.
2 26 Feb 07 jari 582      * @param mlist Matrix Element list.
2 26 Feb 07 jari 583      */
2 26 Feb 07 jari 584     private void addMatrices(Map map, Element mlist) {
2 26 Feb 07 jari 585         Object [] matrixObjectNames = map.keySet().toArray();
2 26 Feb 07 jari 586         Element matrixElement;
2 26 Feb 07 jari 587         
2 26 Feb 07 jari 588         FloatMatrix currentFM;
2 26 Feb 07 jari 589         
2 26 Feb 07 jari 590         String [] matrixNames = new String[matrixObjectNames.length];
2 26 Feb 07 jari 591         
2 26 Feb 07 jari 592         for (int i = 0; i < matrixNames.length; i++)
2 26 Feb 07 jari 593             matrixNames[i] = (String)matrixObjectNames[i];
2 26 Feb 07 jari 594         
2 26 Feb 07 jari 595         
2 26 Feb 07 jari 596         for(int i = 0; i < matrixNames.length; i++) {
2 26 Feb 07 jari 597             currentFM = (FloatMatrix)map.get(matrixNames[i]);
2 26 Feb 07 jari 598             
2 26 Feb 07 jari 599             matrixElement = document.createElement("matrix");
2 26 Feb 07 jari 600             matrixElement.setAttribute("name", matrixNames[i]);
2 26 Feb 07 jari 601             matrixElement.setAttribute("type", "FloatMatrix");
2 26 Feb 07 jari 602             matrixElement.setAttribute("row_dim", String.valueOf(currentFM.getRowDimension()));
2 26 Feb 07 jari 603             matrixElement.setAttribute("col_dim", String.valueOf(currentFM.getColumnDimension()));
2 26 Feb 07 jari 604             
2 26 Feb 07 jari 605             addMatrixElements(currentFM, matrixElement);
2 26 Feb 07 jari 606             
2 26 Feb 07 jari 607             mlist.appendChild(matrixElement);
2 26 Feb 07 jari 608         }
2 26 Feb 07 jari 609     }
2 26 Feb 07 jari 610     
2 26 Feb 07 jari 611     /** Adds actual matrix elements.
2 26 Feb 07 jari 612      * @param matrix FloatMatrix to append
2 26 Feb 07 jari 613      * @param matrixElement Element to receive. */
2 26 Feb 07 jari 614     private void addMatrixElements(FloatMatrix matrix, Element matrixElement) {
2 26 Feb 07 jari 615         Element elementElement;
2 26 Feb 07 jari 616         
2 26 Feb 07 jari 617         float [][] data = matrix.A;
2 26 Feb 07 jari 618         
2 26 Feb 07 jari 619         for(int i = 0; i < data.length; i++) {
2 26 Feb 07 jari 620             for(int j = 0; j < data[i].length; j++) {
2 26 Feb 07 jari 621                 elementElement = document.createElement("element");
2 26 Feb 07 jari 622                 elementElement.setAttribute("row", String.valueOf(i));
2 26 Feb 07 jari 623                 elementElement.setAttribute("col", String.valueOf(j));
2 26 Feb 07 jari 624                 elementElement.setAttribute("value", String.valueOf(data[i][j]));
2 26 Feb 07 jari 625                 matrixElement.appendChild(elementElement);
2 26 Feb 07 jari 626             }
2 26 Feb 07 jari 627         }
2 26 Feb 07 jari 628     }
2 26 Feb 07 jari 629     
2 26 Feb 07 jari 630     /** Writes the source to the file name.
2 26 Feb 07 jari 631      * @param fileName file name
2 26 Feb 07 jari 632      * @throws IOException
2 26 Feb 07 jari 633      */
2 26 Feb 07 jari 634     public void writeDocument(String fileName) throws IOException {
2 26 Feb 07 jari 635         FileWriter writer = new java.io.FileWriter(fileName);
2 26 Feb 07 jari 636         serialize(writer);
2 26 Feb 07 jari 637         
2 26 Feb 07 jari 638         writer.flush();
2 26 Feb 07 jari 639         writer.close();
2 26 Feb 07 jari 640     }
2 26 Feb 07 jari 641     
2 26 Feb 07 jari 642     
2 26 Feb 07 jari 643     /** Outputs document to Writer.
2 26 Feb 07 jari 644      * @param writer Output Writer
2 26 Feb 07 jari 645      * @throws IOException
2 26 Feb 07 jari 646      */
2 26 Feb 07 jari 647     private void writeDocument(Writer writer) throws IOException {
2 26 Feb 07 jari 648         serialize(writer);
2 26 Feb 07 jari 649     }
2 26 Feb 07 jari 650     
2 26 Feb 07 jari 651     
2 26 Feb 07 jari 652     
2 26 Feb 07 jari 653     /**
2 26 Feb 07 jari 654      * Serialization Code
2 26 Feb 07 jari 655      * @param writer Output Writer
2 26 Feb 07 jari 656      * @throws IOException  */
2 26 Feb 07 jari 657     private void serialize(Writer writer) throws IOException {
2 26 Feb 07 jari 658         serializeNode(document,  writer, "");
2 26 Feb 07 jari 659     }
2 26 Feb 07 jari 660     
2 26 Feb 07 jari 661     /** serializes a single node.
2 26 Feb 07 jari 662      * @param node Node to output
2 26 Feb 07 jari 663      * @param writer output writer
2 26 Feb 07 jari 664      * @param indentLevel Indent level
2 26 Feb 07 jari 665      * @throws IOException
2 26 Feb 07 jari 666      */
2 26 Feb 07 jari 667     private void serializeNode(Node node, Writer writer, String indentLevel) throws IOException {
2 26 Feb 07 jari 668         String name;
2 26 Feb 07 jari 669         String text;
2 26 Feb 07 jari 670         StringTokenizer stok;
2 26 Feb 07 jari 671         
2 26 Feb 07 jari 672         switch(node.getNodeType()) {
2 26 Feb 07 jari 673             case Node.DOCUMENT_NODE:
2 26 Feb 07 jari 674                 writer.write("<?xml version=\"1.0\"?>");
2 26 Feb 07 jari 675                 writer.write(lineSeparator);
2 26 Feb 07 jari 676                 writer.write(ScriptConstants.DOCTYPE_STRING);
2 26 Feb 07 jari 677                 writer.write(lineSeparator);
2 26 Feb 07 jari 678                 Document doc = (Document)node;
2 26 Feb 07 jari 679                 serializeNode(doc.getDocumentElement(), writer, " ");
2 26 Feb 07 jari 680                 break;
2 26 Feb 07 jari 681             case Node.ELEMENT_NODE:
2 26 Feb 07 jari 682                 boolean haveContent = false;
2 26 Feb 07 jari 683                 name = node.getNodeName();
2 26 Feb 07 jari 684                 writer.write(indentLevel + "<" + name);
2 26 Feb 07 jari 685                 
2 26 Feb 07 jari 686                 //posible attributes
2 26 Feb 07 jari 687                 NamedNodeMap attrs = node.getAttributes();
2 26 Feb 07 jari 688                 for(int i = 0; i < attrs.getLength(); i++) {
2 26 Feb 07 jari 689                     Node attr = attrs.item(i);
2 26 Feb 07 jari 690                     writer.write(" "+ attr.getNodeName()+"=\""+attr.getNodeValue()+"\"");
2 26 Feb 07 jari 691                 }
2 26 Feb 07 jari 692                 
2 26 Feb 07 jari 693                 NodeList children = node.getChildNodes();
2 26 Feb 07 jari 694                 if(children.getLength() > 0) {
2 26 Feb 07 jari 695                     
2 26 Feb 07 jari 696                     writer.write(">");
2 26 Feb 07 jari 697                     
2 26 Feb 07 jari 698                     if((children.item(0) != null) &&
2 26 Feb 07 jari 699                     (children.item(0).getNodeType() == Node.ELEMENT_NODE )){
2 26 Feb 07 jari 700                         writer.write(lineSeparator);
2 26 Feb 07 jari 701                     }
2 26 Feb 07 jari 702                     for(int i = 0; i < children.getLength(); i++){
2 26 Feb 07 jari 703                         serializeNode(children.item(i), writer, indentLevel + indent);
2 26 Feb 07 jari 704                     }
2 26 Feb 07 jari 705                     if((children.item(0) != null) &&
2 26 Feb 07 jari 706                     (children.item(children.getLength()-1).getNodeType() == Node.ELEMENT_NODE)) {
2 26 Feb 07 jari 707                         writer.write(indentLevel);
2 26 Feb 07 jari 708                     }
2 26 Feb 07 jari 709                     
2 26 Feb 07 jari 710                     writer.write("</" + name + ">");
2 26 Feb 07 jari 711                     
2 26 Feb 07 jari 712                 } else {
2 26 Feb 07 jari 713                     writer.write("/>");
2 26 Feb 07 jari 714                 }
2 26 Feb 07 jari 715                 
2 26 Feb 07 jari 716                 writer.write(lineSeparator);
2 26 Feb 07 jari 717                 break;
2 26 Feb 07 jari 718             case Node.TEXT_NODE:
2 26 Feb 07 jari 719                 writer.write(node.getNodeValue());
2 26 Feb 07 jari 720                 break;
2 26 Feb 07 jari 721             case Node.COMMENT_NODE:
2 26 Feb 07 jari 722                 text = node.getNodeValue();
2 26 Feb 07 jari 723                 writer.write("<!--");
2 26 Feb 07 jari 724                 
2 26 Feb 07 jari 725                 stok = new StringTokenizer(text, " ");
2 26 Feb 07 jari 726                 int charCnt;
2 26 Feb 07 jari 727                 String word;
2 26 Feb 07 jari 728                 
2 26 Feb 07 jari 729                 while(stok.hasMoreElements()) {
2 26 Feb 07 jari 730                     charCnt = 0;
2 26 Feb 07 jari 731                     while(charCnt < 50){
2 26 Feb 07 jari 732                         word = stok.nextToken();
2 26 Feb 07 jari 733                         writer.write(word);
2 26 Feb 07 jari 734                         charCnt = word.length();
2 26 Feb 07 jari 735                     }
2 26 Feb 07 jari 736                     writer.write(lineSeparator);
2 26 Feb 07 jari 737                 }
2 26 Feb 07 jari 738                 writer.write("-->");
2 26 Feb 07 jari 739                 break;
2 26 Feb 07 jari 740         }
2 26 Feb 07 jari 741     }
2 26 Feb 07 jari 742     
2 26 Feb 07 jari 743     /** Forces the script to update on events where the
2 26 Feb 07 jari 744      * underlying information changes.
2 26 Feb 07 jari 745      */
2 26 Feb 07 jari 746     public void updateScript() {
2 26 Feb 07 jari 747         if(!isTextCurrent) {
2 26 Feb 07 jari 748         try {
2 26 Feb 07 jari 749             scriptText = "";
2 26 Feb 07 jari 750             writeScriptText(document, "");
2 26 Feb 07 jari 751             //text is updated
2 26 Feb 07 jari 752             isTextCurrent = true;
2 26 Feb 07 jari 753         } catch (IOException e) {
2 26 Feb 07 jari 754             e.printStackTrace();
2 26 Feb 07 jari 755         }
2 26 Feb 07 jari 756         }
2 26 Feb 07 jari 757     }
2 26 Feb 07 jari 758     
2 26 Feb 07 jari 759     
2 26 Feb 07 jari 760     /** Writes node serialized form to the internal text String.
2 26 Feb 07 jari 761      * @param node node to serialize
2 26 Feb 07 jari 762      * @param indentLevel indent level.
2 26 Feb 07 jari 763      * @throws IOException
2 26 Feb 07 jari 764      */ /*
2 26 Feb 07 jari 765     private void writeScriptText(Node node, String indentLevel) throws IOException {
2 26 Feb 07 jari 766         String name;
2 26 Feb 07 jari 767         String text;
2 26 Feb 07 jari 768         StringTokenizer stok;
2 26 Feb 07 jari 769          
2 26 Feb 07 jari 770         switch(node.getNodeType()) {
2 26 Feb 07 jari 771          
2 26 Feb 07 jari 772             case Node.DOCUMENT_NODE:
2 26 Feb 07 jari 773                 scriptText += ("<?xml version=\"1.0\"?>");
2 26 Feb 07 jari 774                 scriptText += (lineSeparator);
2 26 Feb 07 jari 775          
2 26 Feb 07 jari 776                 NodeList nodes = node.getChildNodes();
2 26 Feb 07 jari 777                 if(nodes != null) {
2 26 Feb 07 jari 778                     for(int i = 0; i < nodes.getLength(); i++) {
2 26 Feb 07 jari 779                         writeScriptText(nodes.item(i), "");
2 26 Feb 07 jari 780                     }
2 26 Feb 07 jari 781                 }
2 26 Feb 07 jari 782                 /*
2 26 Feb 07 jari 783                 Document doc = (Document)node;
2 26 Feb 07 jari 784                 writeScriptText(doc.getDocumentElement()," ");
2 26 Feb 07 jari 785       **/
2 26 Feb 07 jari 786 /*                break;
2 26 Feb 07 jari 787             case Node.ELEMENT_NODE:
2 26 Feb 07 jari 788                 name = node.getNodeName();
2 26 Feb 07 jari 789                 //    if(parsedScript)
2 26 Feb 07 jari 790                 //       scriptText += "<"+name;
2 26 Feb 07 jari 791                 //    else
2 26 Feb 07 jari 792                 scriptText += (indentLevel + "<" + name);
2 26 Feb 07 jari 793  
2 26 Feb 07 jari 794                 //posible attributes
2 26 Feb 07 jari 795                 NamedNodeMap attrs = node.getAttributes();
2 26 Feb 07 jari 796                 for(int i = 0; i < attrs.getLength(); i++) {
2 26 Feb 07 jari 797                     Node attr = attrs.item(i);
2 26 Feb 07 jari 798                     scriptText += (" "+ attr.getNodeName()+"=\""+attr.getNodeValue()+"\"");
2 26 Feb 07 jari 799                 }
2 26 Feb 07 jari 800  
2 26 Feb 07 jari 801                 NodeList children = node.getChildNodes();
2 26 Feb 07 jari 802                 if(children.getLength() > 0) {
2 26 Feb 07 jari 803  
2 26 Feb 07 jari 804                     scriptText += (">");
2 26 Feb 07 jari 805  
2 26 Feb 07 jari 806                     if((children.item(0) != null) &&
2 26 Feb 07 jari 807                     (children.item(0).getNodeType() == Node.ELEMENT_NODE || children.item(0).getNodeType() == Node.COMMENT_NODE)){
2 26 Feb 07 jari 808                         scriptText += (lineSeparator);
2 26 Feb 07 jari 809                     }
2 26 Feb 07 jari 810                     for(int i = 0; i < children.getLength(); i++){
2 26 Feb 07 jari 811                         writeScriptText(children.item(i), indentLevel + indent);
2 26 Feb 07 jari 812                     }
2 26 Feb 07 jari 813                     if((children.item(0) != null) ){// &&
2 26 Feb 07 jari 814                //     (children.item(children.getLength()-1).getNodeType() == Node.ELEMENT_NODE)) {
2 26 Feb 07 jari 815                         scriptText += (indentLevel);
2 26 Feb 07 jari 816                     }
2 26 Feb 07 jari 817  
2 26 Feb 07 jari 818                     scriptText += ("</" + name + ">");
2 26 Feb 07 jari 819  
2 26 Feb 07 jari 820                 } else {
2 26 Feb 07 jari 821                     scriptText += ("/>");
2 26 Feb 07 jari 822                 }
2 26 Feb 07 jari 823  
2 26 Feb 07 jari 824                 scriptText += (lineSeparator);
2 26 Feb 07 jari 825                 break;
2 26 Feb 07 jari 826             case Node.TEXT_NODE:
2 26 Feb 07 jari 827                 // text = node.getNodeValue();
2 26 Feb 07 jari 828                //  scriptText += indentLevel+text+lineSeparator;
2 26 Feb 07 jari 829  
2 26 Feb 07 jari 830  
2 26 Feb 07 jari 831  
2 26 Feb 07 jari 832                 String newText = node.getNodeValue();
2 26 Feb 07 jari 833                 String preText = "";
2 26 Feb 07 jari 834                 int pt;
2 26 Feb 07 jari 835                 if(newText.indexOf("\n") != -1 && scriptText.lastIndexOf('\n') == scriptText.length()-1){
2 26 Feb 07 jari 836                     pt = newText.lastIndexOf("\n")+1;
2 26 Feb 07 jari 837                     if(pt < newText.length()) {
2 26 Feb 07 jari 838                         preText = newText.substring(pt);
2 26 Feb 07 jari 839                         preText +=newText.substring(0, pt-1);
2 26 Feb 07 jari 840                       //  preText = newText.substring(0, pt-1);
2 26 Feb 07 jari 841                         newText = preText;
2 26 Feb 07 jari 842                     }
2 26 Feb 07 jari 843  
2 26 Feb 07 jari 844                 }
2 26 Feb 07 jari 845  
2 26 Feb 07 jari 846  
2 26 Feb 07 jari 847                 scriptText += newText;
2 26 Feb 07 jari 848  
2 26 Feb 07 jari 849  
2 26 Feb 07 jari 850  
2 26 Feb 07 jari 851  
2 26 Feb 07 jari 852                 // name = node.getNodeName();
2 26 Feb 07 jari 853                 //// String text = node.getNodeValue();
2 26 Feb 07 jari 854                 // scriptText += (indentLevel + "<" + name + ">" + text + "<\\" + name +">");
2 26 Feb 07 jari 855                 // scriptText += (lineSeparator);
2 26 Feb 07 jari 856                 break;
2 26 Feb 07 jari 857  
2 26 Feb 07 jari 858             case Node.COMMENT_NODE:
2 26 Feb 07 jari 859                 text = node.getNodeValue();
2 26 Feb 07 jari 860                 scriptText += indentLevel+"<!-- ";
2 26 Feb 07 jari 861                 /*
2 26 Feb 07 jari 862                 stok = new StringTokenizer(text, " ");
2 26 Feb 07 jari 863                 int charCnt = 0;
2 26 Feb 07 jari 864                 String word;
2 26 Feb 07 jari 865  
2 26 Feb 07 jari 866                 while(stok.hasMoreElements()) {
2 26 Feb 07 jari 867  
2 26 Feb 07 jari 868                     word = stok.nextToken();
2 26 Feb 07 jari 869                     if (charCnt < 50){
2 26 Feb 07 jari 870                         scriptText += word+" ";
2 26 Feb 07 jari 871                         charCnt += word.length();
2 26 Feb 07 jari 872                     } else {
2 26 Feb 07 jari 873                         scriptText += lineSeparator+indentLevel+"     ";
2 26 Feb 07 jari 874                         scriptText += word+" ";
2 26 Feb 07 jari 875                         charCnt = 0;
2 26 Feb 07 jari 876                     }
2 26 Feb 07 jari 877                 }
2 26 Feb 07 jari 878  */
2 26 Feb 07 jari 879      /*           scriptText += text;
2 26 Feb 07 jari 880       
2 26 Feb 07 jari 881                 scriptText += " -->"+lineSeparator+lineSeparator;
2 26 Feb 07 jari 882                 break;
2 26 Feb 07 jari 883             case Node.DOCUMENT_TYPE_NODE:
2 26 Feb 07 jari 884                 DocumentType docType = (DocumentType)node;
2 26 Feb 07 jari 885                 scriptText += ("<!DOCTYPE " + docType.getName());
2 26 Feb 07 jari 886                 scriptText += " SYSTEM ";
2 26 Feb 07 jari 887                 scriptText += "\""+docType.getSystemId()+"\">";
2 26 Feb 07 jari 888                 scriptText += lineSeparator;
2 26 Feb 07 jari 889                 break;
2 26 Feb 07 jari 890         }
2 26 Feb 07 jari 891     }
2 26 Feb 07 jari 892       */
2 26 Feb 07 jari 893     
2 26 Feb 07 jari 894     /** Writes node serialized form to the internal text String.
2 26 Feb 07 jari 895      * @param node node to serialize
2 26 Feb 07 jari 896      * @param indentLevel indent level.
2 26 Feb 07 jari 897      * @throws IOException
2 26 Feb 07 jari 898      */
2 26 Feb 07 jari 899     private void writeScriptText(Node node, String indentLevel) throws IOException {
2 26 Feb 07 jari 900         String name;
2 26 Feb 07 jari 901         String text;
2 26 Feb 07 jari 902         StringTokenizer stok;
2 26 Feb 07 jari 903         
2 26 Feb 07 jari 904         switch(node.getNodeType()) {
2 26 Feb 07 jari 905             
2 26 Feb 07 jari 906             case Node.DOCUMENT_NODE:
2 26 Feb 07 jari 907                 scriptText += ("<?xml version=\"1.0\"?>");
2 26 Feb 07 jari 908                 scriptText += (lineSeparator);
2 26 Feb 07 jari 909                 
2 26 Feb 07 jari 910                 NodeList nodes = node.getChildNodes();
2 26 Feb 07 jari 911                 if(nodes != null) {
2 26 Feb 07 jari 912                     for(int i = 0; i < nodes.getLength(); i++) {
2 26 Feb 07 jari 913                         writeScriptText(nodes.item(i), "");
2 26 Feb 07 jari 914                     }
2 26 Feb 07 jari 915                 }
2 26 Feb 07 jari 916                 /*
2 26 Feb 07 jari 917                 Document doc = (Document)node;
2 26 Feb 07 jari 918                 writeScriptText(doc.getDocumentElement()," ");
2 26 Feb 07 jari 919                  **/
2 26 Feb 07 jari 920                 break;
2 26 Feb 07 jari 921             case Node.ELEMENT_NODE:
2 26 Feb 07 jari 922                 name = node.getNodeName();
2 26 Feb 07 jari 923                 //    if(parsedScript)
2 26 Feb 07 jari 924                 //       scriptText += "<"+name;
2 26 Feb 07 jari 925                 //    else
2 26 Feb 07 jari 926                 scriptText += (indentLevel + "<" + name);
2 26 Feb 07 jari 927                 
2 26 Feb 07 jari 928                 //posible attributes
2 26 Feb 07 jari 929                 NamedNodeMap attrs = node.getAttributes();
2 26 Feb 07 jari 930                 for(int i = 0; i < attrs.getLength(); i++) {
2 26 Feb 07 jari 931                     Node attr = attrs.item(i);
2 26 Feb 07 jari 932                     scriptText += (" "+ attr.getNodeName()+"=\""+attr.getNodeValue()+"\"");
2 26 Feb 07 jari 933                 }
2 26 Feb 07 jari 934                 
2 26 Feb 07 jari 935                 NodeList children = node.getChildNodes();
2 26 Feb 07 jari 936                 if(children.getLength() > 0) {
2 26 Feb 07 jari 937                     
2 26 Feb 07 jari 938                     scriptText += (">");
2 26 Feb 07 jari 939                     
2 26 Feb 07 jari 940                     if((children.item(0) != null)){// &&
2 26 Feb 07 jari 941                         //                 (children.item(0).getNodeType() == Node.ELEMENT_NODE || children.item(0).getNodeType() == Node.COMMENT_NODE)){
2 26 Feb 07 jari 942                         scriptText += (lineSeparator);
2 26 Feb 07 jari 943                     }
2 26 Feb 07 jari 944                     for(int i = 0; i < children.getLength(); i++){
2 26 Feb 07 jari 945                         if(children.item(i).getNodeType() != Node.TEXT_NODE)
2 26 Feb 07 jari 946                             writeScriptText(children.item(i), indentLevel + indent);
2 26 Feb 07 jari 947                     }
2 26 Feb 07 jari 948                     if((children.item(0) != null) ){// &&
2 26 Feb 07 jari 949                         //     (children.item(children.getLength()-1).getNodeType() == Node.ELEMENT_NODE)) {
2 26 Feb 07 jari 950                         scriptText += (indentLevel);
2 26 Feb 07 jari 951                     }
2 26 Feb 07 jari 952                     
2 26 Feb 07 jari 953                     scriptText += ("</" + name + ">");
2 26 Feb 07 jari 954                     
2 26 Feb 07 jari 955                 } else {
2 26 Feb 07 jari 956                     scriptText += ("/>");
2 26 Feb 07 jari 957                 }
2 26 Feb 07 jari 958                 
2 26 Feb 07 jari 959                 scriptText += (lineSeparator);
2 26 Feb 07 jari 960                 break;
2 26 Feb 07 jari 961             case Node.TEXT_NODE:
2 26 Feb 07 jari 962                 // text = node.getNodeValue();
2 26 Feb 07 jari 963                 //  scriptText += indentLevel+text+lineSeparator;
2 26 Feb 07 jari 964                 
2 26 Feb 07 jari 965                 
2 26 Feb 07 jari 966                 
2 26 Feb 07 jari 967                 String newText = node.getNodeValue();
2 26 Feb 07 jari 968                 String preText = "";
2 26 Feb 07 jari 969                 int pt;
2 26 Feb 07 jari 970                 if(newText.indexOf("\n") != -1 && scriptText.lastIndexOf('\n') == scriptText.length()-1){
2 26 Feb 07 jari 971                     pt = newText.lastIndexOf("\n")+1;
2 26 Feb 07 jari 972                     if(pt < newText.length()) {
2 26 Feb 07 jari 973                         preText = newText.substring(pt);
2 26 Feb 07 jari 974                         preText +=newText.substring(0, pt-1);
2 26 Feb 07 jari 975                         //  preText = newText.substring(0, pt-1);
2 26 Feb 07 jari 976                         newText = preText;
2 26 Feb 07 jari 977                     }
2 26 Feb 07 jari 978                     
2 26 Feb 07 jari 979                 }
2 26 Feb 07 jari 980                 
2 26 Feb 07 jari 981                 
2 26 Feb 07 jari 982                 scriptText += newText;
2 26 Feb 07 jari 983                 
2 26 Feb 07 jari 984                 
2 26 Feb 07 jari 985                 
2 26 Feb 07 jari 986                 
2 26 Feb 07 jari 987                 // name = node.getNodeName();
2 26 Feb 07 jari 988                 //// String text = node.getNodeValue();
2 26 Feb 07 jari 989                 // scriptText += (indentLevel + "<" + name + ">" + text + "<\\" + name +">");
2 26 Feb 07 jari 990                 // scriptText += (lineSeparator);
2 26 Feb 07 jari 991                 break;
2 26 Feb 07 jari 992                 
2 26 Feb 07 jari 993             case Node.COMMENT_NODE:
2 26 Feb 07 jari 994                 text = node.getNodeValue();
2 26 Feb 07 jari 995                 scriptText += indentLevel+"<!--";
2 26 Feb 07 jari 996                 /*
2 26 Feb 07 jari 997                 stok = new StringTokenizer(text, " ");
2 26 Feb 07 jari 998                 int charCnt = 0;
2 26 Feb 07 jari 999                 String word;
2 26 Feb 07 jari 1000                  
2 26 Feb 07 jari 1001                 while(stok.hasMoreElements()) {
2 26 Feb 07 jari 1002                  
2 26 Feb 07 jari 1003                     word = stok.nextToken();
2 26 Feb 07 jari 1004                     if (charCnt < 50){
2 26 Feb 07 jari 1005                         scriptText += word+" ";
2 26 Feb 07 jari 1006                         charCnt += word.length();
2 26 Feb 07 jari 1007                     } else {
2 26 Feb 07 jari 1008                         scriptText += lineSeparator+indentLevel+"     ";
2 26 Feb 07 jari 1009                         scriptText += word+" ";
2 26 Feb 07 jari 1010                         charCnt = 0;
2 26 Feb 07 jari 1011                     }
2 26 Feb 07 jari 1012                 }
2 26 Feb 07 jari 1013                  */
2 26 Feb 07 jari 1014                 scriptText += text;
2 26 Feb 07 jari 1015                 
2 26 Feb 07 jari 1016                 scriptText += "-->"+lineSeparator+lineSeparator;
2 26 Feb 07 jari 1017                 break;
2 26 Feb 07 jari 1018             case Node.DOCUMENT_TYPE_NODE:
2 26 Feb 07 jari 1019                 DocumentType docType = (DocumentType)node;
2 26 Feb 07 jari 1020                 scriptText += ("<!DOCTYPE " + docType.getName());
2 26 Feb 07 jari 1021                 scriptText += " SYSTEM ";
2 26 Feb 07 jari 1022                 scriptText += "\""+docType.getSystemId()+"\">";
2 26 Feb 07 jari 1023                 scriptText += lineSeparator;
2 26 Feb 07 jari 1024                 break;
2 26 Feb 07 jari 1025         }
2 26 Feb 07 jari 1026     }
2 26 Feb 07 jari 1027     
2 26 Feb 07 jari 1028     /** Returns the current String representation of the script.
2 26 Feb 07 jari 1029      * @return  */
2 26 Feb 07 jari 1030     public String toString() {
2 26 Feb 07 jari 1031         return scriptText;
2 26 Feb 07 jari 1032     }
2 26 Feb 07 jari 1033     
2 26 Feb 07 jari 1034     /** Returns the document's <CODE>ErrorLog</CODE>
2 26 Feb 07 jari 1035      * @return  */
2 26 Feb 07 jari 1036     public ErrorLog getErrorLog() {
2 26 Feb 07 jari 1037         return errorLog;
2 26 Feb 07 jari 1038     }
2 26 Feb 07 jari 1039     
2 26 Feb 07 jari 1040     /** Opens the document's <CODE>ErrorLog</CODE>
2 26 Feb 07 jari 1041      */
2 26 Feb 07 jari 1042     public void showErrorLog() {
2 26 Feb 07 jari 1043         
2 26 Feb 07 jari 1044     }
2 26 Feb 07 jari 1045     
2 26 Feb 07 jari 1046     /** Returns the number of validation errors found during a load or requested
2 26 Feb 07 jari 1047      * validation.
2 26 Feb 07 jari 1048      */
2 26 Feb 07 jari 1049     public int getErrorCount() {
2 26 Feb 07 jari 1050         return parseErrors;
2 26 Feb 07 jari 1051     }
2 26 Feb 07 jari 1052     
2 26 Feb 07 jari 1053     
2 26 Feb 07 jari 1054     
2 26 Feb 07 jari 1055     /** Loads the specified file using the passed progress bar.
2 26 Feb 07 jari 1056      * @param inputFile File
2 26 Feb 07 jari 1057      * @param progress Progress monitor
2 26 Feb 07 jari 1058      * @throws Exception
2 26 Feb 07 jari 1059      * @return
2 26 Feb 07 jari 1060      */
2 26 Feb 07 jari 1061     public boolean loadXMLFile(File inputFile, Progress progress) throws Exception{
2 26 Feb 07 jari 1062         if(!inputFile.exists())
2 26 Feb 07 jari 1063             return false;
2 26 Feb 07 jari 1064         
2 26 Feb 07 jari 1065         progress.setUnits(4);
2 26 Feb 07 jari 1066         progress.setValue(1);
2 26 Feb 07 jari 1067         progress.setDescription("Parsing File");
2 26 Feb 07 jari 1068         
2 26 Feb 07 jari 1069         errorLog.setFile(inputFile);
2 26 Feb 07 jari 1070         
2 26 Feb 07 jari 1071         
2 26 Feb 07 jari 1072         DOMParser parser = new DOMParser();
2 26 Feb 07 jari 1073         
2 26 Feb 07 jari 1074         try {
2 26 Feb 07 jari 1075             parser.setFeature("http://xml.org/sax/features/validation", true);
2 26 Feb 07 jari 1076             parser.setErrorHandler(this);
2 26 Feb 07 jari 1077             
2 26 Feb 07 jari 1078             parser.parse(inputFile.toURL().toString());
2 26 Feb 07 jari 1079             
2 26 Feb 07 jari 1080         } catch ( Exception e ) {
2 26 Feb 07 jari 1081             return false;
2 26 Feb 07 jari 1082         }
2 26 Feb 07 jari 1083         
2 26 Feb 07 jari 1084         document = parser.getDocument();
2 26 Feb 07 jari 1085         
2 26 Feb 07 jari 1086         //now set key element references.
2 26 Feb 07 jari 1087         root = document.getDocumentElement();
2 26 Feb 07 jari 1088         
2 26 Feb 07 jari 1089         
2 26 Feb 07 jari 1090         NodeList list = root.getElementsByTagName("mev");
2 26 Feb 07 jari 1091         if(list != null && list.getLength() > 0)
2 26 Feb 07 jari 1092             mevElement = (Element)list.item(0);
2 26 Feb 07 jari 1093         
2 26 Feb 07 jari 1094         
2 26 Feb 07 jari 1095         list = root.getElementsByTagName("primary_data");
2 26 Feb 07 jari 1096         if(list != null && list.getLength() > 0)
2 26 Feb 07 jari 1097             primaryDataElement = (Element)list.item(0);
2 26 Feb 07 jari 1098         
2 26 Feb 07 jari 1099         list = root.getElementsByTagName("analysis");
2 26 Feb 07 jari 1100         if(list != null && list.getLength() > 0)
2 26 Feb 07 jari 1101             analysisElement = (Element)list.item(0);
2 26 Feb 07 jari 1102         
2 26 Feb 07 jari 1103         progress.setValue(2);
2 26 Feb 07 jari 1104         progress.setDescription("Checking Algorithm Sets");
2 26 Feb 07 jari 1105         
2 26 Feb 07 jari 1106         //set alg_set counter value
2 26 Feb 07 jari 1107         list = root.getElementsByTagName("alg_set");
2 26 Feb 07 jari 1108         if(list != null && list.getLength() > 0) {
2 26 Feb 07 jari 1109             int maxID = -1;
2 26 Feb 07 jari 1110             for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 1111                 currAlgSetID = Integer.parseInt(((Element)list.item(i)).getAttribute("set_id"));
2 26 Feb 07 jari 1112                 if(currAlgSetID > maxID)
2 26 Feb 07 jari 1113                     maxID = currAlgSetID;
2 26 Feb 07 jari 1114             }
2 26 Feb 07 jari 1115             if(currAlgSetID < 0)
2 26 Feb 07 jari 1116                 currAlgSetID = 0;
2 26 Feb 07 jari 1117             else
2 26 Feb 07 jari 1118                 currAlgSetID = maxID;
2 26 Feb 07 jari 1119             currAlgSetID++; //Increment for next
2 26 Feb 07 jari 1120         }
2 26 Feb 07 jari 1121         
2 26 Feb 07 jari 1122         progress.setValue(2);
2 26 Feb 07 jari 1123         progress.setDescription("Setting Output ID");
2 26 Feb 07 jari 1124         
2 26 Feb 07 jari 1125         //set data_node counter value
2 26 Feb 07 jari 1126         list = root.getElementsByTagName("data_node");
2 26 Feb 07 jari 1127         if(list != null && list.getLength() > 0) {
2 26 Feb 07 jari 1128             int maxID = -1;
2 26 Feb 07 jari 1129             for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 1130                 currDataID = Integer.parseInt(((Element)list.item(i)).getAttribute("data_node_id"));
2 26 Feb 07 jari 1131                 if(currDataID > maxID)
2 26 Feb 07 jari 1132                     maxID = currDataID;
2 26 Feb 07 jari 1133             }
2 26 Feb 07 jari 1134             if(currDataID < 0)
2 26 Feb 07 jari 1135                 currDataID = 0;
2 26 Feb 07 jari 1136             else
2 26 Feb 07 jari 1137                 currDataID = maxID;  //preincremented before use
2 26 Feb 07 jari 1138         }
2 26 Feb 07 jari 1139         
2 26 Feb 07 jari 1140         
2 26 Feb 07 jari 1141         progress.setValue(3);
2 26 Feb 07 jari 1142         progress.setDescription("Internal Serialization");
2 26 Feb 07 jari 1143         
2 26 Feb 07 jari 1144         parsedScript = true;
2 26 Feb 07 jari 1145         updateScript();
2 26 Feb 07 jari 1146         
2 26 Feb 07 jari 1147         //Extract name, description and date tags if availible
2 26 Feb 07 jari 1148         progress.setValue(4);
2 26 Feb 07 jari 1149         progress.setDescription("Done");
2 26 Feb 07 jari 1150         progress.dispose();
2 26 Feb 07 jari 1151         
2 26 Feb 07 jari 1152         return validateDocument();
2 26 Feb 07 jari 1153     }
2 26 Feb 07 jari 1154     
2 26 Feb 07 jari 1155     /** Validates the document
2 26 Feb 07 jari 1156      */
2 26 Feb 07 jari 1157     public boolean validateDocument() {
2 26 Feb 07 jari 1158         return true;
2 26 Feb 07 jari 1159     }
2 26 Feb 07 jari 1160     
2 26 Feb 07 jari 1161     
2 26 Feb 07 jari 1162     /** Modifies a parameter
2 26 Feb 07 jari 1163      * @param attributes parameter attributes
2 26 Feb 07 jari 1164      * @param modLine moddification line
2 26 Feb 07 jari 1165      * @param value value
2 26 Feb 07 jari 1166      * @return
2 26 Feb 07 jari 1167      */
2 26 Feb 07 jari 1168     public boolean modifyParameter(Hashtable attributes, String modLine, String value) {
2 26 Feb 07 jari 1169         NodeList list = document.getElementsByTagName("algorithm");
2 26 Feb 07 jari 1170         Element algElement;
2 26 Feb 07 jari 1171         for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 1172             algElement = (Element)list.item(i);
2 26 Feb 07 jari 1173             if(algorithmMatches(attributes, algElement)) {
2 26 Feb 07 jari 1174                 return modifyAlgorithmParameter(algElement, modLine, value);
2 26 Feb 07 jari 1175             }
2 26 Feb 07 jari 1176         }
2 26 Feb 07 jari 1177         return false;
2 26 Feb 07 jari 1178     }
2 26 Feb 07 jari 1179     
2 26 Feb 07 jari 1180     
2 26 Feb 07 jari 1181     //find and mod the parameter
2 26 Feb 07 jari 1182     /** Modifies an a parameter given an elemement.
2 26 Feb 07 jari 1183      * @param elem Element to mod.
2 26 Feb 07 jari 1184      * @param modLine modified line
2 26 Feb 07 jari 1185      * @param value value
2 26 Feb 07 jari 1186      * @return
2 26 Feb 07 jari 1187      */
2 26 Feb 07 jari 1188     private boolean modifyAlgorithmParameter(Element elem, String modLine, String value) {
2 26 Feb 07 jari 1189         NodeList list = elem.getElementsByTagName("param");
2 26 Feb 07 jari 1190         Element param;
2 26 Feb 07 jari 1191         String key;
2 26 Feb 07 jari 1192         
2 26 Feb 07 jari 1193         isTextCurrent = false;
2 26 Feb 07 jari 1194         
2 26 Feb 07 jari 1195         for(int i =0; i < list.getLength(); i++) {
2 26 Feb 07 jari 1196             param = (Element)list.item(i);
2 26 Feb 07 jari 1197             key = param.getAttribute("key");
2 26 Feb 07 jari 1198             
2 26 Feb 07 jari 1199             if(modLine.indexOf(key) > -1) {
2 26 Feb 07 jari 1200                 param.setAttribute("value", value);                
2 26 Feb 07 jari 1201                 fireScriptEvent();
2 26 Feb 07 jari 1202                 return true;
2 26 Feb 07 jari 1203             }
2 26 Feb 07 jari 1204         }
2 26 Feb 07 jari 1205         return false;        
2 26 Feb 07 jari 1206     }
2 26 Feb 07 jari 1207     
2 26 Feb 07 jari 1208     //verify algorithm Element is correct
2 26 Feb 07 jari 1209     /** Verifies algorithm identity
2 26 Feb 07 jari 1210      * @param attributes Attribute hash
2 26 Feb 07 jari 1211      * @param algorithm Algorithm element
2 26 Feb 07 jari 1212      * @return
2 26 Feb 07 jari 1213      */
2 26 Feb 07 jari 1214     private boolean algorithmMatches(Hashtable attributes, Element algorithm) {
2 26 Feb 07 jari 1215         Enumeration _enum = attributes.keys();
2 26 Feb 07 jari 1216         String key, value, algValue;
2 26 Feb 07 jari 1217         boolean match = true;
2 26 Feb 07 jari 1218         while(_enum.hasMoreElements()) {
2 26 Feb 07 jari 1219             key = (String)_enum.nextElement();
2 26 Feb 07 jari 1220             value = (String)attributes.get(key);
2 26 Feb 07 jari 1221             algValue = algorithm.getAttribute(key);
2 26 Feb 07 jari 1222             if(!algValue.equals(value))
2 26 Feb 07 jari 1223                 return false;
2 26 Feb 07 jari 1224         }
2 26 Feb 07 jari 1225         return true;
2 26 Feb 07 jari 1226     }
2 26 Feb 07 jari 1227     
2 26 Feb 07 jari 1228     
2 26 Feb 07 jari 1229     //  WARNING Event Handler
2 26 Feb 07 jari 1230     /** Reports Parser Exceptions (Warning level exp.)
2 26 Feb 07 jari 1231      * @param e reported exception
2 26 Feb 07 jari 1232      * @throws SAXException
2 26 Feb 07 jari 1233      */
2 26 Feb 07 jari 1234     public void warning(SAXParseException e)
2 26 Feb 07 jari 1235     throws SAXException {
2 26 Feb 07 jari 1236         System.err.println("Warning:  "+e);
2 26 Feb 07 jari 1237         parseErrors++;
2 26 Feb 07 jari 1238         errorLog.recordWarning(e);
2 26 Feb 07 jari 1239     }
2 26 Feb 07 jari 1240     
2 26 Feb 07 jari 1241     //  ERROR Event Handler
2 26 Feb 07 jari 1242     /** Parse error reporting.
2 26 Feb 07 jari 1243      */
2 26 Feb 07 jari 1244     public void error(SAXParseException e)
2 26 Feb 07 jari 1245     throws SAXException {
2 26 Feb 07 jari 1246         System.err.println("Error:  "+e);
2 26 Feb 07 jari 1247         errorLog.recordError(e);
2 26 Feb 07 jari 1248         parseErrors++;
2 26 Feb 07 jari 1249     }
2 26 Feb 07 jari 1250     
2 26 Feb 07 jari 1251     //  FATAL ERROR Event Handler
2 26 Feb 07 jari 1252     /** Parse Fatal errors
2 26 Feb 07 jari 1253      */
2 26 Feb 07 jari 1254     public void fatalError(SAXParseException e)
2 26 Feb 07 jari 1255     throws SAXException {
2 26 Feb 07 jari 1256         System.err.println("Fatal Error:  "+e);
2 26 Feb 07 jari 1257         errorLog.recordFatalError(e);
2 26 Feb 07 jari 1258         parseErrors++;
2 26 Feb 07 jari 1259     }
2 26 Feb 07 jari 1260     
2 26 Feb 07 jari 1261     
2 26 Feb 07 jari 1262     /** Adds a <CODE>ScriptEventListener</CODE> instance.
2 26 Feb 07 jari 1263      * @param listener Listener to add
2 26 Feb 07 jari 1264      */
2 26 Feb 07 jari 1265     public void addDocumentListener(ScriptEventListener listener) {
2 26 Feb 07 jari 1266         if(!listeners.contains(listener))
2 26 Feb 07 jari 1267             listeners.add(listener);
2 26 Feb 07 jari 1268     }
2 26 Feb 07 jari 1269     
2 26 Feb 07 jari 1270     /** Fires events to cached listeners.
2 26 Feb 07 jari 1271      */
2 26 Feb 07 jari 1272     private void fireScriptEvent() {
2 26 Feb 07 jari 1273         ScriptDocumentEvent event = new ScriptDocumentEvent(this);
2 26 Feb 07 jari 1274         for(int i = 0; i < listeners.size(); i++) {
2 26 Feb 07 jari 1275             ((ScriptEventListener)listeners.elementAt(i)).documentChanged(event);
2 26 Feb 07 jari 1276         }
2 26 Feb 07 jari 1277     }
2 26 Feb 07 jari 1278     
2 26 Feb 07 jari 1279     /** Removes a specified listener
2 26 Feb 07 jari 1280      * @param listener Listener to remove.
2 26 Feb 07 jari 1281      */
2 26 Feb 07 jari 1282     public void removeScriptListener(ScriptEventListener listener) {
2 26 Feb 07 jari 1283         listeners.remove(listener);
2 26 Feb 07 jari 1284     }
2 26 Feb 07 jari 1285     
2 26 Feb 07 jari 1286     /** Removes a specified algorithm from the model.
2 26 Feb 07 jari 1287      * @param node <CODE>AlgorithmNode</CODE> to delete.
2 26 Feb 07 jari 1288      */
2 26 Feb 07 jari 1289     public void removeAlgorithm(AlgorithmNode node) {
2 26 Feb 07 jari 1290         int algID = node.getID();
2 26 Feb 07 jari 1291         int dataRef = node.getDataNodeRef();
2 26 Feb 07 jari 1292         String name = node.getAlgorithmName();
2 26 Feb 07 jari 1293         
2 26 Feb 07 jari 1294         Element algSetElement = getAlgorithmSetByDataRef(dataRef);
2 26 Feb 07 jari 1295         Element algorithmElement = null;
2 26 Feb 07 jari 1296         NodeList list;
2 26 Feb 07 jari 1297         boolean found = false;
2 26 Feb 07 jari 1298         if(algSetElement != null) {
2 26 Feb 07 jari 1299             list = algSetElement.getElementsByTagName("algorithm");
2 26 Feb 07 jari 1300             for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 1301                 algorithmElement = (Element)list.item(i);
2 26 Feb 07 jari 1302                 if((String.valueOf(algID)).equals(algorithmElement.getAttribute("alg_id"))
2 26 Feb 07 jari 1303                 && (name.equals(algorithmElement.getAttribute("alg_name")))) {
2 26 Feb 07 jari 1304                     found = true;
2 26 Feb 07 jari 1305                     break;
2 26 Feb 07 jari 1306                 }
2 26 Feb 07 jari 1307             }
2 26 Feb 07 jari 1308             if(found) {
2 26 Feb 07 jari 1309                 
2 26 Feb 07 jari 1310                 if(algorithmElement == null)
2 26 Feb 07 jari 1311                     return;
2 26 Feb 07 jari 1312                 
2 26 Feb 07 jari 1313                 //Decided not to rollback alg id's for deleted
2 26 Feb 07 jari 1314                 Node parentNode = algorithmElement.getParentNode();
2 26 Feb 07 jari 1315                 if(parentNode != null) {
2 26 Feb 07 jari 1316                     
2 26 Feb 07 jari 1317                     //Get rid of alg sets that reference output from the algorithmElement
2 26 Feb 07 jari 1318                     
2 26 Feb 07 jari 1319                     //Get output node and then the data node id's
2 26 Feb 07 jari 1320                     list = algorithmElement.getElementsByTagName("data_node");
2 26 Feb 07 jari 1321                     
2 26 Feb 07 jari 1322                     //((Element)(algorithmElement.getElementsByTagName("output_data").item(0))).getElementsByTagName("data_node");
2 26 Feb 07 jari 1323                     String [] data_refs = new String[list.getLength()];
2 26 Feb 07 jari 1324                     Node dataNode;
2 26 Feb 07 jari 1325                     for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 1326                         dataNode = list.item(i);
2 26 Feb 07 jari 1327                         data_refs[i] = ((Element)dataNode).getAttribute("data_node_id");
2 26 Feb 07 jari 1328                     }
2 26 Feb 07 jari 1329                     
2 26 Feb 07 jari 1330                     
2 26 Feb 07 jari 1331                     
2 26 Feb 07 jari 1332                     //Check if this analysis node has algorithm sets that reference
2 26 Feb 07 jari 1333                     //the output of the algorithm to delete, if so remove them.
2 26 Feb 07 jari 1334                   /*
2 26 Feb 07 jari 1335                    
2 26 Feb 07 jari 1336                    original version to delete child algsets
2 26 Feb 07 jari 1337                    
2 26 Feb 07 jari 1338                    list = analysisElement.getElementsByTagName("alg_set");
2 26 Feb 07 jari 1339                     Node algSetNode;
2 26 Feb 07 jari 1340                     String ref;
2 26 Feb 07 jari 1341                     for(int i = 0; i < list.getLength(); i++) {
2 26 Feb 07 jari 1342                         algSetNode = list.item(i);
2 26 Feb 07 jari 1343                         ref = ((Element)algSetNode).getAttribute("input_data_ref");
2 26 Feb 07 jari 1344                         for(int j = 0; j < data_refs.length; j++) {
2 26 Feb 07 jari 1345                             if(data_refs[j].equals(ref))
2 26 Feb 07 jari 1346                                 analysisElement.removeChild(algSetNode);
2 26 Feb 07 jari 1347                         }
2 26 Feb 07 jari 1348                     }
2 26 Feb 07 jari 1349                    */
2 26 Feb 07 jari 1350                     
2 26 Feb 07 jari 1351                     //new recursive method
2 26 Feb 07 jari 1352                     Vector algSetIDs = getDependentDataIDs(algorithmElement, list);
2 26 Feb 07 jari 1353                     //have dependent algset ids
2 26 Feb 07 jari 1354                     list = analysisElement.getElementsByTagName("alg_set");
2 26 Feb 07 jari 1355                     Node algSetNode;
2 26 Feb 07 jari 1356                     String ref;
2 26 Feb 07 jari 1357                     Vector setsToRemove = new Vector();
2 26 Feb 07 jari 1358                     int listLength = list.getLength();
2 26 Feb 07 jari 1359                     for(int i = 0; i < listLength; i++) {
2 26 Feb 07 jari 1360                         algSetNode = list.item(i);
2 26 Feb 07 jari 1361                         ref = ((Element)algSetNode).getAttribute("set_id");
2 26 Feb 07 jari 1362                         
2 26 Feb 07 jari 1363                         for(int j = 0; j < algSetIDs.size(); j++) {
2 26 Feb 07 jari 1364                             if(ref.equals((String)(algSetIDs.elementAt(j))))
2 26 Feb 07 jari 1365                                 setsToRemove.addElement(algSetNode);
2 26 Feb 07 jari 1366                         }
2 26 Feb 07 jari 1367                     }
2 26 Feb 07 jari 1368                     
2 26 Feb 07 jari 1369                     for(int i = 0; i < setsToRemove.size(); i++)
2 26 Feb 07 jari 1370                         analysisElement.removeChild(((Element)(setsToRemove.elementAt(i))));
2 26 Feb 07 jari 1371                     
2 26 Feb 07 jari 1372                     parentNode.removeChild(algorithmElement);
2 26 Feb 07 jari 1373                     
2 26 Feb 07 jari 1374                     //Check for more algorithms
2 26 Feb 07 jari 1375                     if(parentNode.getChildNodes().getLength() == 0) {
2 26 Feb 07 jari 1376                         Node grandparent = parentNode.getParentNode();
2 26 Feb 07 jari 1377                         if(grandparent != null && parentNode.getNodeName().equals("alg_set")
2 26 Feb 07 jari 1378                         && !(((Element)parentNode).getAttribute("set_id")).equals("1")){
2 26 Feb 07 jari 1379                             //parent was an algset without children
2 26 Feb 07 jari 1380                             //and it was not the base algset "1"
2 26 Feb 07 jari 1381                             grandparent.removeChild(parentNode);
2 26 Feb 07 jari 1382                         }
2 26 Feb 07 jari 1383                     }
2 26 Feb 07 jari 1384                 }
2 26 Feb 07 jari 1385                 
2 26 Feb 07 jari 1386                 //updateScript();
2 26 Feb 07 jari 1387                 isTextCurrent = false;
2 26 Feb 07 jari 1388                 fireScriptEvent();
2 26 Feb 07 jari 1389             }
2 26 Feb 07 jari 1390         }
2 26 Feb 07 jari 1391     }
2 26 Feb 07 jari 1392     
2 26 Feb 07 jari 1393     
2 26 Feb 07 jari 1394     /** Returns the data ID's under the algorithm element
2 26 Feb 07 jari 1395      */
2 26 Feb 07 jari 1396     private Vector getDependentDataIDs(Element algElement, NodeList dataElements) {
2 26 Feb 07 jari 1397         Element dataElement;
2 26 Feb 07 jari 1398         Vector indices = new Vector();
2 26 Feb 07 jari 1399         for(int i = 0; i < dataElements.getLength(); i++) {
2 26 Feb 07 jari 1400             dataElement = ((Element)(dataElements.item(i)));
2 26 Feb 07 jari 1401             indices.addElement(dataElement.getAttribute("data_node_id"));
2 26 Feb 07 jari 1402         }
2 26 Feb 07 jari 1403         
2 26 Feb 07 jari 1404         getDependentDataIDs(indices, 0, analysisElement.getElementsByTagName("alg_set"));
2 26 Feb 07 jari 1405         
2 26 Feb 07 jari 1406         return indices;
2 26 Feb 07 jari 1407     }
2 26 Feb 07 jari 1408     
2 26 Feb 07 jari 1409     
2 26 Feb 07 jari 1410     /** accumulates data ID's below the passed data id indices
2 26 Feb 07 jari 1411      */
2 26 Feb 07 jari 1412     private void getDependentDataIDs(Vector indices, int start, NodeList algSets) {
2 26 Feb 07 jari 1413         //exit stategy
2 26 Feb 07 jari 1414         if( indices.size() <= start)
2 26 Feb 07 jari 1415             return;
2 26 Feb 07 jari 1416         //new hit accumulator
2 26 Feb 07 jari 1417         int initSize = indices.size();
2 26 Feb 07 jari 1418         int newHits = 0;
2 26 Feb 07 jari 1419         String index, newIndex, algSetID;
2 26 Feb 07 jari 1420         Element algSet;
2 26 Feb 07 jari 1421         
2 26 Feb 07 jari 1422         //algSets
2 26 Feb 07 jari 1423         for(int i = start; i < indices.size(); i++){
2 26 Feb 07 jari 1424             index = (String)(indices.elementAt(i));
2 26 Feb 07 jari 1425             for(int j = 0; j < algSets.getLength(); j++) {
2 26 Feb 07 jari 1426                 algSet = ((Element)(algSets.item(j)));
2 26 Feb 07 jari 1427                 algSetID = algSet.getAttribute("set_id");
2 26 Feb 07 jari 1428                 if(algSetID.equals(index)) {
2 26 Feb 07 jari 1429                     //this is a dependent alg set, need get all data references
2 26 Feb 07 jari 1430                     NodeList dataList = algSet.getElementsByTagName("data_node");
2 26 Feb 07 jari 1431                     for(int k = 0; k < dataList.getLength(); k++) {
2 26 Feb 07 jari 1432                         newIndex = ((Element)dataList.item(k)).getAttribute("data_node_id");
2 26 Feb 07 jari 1433                         if(!indices.contains(newIndex)) {
2 26 Feb 07 jari 1434                             newHits++;
2 26 Feb 07 jari 1435                             indices.addElement(newIndex);
2 26 Feb 07 jari 1436                         }
2 26 Feb 07 jari 1437                     }
2 26 Feb 07 jari 1438                 }
2 26 Feb 07 jari 1439             }
2 26 Feb 07 jari 1440         }
2 26 Feb 07 jari 1441         
2 26 Feb 07 jari 1442         //tail recursion
2 26 Feb 07 jari 1443         getDependentDataIDs(indices, initSize, algSets);
2 26 Feb 07 jari 1444     }
2 26 Feb 07 jari 1445     
2 26 Feb 07 jari 1446     
2 26 Feb 07 jari 1447     private void writeObject(java.io.ObjectOutputStream oos) throws java.io.IOException {
2 26 Feb 07 jari 1448         oos.writeObject(tm4ScriptVersion);
2 26 Feb 07 jari 1449         oos.writeObject(mevScriptVersion);
2 26 Feb 07 jari 1450         oos.writeObject(manager);
2 26 Feb 07 jari 1451         oos.writeObject(document);
2 26 Feb 07 jari 1452         oos.writeObject(scriptText);
2 26 Feb 07 jari 1453         oos.writeObject(root);
2 26 Feb 07 jari 1454         oos.writeObject(mevElement);
2 26 Feb 07 jari 1455         oos.writeObject(this.primaryDataElement);
2 26 Feb 07 jari 1456         oos.writeObject(this.commentElement);
2 26 Feb 07 jari 1457         oos.writeObject(this.analysisElement);
2 26 Feb 07 jari 1458         oos.writeInt(currDataID);
2 26 Feb 07 jari 1459         oos.writeInt(currAlgSetID);
2 26 Feb 07 jari 1460         oos.writeObject(lineSeparator);
2 26 Feb 07 jari 1461         oos.writeObject(indent);
2 26 Feb 07 jari 1462         oos.writeBoolean(errorLog != null);
2 26 Feb 07 jari 1463         // if(errorLog != null)
2 26 Feb 07 jari 1464         //     oos.writeObject(errorLog);
2 26 Feb 07 jari 1465         oos.writeBoolean(parsedScript);
2 26 Feb 07 jari 1466     }
2 26 Feb 07 jari 1467     
2 26 Feb 07 jari 1468     
2 26 Feb 07 jari 1469     
2 26 Feb 07 jari 1470     private void readObject(java.io.ObjectInputStream ois) throws java.io.IOException, ClassNotFoundException {
2 26 Feb 07 jari 1471         this.tm4ScriptVersion = (String)ois.readObject();
2 26 Feb 07 jari 1472         this.mevScriptVersion = (String)ois.readObject();
2 26 Feb 07 jari 1473         this.manager = (ScriptManager)ois.readObject();
2 26 Feb 07 jari 1474         this.document = (Document)ois.readObject();
2 26 Feb 07 jari 1475         this.scriptText = (String)ois.readObject();
2 26 Feb 07 jari 1476         this.root = (Element)ois.readObject();
2 26 Feb 07 jari 1477         this.mevElement = (Element)ois.readObject();
2 26 Feb 07 jari 1478         this.primaryDataElement = (Element)ois.readObject();
2 26 Feb 07 jari 1479         this.commentElement = (Element)ois.readObject();
2 26 Feb 07 jari 1480         this.analysisElement = (Element)ois.readObject();
2 26 Feb 07 jari 1481         this.currDataID = ois.readInt();
2 26 Feb 07 jari 1482         this.currAlgSetID = ois.readInt();
2 26 Feb 07 jari 1483         this.lineSeparator = (String)ois.readObject();
2 26 Feb 07 jari 1484         this.indent = (String)ois.readObject();
2 26 Feb 07 jari 1485         //  if(ois.readBoolean())
2 26 Feb 07 jari 1486         //     this.errorLog = (ErrorLog)ois.readObject();
2 26 Feb 07 jari 1487         this.parsedScript = ois.readBoolean();
2 26 Feb 07 jari 1488     }
2 26 Feb 07 jari 1489 }