package core.framework.impl.template.expression;
import core.framework.impl.template.TemplateMetaContext;
/**
* @author neo
*/
class ExpressionTranslator {
private final Token expression;
private final TemplateMetaContext context;
ExpressionTranslator(Token expression, TemplateMetaContext context) {
this.expression = expression;
this.context = context;
}
public String translate() {
if (expression instanceof ValueToken) return ((ValueToken) expression).value;
StringBuilder builder = new StringBuilder();
append(builder, expression, true);
return builder.toString();
}
private void append(StringBuilder builder, Token token, boolean root) {
if (token instanceof FieldToken) {
FieldToken field = (FieldToken) token;
if (root && !context.paramClasses.containsKey(field.name)) {
builder.append("$root.");
}
builder.append(field.name);
if (field.next != null) {
builder.append('.');
append(builder, field.next, false);
}
} else if (token instanceof MethodToken) {
appendMethod(builder, (MethodToken) token, root);
} else if (token instanceof ValueToken) {
builder.append(((ValueToken) token).value);
}
}
private void appendMethod(StringBuilder builder, MethodToken method, boolean root) {
if (root && !context.paramClasses.containsKey(method.name)) {
builder.append("$root.");
}
builder.append(method.name).append('(');
int index = 0;
for (Token param : method.params) {
if (index > 0) builder.append(',');
append(builder, param, true);
index++;
}
builder.append(')');
if (method.next != null) {
builder.append('.');
append(builder, method.next, false);
}
}
}