package org.geotools.styling.builder; import java.util.ArrayList; import java.util.List; import org.geotools.Builder; import org.geotools.styling.GraphicLegend; import org.geotools.styling.Rule; import org.geotools.styling.Symbolizer; import org.opengis.filter.Filter; /** * * * @source $URL$ */ public class RuleBuilder extends AbstractStyleBuilder<Rule> { List<Symbolizer> symbolizers = new ArrayList<Symbolizer>(); Builder<? extends Symbolizer> symbolizerBuilder; String name; String ruleAbstract; double minScaleDenominator; double maxScaleDenominator; Filter filter = null; boolean elseFilter; String title; private GraphicLegendBuilder legend = new GraphicLegendBuilder(this).unset(); public RuleBuilder() { this(null); } public RuleBuilder(FeatureTypeStyleBuilder parent) { super(parent); reset(); } public RuleBuilder name(String name) { unset = false; this.name = name; return this; } public RuleBuilder title(String title) { unset = false; this.title = title; return this; } public RuleBuilder ruleAbstract(String ruleAbstract) { unset = false; this.ruleAbstract = ruleAbstract; return this; } public GraphicLegendBuilder legend() { unset = false; return legend; } public RuleBuilder min(double minScaleDenominator) { unset = false; if (minScaleDenominator < 0) throw new IllegalArgumentException( "Invalid min scale denominator, should be positive or 0"); this.minScaleDenominator = minScaleDenominator; return this; } public RuleBuilder max(double maxScaleDenominator) { unset = false; if (maxScaleDenominator < 0) throw new IllegalArgumentException( "Invalid max scale denominator, should be positive or 0"); this.maxScaleDenominator = maxScaleDenominator; return this; } public RuleBuilder elseFilter() { unset = false; this.elseFilter = true; this.filter = null; return this; } public RuleBuilder filter(Filter filter) { unset = false; this.elseFilter = false; this.filter = filter; return this; } public RuleBuilder filter(String cql) { unset = false; this.elseFilter = false; this.filter = cqlFilter(cql); return this; } public PointSymbolizerBuilder point() { unset = false; if (symbolizerBuilder != null) symbolizers.add(symbolizerBuilder.build()); symbolizerBuilder = new PointSymbolizerBuilder(this); return (PointSymbolizerBuilder) symbolizerBuilder; } public LineSymbolizerBuilder line() { unset = false; if (symbolizerBuilder != null) symbolizers.add(symbolizerBuilder.build()); symbolizerBuilder = new LineSymbolizerBuilder(this); return (LineSymbolizerBuilder) symbolizerBuilder; } public PolygonSymbolizerBuilder polygon() { unset = false; if (symbolizerBuilder != null) symbolizers.add(symbolizerBuilder.build()); symbolizerBuilder = new PolygonSymbolizerBuilder(this); return (PolygonSymbolizerBuilder) symbolizerBuilder; } public TextSymbolizerBuilder text() { unset = false; if (symbolizerBuilder != null) symbolizers.add(symbolizerBuilder.build()); symbolizerBuilder = new TextSymbolizerBuilder(this); return (TextSymbolizerBuilder) symbolizerBuilder; } public RasterSymbolizerBuilder raster() { unset = false; if (symbolizerBuilder != null) symbolizers.add(symbolizerBuilder.build()); symbolizerBuilder = new RasterSymbolizerBuilder(this); return (RasterSymbolizerBuilder) symbolizerBuilder; } public ExtensionSymbolizerBuilder extension() { unset = false; if (symbolizerBuilder != null) symbolizers.add(symbolizerBuilder.build()); symbolizerBuilder = new ExtensionSymbolizerBuilder(this); return (ExtensionSymbolizerBuilder) symbolizerBuilder; } public Rule build() { if (unset) { return null; } if (symbolizerBuilder == null && symbolizers.size() == 0) { symbolizerBuilder = new PointSymbolizerBuilder(); } if (symbolizerBuilder != null) { symbolizers.add(symbolizerBuilder.build()); } Rule rule = sf.createRule(); rule.setName(name); // TODO: rule's description cannot be set rule.setTitle(title); rule.setAbstract(ruleAbstract); rule.setMinScaleDenominator(minScaleDenominator); rule.setMaxScaleDenominator(maxScaleDenominator); rule.setFilter(filter); rule.setElseFilter(elseFilter); rule.symbolizers().addAll(symbolizers); GraphicLegend gl = legend.build(); if (gl != null) { rule.setLegend(gl); } if (parent == null) { reset(); } return rule; } public RuleBuilder unset() { return (RuleBuilder) super.unset(); } public RuleBuilder reset() { name = null; title = null; ruleAbstract = null; minScaleDenominator = 0; maxScaleDenominator = Double.POSITIVE_INFINITY; filter = Filter.INCLUDE; elseFilter = false; symbolizers.clear(); legend.unset(); unset = false; return this; } public RuleBuilder reset(Rule rule) { if (rule == null) { return unset(); } name = rule.getName(); title = rule.getTitle(); ruleAbstract = rule.getAbstract(); minScaleDenominator = rule.getMinScaleDenominator(); maxScaleDenominator = rule.getMaxScaleDenominator(); filter = rule.getFilter(); elseFilter = rule.isElseFilter(); symbolizers.clear(); symbolizers.addAll(rule.symbolizers()); // TODO: unpack into builders in order to "copy" symbolizerBuilder = null; unset = false; legend.reset(rule.getLegend()); return this; } protected void buildStyleInternal(StyleBuilder sb) { sb.featureTypeStyle().rule().init(this); } }