Andrea Aime ha scritto:

Doh, during the holiday I coded the builder I was talking about almost
fully (it just misses support for text and raster symbolizers).
I don't have the code handy right now but I'll post it tomorrow or
Monday. Where is yours so that I can have a look at it?

Here is the builder I've been working on. It's still quite green,
has just one test, misses the builders for text and raster symbolizers,
but you should get the idea anyways.

Cheers
Andrea

--
Andrea Aime
OpenGeo - http://opengeo.org
Expert service straight from the developers.
Index: src/test/java/org/geotools/styling/builder/StyleBuilderTest.java
===================================================================
--- src/test/java/org/geotools/styling/builder/StyleBuilderTest.java	(revisione 0)
+++ src/test/java/org/geotools/styling/builder/StyleBuilderTest.java	(revisione 0)
@@ -0,0 +1,41 @@
+package org.geotools.styling.builder;
+
+import org.geotools.styling.FeatureTypeStyle;
+import org.geotools.styling.Mark;
+import org.geotools.styling.PointSymbolizer;
+import org.geotools.styling.Rule;
+import org.geotools.styling.Style;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+public class StyleBuilderTest {
+	
+	@Test
+	public void allDefaults() {
+		Style style = new StyleBuilder().build();
+		
+		assertNotNull(style);
+		assertNull(style.getName());
+		assertEquals(1, style.featureTypeStyles().size());
+		
+		FeatureTypeStyle fts = style.featureTypeStyles().get(0);
+		assertNotNull(fts);
+		assertEquals(0, fts.featureTypeNames().size());
+		assertEquals(1, fts.rules().size());
+		
+		Rule r = fts.rules().get(0);
+		assertNotNull(r);
+		assertNull(r.getName());
+		assertEquals(1, r.symbolizers().size());
+		
+		PointSymbolizer ps = (PointSymbolizer) r.symbolizers().get(0);
+		assertNull(ps.getGeometryPropertyName());
+		assertEquals(1, ps.getGraphic().graphicalSymbols().size());
+		
+		Mark mark = (Mark) ps.getGraphic().graphicalSymbols().get(0);
+		assertEquals("square", mark.getWellKnownName().evaluate(null));
+	}
+	
+	
+
+}
Index: src/main/java/org/geotools/styling/builder/PointSymbolizerBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/PointSymbolizerBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/PointSymbolizerBuilder.java	(revisione 0)
@@ -0,0 +1,46 @@
+package org.geotools.styling.builder;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.styling.Graphic;
+import org.geotools.styling.PointSymbolizer;
+import org.geotools.styling.StyleFactory;
+
+public class PointSymbolizerBuilder implements Builder<PointSymbolizer> {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+	String geometry;
+	GraphicBuilder graphicBuilder;
+	
+	PointSymbolizerBuilder geometry(String geometry) {
+		this.geometry = geometry;
+		return this;
+	}
+	
+	GraphicBuilder graphic() {
+		if(graphicBuilder == null)
+			graphicBuilder = new GraphicBuilder();
+		return graphicBuilder;
+	}
+	
+	public PointSymbolizer build() {
+		// TODO: see what the actual default is!
+		Graphic graphic;
+		if(graphicBuilder != null) {
+			graphic = graphicBuilder.build();
+		} else {
+			graphicBuilder = new GraphicBuilder();
+			graphic = graphicBuilder.build();
+		}
+		PointSymbolizer ps = sf.createPointSymbolizer(graphic, geometry);
+		reset();
+		
+		return ps;
+	}
+
+	public PointSymbolizerBuilder reset() {
+		this.geometry = null;
+		this.graphicBuilder = null;
+		
+		return this;
+	}
+	
+}
Index: src/main/java/org/geotools/styling/builder/MarkBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/MarkBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/MarkBuilder.java	(revisione 0)
@@ -0,0 +1,57 @@
+package org.geotools.styling.builder;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.filter.ConstantExpression;
+import org.geotools.styling.Fill;
+import org.geotools.styling.Mark;
+import org.geotools.styling.Stroke;
+import org.geotools.styling.StyleFactory;
+import org.opengis.filter.expression.Expression;
+
+public class MarkBuilder {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+
+	Expression name;
+	StrokeBuilder strokeBuilder;
+	FillBuilder fillBuilder;
+	
+	public MarkBuilder() {
+		reset();
+	}
+	
+	
+	public MarkBuilder wellKnownName(Expression name) {
+		this.name = name;
+		return this;
+	}
+	
+	public StrokeBuilder stroke() {
+		if(strokeBuilder == null)
+			strokeBuilder = new StrokeBuilder();
+		return strokeBuilder;
+	}
+	
+	public FillBuilder fill() {
+		if(fillBuilder == null)
+			fillBuilder = new FillBuilder();
+		return fillBuilder;
+	}
+	
+	public MarkBuilder reset() {
+		// TODO: where is the default mark?
+		this.name = CommonFactoryFinder.getFilterFactory(null).literal("square");
+		this.strokeBuilder = null;
+		this.fillBuilder = null;
+		
+		return this;
+	}
+	
+	public Mark build() {
+		Stroke stroke = strokeBuilder != null ? strokeBuilder.build() : Stroke.DEFAULT;
+		Fill fill = fillBuilder != null ? fillBuilder.build() : Fill.DEFAULT;
+		// why in the world does the factory accept a size and a rotation? they are part of the Graphics
+		Mark mark = sf.createMark(name, stroke, fill, ConstantExpression.constant(12), ConstantExpression.constant(0));
+		reset();
+		return mark;
+	}
+}
Index: src/main/java/org/geotools/styling/builder/GraphicBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/GraphicBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/GraphicBuilder.java	(revisione 0)
@@ -0,0 +1,74 @@
+package org.geotools.styling.builder;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.styling.Graphic;
+import org.geotools.styling.StyleFactory;
+import org.geotools.styling.Symbol;
+import org.opengis.filter.expression.Expression;
+
+public class GraphicBuilder implements Builder<Graphic> {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+	List<Symbol> symbols = new ArrayList<Symbol>();
+	MarkBuilder markBuilder;
+	Expression opacity;
+	Expression size;
+	Expression rotation;
+	
+	public GraphicBuilder opacity(Expression opacity) {
+		this.opacity = opacity;
+		return this;
+	}
+	
+	public GraphicBuilder size(Expression size) {
+		this.size = size;
+		return this;
+	}
+	
+	public GraphicBuilder rotation(Expression rotation) {
+		this.rotation = rotation;
+		return this;
+	}
+	
+	public GraphicBuilder externalGraphic(URL onlineResource, String format) {
+		symbols.add(sf.createExternalGraphic(onlineResource, format));
+		return this;
+	}
+	
+	public MarkBuilder newMark() {
+		if(markBuilder != null)
+			symbols.add(markBuilder.build());
+		else
+			markBuilder = new MarkBuilder();
+		return markBuilder;
+	}
+	
+	public Graphic build() {
+		if(markBuilder != null)
+			symbols.add(markBuilder.build());
+		if(symbols.size() == 0) {
+			MarkBuilder builder = new MarkBuilder();
+			symbols.add(builder.build());
+		}
+		
+		Symbol[] symbolsArray = (Symbol[]) symbols.toArray(new Symbol[symbols.size()]);
+		Graphic g = sf.createGraphic(null, null, symbolsArray, opacity, size, rotation);
+		
+		reset();
+		return g;
+	}
+
+	public GraphicBuilder reset() {
+		symbols.clear();
+		opacity = null;
+		size = null;
+		rotation = null;
+		
+		return this;
+	}
+
+	
+}
Index: src/main/java/org/geotools/styling/builder/FeatureTypeStyleBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/FeatureTypeStyleBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/FeatureTypeStyleBuilder.java	(revisione 0)
@@ -0,0 +1,103 @@
+package org.geotools.styling.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.feature.NameImpl;
+import org.geotools.styling.FeatureTypeStyle;
+import org.geotools.styling.Rule;
+import org.geotools.styling.StyleFactory;
+import org.geotools.util.SimpleInternationalString;
+import org.opengis.feature.type.Name;
+
+public class FeatureTypeStyleBuilder implements Builder<FeatureTypeStyle> {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+	List<Rule> rules = new ArrayList<Rule>();
+	RuleBuilder ruleBuilder;
+	String name;
+	String ftsAbstract;
+	String title;
+	List<Name> featureTypeNames;
+	// TODO	: add semantic type identifier, provided it makes any sense to have it
+	
+	public FeatureTypeStyleBuilder() {
+		reset();
+	}
+	
+	public RuleBuilder newRule() {
+		if(ruleBuilder != null)
+			rules.add(ruleBuilder.build());
+		else
+			ruleBuilder = new RuleBuilder();
+		return ruleBuilder;
+	}
+	
+	public FeatureTypeStyleBuilder name(String name) {
+		this.name = name;
+		return this;
+	}
+	
+	public FeatureTypeStyleBuilder title(String title) {
+		this.title = title;
+		return this;
+	}
+	
+	public FeatureTypeStyleBuilder ftsAbstract(String ftsAbstract) {
+		this.ftsAbstract = ftsAbstract;
+		return this;
+	}
+	
+	/**
+	 * Accumulates another feature type name in the list of the feature type names
+	 * for this {...@link FeatureTypeStyle}
+	 * @param featureTypeName
+	 * @return
+	 */
+	public FeatureTypeStyleBuilder featureTypeName(String featureTypeName) {
+		this.featureTypeNames.add(new NameImpl(featureTypeName));
+		return this;
+	}
+	
+	/**
+	 * Accumulates another feature type name in the list of the feature type names
+	 * for this {...@link FeatureTypeStyle}
+	 * @param featureTypeName
+	 * @return
+	 */
+	public FeatureTypeStyleBuilder featureTypeName(Name featureTypeName) {
+		this.featureTypeNames.add(featureTypeName);
+		return this;
+	}
+	
+	public FeatureTypeStyle build() {
+		if(ruleBuilder == null)
+			ruleBuilder = new RuleBuilder();
+		rules.add(ruleBuilder.build());
+		
+		FeatureTypeStyle fts = sf.createFeatureTypeStyle();
+		fts.rules().addAll(rules);
+		if(ftsAbstract != null)
+			fts.getDescription().setAbstract(new SimpleInternationalString(ftsAbstract));
+		if(title != null)
+			fts.getDescription().setTitle(new SimpleInternationalString(title));
+		fts.setName(name);
+		if(featureTypeNames != null && featureTypeNames.size() > 0)
+			fts.featureTypeNames().addAll(featureTypeNames);
+		
+		reset();
+		return fts;
+	}
+
+	public FeatureTypeStyleBuilder reset() {
+		rules.clear();
+		ruleBuilder = null;
+		name = null;
+		ftsAbstract = null;
+		title = null;
+		featureTypeNames = null;
+		
+		return this;
+	}
+
+}
Index: src/main/java/org/geotools/styling/builder/Builder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/Builder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/Builder.java	(revisione 0)
@@ -0,0 +1,8 @@
+package org.geotools.styling.builder;
+
+interface Builder<T> {
+	
+	Builder<T> reset();
+	
+	T build();
+}
Index: src/main/java/org/geotools/styling/builder/notes.txt
===================================================================
--- src/main/java/org/geotools/styling/builder/notes.txt	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/notes.txt	(revisione 0)
@@ -0,0 +1,10 @@
+
+TODO
+-----------------------------------------------
+- some default objects are missing in our API
+- text and raster symbolizer builders are missing
+- deal with the few deprecated items
+- should the builder validate the inputs? (null URL, negative scales?)
+- shall we build the upper layer as well (StyledLayerDescriptorBuilder?)
+- pass down the style factory from parent to child and have each
+  accept it in the constructor as well
\ No newline at end of file
Index: src/main/java/org/geotools/styling/builder/StyleBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/StyleBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/StyleBuilder.java	(revisione 0)
@@ -0,0 +1,74 @@
+package org.geotools.styling.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.styling.FeatureTypeStyle;
+import org.geotools.styling.Style;
+import org.geotools.styling.StyleFactory;
+import org.geotools.util.SimpleInternationalString;
+
+public class StyleBuilder implements Builder<Style> {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+	List<FeatureTypeStyle> fts = new ArrayList<FeatureTypeStyle>();
+	FeatureTypeStyleBuilder ftsBuilder;
+	String name;
+	String styleAbstract;
+	String title;
+	boolean isDefault;
+	
+	
+	public StyleBuilder name(String name) {
+		this.name = name;
+		return this;
+	}
+	
+	public StyleBuilder title(String title) {
+		this.title = title;
+		return this;
+	}
+	
+	public StyleBuilder styleAbstract(String styleAbstract) {
+		this.styleAbstract = styleAbstract;
+		return this;
+	}
+	
+	public FeatureTypeStyleBuilder newFeatureTypeStyle() {
+		if(ftsBuilder == null)
+			ftsBuilder = new FeatureTypeStyleBuilder();
+		else
+			fts.add(ftsBuilder.build());
+		return ftsBuilder;
+	}
+
+	public Style build() {
+		if(ftsBuilder == null)
+			ftsBuilder = new FeatureTypeStyleBuilder();
+		fts.add(ftsBuilder.build());
+		
+		Style s = sf.createStyle();
+		s.setName(name);
+		if(styleAbstract != null)
+			s.getDescription().setAbstract(new SimpleInternationalString(styleAbstract));
+		if(title != null)
+			s.getDescription().setTitle(new SimpleInternationalString(title));
+		s.featureTypeStyles().addAll(fts);
+		s.setDefault(isDefault);
+		
+		reset();
+		return s;
+	}
+
+	public StyleBuilder reset() {
+		fts.clear();
+		ftsBuilder = null;
+		name = null;
+		styleAbstract = null;
+		title = null;
+		isDefault = false;
+		
+		return this;
+	}
+
+}
Index: src/main/java/org/geotools/styling/builder/FillBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/FillBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/FillBuilder.java	(revisione 0)
@@ -0,0 +1,45 @@
+package org.geotools.styling.builder;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.styling.Fill;
+import org.geotools.styling.Graphic;
+import org.geotools.styling.StyleFactory;
+import org.opengis.filter.expression.Expression;
+
+public class FillBuilder {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+	
+	Expression color;
+	Expression opacity;
+	GraphicBuilder graphicBuilder;
+	
+	public FillBuilder color(Expression color) {
+		this.color = color;
+		return this;
+	}
+	
+	public FillBuilder opacity(Expression opacity) {
+		this.opacity = opacity;
+		return this;
+	}
+	
+	public GraphicBuilder graphicFill() {
+		if(graphicBuilder == null)
+			graphicBuilder = new GraphicBuilder();
+		return graphicBuilder;
+	}
+	
+	public Fill build() {
+		Graphic graphicFill = graphicBuilder != null ? graphicBuilder.build() : null;
+		Fill fill = sf.createFill(color, null, opacity, graphicFill);
+		reset();
+		return fill;
+	}
+
+	public void reset() {
+		color = Fill.DEFAULT.getColor();
+		opacity = Fill.DEFAULT.getOpacity();
+		graphicBuilder = null;
+	}
+	
+}
Index: src/main/java/org/geotools/styling/builder/StrokeBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/StrokeBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/StrokeBuilder.java	(revisione 0)
@@ -0,0 +1,94 @@
+package org.geotools.styling.builder;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.styling.Graphic;
+import org.geotools.styling.Stroke;
+import org.geotools.styling.StyleFactory;
+import org.opengis.filter.expression.Expression;
+
+public class StrokeBuilder {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+	Expression color;
+	Expression width;
+	Expression opacity;
+	Expression lineCap;
+	Expression lineJoin;
+	float[] dashArray;
+	Expression dashOffset;
+	GraphicBuilder fillBuilder;
+	GraphicBuilder strokeBuilder;
+	
+	public StrokeBuilder() {
+		reset();
+	}
+	
+	public StrokeBuilder reset() {
+		color = Stroke.DEFAULT.getColor();
+		width = Stroke.DEFAULT.getWidth();
+		opacity = Stroke.DEFAULT.getOpacity();
+		lineCap = Stroke.DEFAULT.getLineCap();
+		lineJoin = Stroke.DEFAULT.getLineJoin();
+		dashArray = Stroke.DEFAULT.getDashArray();
+		dashOffset = Stroke.DEFAULT.getDashOffset();
+		fillBuilder = null;
+		strokeBuilder = null;
+		
+		return this;
+	}
+
+	public StrokeBuilder color(Expression color) {
+		this.color = color;
+		return this;
+	}
+
+	public StrokeBuilder width(Expression width) {
+		this.width = width;
+		return this;
+	}
+
+	public StrokeBuilder opacity(Expression opacity) {
+		this.opacity = opacity;
+		return this;
+	}
+
+	public StrokeBuilder lineCap(Expression lineCap) {
+		this.lineCap = lineCap;
+		return this;
+	}
+
+	public StrokeBuilder lineJoin(Expression lineJoin) {
+		this.lineJoin = lineJoin;
+		return this;
+	}
+
+	public StrokeBuilder dashArray(float[] dashArray) {
+		this.dashArray = dashArray;
+		return this;
+	}
+
+	public StrokeBuilder dashOffet(Expression dashOffet) {
+		this.dashOffset = dashOffet;
+		return this;
+	}
+	
+	public GraphicBuilder graphicStroke() {
+		if(strokeBuilder == null)
+			strokeBuilder = new GraphicBuilder();
+		return strokeBuilder;
+	}
+	
+	public GraphicBuilder fillBuilder() {
+		if(fillBuilder == null)
+			fillBuilder = new GraphicBuilder();
+		return fillBuilder;
+	}
+	
+	Stroke build() {
+		Graphic graphicFill = fillBuilder != null ? fillBuilder.build() : null;
+		Graphic graphicStroke = strokeBuilder != null ? strokeBuilder.build() : null;
+		Stroke stroke = sf.createStroke(color, width, opacity, lineJoin, lineCap, dashArray, dashOffset, graphicFill, graphicStroke);
+		reset();
+		
+		return stroke;	
+	}
+}
Index: src/main/java/org/geotools/styling/builder/LineSymbolizerBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/LineSymbolizerBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/LineSymbolizerBuilder.java	(revisione 0)
@@ -0,0 +1,37 @@
+package org.geotools.styling.builder;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.styling.LineSymbolizer;
+import org.geotools.styling.Stroke;
+import org.geotools.styling.StyleFactory;
+
+public class LineSymbolizerBuilder implements Builder<LineSymbolizer> {
+
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+
+	StrokeBuilder strokeBuilder;
+	String geometry;
+
+	public LineSymbolizerBuilder geometry(String geometry) {
+		this.geometry = geometry;
+		return this;
+	}
+
+	public StrokeBuilder stroke() {
+		if (strokeBuilder == null)
+			strokeBuilder = new StrokeBuilder();
+		return strokeBuilder;
+	}
+
+	public LineSymbolizer build() {
+		Stroke stroke = strokeBuilder == null ? strokeBuilder.build() : Stroke.DEFAULT;
+		LineSymbolizer ls = sf.createLineSymbolizer(stroke, geometry);
+		reset();
+		return ls;
+	}
+
+	public LineSymbolizerBuilder reset() {
+		strokeBuilder = null;
+		return this;
+	}
+}
Index: src/main/java/org/geotools/styling/builder/RuleBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/RuleBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/RuleBuilder.java	(revisione 0)
@@ -0,0 +1,124 @@
+package org.geotools.styling.builder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.styling.Rule;
+import org.geotools.styling.StyleFactory;
+import org.geotools.styling.Symbolizer;
+import org.opengis.filter.Filter;
+
+public class RuleBuilder implements Builder<Rule> {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+	List<Symbolizer> symbolizers = new ArrayList<Symbolizer>();
+	Builder<? extends Symbolizer> symbolizerBuilder;
+	String name;
+	String ruleAbstract;
+	double minScaleDenominator;
+	double maxScaleDenominator;
+	Filter filter;
+	boolean elseFilter;
+	String title;
+
+	public RuleBuilder() {
+		reset();
+	}
+	
+	public RuleBuilder name(String name) {
+		this.name = name;
+		return this;
+	}
+	
+	public RuleBuilder title(String title) {
+		this.title = title;
+		return this;
+	}
+	
+	public RuleBuilder ruleAbstract(String ruleAbstract) {
+		this.ruleAbstract = ruleAbstract;
+		return this;
+	}
+	
+	public RuleBuilder minScaleDenominator(double minScaleDenominator) {
+		if(minScaleDenominator < 0)
+			throw new IllegalArgumentException("Invalid min scale denominator, should be positive or 0");
+		this.minScaleDenominator = minScaleDenominator;
+		return this;
+	}
+	
+	public RuleBuilder maxScaleDenominator(double maxScaleDenominator) {
+		if(maxScaleDenominator < 0)
+			throw new IllegalArgumentException("Invalid max scale denominator, should be positive or 0");
+		this.maxScaleDenominator = maxScaleDenominator;
+		return this;
+	}
+	
+	public RuleBuilder elseFilter() {
+		this.elseFilter = true;
+		this.filter = null;
+		return this;
+	}
+	
+	public RuleBuilder filter(Filter filter) {
+		this.elseFilter = false;
+		this.filter = filter;
+		return this;
+	}
+	
+	public PointSymbolizerBuilder newPoint() {
+		if(symbolizerBuilder != null)
+			symbolizers.add(symbolizerBuilder.build());
+		symbolizerBuilder = new PointSymbolizerBuilder();
+		return (PointSymbolizerBuilder) symbolizerBuilder;
+	}
+	
+	public LineSymbolizerBuilder newLine() {
+		if(symbolizerBuilder != null)
+			symbolizers.add(symbolizerBuilder.build());
+		symbolizerBuilder = new LineSymbolizerBuilder();
+		return (LineSymbolizerBuilder) symbolizerBuilder;
+	}
+	
+	public PolygonSymbolizerBuilder newPolygon() {
+		if(symbolizerBuilder != null)
+			symbolizers.add(symbolizerBuilder.build());
+		symbolizerBuilder = new PolygonSymbolizerBuilder();
+		return (PolygonSymbolizerBuilder) symbolizerBuilder;
+	}
+	
+	public Rule build() {
+		if(symbolizerBuilder == null) {
+			symbolizerBuilder = new PointSymbolizerBuilder();
+		}
+		// cascade build operation
+		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);
+		
+		reset();
+		return rule;
+	}
+	
+	public RuleBuilder reset() {
+		name = null;
+		title = null;
+		ruleAbstract = null;
+		minScaleDenominator = 0;
+		maxScaleDenominator = Double.POSITIVE_INFINITY;
+		filter = null;
+		elseFilter = false;
+		symbolizers.clear();
+		return this;
+	}
+	
+}
Index: src/main/java/org/geotools/styling/builder/PolygonSymbolizerBuilder.java
===================================================================
--- src/main/java/org/geotools/styling/builder/PolygonSymbolizerBuilder.java	(revisione 0)
+++ src/main/java/org/geotools/styling/builder/PolygonSymbolizerBuilder.java	(revisione 0)
@@ -0,0 +1,49 @@
+package org.geotools.styling.builder;
+
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.styling.Fill;
+import org.geotools.styling.PolygonSymbolizer;
+import org.geotools.styling.Stroke;
+import org.geotools.styling.StyleFactory;
+
+public class PolygonSymbolizerBuilder implements Builder<PolygonSymbolizer> {
+	StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
+	
+	StrokeBuilder strokeBuilder;
+	FillBuilder fillBuilder;
+	String geometry;
+	
+	PolygonSymbolizerBuilder geometry(String geometry) {
+		this.geometry = geometry;
+		return this;
+	}
+	
+	public StrokeBuilder stroke() {
+		if(strokeBuilder == null)
+			strokeBuilder = new StrokeBuilder();
+		return strokeBuilder;
+	}
+	
+	public FillBuilder fill() {
+		if(fillBuilder == null)
+			fillBuilder = new FillBuilder();
+		return fillBuilder;
+	}
+
+
+	public PolygonSymbolizer build() {
+		Stroke stroke = strokeBuilder == null ? strokeBuilder.build() : null;
+		Fill fill = fillBuilder == null ? fillBuilder.build() : null;
+		PolygonSymbolizer ps = sf.createPolygonSymbolizer(stroke, fill, geometry);
+		reset();
+		return ps;
+	}
+
+	public PolygonSymbolizerBuilder reset() {
+		strokeBuilder = null;
+		fillBuilder = null;
+		return this;
+	}
+	
+	
+}
------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Geotools-devel mailing list
Geotools-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-devel

Reply via email to