Commit in lcsim-job/src on MAIN
main/java/org/lcsim/job/JobControlManager.java+321added 1.1
                       /TestDriver.java+152added 1.1
test/java/org/lcsim/job/JobControlManagerTest.java+15added 1.1
test/resources/org/lcsim/job/test.xml+59added 1.1
+547
4 added files
JM: lcsim-job source

lcsim-job/src/main/java/org/lcsim/job
JobControlManager.java added at 1.1
diff -N JobControlManager.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ JobControlManager.java	7 Aug 2008 18:47:31 -0000	1.1
@@ -0,0 +1,321 @@
+package org.lcsim.job;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+
+import java.beans.BeanInfo;
+import java.beans.PropertyDescriptor;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.jdom.Document;
+import org.jdom.Element;
+import org.jdom.input.SAXBuilder;
+import org.lcsim.util.Driver;
+import org.lcsim.util.loop.LCIOEventSource;
+import org.lcsim.util.loop.LCSimLoop;
+
+// TODO: implement global parameters such as numberToRun as 
+//       T getParameter(name,Class<T>)
+//
+// TODO: handle additional parameter types such as SymmetricMatrix
+//
+// TODO: handle 2d array parameters
+//
+// TODO: turn on/off driverStatistics (does this require Driver changes?)
+//
+// TODO: allow short name for class type by looking for class 
+//       in org.lcsim subpackages (see Package and Class Loader javadoc)
+//
+// TODO: expressions as in compact description for simple arithmetic with units
+//
+// TODO: handle constructor arguments (no idea how to do this)
+//
+public class JobControlManager {
+	
+	Map<String,Driver> driverMap;
+	List<Driver> driverExec;
+	List<File> inputFiles;
+				
+	public void run() {
+    	LCSimLoop loop = new LCSimLoop();
+    	for (Driver driver : driverExec) {
+    		loop.add(driver);
+    	}
+    	try {
+    		loop.setLCIORecordSource(new LCIOEventSource("test",inputFiles));
+    		loop.loop(-1,null);
+    	} catch (Exception x) {
+    		throw new RuntimeException(x);
+    	}    	
+    	loop.dispose();
+    }    	
+    
+    // setup from embedded resource
+    public void setup(String resource) {
+    	setup(JobControlManager.class.getResourceAsStream(resource));
+    }
+    
+    // setup from file
+    public void setup(File file) {
+    	try {
+    		setup((new FileInputStream(file)));
+    	} catch (FileNotFoundException x) {
+    		throw new RuntimeException(x);
+    	}
+    } 
+	
+    // setup from InputStream (primary setup routine)
+    public void setup(InputStream in) {
+    	
+    	// clear data structures for next job
+    	clear();
+        
+    	// build the steering xml document
+        SAXBuilder builder = new SAXBuilder();
+        Document doc = null;
+        try {
+        	doc = builder.build(in);
+        } catch (Exception x) {
+        	throw new RuntimeException(x);
+        }
+        
+        // get the root element
+        Element root = doc.getRootElement();            
+        
+        // get list of driver elements from the file
+        List<Element> drivers = root.getChild("drivers").getChildren("driver");
+        
+        // process list of drivers
+        for (Element driver : drivers) {
+        	
+        	// get the name of driver
+        	String name = driver.getAttributeValue("name");
+        	
+        	// get the type of driver
+        	String type = driver.getAttributeValue("type");
+
+        	// get the class of driver
+        	Class driverClass;
+        	
+        	// the BeanInfo for this class
+        	BeanInfo beaninfo;
+        	
+        	// the constructor for this class
+        	Constructor constructor;
+        	
+        	// instantiated object
+        	Driver newDriver;
+        	
+        	// a lot of exceptions to catch for introspection so just wrap 
+        	// the next 4 gets in a try block
+        	try {
+        		driverClass = Class.forName(type);
+        	
+        		// get bean info for driver
+        		beaninfo = java.beans.Introspector.getBeanInfo(driverClass);
+        	            		
+        		// create a new instance of this driver
+        		constructor = driverClass.getConstructors()[0];
+        		newDriver = (Driver)constructor.newInstance(null);
+        	} catch (Exception x) {
+        		throw new RuntimeException(x);
+        	}
+        	
+        	// get list of parameter elements
+        	List<Element> parameters = driver.getChildren();
+        	
+        	// process the parameters
+        	for (Element parameter : parameters) {
+        		
+        		// get parameter name
+        		String pname = parameter.getName();
+        		
+        		// find the correct property descriptor for this parameter
+        		PropertyDescriptor propFind = null;
+        		for (PropertyDescriptor prop : beaninfo.getPropertyDescriptors()) {
+        			if (prop.getName().equals(pname)) {
+        				propFind = prop;
+        				break;
+        			}
+        		}
+        		        	        		
+        		// found a valid property?
+        		if (propFind != null) {
+        			        	
+        			// get the class of the property
+        			Class propertyType = propFind.getPropertyType();
+        		
+        			// create Object for next Driver parameter
+        			//System.out.println("converting: " + propFind.getName());
+        			Object nextParameter = convertParameter(parameter.getText(), propertyType);        		        		
+        		    
+        			// TODO: use set property
+        			
+        			// if got a valid parameter value, then invoke the setter with its value
+        			if (nextParameter != null) {
+        				Method propWrite = propFind.getWriteMethod();
+        				Object pargs[] = new Object[1];
+        				pargs[0] = nextParameter;
+        				try {
+        					propWrite.invoke(newDriver, pargs);
+        				} catch (Exception x) {
+        					throw new RuntimeException(x);
+        				}
+        			}
+        			else {
+        				System.out.println("WARNING: failed to create parameter object with value: " + parameter.getText());
+        			}
+        		}
+        		else {
+        			System.out.println("WARNING: no property descriptor found: " + pname);
+        		}
+        	}
+        	
+        	// add this driver to Driver map
+        	addDriver(name,newDriver);        	       
+        }        	
+        
+    	// add driver references to list for execution order
+    	List<Element> exec = root.getChild("execute").getChildren("driver");
+    	for (Element execDriver : exec) {
+    		String driverName = execDriver.getAttributeValue("name");
+    		Driver driverFind = driverMap.get(driverName);
+    		if (driverFind != null)
+    			driverExec.add(driverFind);
+    		else
+    			throw new RuntimeException("driver not found: " + driverName);
+    	}
+        
+        // process list of input LCIO files
+        List<Element> files = root.getChild("inputFiles").getChildren("file");
+        for (Element file : files) {
+        	String fileLoc = file.getText();        	
+        	File nextFile = new File(fileLoc);
+        	inputFiles.add(nextFile);
+        }
+    }   
+    
+    // reset internal data structures
+    public void clear() {
+    	inputFiles = new ArrayList<File>();
+    	driverExec = new ArrayList<Driver>();    	
+    	driverMap = new LinkedHashMap<String,Driver>();
+    }
+        
+    // generic parameter conversion to int, String, double, float
+    private Object convertParameter(String value, Class propertyType) {
+    	
+    	//System.out.println("converting type: <" + propertyType.getName() +">");
+    	
+    	Object o = null;
+    	
+    	// int
+    	if (propertyType.equals(int.class)) {
+    		o = Integer.valueOf(value);
+    	}
+    	// String
+    	else if (propertyType.equals(String.class)) {
+    		o = value;
+    	}
+    	// double
+    	else if (propertyType.equals(double.class)) {
+    		o = Double.valueOf(value);
+    	}
+    	// float
+    	else if (propertyType.equals(float.class)) {
+    		o = Float.valueOf(value);
+    	}
+    	// boolean
+    	else if (propertyType.equals(boolean.class)) {
+    		o = Boolean.valueOf(value);
+    	}
+    	// Hep3Vector
+    	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());
+    		o = new BasicHep3Vector(x,y,z); 
+    	}
+    	// 1d array of doubles
+    	else if (propertyType.getName().equals("[D")) {
+    		StringTokenizer tokenize = new StringTokenizer(value);
+    		int size = tokenize.countTokens();
+    		double da[] = new double[size];
+    		int i = 0;
+    		while (tokenize.hasMoreTokens()) {
+    			da[i] = Double.valueOf(tokenize.nextToken());
+    			++i;
+    		}
+    		o = da;
+    	}
+    	// 1d array of ints
+    	else if (propertyType.getName().equals("[I")) {
+    		StringTokenizer tokenize = new StringTokenizer(value);
+    		int size = tokenize.countTokens();
+    		int ia[] = new int[size];
+    		int i = 0;
+    		while (tokenize.hasMoreTokens()) {
+    			ia[i] = Integer.valueOf(tokenize.nextToken());
+    			++i;
+    		}
+    		o = ia;
+    	}
+    	// 1d array of floats
+    	else if (propertyType.getName().equals("[F")) {
+    		StringTokenizer tokenize = new StringTokenizer(value);
+    		int size = tokenize.countTokens();
+    		float fa[] = new float[size];
+    		int i = 0;
+    		while (tokenize.hasMoreTokens()) {
+    			fa[i] = Float.valueOf(tokenize.nextToken());
+    			++i;
+    		}
+    		o = fa;
+    	}
+    	// 1d array of strings
+    	else if (propertyType.getName().equals("[Ljava.lang.String;")) {
+    		StringTokenizer tokenize = new StringTokenizer(value);
+    		int size = tokenize.countTokens();
+    		String sa[] = new String[size];
+    		int i = 0;
+    		while (tokenize.hasMoreTokens()) {
+    			sa[i] = tokenize.nextToken();
+    			++i;
+    		}
+    		o = sa;
+    	}
+    	// 1d array of booleans
+    	else if (propertyType.getName().equals("[Z")) {
+    		StringTokenizer tokenize = new StringTokenizer(value);
+    		int size = tokenize.countTokens();
+    		boolean ba[] = new boolean[size];
+    		int i = 0;
+    		while (tokenize.hasMoreTokens()) {
+    			ba[i] = Boolean.valueOf(tokenize.nextToken());
+    			++i;
+    		}
+    		o = ba;
+    	}
+    	
+    	return o;
+    }
+    
+    // add a driver with associated name
+    private void addDriver(String name, Driver driver) {
+    	if (driverMap.containsKey(name)) {
+    		throw new RuntimeException("ERROR: duplicate driver name: " + name);
+    	}
+    	driverMap.put(name, driver);
+    }   
+}
\ No newline at end of file

