package com.floreysoft.jmte.token;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import com.floreysoft.jmte.TemplateContext;
import com.floreysoft.jmte.util.Util;
public abstract class ExpressionToken extends AbstractToken {
public final static String segmentsToString(List<String> segments,
int start, int end) {
if (start >= segments.size() || end > segments.size()) {
throw new IllegalArgumentException("Range is not inside segments");
}
StringBuilder builder = new StringBuilder();
for (int i = start; i < end; i++) {
String segment = segments.get(i);
builder.append(segment);
if (i < end - 1) {
builder.append(".");
}
}
return builder.toString();
}
private List<String> segments;
private String expression;
public ExpressionToken(String expression) {
if (expression == null) {
throw new IllegalArgumentException(
"Parameter expression must not be null");
}
this.setExpression(expression);
}
protected ExpressionToken(List<String> segments, String expression) {
this.segments = segments;
this.expression = expression;
}
public boolean isComposed() {
return getSegments().size() > 1;
}
public boolean isEmpty() {
return getSegments().size() == 0;
}
public List<String> getSegments() {
return segments;
}
public String getFirstSegment() {
if (isEmpty()) {
throw new IllegalStateException("There is no first segment");
}
return getSegments().get(0);
}
public String getLastSegment() {
if (isEmpty()) {
throw new IllegalStateException("There is no last segment");
}
return getSegments().get(getSegments().size() - 1);
}
public String getAllButLastSegment() {
if (isEmpty()) {
throw new IllegalStateException("There are no segments");
}
return segmentsToString(segments, 0, getSegments().size() - 1);
}
public String getAllButFirstSegment() {
if (isEmpty()) {
throw new IllegalStateException("There are no segments");
}
return segmentsToString(segments, 1, getSegments().size());
}
public void setExpression(String expression) {
this.text = null;
this.segments = Util.MINI_PARSER.split(expression, '.');
this.expression = Util.MINI_PARSER.unescape(expression);
}
public String getExpression() {
return expression;
}
public void setSegments(List<String> segments) {
this.segments = segments;
this.expression = segmentsToString(segments, 0, segments.size());
this.text = null;
}
@Override
public abstract Object evaluate(TemplateContext context);
protected Object evaluatePlain(TemplateContext context) {
final Object value = context.modelAdaptor.getValue(context, this, getSegments(), getExpression());
return value;
}
}