package com.google.sitebricks.rendering; import com.google.sitebricks.Evaluator; import com.google.sitebricks.compiler.EvaluatorCompiler; import com.google.sitebricks.compiler.ExpressionCompileException; import com.google.sitebricks.compiler.Parsing; import com.google.sitebricks.compiler.Token; import org.jetbrains.annotations.Nullable; import org.mvel2.MVEL; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; /** * Temporary class to enable dynamic typing for collection projections (since we don't have * a good mechanism in MVEL to reflect on parametric types yet) * * @author Dhanji R. Prasanna (dhanji@gmail.com) */ public class DynTypedMvelEvaluatorCompiler implements EvaluatorCompiler { public DynTypedMvelEvaluatorCompiler(Map<String, Class<?>> map) { } public Evaluator compile(final String expression) throws ExpressionCompileException { return new Evaluator() { private final ConcurrentMap<String, Serializable> map = new ConcurrentHashMap<String, Serializable>(); @Nullable public Object evaluate(String ___expr, Object bean) { Serializable serializable = map.get(expression); if (null == serializable) { serializable = MVEL.compileExpression(expression); map.put(expression, serializable); } return MVEL.executeExpression(serializable, bean); } public void write(String expr, Object bean, Object value) { } public Object read(String property, Object contextObject) { return MVEL.getProperty(property, contextObject); } }; } public Class<?> resolveCollectionTypeParameter(String expression) throws ExpressionCompileException { return Object.class; } public List<Token> tokenizeAndCompile(String template) throws ExpressionCompileException { return Parsing.tokenize(template, this); } public Class<?> resolveEgressType(String expression) throws ExpressionCompileException { return Collection.class; } public boolean isWritable(String property) throws ExpressionCompileException { return true; } }