2 |
26 Feb 07 |
jari |
1 |
/* |
2 |
26 Feb 07 |
jari |
Copyright @ 1999-2003, The Institute for Genomic Research (TIGR). |
2 |
26 Feb 07 |
jari |
All rights reserved. |
2 |
26 Feb 07 |
jari |
4 |
*/ |
2 |
26 Feb 07 |
jari |
5 |
/* |
2 |
26 Feb 07 |
jari |
* $RCSfile: MAGEResponseHandler.java,v $ |
2 |
26 Feb 07 |
jari |
* $Revision: 1.3 $ |
2 |
26 Feb 07 |
jari |
* $Date: 2005/03/10 15:28:22 $ |
2 |
26 Feb 07 |
jari |
* $Author: braistedj $ |
2 |
26 Feb 07 |
jari |
* $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 |
// 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 |
* 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 |
* 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 |
* 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 |
// If this BioAssayData element has 'parameters' name, when it contains |
2 |
26 Feb 07 |
jari |
// 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 |
// That means that we unmarshal matrix dimensions |
2 |
26 Feb 07 |
jari |
// 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 |
// 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 |
// Cluster node contents ( parameters ) |
2 |
26 Feb 07 |
jari |
// '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 |
// 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 |
* 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 |
// Matrix finished |
2 |
26 Feb 07 |
jari |
// 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 |
// 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 |
* Unlike parsing with Xerces C++, we should glue different chunks |
2 |
26 Feb 07 |
jari |
* 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 |
* @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 |
* 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 |
// 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 |
* Creates a new rest chunk. |
2 |
26 Feb 07 |
jari |
* @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 |
* 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 |
// We are inside DataInternal for the current matrix |
2 |
26 Feb 07 |
jari |
// First, we need to detect, is there a float value cut at the end of a chunk ? |
2 |
26 Feb 07 |
jari |
// If the last chunk character is not, probably the cut has occured |
2 |
26 Feb 07 |
jari |
// There is no cut, if this chunk is the last chunk or the next |
2 |
26 Feb 07 |
jari |
// will start with witespace. |
2 |
26 Feb 07 |
jari |
// But we cannot detect that here |
2 |
26 Feb 07 |
jari |
// 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
* 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 |
} |