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);
    }
    
}

 

Ads help maintain this website.