/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2014, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotools.styling.css.selector; import java.util.ArrayList; import java.util.List; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.text.cql2.CQLException; import org.geotools.filter.text.ecql.ECQL; import org.geotools.filter.visitor.SimplifyingFilterVisitor; import org.geotools.styling.css.util.FilterSpecificityExtractor; import org.geotools.styling.css.util.UnboundSimplifyingFilterVisitor; import org.opengis.feature.type.FeatureType; import org.opengis.filter.Filter; import org.opengis.filter.FilterFactory2; public class Data extends Selector { public static final FilterFactory2 FF = CommonFactoryFinder.getFilterFactory2(); public static Selector combineAnd(List<Data> selectors, Object ctx) { if (selectors.size() == 1) { return selectors.get(0); } List<Filter> filters = new ArrayList<>(); FeatureType featureType = null; for (Data selector : selectors) { filters.add(selector.filter); featureType = selector.featureType; } org.opengis.filter.And and = FF.and(filters); SimplifyingFilterVisitor visitor; if (ctx instanceof SimplifyingFilterVisitor) { visitor = (SimplifyingFilterVisitor) ctx; } else { visitor = new UnboundSimplifyingFilterVisitor(); visitor.setFeatureType(featureType); } Filter simplified = (Filter) and.accept(visitor, null); if (Filter.INCLUDE.equals(simplified)) { return ACCEPT; } else if (Filter.EXCLUDE.equals(simplified)) { return REJECT; } else { return new Data(simplified); } } public Filter filter; public FeatureType featureType; public Data(Filter filter) { this.filter = filter; } public Data(String filter) { try { this.filter = ECQL.toFilter(filter); } catch (CQLException e) { throw new RuntimeException(e); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((filter == null) ? 0 : filter.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Data other = (Data) obj; if (filter == null) { if (other.filter != null) return false; } else if (!filter.equals(other.filter)) return false; return true; } @Override public String toString() { return "OGCFilter [filter=" + ECQL.toCQL(filter) + "]"; } @Override public Specificity getSpecificity() { FilterSpecificityExtractor extractor = new FilterSpecificityExtractor(); filter.accept(extractor, null); return new Specificity(0, extractor.getSpecificityScore(), 0); } public Object accept(SelectorVisitor visitor) { return visitor.visit(this); } }