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;
/**
* Extracts a subset of a Selector that is compatible with the given TypeName. In case the default
* typename is provided, only selector bits with no typename attached will be preserved
*
* @author Andrea Aime - GeoSolutions
*
*/
public class TypeNameSimplifier implements SelectorVisitor {
TypeName targetTypeName;
public TypeNameSimplifier(TypeName targetTypeName) {
this.targetTypeName = targetTypeName;
}
@Override
public Object visit(Accept accept) {
return accept;
}
@Override
public Object visit(Reject reject) {
return reject;
}
@Override
public Object visit(Id id) {
// making no assumption on the id structure, even if normally
// an id is built as typename.idx
return id;
}
@Override
public Object visit(Data data) {
return data;
}
@Override
public Object visit(And and) {
List<Selector> selectors = new ArrayList<>();
for (Selector child : and.getChildren()) {
Selector converted = (Selector) child.accept(this);
if (converted instanceof Reject) {
return Selector.REJECT;
} else if (!(converted instanceof Accept)) {
selectors.add(converted);
}
}
if (selectors.size() == 0) {
return Selector.ACCEPT;
} else if (selectors.size() == 1) {
return selectors.get(0);
} else {
return new And(selectors);
}
}
@Override
public Object visit(Or or) {
List<Selector> selectors = new ArrayList<>();
for (Selector child : or.getChildren()) {
Selector converted = (Selector) child.accept(this);
if (converted instanceof Accept) {
return Selector.ACCEPT;
} else if (!(converted instanceof Reject)) {
selectors.add(converted);
}
}
if (selectors.size() == 0) {
return Selector.REJECT;
} else if (selectors.size() == 1) {
return selectors.get(0);
} else {
return new Or(selectors);
}
}
@Override
public Object visit(TypeName typeName) {
if (targetTypeName.equals(typeName)) {
return Selector.ACCEPT;
} else {
return Selector.REJECT;
}
}
@Override
public Object visit(ScaleRange scaleRange) {
return scaleRange;
}
@Override
public Object visit(PseudoClass pseudoClass) {
return pseudoClass;
}
}