mev-4.0.01/source/org/tigr/remote/protocol/parser/MAGEResponseHandler.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, 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  * $RCSfile: MAGEResponseHandler.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.3 $
2 26 Feb 07 jari 8  * $Date: 2005/03/10 15:28:22 $
2 26 Feb 07 jari 9  * $Author: braistedj $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.remote.protocol.parser;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.util.LinkedList;
2 26 Feb 07 jari 15 import java.util.StringTokenizer;
2 26 Feb 07 jari 16
2 26 Feb 07 jari 17 import org.tigr.microarray.mev.cluster.Cluster;
2 26 Feb 07 jari 18 import org.tigr.microarray.mev.cluster.Node;
2 26 Feb 07 jari 19 import org.tigr.microarray.mev.cluster.NodeValue;
2 26 Feb 07 jari 20 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 21 import org.tigr.util.ConfMap;
2 26 Feb 07 jari 22 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 23 import org.xml.sax.Attributes;
2 26 Feb 07 jari 24 import org.xml.sax.SAXException;
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26 class MAGEResponseHandler extends ResponseHandlerBase {
2 26 Feb 07 jari 27
2 26 Feb 07 jari 28     // required parameters
2 26 Feb 07 jari 29     private MatrixData  m_currentMatrix = null;
2 26 Feb 07 jari 30     private ClusterData m_currentCluster = null;
2 26 Feb 07 jari 31     private NodeValue   m_nodeValue = null;
2 26 Feb 07 jari 32     private AlgorithmData m_data = new AlgorithmData();
2 26 Feb 07 jari 33     private boolean m_parameters;
2 26 Feb 07 jari 34
2 26 Feb 07 jari 35     /**
2 26 Feb 07 jari 36      * Constructs a <code>MAGEResponseHandler</code> with specified configuration.
2 26 Feb 07 jari 37      */
2 26 Feb 07 jari 38     public MAGEResponseHandler(ConfMap cfg) {
2 26 Feb 07 jari 39         super( cfg );
2 26 Feb 07 jari 40     }
2 26 Feb 07 jari 41
2 26 Feb 07 jari 42     /**
2 26 Feb 07 jari 43      * Returns the build result.
2 26 Feb 07 jari 44      */
2 26 Feb 07 jari 45     public AlgorithmData getResult() { return m_data;}
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47     /**
2 26 Feb 07 jari 48      * An element is started.
2 26 Feb 07 jari 49      */
2 26 Feb 07 jari 50     public void startElement(String uri, String localName,
2 26 Feb 07 jari 51                              String name , Attributes attrs) throws SAXException {
2 26 Feb 07 jari 52         super.startElement(uri, localName, name, attrs);
2 26 Feb 07 jari 53         try {
2 26 Feb 07 jari 54             if (name.equals("DerivedBioAssayData")) {
2 26 Feb 07 jari 55                 String matrixID = attrs.getValue("identifier" );
2 26 Feb 07 jari 56                 // If this BioAssayData element has 'parameters' name, when it contains
2 26 Feb 07 jari 57                 // parameters rather than a matrix
2 26 Feb 07 jari 58                 if (! matrixID.equals( "parameters" ))
2 26 Feb 07 jari 59                     m_currentMatrix = new MatrixData( matrixID );
2 26 Feb 07 jari 60                 else
2 26 Feb 07 jari 61                     m_parameters = true;
2 26 Feb 07 jari 62             } else
2 26 Feb 07 jari 63                 if (name.equals( "NameValueType" )) {
2 26 Feb 07 jari 64                 String mdimsPath[] = {"NameValueType", "PropertySets_assnlist", "BioDataCube"};
2 26 Feb 07 jari 65                 String paramsPath[] = {"NameValueType", "PropertySets_assnlist", "DerivedBioAssayData"};
2 26 Feb 07 jari 66                 String clusterNodeDimsPath[] = {"NameValueType", "PropertySets_assnlist", "NodeContents", "NodeContents_assnlist", "Node"};
2 26 Feb 07 jari 67                 if (m_path.checkFromBottom( mdimsPath )) {
2 26 Feb 07 jari 68                     // That means that we unmarshal matrix dimensions
2 26 Feb 07 jari 69                     // cols and rows attributes
2 26 Feb 07 jari 70                     String _name =  attrs.getValue("name");
2 26 Feb 07 jari 71                     if (_name.equals("cols")) {
2 26 Feb 07 jari 72                         String val =  attrs.getValue("value") ;
2 26 Feb 07 jari 73                         int dimX = Integer.parseInt( val ) ;
2 26 Feb 07 jari 74                         m_currentMatrix.m_dims.setDimX( dimX );
2 26 Feb 07 jari 75                     } else
2 26 Feb 07 jari 76                         if (_name.equals("rows")) {
2 26 Feb 07 jari 77                         String val =  attrs.getValue("value") ;
2 26 Feb 07 jari 78                         int dimY = Integer.parseInt( val ) ;
2 26 Feb 07 jari 79                         m_currentMatrix.m_dims.setDimY( dimY );
2 26 Feb 07 jari 80                     }
2 26 Feb 07 jari 81                     MatrixDimensions dims = m_currentMatrix.m_dims;
2 26 Feb 07 jari 82                     if (dims.getDimX() != 0 && dims.getDimY() != 0) {
2 26 Feb 07 jari 83                         m_currentMatrix.m_matrix = new FloatMatrix( dims.getDimY(), dims.getDimX() );
2 26 Feb 07 jari 84                     }
2 26 Feb 07 jari 85                 } else
2 26 Feb 07 jari 86                     if (m_path.checkFromBottom( paramsPath )) {
2 26 Feb 07 jari 87                     // That means that we unmarshal algorithm parameters
2 26 Feb 07 jari 88                     String _name = attrs.getValue("name" );
2 26 Feb 07 jari 89                     String value = attrs.getValue("value");
2 26 Feb 07 jari 90                     String type  = attrs.getValue("type");
2 26 Feb 07 jari 91                     if (type != null) {
2 26 Feb 07 jari 92                         if (type.equals( "vector-of-int" )) {
2 26 Feb 07 jari 93                             IntVectorParser p = new IntVectorParser();
2 26 Feb 07 jari 94                             int[] vector = null;
2 26 Feb 07 jari 95                             try {
2 26 Feb 07 jari 96                                 vector = p.parse( value );
2 26 Feb 07 jari 97                             } catch (ParserException ee) {
2 26 Feb 07 jari 98                                 throw new ParserException("error parsing parameter " + _name, ee );
2 26 Feb 07 jari 99                             }
2 26 Feb 07 jari 100                             m_data.addIntArray( _name, vector );
2 26 Feb 07 jari 101                         }
2 26 Feb 07 jari 102                     } else {
2 26 Feb 07 jari 103                         m_data.addParam(_name, value);
2 26 Feb 07 jari 104                     }
2 26 Feb 07 jari 105                 } else
2 26 Feb 07 jari 106                     if (m_path.checkFromBottom( clusterNodeDimsPath )) {
2 26 Feb 07 jari 107                     // Cluster node contents ( parameters )
2 26 Feb 07 jari 108                     // 'nvt' means NameValueType MAGE element
2 26 Feb 07 jari 109                     if (m_currentCluster != null) {
2 26 Feb 07 jari 110                         String nvtName = attrs.getValue("name");
2 26 Feb 07 jari 111                         String nvtValue = attrs.getValue("value");
2 26 Feb 07 jari 112                         if (nvtName != null && nvtValue != null) {
2 26 Feb 07 jari 113                             if (nvtName.equals("features-indexes")) {
2 26 Feb 07 jari 114                                 IntVectorParser p = new IntVectorParser();
2 26 Feb 07 jari 115                                 try {
2 26 Feb 07 jari 116                                     m_currentCluster.getCurrentNode().setFeaturesIndexes( p.parse( nvtValue  ) );
2 26 Feb 07 jari 117                                 } catch (ParserException e) {
2 26 Feb 07 jari 118                                     throw new ParserException("Cannot parse features indexes. " +
2 26 Feb 07 jari 119                                                               "Cluster: " + m_currentCluster.m_id + ". Node: " +
2 26 Feb 07 jari 120                                                               m_currentCluster.getCurrentNode() , e );
2 26 Feb 07 jari 121                                 }
2 26 Feb 07 jari 122                             }
2 26 Feb 07 jari 123                             if (nvtName.equals("probes-indexes")) {
2 26 Feb 07 jari 124                                 IntVectorParser p = new IntVectorParser();
2 26 Feb 07 jari 125                                 try {
2 26 Feb 07 jari 126                                     m_currentCluster.getCurrentNode().setProbesIndexes( p.parse( nvtValue  ) );
2 26 Feb 07 jari 127                                 } catch (ParserException e) {
2 26 Feb 07 jari 128                                     throw new ParserException("Cannot parse probes indexes. " +
2 26 Feb 07 jari 129                                                               "Cluster: " + m_currentCluster.m_id + ". Node: " +
2 26 Feb 07 jari 130                                                               m_currentCluster.getCurrentNode() , e );
2 26 Feb 07 jari 131                                 }
2 26 Feb 07 jari 132                             } else {
2 26 Feb 07 jari 133                                 // user-defined cluster noode content parameter
2 26 Feb 07 jari 134                                 m_currentCluster.getCurrentNode().setProperty( nvtName, nvtValue );
2 26 Feb 07 jari 135                             }
2 26 Feb 07 jari 136                         }
2 26 Feb 07 jari 137                     }
2 26 Feb 07 jari 138                 }
2 26 Feb 07 jari 139             } else
2 26 Feb 07 jari 140                 if (name.equals("BioAssayDataCluster")) {
2 26 Feb 07 jari 141                 String id = attrs.getValue("identifier");
2 26 Feb 07 jari 142                 m_currentCluster = new ClusterData( id );
2 26 Feb 07 jari 143             } else
2 26 Feb 07 jari 144                 if (name.equals("Node")) {
2 26 Feb 07 jari 145                 String path1[] = {"Node","Nodes_assnlist","Node"};
2 26 Feb 07 jari 146                 String path2[] = {"Node","Nodes_assnlist","BioAssayDataCluster"};
2 26 Feb 07 jari 147                 if (( m_path.checkFromBottom( path1 ) || m_path.checkFromBottom( path2 ) ) &&
2 26 Feb 07 jari 148                     m_currentCluster != null) {
2 26 Feb 07 jari 149                     m_currentCluster.startNode(  new Node() );
2 26 Feb 07 jari 150                 }
2 26 Feb 07 jari 151             } else
2 26 Feb 07 jari 152                 if (name.equals("NodeValue")) {
2 26 Feb 07 jari 153                 if (m_currentCluster != null) {
2 26 Feb 07 jari 154                     m_nodeValue = new NodeValue( attrs.getValue("name"), attrs.getValue("value"), null   );
2 26 Feb 07 jari 155                 }
2 26 Feb 07 jari 156             } else
2 26 Feb 07 jari 157                 if (name.equals("OntologyEntry")) {
2 26 Feb 07 jari 158                 String path[] = {"OntologyEntry", "Type_assn","NodeValue"};
2 26 Feb 07 jari 159                 if (m_path.checkFromBottom( path )) {
2 26 Feb 07 jari 160                     if (m_nodeValue != null) {
2 26 Feb 07 jari 161                         m_nodeValue.description = attrs.getValue("value");
2 26 Feb 07 jari 162                         String category = attrs.getValue("category");
2 26 Feb 07 jari 163                         if (category != null && category.equals("type")) {
2 26 Feb 07 jari 164                             adjustValueType( m_nodeValue, attrs.getValue("value") );
2 26 Feb 07 jari 165                         }
2 26 Feb 07 jari 166                     }
2 26 Feb 07 jari 167                 }
2 26 Feb 07 jari 168             }
2 26 Feb 07 jari 169         } catch (Exception ex) {
2 26 Feb 07 jari 170             processError( ex );
2 26 Feb 07 jari 171         }
2 26 Feb 07 jari 172     }
2 26 Feb 07 jari 173
2 26 Feb 07 jari 174     /**
2 26 Feb 07 jari 175      * An element is finished.
2 26 Feb 07 jari 176      */
2 26 Feb 07 jari 177     public void endElement(String uri, String localName, String name) throws SAXException {
2 26 Feb 07 jari 178         try {
2 26 Feb 07 jari 179             if (name.equals("DerivedBioAssayData")) {
2 26 Feb 07 jari 180                 if (m_currentMatrix != null) {
2 26 Feb 07 jari 181                     // Matrix finished
2 26 Feb 07 jari 182                     // parse the most recent chunk
2 26 Feb 07 jari 183                     if (!"".equals(m_currentMatrix.m_prevChunk))
2 26 Feb 07 jari 184                         parseFloats( m_currentMatrix.m_prevChunk );
2 26 Feb 07 jari 185                     m_currentMatrix.checkFinalState();
2 26 Feb 07 jari 186                     m_data.addMatrix( m_currentMatrix.m_name, m_currentMatrix.m_matrix );
2 26 Feb 07 jari 187                     m_currentMatrix = null;
2 26 Feb 07 jari 188                 } else {
2 26 Feb 07 jari 189                     // Parameters finished
2 26 Feb 07 jari 190                     m_parameters = false;
2 26 Feb 07 jari 191                 }
2 26 Feb 07 jari 192             } else
2 26 Feb 07 jari 193                 if (name.equals("BioAssayDataCluster")) {
2 26 Feb 07 jari 194                 m_data.addCluster( m_currentCluster.m_id, m_currentCluster.m_cluster   );
2 26 Feb 07 jari 195                 m_currentCluster = null;
2 26 Feb 07 jari 196             } else
2 26 Feb 07 jari 197                 if (name.equals("Node")) {
2 26 Feb 07 jari 198                 if (m_currentCluster != null)
2 26 Feb 07 jari 199                     m_currentCluster.endNode();
2 26 Feb 07 jari 200             } else
2 26 Feb 07 jari 201                 if (name.equals("NodeValue")) {
2 26 Feb 07 jari 202                 if (m_nodeValue != null) {
2 26 Feb 07 jari 203                     m_currentCluster.getCurrentNode().getValues().addNodeValue( m_nodeValue );
2 26 Feb 07 jari 204                     m_nodeValue  = null;
2 26 Feb 07 jari 205                 }
2 26 Feb 07 jari 206             }
2 26 Feb 07 jari 207
2 26 Feb 07 jari 208         } catch (Exception ex) {
2 26 Feb 07 jari 209             processError( ex );
2 26 Feb 07 jari 210         } finally {
2 26 Feb 07 jari 211             super.endElement( uri, localName, name );
2 26 Feb 07 jari 212         }
2 26 Feb 07 jari 213     }
2 26 Feb 07 jari 214
2 26 Feb 07 jari 215     /**
2 26 Feb 07 jari 216      * Unlike parsing with Xerces C++, we should glue different chunks
2 26 Feb 07 jari 217      * to unmarshal floats correctly.
2 26 Feb 07 jari 218      */
2 26 Feb 07 jari 219     private void parseFloats( String str ) throws ParserException  {
2 26 Feb 07 jari 220         StringTokenizer st = new StringTokenizer(str);
2 26 Feb 07 jari 221         while (st.hasMoreTokens()) {
2 26 Feb 07 jari 222             String s = st.nextToken();
2 26 Feb 07 jari 223             float value = 0f;
2 26 Feb 07 jari 224             try {
2 26 Feb 07 jari 225                 if (s.equals("NaN"))
2 26 Feb 07 jari 226                     value = Float.NaN;
2 26 Feb 07 jari 227                 else
2 26 Feb 07 jari 228                     value = Float.parseFloat( s );
2 26 Feb 07 jari 229             } catch (NumberFormatException ex) {
2 26 Feb 07 jari 230                 throw new ParserException("Failed to parser float: " + s + " matrix: " +
2 26 Feb 07 jari 231                                           m_currentMatrix.m_name + " order: " +
2 26 Feb 07 jari 232                                           m_currentMatrix.getNumbersRead(), ex );
2 26 Feb 07 jari 233             }
2 26 Feb 07 jari 234             m_currentMatrix.floatRead( value );
2 26 Feb 07 jari 235         }
2 26 Feb 07 jari 236     }
2 26 Feb 07 jari 237
2 26 Feb 07 jari 238     /**
2 26 Feb 07 jari 239      * @return true if specified char is a space.
2 26 Feb 07 jari 240      */
2 26 Feb 07 jari 241     private static boolean isSpace( char ch ) {
2 26 Feb 07 jari 242         return Character.isWhitespace( ch ) || Character.isSpaceChar( ch );
2 26 Feb 07 jari 243     }
2 26 Feb 07 jari 244
2 26 Feb 07 jari 245     /**
2 26 Feb 07 jari 246      * Glue string to be parsed as a string of floats.
2 26 Feb 07 jari 247      */
2 26 Feb 07 jari 248     private int doGlue( char ch[], int start, int length ) throws Exception {
2 26 Feb 07 jari 249         if (!"".equals( m_currentMatrix.m_prevChunk )) {
2 26 Feb 07 jari 250             StringBuffer toParse = new StringBuffer( m_currentMatrix.m_prevChunk );
2 26 Feb 07 jari 251             int startPos = start;
2 26 Feb 07 jari 252             if (!isSpace( ch[start] )) {
2 26 Feb 07 jari 253                 // arrived chunk starts with non-space char
2 26 Feb 07 jari 254                 int i = start;
2 26 Feb 07 jari 255                 while ((!isSpace( ch[i] )) && (( start + length ) > i)) {
2 26 Feb 07 jari 256                     toParse.append( ch[i] );
2 26 Feb 07 jari 257                     i++;
2 26 Feb 07 jari 258                 }
2 26 Feb 07 jari 259                 startPos = i;
2 26 Feb 07 jari 260             }
2 26 Feb 07 jari 261             parseFloats( toParse.toString() );
2 26 Feb 07 jari 262             m_currentMatrix.m_prevChunk = "";
2 26 Feb 07 jari 263             return startPos;
2 26 Feb 07 jari 264         } else
2 26 Feb 07 jari 265             return start;
2 26 Feb 07 jari 266     }
2 26 Feb 07 jari 267
2 26 Feb 07 jari 268     /**
2 26 Feb 07 jari 269      * Creates a new rest chunk.
2 26 Feb 07 jari 270      * @return the corrected length.
2 26 Feb 07 jari 271      */
2 26 Feb 07 jari 272     private int leaveChunk( char ch[], int start, int length ) {
2 26 Feb 07 jari 273         int curPos = start + length - 1;
2 26 Feb 07 jari 274         if (! isSpace( ch[ curPos] )) {
2 26 Feb 07 jari 275             int realLength = length;
2 26 Feb 07 jari 276             StringBuffer sb = new StringBuffer();
2 26 Feb 07 jari 277             int i = curPos;
2 26 Feb 07 jari 278             while (!isSpace( ch[i] ) && ( i > start )) {
2 26 Feb 07 jari 279                 sb.append( ch[i] );
2 26 Feb 07 jari 280                 --i;
2 26 Feb 07 jari 281                 --realLength;
2 26 Feb 07 jari 282             }
2 26 Feb 07 jari 283             m_currentMatrix.m_prevChunk = sb.reverse().toString();
2 26 Feb 07 jari 284             return realLength;
2 26 Feb 07 jari 285         } else {
2 26 Feb 07 jari 286             m_currentMatrix.m_prevChunk = "";
2 26 Feb 07 jari 287             return length;
2 26 Feb 07 jari 288         }
2 26 Feb 07 jari 289     }
2 26 Feb 07 jari 290
2 26 Feb 07 jari 291     /**
2 26 Feb 07 jari 292      * Invoked to handle chunk of an element characters.
2 26 Feb 07 jari 293      */
2 26 Feb 07 jari 294     public void characters(char ch[], int start, int length) throws SAXException {
2 26 Feb 07 jari 295         String prevChunk = "";
2 26 Feb 07 jari 296         int realStart = start;
2 26 Feb 07 jari 297         int realLength = length;
2 26 Feb 07 jari 298         try {
2 26 Feb 07 jari 299             String mdataPath[] = { "DataInternal", "DataInternal_assn", "BioDataCube"};
2 26 Feb 07 jari 300             if (m_path.checkFromBottom( mdataPath )) {
2 26 Feb 07 jari 301                 if (m_currentMatrix == null) throw new SAXException("Program error parsing matrix");
2 26 Feb 07 jari 302                 if (m_currentMatrix.m_matrix == null)
2 26 Feb 07 jari 303                     throw new SAXException("Wrong matrix - no dimensions defined");
2 26 Feb 07 jari 304                 // We are inside DataInternal for the current matrix
2 26 Feb 07 jari 305                 // First, we need to detect, is there a float value cut at the end of a chunk ?
2 26 Feb 07 jari 306                 // If the last chunk character is not, probably the cut has occured
2 26 Feb 07 jari 307                 // There is no cut, if this chunk is the last chunk or the next
2 26 Feb 07 jari 308                 // will start with witespace.
2 26 Feb 07 jari 309                 // But we cannot detect that here
2 26 Feb 07 jari 310                 // So, we will treat this event as a cut.
2 26 Feb 07 jari 311
2 26 Feb 07 jari 312                 realStart = doGlue( ch, start, length );
2 26 Feb 07 jari 313                 realLength = leaveChunk( ch, realStart, length + ( start - realStart) );
2 26 Feb 07 jari 314
2 26 Feb 07 jari 315                 String str = new String( ch, realStart, realLength );
2 26 Feb 07 jari 316                 parseFloats( str );
2 26 Feb 07 jari 317             }
2 26 Feb 07 jari 318         } catch (Exception ex) {
2 26 Feb 07 jari 319             processError( ex );
2 26 Feb 07 jari 320         }
2 26 Feb 07 jari 321     }
2 26 Feb 07 jari 322
2 26 Feb 07 jari 323     /**
2 26 Feb 07 jari 324      *  Ignore the ignorable.
2 26 Feb 07 jari 325      */
2 26 Feb 07 jari 326     public void ignorableWhitespace(char ch[], int start, int length) {}
2 26 Feb 07 jari 327
2 26 Feb 07 jari 328     /**
2 26 Feb 07 jari 329      * Could recognize the following types: integer, float.
2 26 Feb 07 jari 330      */
2 26 Feb 07 jari 331     private void adjustValueType( NodeValue value, String type ) throws Exception {
2 26 Feb 07 jari 332         if (!"".equals(type)) {
2 26 Feb 07 jari 333             String realValue = (String)value.value;
2 26 Feb 07 jari 334             if (type.equals("integer"))
2 26 Feb 07 jari 335                 value.value = new Integer( realValue );
2 26 Feb 07 jari 336             else
2 26 Feb 07 jari 337                 if (type.equals("float"))
2 26 Feb 07 jari 338                 value.value = new Float( realValue );
2 26 Feb 07 jari 339             else
2 26 Feb 07 jari 340                 if (type.equals("int-array"))
2 26 Feb 07 jari 341                 value.value = (new IntVectorParser()).parse(realValue);
2 26 Feb 07 jari 342             else
2 26 Feb 07 jari 343                 if (type.equals("float-array"))
2 26 Feb 07 jari 344                 value.value = (new FloatVectorParser()).parse(realValue);
2 26 Feb 07 jari 345             else
2 26 Feb 07 jari 346                 throw new Exception("Unknown value type: " + type);
2 26 Feb 07 jari 347         }
2 26 Feb 07 jari 348     }
2 26 Feb 07 jari 349
2 26 Feb 07 jari 350     /**
2 26 Feb 07 jari 351      * The structure to store two dimensions of a matrix.
2 26 Feb 07 jari 352      */
2 26 Feb 07 jari 353     class MatrixDimensions {
2 26 Feb 07 jari 354
2 26 Feb 07 jari 355         private int m_dimX;
2 26 Feb 07 jari 356         private int m_dimY;
2 26 Feb 07 jari 357
2 26 Feb 07 jari 358         public MatrixDimensions() {
2 26 Feb 07 jari 359             m_dimX = m_dimY = 0;
2 26 Feb 07 jari 360         }
2 26 Feb 07 jari 361
2 26 Feb 07 jari 362         public int getDimX() { return m_dimX;}
2 26 Feb 07 jari 363         public int getDimY() { return m_dimY;}
2 26 Feb 07 jari 364         public void setDimX( int X ) { m_dimX = X;}
2 26 Feb 07 jari 365         public void setDimY( int Y ) { m_dimY = Y;}
2 26 Feb 07 jari 366     }
2 26 Feb 07 jari 367
2 26 Feb 07 jari 368     /**
2 26 Feb 07 jari 369      * The structure to store a matrix data.
2 26 Feb 07 jari 370      */
2 26 Feb 07 jari 371     class MatrixData {
2 26 Feb 07 jari 372
2 26 Feb 07 jari 373         private int m_numbersRead;
2 26 Feb 07 jari 374         public String m_name;
2 26 Feb 07 jari 375         public MatrixDimensions m_dims = new MatrixDimensions();
2 26 Feb 07 jari 376         public FloatMatrix m_matrix;
2 26 Feb 07 jari 377         public String m_prevChunk = "";
2 26 Feb 07 jari 378
2 26 Feb 07 jari 379         /**
2 26 Feb 07 jari 380          * Constructs a <code>MatrixData</code> with specified name.
2 26 Feb 07 jari 381          */
2 26 Feb 07 jari 382         public MatrixData( String name ) {
2 26 Feb 07 jari 383             m_name = name;
2 26 Feb 07 jari 384             m_matrix = null;
2 26 Feb 07 jari 385             m_numbersRead = 0;
2 26 Feb 07 jari 386         }
2 26 Feb 07 jari 387
2 26 Feb 07 jari 388         /**
2 26 Feb 07 jari 389          * Accept specified float value.
2 26 Feb 07 jari 390          */
2 26 Feb 07 jari 391         public void floatRead( float value ) throws ParserException {
2 26 Feb 07 jari 392             try {
2 26 Feb 07 jari 393                 checkReadInProgressState();
2 26 Feb 07 jari 394                 int col = m_numbersRead / m_matrix.getRowDimension();
2 26 Feb 07 jari 395                 int row = m_numbersRead % m_matrix.getRowDimension();
2 26 Feb 07 jari 396                 m_matrix.set(row, col, value);
2 26 Feb 07 jari 397                 ++m_numbersRead;
2 26 Feb 07 jari 398             } catch (Exception e) {
2 26 Feb 07 jari 399                 throw new ParserException("error setting matrix value", e );
2 26 Feb 07 jari 400             }
2 26 Feb 07 jari 401         }
2 26 Feb 07 jari 402
2 26 Feb 07 jari 403         /**
2 26 Feb 07 jari 404          * Checkes if the matrix is overflow.
2 26 Feb 07 jari 405          */
2 26 Feb 07 jari 406         public void checkReadInProgressState() throws Exception {
2 26 Feb 07 jari 407             if (( m_numbersRead + 1 ) > m_dims.getDimX() * m_dims.getDimY())
2 26 Feb 07 jari 408                 throw new Exception("Error reading matrix data. Has read more data than dims allow: " +
2 26 Feb 07 jari 409                                     "read: " + m_numbersRead );
2 26 Feb 07 jari 410         }
2 26 Feb 07 jari 411
2 26 Feb 07 jari 412         /**
2 26 Feb 07 jari 413          * Checkes if number of read values is correct.
2 26 Feb 07 jari 414          */
2 26 Feb 07 jari 415         public void checkFinalState() throws Exception  {
2 26 Feb 07 jari 416             if (m_numbersRead != m_dims.getDimX() * m_dims.getDimY()) {
2 26 Feb 07 jari 417                 String str = "Error reading matrix data: \n" +
2 26 Feb 07 jari 418                              "Dimensions: " + m_dims.getDimX() + "x" + m_dims.getDimY() +
2 26 Feb 07 jari 419                              " = " + m_dims.getDimX() * m_dims.getDimY() + "\n" +
2 26 Feb 07 jari 420                              "It has been read: " + m_numbersRead + "\n";
2 26 Feb 07 jari 421                 throw new Exception( str );
2 26 Feb 07 jari 422             }
2 26 Feb 07 jari 423         }
2 26 Feb 07 jari 424
2 26 Feb 07 jari 425         /**
2 26 Feb 07 jari 426          * Returns number of read values.
2 26 Feb 07 jari 427          */
2 26 Feb 07 jari 428         public int getNumbersRead() { return m_numbersRead;}
2 26 Feb 07 jari 429     }
2 26 Feb 07 jari 430
2 26 Feb 07 jari 431     /**
2 26 Feb 07 jari 432      * The structure to accept a cluster data.
2 26 Feb 07 jari 433      */
2 26 Feb 07 jari 434     class ClusterData {
2 26 Feb 07 jari 435
2 26 Feb 07 jari 436         public String m_id;
2 26 Feb 07 jari 437         public Cluster m_cluster = new Cluster();
2 26 Feb 07 jari 438         private LinkedList m_nodes = new LinkedList();
2 26 Feb 07 jari 439
2 26 Feb 07 jari 440         /**
2 26 Feb 07 jari 441          * Constructs a <code>ClusterData</code> with specified id.
2 26 Feb 07 jari 442          */
2 26 Feb 07 jari 443         public ClusterData(String id ) {
2 26 Feb 07 jari 444             m_id = id;
2 26 Feb 07 jari 445         }
2 26 Feb 07 jari 446
2 26 Feb 07 jari 447         /**
2 26 Feb 07 jari 448          * Accepts a specified node.
2 26 Feb 07 jari 449          */
2 26 Feb 07 jari 450         public void startNode( Node node ) {
2 26 Feb 07 jari 451             assignParentToStarted( node );
2 26 Feb 07 jari 452             m_nodes.addLast( node );
2 26 Feb 07 jari 453         }
2 26 Feb 07 jari 454
2 26 Feb 07 jari 455         public void endNode() {
2 26 Feb 07 jari 456             m_nodes.removeLast();
2 26 Feb 07 jari 457         }
2 26 Feb 07 jari 458
2 26 Feb 07 jari 459         public Node getCurrentNode() {
2 26 Feb 07 jari 460             if (m_nodes.size() == 0)
2 26 Feb 07 jari 461                 return null;
2 26 Feb 07 jari 462             else
2 26 Feb 07 jari 463                 return(Node)m_nodes.getLast();
2 26 Feb 07 jari 464         }
2 26 Feb 07 jari 465
2 26 Feb 07 jari 466         /**
2 26 Feb 07 jari 467          * Assignes a parent to the specified node.
2 26 Feb 07 jari 468          */
2 26 Feb 07 jari 469         private void assignParentToStarted( Node node ) {
2 26 Feb 07 jari 470             Node current = getCurrentNode();
2 26 Feb 07 jari 471             if (current == null) {
2 26 Feb 07 jari 472                 m_cluster.getNodeList().addNode(  node );
2 26 Feb 07 jari 473             } else
2 26 Feb 07 jari 474                 current.getChildNodes().addNode( node );
2 26 Feb 07 jari 475         }
2 26 Feb 07 jari 476     }
2 26 Feb 07 jari 477 }