Commit in lcsim/src/org/lcsim/job on MAIN
JobControlManager.java+59-101.21 -> 1.22
support for simple define block and expressions in driver arguments (work in progress)

lcsim/src/org/lcsim/job
JobControlManager.java 1.21 -> 1.22
diff -u -r1.21 -r1.22
--- JobControlManager.java	26 Aug 2009 21:10:06 -0000	1.21
+++ JobControlManager.java	26 Aug 2009 23:34:20 -0000	1.22
@@ -29,12 +29,15 @@
 
 import org.jdom.Document;
 import org.jdom.Element;
+import org.jdom.Text;
 import org.jdom.input.SAXBuilder;
 import org.lcsim.LCSimVersion;
+import org.lcsim.units.Constants;
 import org.lcsim.util.Driver;
 import org.lcsim.util.cache.FileCache;
 import org.lcsim.util.loop.LCIOEventSource;
 import org.lcsim.util.loop.LCSimLoop;
+import org.lcsim.util.xml.JDOMExpressionFactory;
 
 /**
  * The <code>JobControlManager</code> provides an XML frontend for running LCSim jobs.
@@ -72,6 +75,8 @@
 	PrintStream logStream = System.out;
 	LCSimLoop loop;
 	Element root;
+	Map<String,Double> constants = new HashMap<String,Double>();
+	JDOMExpressionFactory factory;
 
 	/**
 	 * Default no-argument constructor.
@@ -203,7 +208,10 @@
 	 */
 	public void setup(InputStream in)
 	{
-		SAXBuilder builder = new SAXBuilder();
+		SAXBuilder builder = new SAXBuilder();		
+		factory = new JDOMExpressionFactory();
+		builder.setFactory(factory);
+		
 		Document doc = null;
 		try
 		{
@@ -227,6 +235,12 @@
 
 		// Set the root element.
 		root = doc.getRootElement();
+		
+		// Setup units.
+		setupUnits();
+		
+		// Process the variable definitions.
+		processConstants();
 
 		// Setup the job control parameters.
 		setupJobControlParameters();
@@ -818,26 +832,31 @@
 		String value = parameterElement.getText();
 
 		// Single int.
+		// Evaluate expression.
 		if (propertyType.equals(int.class))
 		{
-			o = Integer.valueOf(value);
+			o = Integer.valueOf((int)factory.computeDouble(value));
 		}
 		// Single String.
+		// No expression.
 		else if (propertyType.equals(String.class))
 		{
 			o = value;
 		}
 		// Single double.
+		// Evaluate expression.
 		else if (propertyType.equals(double.class))
 		{
-			o = Double.valueOf(value);
+			o = Double.valueOf(factory.computeDouble(value));
 		}
 		// Single float.
+		// Evaluate expression.
 		else if (propertyType.equals(float.class))
 		{
-			o = Float.valueOf(value);
+			o = Float.valueOf(factory.computeFloat(value));
 		}
 		// Single boolean.
+		// No expression.
 		else if (propertyType.equals(boolean.class))
 		{
 			o = Boolean.valueOf(value);
@@ -846,12 +865,13 @@
 		else if (propertyType.equals(Hep3Vector.class))
 		{
 			StringTokenizer tokenize = new StringTokenizer(value);
-			double x = Double.valueOf(tokenize.nextToken());
-			double y = Double.valueOf(tokenize.nextToken());
-			double z = Double.valueOf(tokenize.nextToken());
+			double x = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
+			double y = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
+			double z = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
 			o = new BasicHep3Vector(x, y, z);
 		}
 		// 1d array of doubles.
+		// Each token is evaluated.
 		else if (propertyType.getName().equals("[D"))
 		{
 			StringTokenizer tokenize = new StringTokenizer(value);
@@ -860,12 +880,13 @@
 			int i = 0;
 			while (tokenize.hasMoreTokens())
 			{
-				da[i] = Double.valueOf(tokenize.nextToken());
+				da[i] = Double.valueOf(factory.computeDouble(tokenize.nextToken()));
 				++i;
 			}
 			o = da;
 		}
 		// 1d array of ints.
+		// Each token is evaluated.
 		else if (propertyType.getName().equals("[I"))
 		{
 			StringTokenizer tokenize = new StringTokenizer(value);
@@ -874,12 +895,13 @@
 			int i = 0;
 			while (tokenize.hasMoreTokens())
 			{
-				ia[i] = Integer.valueOf(tokenize.nextToken());
+				ia[i] = Integer.valueOf((int)factory.computeDouble(tokenize.nextToken()));
 				++i;
 			}
 			o = ia;
 		}
 		// 1d array of floats.
+		// Each token is evaluated.
 		else if (propertyType.getName().equals("[F"))
 		{
 			StringTokenizer tokenize = new StringTokenizer(value);
@@ -888,12 +910,13 @@
 			int i = 0;
 			while (tokenize.hasMoreTokens())
 			{
-				fa[i] = Float.valueOf(tokenize.nextToken());
+				fa[i] = Float.valueOf(factory.computeFloat(tokenize.nextToken()));
 				++i;
 			}
 			o = fa;
 		}
 		// 1d array of strings.
+		// No expressions.
 		else if (propertyType.getName().equals("[Ljava.lang.String;"))
 		{
 			StringTokenizer tokenize = new StringTokenizer(value);
@@ -908,6 +931,7 @@
 			o = sa;
 		}
 		// 1d array of booleans.
+		// No expressions.
 		else if (propertyType.getName().equals("[Z"))
 		{
 			StringTokenizer tokenize = new StringTokenizer(value);
@@ -947,6 +971,31 @@
 		return o;
 	}
 	
+	private void processConstants()
+	{
+		Element define = root.getChild("define");		
+		if (define != null)
+		{
+			for (Object o : define.getChildren())
+			{				
+				Element e = (Element)o;
+				Text txt = (Text)e.getContent().get(0);
+				double dval = factory.computeDouble(txt.getValue());
+				this.constants.put(e.getName(), dval);
+				factory.addConstant(e.getName(), dval);				
+			}
+		}
+	}
+	
+	private void setupUnits()
+	{
+		Constants constants = Constants.getInstance();
+		for (Entry<String,Double> unit : constants.entrySet())
+		{	    		   
+			factory.addConstant(unit.getKey(),unit.getValue());	    
+	    }
+	}
+	
 	private static Class getPrimitiveType(String name)
 	{
 		if (name.equals("byte")) return byte.class;
CVSspam 0.2.8