/* * 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.util; import java.util.ArrayList; import java.util.List; import org.geotools.styling.css.selector.Accept; import org.geotools.styling.css.selector.And; import org.geotools.styling.css.selector.Data; import org.geotools.styling.css.selector.Id; import org.geotools.styling.css.selector.Or; import org.geotools.styling.css.selector.PseudoClass; import org.geotools.styling.css.selector.Reject; import org.geotools.styling.css.selector.ScaleRange; import org.geotools.styling.css.selector.Selector; import org.geotools.styling.css.selector.SelectorVisitor; import org.geotools.styling.css.selector.TypeName; /** * Simplifies out all pseudo classes, replacing them with {@link Selector#ACCEPT} * * @author Andrea Aime - GeoSolutions * */ public class PseudoClassRemover implements SelectorVisitor { @Override public Object visit(Accept accept) { return accept; } @Override public Object visit(Reject reject) { return reject; } @Override public Object visit(Id id) { return id; } @Override public Object visit(Data data) { return data; } @Override public Object visit(And and) { List<Selector> simplified = new ArrayList<>(); for (Selector child : and.getChildren()) { Selector newChild = (Selector) child.accept(this); if (newChild == Selector.REJECT) { return Selector.REJECT; } else if (newChild != Selector.ACCEPT) { simplified.add(newChild); } } if (simplified.size() == 0) { return Selector.ACCEPT; } else if (simplified.size() == 1) { return simplified.get(0); } else { return new And(simplified); } } @Override public Object visit(Or or) { List<Selector> simplified = new ArrayList<>(); for (Selector child : or.getChildren()) { Selector newChild = (Selector) child.accept(this); if (newChild == Selector.ACCEPT) { return Selector.ACCEPT; } else if (newChild != Selector.REJECT) { simplified.add(newChild); } } if (simplified.size() == 0) { return Selector.REJECT; } else if (simplified.size() == 1) { return simplified.get(0); } else { return new Or(simplified); } } @Override public Object visit(TypeName typeName) { return typeName; } @Override public Object visit(ScaleRange scaleRange) { return scaleRange; } @Override public Object visit(PseudoClass pseudoClass) { // simplify out all pseudo classes return Selector.ACCEPT; } }