/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.kml.utils;
import java.util.ArrayList;
import java.util.List;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.visitor.SimplifyingFilterVisitor;
import org.geotools.styling.AbstractStyleVisitor;
import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.Rule;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory;
/**
* Collects all the filters in the style and builds a summary filter that matches every feature
* matched by at least one rule in the style
*
* @author Andrea Aime - GeoSolutions
*/
public class RuleFiltersCollector extends AbstractStyleVisitor {
List<Filter> filters = new ArrayList<Filter>();
@Override
public void visit(FeatureTypeStyle fts) {
for(Rule rule : fts.rules()) {
if(rule.isElseFilter()) {
filters.add(Filter.INCLUDE);
} else {
Filter filter = rule.getFilter();
if(filter == null) {
filters.add(Filter.INCLUDE);
} else {
filters.add(filter);
}
}
}
}
/**
* Returns a filter that includes all the visited rules
*
*/
Filter getSummaryFilter() {
if(filters.size() == 0) {
return Filter.INCLUDE;
} else if(filters.size() == 1) {
return filters.get(0);
} else {
FilterFactory ff = CommonFactoryFinder.getFilterFactory();
Filter or = ff.or(filters);
SimplifyingFilterVisitor simplifier = new SimplifyingFilterVisitor();
return (Filter) or.accept(simplifier, null);
}
}
}