package hep.aida.ref.jel;
import gnu.jel.CompiledExpression;
import gnu.jel.DVMap;
import gnu.jel.Evaluator;
import gnu.jel.Library;
import java.util.ArrayList;
/**
*
* @author The FreeHEP team @ SLAC.
*
*/
public abstract class JELLibraryFactory {
private static ArrayList staticLibsList = new ArrayList();
private static ArrayList dotLibsList = new ArrayList();
static {
staticLibsList.add(java.lang.Math.class);
dotLibsList.add(Object.class);
dotLibsList.add(String.class);
dotLibsList.add(java.util.Date.class);
}
public static CompiledExpression compile(DVMap map, Class valueProvider, String expression, Class type) {
Class[] staticLib = getStaticLibs();
Class[] dotLib = getDotLibs();
Class[] dynamicLib = new Class[]{valueProvider};
Library lib = null;
try {
lib = new Library(staticLib, dynamicLib, dotLib, map, null);
lib.markStateDependent("random", null);
} catch (gnu.jel.CompilationException ec1) {
throw new RuntimeException("Can not compile JEL Library!", ec1);
}
CompiledExpression compExpression = null;
try {
compExpression = Evaluator.compile(expression, lib, type);
} catch (gnu.jel.CompilationException ec2) {
throw new RuntimeException("Can not compile JEL Expression: "+expression, ec2);
}
return compExpression;
}
static Class[] getStaticLibs() {
int nStaticLibs = staticLibsList.size();
Class[] staticLibs = new Class[nStaticLibs];
for ( int i = 0; i < nStaticLibs; i++ )
staticLibs[i] = (Class) staticLibsList.get(i);
return staticLibs;
}
public static void addStaticLib(Class staticLibClass) {
staticLibsList.add(staticLibClass);
}
static Class[] getDotLibs() {
int nDotLibs = dotLibsList.size();
Class[] dotLibs = new Class[nDotLibs];
for ( int i = 0; i < nDotLibs; i++ )
dotLibs[i] = (Class) dotLibsList.get(i);
return dotLibs;
}
public static void addDotLib(Class staticLibClass) {
dotLibsList.add(staticLibClass);
}
}