View Javadoc

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   * Converter utilities for making Java Beans arguments from LCSim XML Driver parameters, using a JDOM factory to do
18   * expression evaluation.
19   * 
20   * @author jeremym
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             // Parse into a list of list of doubles.
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             // Convert list of doubles into 2D array, checking for wrong sized rows.
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             // Parse into a list of list of doubles.
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             // Convert list of doubles into 2D array, checking for wrong sized rows.
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 }