package com.google.sitebricks.compiler; import net.jcip.annotations.Immutable; import com.google.sitebricks.Evaluator; /** * Created with IntelliJ IDEA. * On: 20/03/2007 * * A simple wrapper around a string or expression (with evaluator), denoting it as a * renderable token. * * @author Dhanji R. Prasanna (dhanji at gmail com) * @since 1.0 */ @Immutable class CompiledToken implements Token { private final String token; private final boolean isExpression; private final Evaluator evaluator; private CompiledToken(String token, boolean expression) { this.token = token; this.evaluator = null; isExpression = expression; } private CompiledToken(Evaluator evaluator, boolean expression) { this.evaluator = evaluator; isExpression = expression; this.token = null; } public boolean isExpression() { return isExpression; } public String render(Object bound) { if (isExpression) { Object object = evaluator.evaluate(null, bound); if (object instanceof String) { return (String) object; } else { return Parsing.getTypeConverter().convert(object, String.class); } } else { return token; } } //local factories static CompiledToken expression(String token, EvaluatorCompiler compiler) throws ExpressionCompileException { //strip leading ${ and trailing } return new CompiledToken(compiler.compile(token.substring(2, token.length() - 1)), true); } static CompiledToken text(String token) { return new CompiledToken(token, false); } }