package org.docbag.expression.evaluator; import org.docbag.Context; import org.docbag.chart.jfree.ChartToSVGConverter; import org.docbag.expression.evaluator.json.JSONContentResolver; import org.docbag.table.TableToFOConverter; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.expression.spel.support.StandardTypeConverter; /** * Spring Expression Language based implementation of {@link ExpressionEvaluator}. * * <p>For the complete documentation of what SpEL can and can't do please refer to the following * documentation: <a href="http://static.springsource.org/spring/docs/current/spring-framework-reference/html/expressions.html"> * http://static.springsource.org/spring/docs/current/spring-framework-reference/html/expressions.html * </a></p> * * <p>This implementation can evaluate any expression that {@link org.docbag.expression.evaluator.PatternsAwareExpressionEvaluator} * can evaluate, plus a lot more.</p> * * @author Jakub Torbicki */ public class SpELExpressionEvaluator implements ExpressionEvaluator<String, String> { private final static SpelExpressionParser parser = new SpelExpressionParser(); private final static StandardTypeConverter standardTypeConverter; /** * Register non standard type converter, so the evaluator knows how to convert Charts objects into * SVG representation. */ static { DefaultConversionService defaultConversionService = new DefaultConversionService(); defaultConversionService.addConverter(new ChartToSVGConverter()); defaultConversionService.addConverter(new TableToFOConverter()); standardTypeConverter = new StandardTypeConverter(defaultConversionService); } public String evaluate(Context context, org.docbag.expression.Expression<String, String> expression) { if (expression.evaluated()) { return expression.getValue(); } String expressionString = expression.getSource(); try { Expression exp = parser.parseExpression(expressionString); StandardEvaluationContext spelContext = new StandardEvaluationContext(new JSONContentResolver(context)); spelContext.setTypeConverter(standardTypeConverter); return exp.getValue(spelContext, String.class); } catch (Exception e) { throw new EvaluatorException(e.getLocalizedMessage(), e); } } public String evaluate(org.docbag.expression.Expression<String, String> expression) { if (expression.evaluated()) { return expression.getValue(); } String expressionString = expression.getSource(); try { Expression exp = parser.parseExpression(expressionString); return exp.getValue(String.class); } catch (Exception e) { throw new EvaluatorException(e.getLocalizedMessage(), e); } } }