package org.geotools.filter;
import java.util.ArrayList;
import java.util.List;
import org.geotools.Builder;
import org.geotools.factory.CommonFactoryFinder;
import org.opengis.filter.And;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.identity.Identifier;
/**
* FitlerBuilder acting as a simple wrapper around an Expression.
*
* @source $URL$
*/
public class AndBuilder<P> implements Builder<And> {
protected FilterFactory ff = CommonFactoryFinder.getFilterFactory2(null);
protected P parent;
protected List<FilterBuilder> list;
private List<Identifier> ids = new ArrayList<Identifier>();
public AndBuilder(){
reset();
}
public AndBuilder( P parent){
this.parent = parent;
reset();
}
/**
* Build an And filter
*/
public And build() {
if( list == null ) {
return null;
}
List<Filter> filters = new ArrayList<Filter>( list.size() );
for( FilterBuilder build : list ){
Filter filter = build.build();
if( filter != null ){
filters.add( filter );
}
}
if (parent == null){
list.clear();
}
return ff.and( filters );
}
public AndBuilder<P> fid( String fid ){
ids.add( ff.featureId(fid));
return this;
}
public AndBuilder<P> and( Filter filter ){
list.add( new FilterBuilder().reset( filter ));
return this;
}
public AndBuilder<P> fid( List<String> fids ){
for( String fid : fids ){
ids.add( ff.featureId(fid));
}
return this;
}
public P end(){
return parent;
}
public AndBuilder<P> reset() {
this.list = new ArrayList<FilterBuilder>();
return this;
}
public AndBuilder<P> reset(And filter) {
if( filter == null ){
return unset();
}
this.list = new ArrayList<FilterBuilder>();
if( filter.getChildren() != null ){
for( Filter child : filter.getChildren() ){
list.add( new FilterBuilder().reset( child ));
}
}
return this;
}
public AndBuilder<P> unset() {
this.list = null;
return this;
}
}