package org.geotools.filter.expression; import org.geotools.Builder; import org.opengis.filter.expression.Expression; /** * Child expression builder; suitable for use collecting function parameters and binary expression * arguments. * <p> * This builder is designed to be "chained" from a parent builder; you may return to the parent * builder at any time by calling end(). * * @param <P> * parent builder * * * @source $URL$ */ public class ChildExpressionBuilder<P extends Builder<?>> extends ExpressionBuilder { private P parent; public ChildExpressionBuilder(P parent) { this.parent = parent; } public ChildExpressionBuilder(P parent, Expression expr1) { super(expr1); this.parent = parent; } @Override public ChildExpressionBuilder<P> reset() { super.reset(); return this; } @Override public ChildExpressionBuilder<P> reset(Expression original) { super.reset(original); return this; } @Override public ChildExpressionBuilder<P> unset() { super.unset(); return this; } /** * Build the parameter; adding it to the parent. * <p> * When using this from another builder you may wish to override the this build() method as * shown below: * * <pre> * final Expression array[] = ... * ChildExpressionBuilder first = new ChildExpressionBuilder<?>(this) { * public Expression build() { * array[0] = super.build(); * return array[0]; * } * }; * } * </pre> * * @return internal expression */ public Expression build() { if (unset) { return null; } return delegate.build(); } /** * Build the expression and return to the parent builder. * <p> * Example use:<code>b.add().expr1().literal(1).end().expr2().literal(2).end().build();</code> * * @see _build() * @return */ public P end() { build(); return parent; } /** * Inline literal value. * <p> * Example:<code>b.literal( 1 );</code> * * @param obj * Object to use as the resulting literal */ public P literal(Object obj) { literal().value(obj); return end(); } /** * Inline property name value. * <p> * Example:<code>b.property("x");</code> */ public P property(String xpath) { property().property(xpath); return end(); } }