1 package org.lcsim.job;
2
3 import hep.physics.vec.BasicHep3Vector;
4 import hep.physics.vec.Hep3Vector;
5
6 import java.io.File;
7 import java.net.MalformedURLException;
8 import java.net.URL;
9 import java.util.ArrayList;
10 import java.util.List;
11 import java.util.StringTokenizer;
12
13 import org.jdom.Element;
14 import org.lcsim.util.xml.JDOMExpressionFactory;
15
16
17
18
19
20
21
22 public class ParameterConverters {
23
24 List<IParameterConverter> converters = new ArrayList<IParameterConverter>();
25 JDOMExpressionFactory factory;
26
27 public ParameterConverters(JDOMExpressionFactory factory) {
28 this.factory = factory;
29
30 add(new IntegerConverter());
31 add(new StringConverter());
32 add(new DoubleConverter());
33 add(new FloatConverter());
34 add(new BooleanConverter());
35 add(new Hep3VectorConverter());
36 add(new DoubleArray1DConverter());
37 add(new IntegerArray1DConverter());
38 add(new FloatArray1DConverter());
39 add(new StringArray1DConverter());
40 add(new BooleanArray1DConverter());
41 add(new FileConverter());
42 add(new URLConverter());
43 add(new IntegerArray2DConverter());
44 add(new DoubleArray2DConverter());
45 }
46
47 public Object convert(Class propertyType, Element parameterElement) {
48 IParameterConverter p = getConverterForType(propertyType);
49 if (p != null) {
50 return p.convert(factory, parameterElement);
51 } else {
52 return null;
53 }
54 }
55
56 protected void add(IParameterConverter converter) {
57 converters.add(converter);
58 }
59
60 public List<IParameterConverter> getConverters() {
61 return converters;
62 }
63
64 public IParameterConverter getConverterForType(Class propertyType) {
65 for (IParameterConverter p : converters) {
66 if (p.handles(propertyType))
67 return p;
68 }
69 return null;
70 }
71
72 public class IntegerConverter implements IParameterConverter {
73
74 public boolean handles(Class propertyType) {
75 return propertyType.equals(int.class);
76 }
77
78 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
79 return Integer.valueOf((int) factory.computeDouble(parameterElement.getValue()));
80 }
81 }
82
83 public class StringConverter implements IParameterConverter {
84
85 public boolean handles(Class propertyType) {
86 return propertyType.equals(String.class);
87 }
88
89 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
90 return parameterElement.getValue();
91 }
92 }
93
94 public class DoubleConverter implements IParameterConverter {
95
96 public boolean handles(Class propertyType) {
97 return propertyType.equals(double.class);
98 }
99
100 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
101 return Double.valueOf(factory.computeDouble(parameterElement.getValue()));
102 }
103 }
104
105 public class FloatConverter implements IParameterConverter {
106
107 public boolean handles(Class propertyType) {
108 return propertyType.equals(float.class);
109 }
110
111 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
112 return Float.valueOf(factory.computeFloat(parameterElement.getValue()));
113 }
114 }
115
116 public class BooleanConverter implements IParameterConverter {
117
118 public boolean handles(Class propertyType) {
119 return propertyType.equals(boolean.class);
120 }
121
122 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
123 return Boolean.valueOf(parameterElement.getValue());
124 }
125 }
126
127 public class Hep3VectorConverter implements IParameterConverter {
128
129 public boolean handles(Class propertyType) {
130 return propertyType.equals(Hep3Vector.class);
131 }
132
133 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
134 StringTokenizer tokenize = new StringTokenizer(parameterElement.getValue());
135 double x = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
136 double y = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
137 double z = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
138 return new BasicHep3Vector(x, y, z);
139 }
140 }
141
142 public class DoubleArray1DConverter implements IParameterConverter {
143
144 public boolean handles(Class propertyType) {
145 return propertyType.getName().equals("[D");
146 }
147
148 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
149 StringTokenizer tokenize = new StringTokenizer(parameterElement.getValue());
150 int size = tokenize.countTokens();
151 double da[] = new double[size];
152 int i = 0;
153 while (tokenize.hasMoreTokens()) {
154 da[i] = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
155 ++i;
156 }
157 return da;
158 }
159 }
160
161 public class IntegerArray1DConverter implements IParameterConverter {
162
163 public boolean handles(Class propertyType) {
164 return propertyType.getName().equals("[I");
165 }
166
167 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
168 StringTokenizer tokenize = new StringTokenizer(parameterElement.getValue());
169 int size = tokenize.countTokens();
170 int ia[] = new int[size];
171 int i = 0;
172 while (tokenize.hasMoreTokens()) {
173 ia[i] = Integer.valueOf((int) factory.computeDouble(tokenize.nextToken()));
174 ++i;
175 }
176 return ia;
177 }
178 }
179
180 public class FloatArray1DConverter implements IParameterConverter {
181
182 public boolean handles(Class propertyType) {
183 return propertyType.getName().equals("[F");
184 }
185
186 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
187 StringTokenizer tokenize = new StringTokenizer(parameterElement.getValue());
188 int size = tokenize.countTokens();
189 float fa[] = new float[size];
190 int i = 0;
191 while (tokenize.hasMoreTokens()) {
192 fa[i] = Float.valueOf(factory.computeFloat(tokenize.nextToken()));
193 ++i;
194 }
195 return fa;
196 }
197 }
198
199 public class StringArray1DConverter implements IParameterConverter {
200
201 public boolean handles(Class propertyType) {
202 return propertyType.getName().equals("[Ljava.lang.String;");
203 }
204
205 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
206 StringTokenizer tokenize = new StringTokenizer(parameterElement.getValue());
207 int size = tokenize.countTokens();
208 String sa[] = new String[size];
209 int i = 0;
210 while (tokenize.hasMoreTokens()) {
211 sa[i] = tokenize.nextToken();
212 ++i;
213 }
214 return sa;
215 }
216 }
217
218 public class BooleanArray1DConverter implements IParameterConverter {
219
220 public boolean handles(Class propertyType) {
221 return propertyType.getName().equals("[Z");
222 }
223
224 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
225 StringTokenizer tokenize = new StringTokenizer(parameterElement.getValue());
226 int size = tokenize.countTokens();
227 boolean ba[] = new boolean[size];
228 int i = 0;
229 while (tokenize.hasMoreTokens()) {
230 ba[i] = Boolean.valueOf(tokenize.nextToken());
231 ++i;
232 }
233 return ba;
234 }
235 }
236
237 public class FileConverter implements IParameterConverter {
238
239 public boolean handles(Class propertyType) {
240 return propertyType.equals(File.class);
241 }
242
243 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
244 return new File(parameterElement.getValue());
245 }
246 }
247
248 public class URLConverter implements IParameterConverter {
249
250 public boolean handles(Class propertyType) {
251 return propertyType.equals(URL.class);
252 }
253
254 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
255 try {
256 return new URL(parameterElement.getValue());
257 } catch (MalformedURLException x) {
258 throw new RuntimeException("Bad URL " + parameterElement.getValue() + " in XML job description.", x);
259 }
260 }
261 }
262
263 public class DoubleArray2DConverter implements IParameterConverter {
264
265 public boolean handles(Class propertyType) {
266 return propertyType.getName().equals("[[D");
267 }
268
269 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
270
271 StringTokenizer tokenize = new StringTokenizer(parameterElement.getValue(), ";");
272 int length = tokenize.countTokens();
273 int ir = 0;
274 List<List<Double>> rows = new ArrayList<List<Double>>(length);
275 while (tokenize.hasMoreTokens()) {
276 String rowStr = tokenize.nextToken();
277 StringTokenizer tokenize2 = new StringTokenizer(rowStr);
278 rows.add(new ArrayList<Double>());
279 List<Double> row = rows.get(ir);
280 while (tokenize2.hasMoreTokens()) {
281 String entry = tokenize2.nextToken();
282 Double d = factory.computeDouble(entry);
283 row.add(d);
284 }
285 ++ir;
286 }
287
288
289 double arr[][] = new double[rows.size()][rows.get(0).size()];
290 int jcheck = rows.get(0).size() - 1;
291 int i = 0;
292 int j = 0;
293 for (List<Double> aa : rows) {
294 for (Double a : aa) {
295 if (j > jcheck) {
296 throw new RuntimeException("Row " + j + " of array " + parameterElement.getName()
297 + "with length " + aa.size() + " is too long.");
298 }
299 arr[i][j] = a;
300 ++j;
301 }
302 if (j < jcheck) {
303 throw new RuntimeException("Row " + j + " of array " + parameterElement.getName() + "with length "
304 + aa.size() + "is too short.");
305 }
306 j = 0;
307 ++i;
308 }
309 return arr;
310 }
311 }
312
313 public class IntegerArray2DConverter implements IParameterConverter {
314
315 public boolean handles(Class propertyType) {
316 return propertyType.getName().equals("[[I");
317 }
318
319 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
320
321 StringTokenizer tokenize = new StringTokenizer(parameterElement.getValue(), ";");
322 int length = tokenize.countTokens();
323 int ir = 0;
324 List<List<Integer>> rows = new ArrayList<List<Integer>>(length);
325 while (tokenize.hasMoreTokens()) {
326 String rowStr = tokenize.nextToken();
327 StringTokenizer tokenize2 = new StringTokenizer(rowStr);
328 rows.add(new ArrayList<Integer>());
329 List<Integer> row = rows.get(ir);
330 while (tokenize2.hasMoreTokens()) {
331 String entry = tokenize2.nextToken();
332 Integer d = Integer.valueOf(entry);
333 row.add(d);
334 }
335 ++ir;
336 }
337
338
339 int arr[][] = new int[rows.size()][rows.get(0).size()];
340 int jcheck = rows.get(0).size() - 1;
341 int i = 0;
342 int j = 0;
343 for (List<Integer> aa : rows) {
344 for (Integer a : aa) {
345 if (j > jcheck) {
346 throw new RuntimeException("Row " + j + " of array " + parameterElement.getName()
347 + "with length " + aa.size() + " is too long.");
348 }
349 arr[i][j] = a;
350 ++j;
351 }
352 if (j < jcheck) {
353 throw new RuntimeException("Row " + j + " of array " + parameterElement.getName() + "with length "
354 + aa.size() + "is too short.");
355 }
356 j = 0;
357 ++i;
358 }
359 return arr;
360 }
361 }
362
363 public class ElementConverter implements IParameterConverter {
364
365 public boolean handles(Class propertyType) {
366 return propertyType.equals(Element.class);
367 }
368
369 public Object convert(JDOMExpressionFactory factory, Element parameterElement) {
370 return parameterElement;
371 }
372 }
373 }