lcsim-job/src/main/java/org/lcsim/job
TestDriver.java added at 1.1
diff -N TestDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TestDriver.java	7 Aug 2008 18:47:31 -0000	1.1
@@ -0,0 +1,152 @@
+package org.lcsim.job;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+
+public class TestDriver extends Driver
+{    
+    int intVar;
+    double doubleVar;
+    float floatVar;  
+    String stringVar;
+    boolean booleanVar;
+    
+    int[] intArr;
+    double[] doubleArr;
+    float[] floatArr;
+    String[] stringArr;
+    boolean[] booleanArr;
+    
+    int[][] intArr2;
+
+    Hep3Vector vec;
+    
+    public static boolean printHello = true;
+    
+    public void process(EventHeader event) {
+    	if (printHello) {
+    		System.out.println(TestDriver.class.getName() + " - " + event.getDetector().getName());
+    		
+    		// Debug printouts...
+    		
+    		System.out.println("intVar="+intVar);
+    		System.out.println("floatVar="+floatVar);
+    		System.out.println("doubleVar="+doubleVar);
+    		System.out.println("booleanVar="+booleanVar);
+    		System.out.println("stringVar="+stringVar);
+    		
+    		System.out.print("doubleArr=[");
+    		for (double d : doubleArr) {
+    			System.out.print(" " + d);
+    		}
+    		System.out.println(" ]");
+    		
+    		System.out.print("intArr=[");
+    		for (int i : intArr) {
+    			System.out.print(" " + i);    			
+    		}
+    		System.out.println(" ]");
+    		
+    		System.out.print("floatArr=[");
+    		for (float f : floatArr) {
+    			System.out.print(" " + f);    			
+    		}
+    		System.out.println(" ]");    		
+    		    		
+    		System.out.print("stringArr=[");
+    		for (String s : stringArr) {
+    			System.out.print(" " + s);
+    		}
+    		System.out.println(" ]");    		
+    		
+    		System.out.print("booleanArr=[");
+    		for (boolean b : booleanArr) {
+    			System.out.print(" " + b);
+    		}
+    		System.out.println(" ]");    		
+    		
+    		System.out.println("vec="+vec.toString());
+    		
+    		printHello = false;
+    	}
+    }
+    
+    public TestDriver() {
+    	System.out.println("created TestDriver");
+    }
+    
+    public void setH(Hep3Vector h) {
+    	vec = new BasicHep3Vector(h.x(),h.y(),h.z());
+    }
+    
+    public void setIntVar(int v) {
+    	intVar = v;
+    }
+    
+    public void setDoubleVar(double v) {
+    	doubleVar = v;
+    }
+    
+    public void setFloatVar(float v) {
+    	floatVar = v;
+    }
+    
+    public void setStringVar(String v) {
+    	stringVar = v;
+    }
+    
+    public void setBooleanVar(boolean v) {
+    	booleanVar = v;
+    }
+    
+    public void setDoubleArr(double[] v) {
+    	doubleArr = v;
+    }
+    
+    public void setDoubleArr(int i, double v) {
+    	doubleArr[i] = v;
+    }
+    
+    public void setIntArr(int[] v) {
+    	intArr = v;
+    }
+    
+    public void setIntArr(int i, int v) {
+    	intArr[i] = v;
+    }
+    
+    public void setFloatArr(float v[]) {
+    	floatArr = v;
+    }
+    
+    public void setFloatArr(int i, float v) {
+    	floatArr[i] = v;
+    }
+    
+    public void setStringArr(String v[]) {
+    	stringArr = v;
+    }
+    
+    public void setStringArr(int i, String v) {
+    	stringArr[i] = v;
+    }
+    
+    public void setBooleanArr(boolean v[]) {
+    	booleanArr = v;
+    }
+    
+    public void setBooleanArr(int i, boolean v) {
+    	booleanArr[i] = v;
+    }
+    
+    public void setIntArr2(int [][] v) {
+    	intArr2 = v;
+    }
+    
+    public void setIntArr2(int i, int v[]) {
+    	intArr2[i] = v;
+    }
+}
\ No newline at end of file

