/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.kml.icons;
import java.util.ArrayList;
import java.util.List;
import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.PointSymbolizer;
import org.geotools.styling.Rule;
import org.geotools.styling.Style;
import org.geotools.styling.StyleFactory;
import org.geotools.styling.Symbolizer;
import org.opengis.filter.Filter;
/**
* A simplified model of an SLD rule used for internal manipulation.
*
* @author David Winslow, OpenGeo
*
*/
class MiniRule {
public final Filter filter;
public final boolean isElseFilter;
public final List<PointSymbolizer> symbolizers;
public MiniRule(Filter filter, boolean isElseFilter, List<PointSymbolizer> symbolizers) {
this.filter = filter;
this.isElseFilter = isElseFilter;
this.symbolizers = symbolizers;
}
static List<List<MiniRule>> minify(Style style) {
List<List<MiniRule>> ftStyles = new ArrayList<List<MiniRule>>();
for (FeatureTypeStyle ftStyle : style.featureTypeStyles()) {
List<MiniRule> rules = new ArrayList<MiniRule>();
for (Rule rule : ftStyle.rules()) {
List<PointSymbolizer> pointSymbolizers = new ArrayList<PointSymbolizer>();
for (Symbolizer symbolizer : rule.symbolizers()) {
if (symbolizer instanceof PointSymbolizer) {
pointSymbolizers.add((PointSymbolizer) symbolizer);
}
}
if (!pointSymbolizers.isEmpty())
rules.add(new MiniRule(rule.getFilter(), rule.isElseFilter(), pointSymbolizers));
}
if (!rules.isEmpty()) {
ftStyles.add(rules);
}
}
return ftStyles;
}
static Style makeStyle(StyleFactory factory, List<List<MiniRule>> ftStyles) {
Style style = factory.createStyle();
for (List<MiniRule> rules : ftStyles) {
FeatureTypeStyle ftStyle = factory.createFeatureTypeStyle();
for (MiniRule miniRule : rules) {
if(!miniRule.symbolizers.isEmpty()){
Rule realRule = factory.createRule();
for (Symbolizer sym : miniRule.symbolizers) {
realRule.symbolizers().add(sym);
}
ftStyle.rules().add(realRule);
}
}
style.featureTypeStyles().add(ftStyle);
}
return style;
}
}