package org.compass.core.converter.dynamic;
import javax.servlet.jsp.el.ELException;
import javax.servlet.jsp.el.Expression;
import javax.servlet.jsp.el.ExpressionEvaluator;
import javax.servlet.jsp.el.VariableResolver;
import org.apache.commons.el.ExpressionEvaluatorImpl;
import org.compass.core.converter.ConversionException;
import org.compass.core.mapping.ResourcePropertyMapping;
/**
* @author kimchy
*/
public class JakartaElDynamicConverter extends AbstractDynamicConverter {
private ExpressionEvaluator expressionEvaluator;
private Expression expression;
public DynamicConverter copy() {
JakartaElDynamicConverter converter = (JakartaElDynamicConverter) super.copy();
converter.expressionEvaluator = expressionEvaluator;
return converter;
}
public void setExpression(String expression) throws ConversionException {
if (expressionEvaluator == null) {
expressionEvaluator = new ExpressionEvaluatorImpl();
}
Class type = String.class;
if (getType() != null) {
type = getType();
}
try {
this.expression = expressionEvaluator.parseExpression(expression, type, null);
} catch (ELException e) {
throw new ConversionException("Failed to compile expression [" + expression + "]", e);
}
}
protected Object evaluate(final Object o, ResourcePropertyMapping resourcePropertyMapping) throws ConversionException {
try {
VariableResolver variableResolver = new VariableResolver() {
public Object resolveVariable(String variable) throws ELException {
return o;
}
};
return expression.evaluate(variableResolver);
} catch (Exception e) {
throw new ConversionException("Failed to evaluate [" + o + "] with expression [" + expression + "]", e);
}
}
}