lcsim-job/src/test/java/org/lcsim/job
JobControlManagerTest.java added at 1.1
diff -N JobControlManagerTest.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ JobControlManagerTest.java	7 Aug 2008 18:47:32 -0000	1.1
@@ -0,0 +1,15 @@
+package org.lcsim.job;
+
+import org.lcsim.job.JobControlManager;
+
+import junit.framework.TestCase;
+
+public class JobControlManagerTest extends TestCase
+{
+	public void test() {
+		JobControlManager mgr = new JobControlManager();
+		mgr.setup("/org/lcsim/job/test.xml");
+		mgr.run();
+		mgr.clear();
+	}	
+}
\ No newline at end of file

lcsim-job/src/test/resources/org/lcsim/job
test.xml added at 1.1
diff -N test.xml
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ test.xml	7 Aug 2008 18:47:32 -0000	1.1
@@ -0,0 +1,59 @@
+<lcsim>
+
+    <!-- input files -->
+    <inputFiles>
+        <file>./test1.slcio</file>
+        <file>./test2.slcio</file>
+    </inputFiles>
+
+    <!-- execution flow -->
+    <execute>
+        <driver name="MyTestDriver"/>
+    </execute>
+    
+    <!-- global parameters -->
+    <parameters>
+        <numberOfEvents>10000</numberOfEvents>
+    </parameters>
+
+    <!-- driver definitions -->
+    <drivers>
+        <driver name="MyTestDriver" type="org.lcsim.job.TestDriver">
+            <histogramLevel>1</histogramLevel>
+            
+            <!-- a Hep3Vector param -->
+            <h>1.0 2.0 3.0</h>
+            
+            <!-- single int param -->
+            <intVar>42</intVar>
+            
+            <!-- single double param -->
+            <doubleVar>1.1</doubleVar>
+            
+            <!-- single float param -->
+            <floatVar>1.12345</floatVar>
+            
+            <!-- single string param -->
+            <stringVar>Slartibartfast</stringVar>
+            
+            <!-- single boolean param -->
+            <booleanVar>true</booleanVar>
+            
+            <!-- 1d array of doubles -->
+            <doubleArr>1.0 2.0 3.0</doubleArr>
+            
+            <!-- 1d array of floats -->
+            <floatArr>3.0 4.0 5.0</floatArr>
+            
+            <!-- 1d array of ints -->
+            <intArr>2 3 4</intArr>
+            
+            <!-- 1d array of strings -->
+            <stringArr>Marvin the Paranoid Android</stringArr>
+            
+            <!-- 1d array of booleans -->
+            <booleanArr>true false true false</booleanArr>
+            
+        </driver>
+    </drivers>
+</lcsim>
CVSspam 0.2.8