package org.geotools.filter.expression; import org.geotools.Builder; import org.geotools.factory.CommonFactoryFinder; import org.opengis.filter.FilterFactory; import org.opengis.filter.expression.Add; import org.opengis.filter.expression.Divide; import org.opengis.filter.expression.Expression; import org.opengis.filter.expression.Function; import org.opengis.filter.expression.Literal; import org.opengis.filter.expression.Multiply; import org.opengis.filter.expression.PropertyName; import org.opengis.filter.expression.Subtract; /** * ExpressionBuilder acting as a simple wrapper around an Expression. * * * @source $URL$ */ public class ExpressionBuilder implements Builder<Expression> { protected FilterFactory ff = CommonFactoryFinder.getFilterFactory2(null); protected boolean unset = false; protected Builder<? extends Expression> delegate = new NilBuilder(); public ExpressionBuilder(){ reset(); } public ExpressionBuilder( Expression expr ){ reset( expr ); } /** * Define expression as a literal. * <p> * Example:<code>b.literal().value( 1 );</code> */ public LiteralBuilder literal(){ delegate = new LiteralBuilder(); unset = false; return (LiteralBuilder) delegate; } public Builder<?> literal( Object literal ){ delegate = new LiteralBuilder().value( literal ); unset = false; return this; } public AddBuilder add(){ delegate = new AddBuilder(); unset = false; return (AddBuilder) delegate; } public MultiplyBuilder multiply(){ delegate = new MultiplyBuilder(); unset = false; return (MultiplyBuilder) delegate; } public DivideBuilder divide(){ delegate = new DivideBuilder(); unset = false; return (DivideBuilder) delegate; } public SubtractBuilder subtract(){ delegate = new SubtractBuilder(); unset = false; return (SubtractBuilder) delegate; } public PropertyNameBuilder property(){ delegate = new PropertyNameBuilder(); unset = false; return (PropertyNameBuilder) delegate; } public Builder<?> property(String xpath){ delegate = new PropertyNameBuilder().property(xpath); unset = false; return this; } public FunctionBuilder function(){ this.delegate = new FunctionBuilder(); unset = false; return (FunctionBuilder) delegate; } public FunctionBuilder function(String name){ this.delegate = new FunctionBuilder().name(name); unset = false; return (FunctionBuilder) delegate; } /** * Build the expression. */ public Expression build() { if( unset ) { return null; } return delegate.build(); } public ExpressionBuilder reset() { this.delegate = new NilBuilder(); this.unset = false; return this; } public ExpressionBuilder reset(Expression original) { if( original == null ){ return unset(); } this.unset = false; if( original instanceof Literal){ delegate = new LiteralBuilder( (Literal) original ); } else if( original instanceof PropertyName){ delegate = new PropertyNameBuilder( (PropertyName) original ); } else if( original instanceof Function){ delegate = new FunctionBuilder( (Function) original ); } else if( original instanceof Add){ delegate = new AddBuilder( (Add) original ); } else if( original instanceof Divide){ delegate = new DivideBuilder( (Divide) original ); } else if( original instanceof Multiply){ delegate = new MultiplyBuilder( (Multiply) original ); } else if( original instanceof Subtract){ delegate = new SubtractBuilder( (Subtract) original ); } else { this.delegate = new NilBuilder(); } return this; } public ExpressionBuilder unset() { this.unset = true; this.delegate = new NilBuilder(); return this; } public boolean isUnset() { return unset; } }