package nl.ipo.cds.validation;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
import nl.ipo.cds.validation.execute.Compiler;
import nl.ipo.cds.validation.execute.CompilerException;
import nl.ipo.cds.validation.execute.ExpressionExecutor;
import org.deegree.geometry.primitive.Point;
public class LastLocationExpression<K extends Enum<K> & ValidationMessage<K, C>, C extends ValidatorContext<K, C>> extends AbstractExpression<K, C, String> {
private final static String separator = ", ";
@Override
public Class<String> getResultType () {
return String.class;
}
public String evaluate (final ValidatorContext<K, C> context) {
final Point point = context.getLastLocation ();
if(point == null) {
return "?";
}
StringBuilder stringBuilder = new StringBuilder("(");
stringBuilder.append(point.get0());
stringBuilder.append(separator);
stringBuilder.append(point.get1());
double p2 = point.get2();
if(!Double.isNaN(p2)) {
stringBuilder.append(separator);
stringBuilder.append(p2);
}
stringBuilder.append(')');
return stringBuilder.toString ();
}
private final static MethodHandle evaluateHandle = Compiler
.findMethod (
LastLocationExpression.class,
"evaluate",
MethodType.methodType (String.class, ValidatorContext.class)
);
@Override
public ExpressionExecutor<C> getExecutor(final Compiler<C> compiler) throws CompilerException {
return ExpressionExecutor.create (
this,
false,
false,
evaluateHandle.bindTo (this),
false
);
}
}