/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, 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;
import java.awt.Color;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.factory.GeoTools;
import org.geotools.filter.function.FilterFunction_buffer;
import org.geotools.test.TestData;
import org.opengis.filter.BinaryLogicOperator;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.Id;
import org.opengis.filter.Not;
import org.opengis.filter.PropertyIsEqualTo;
import org.opengis.filter.expression.Expression;
import org.opengis.filter.expression.Function;
import org.opengis.filter.expression.Literal;
import org.opengis.filter.expression.PropertyName;
import org.opengis.filter.spatial.BinarySpatialOperator;
import org.opengis.filter.spatial.Disjoint;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.Polygon;
/**
* Try out our SLD parser and see how well it does.
*
* @author jamesm
*
* @source $URL$
*/
public class SLDStyleTest extends TestCase {
StyleFactory sf = CommonFactoryFinder.getStyleFactory( GeoTools.getDefaultHints() );
FilterFactory ff = CommonFactoryFinder.getFilterFactory( GeoTools.getDefaultHints() );
StyleBuilder sb = new StyleBuilder(sf, ff);
/**
* Creates a new SLDStyleTest object.
*
* @param testName DOCUMENT ME!
*/
public SLDStyleTest(java.lang.String testName) {
super(testName);
}
/**
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static Test suite() {
TestSuite suite = new TestSuite(SLDStyleTest.class);
return suite;
}
/**
* Test of parseStyle method, of class org.geotools.styling.SLDStyle.
*
* @throws Exception DOCUMENT ME!
*/
public void testParseStyle() throws Exception {
//java.net.URL base = getClass().getResource("testData/");
// base = getClass().getResource("testData");
// base = getClass().getResource("/testData");
//java.net.URL surl = new java.net.URL(base + "/test-sld.xml");
java.net.URL surl = TestData.getResource(this, "test-sld.xml");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
assertEquals("My Layer", sld.getName());
assertEquals("A layer by me", sld.getTitle());
assertEquals("this is a sample layer", sld.getAbstract());
assertEquals(1, sld.getStyledLayers().length);
UserLayer layer = (UserLayer) sld.getStyledLayers()[0];
assertNull(layer.getName());
assertEquals(1, layer.getUserStyles().length);
Style style = layer.getUserStyles()[0];
assertEquals(1, style.getFeatureTypeStyles().length);
assertEquals("My User Style", style.getName());
assertEquals("A style by me", style.getTitle());
assertEquals("this is a sample style", style.getAbstract());
assertTrue(style.isDefault());
FeatureTypeStyle fts = style.getFeatureTypeStyles()[0];
Rule rule = fts.getRules()[0];
LineSymbolizer lineSym = (LineSymbolizer) rule.getSymbolizers()[0];
assertEquals(4,
((Number) lineSym.getStroke().getWidth().evaluate( null, Number.class )).intValue());
}
/**
* XML --> SLD --> XML
* @throws Exception
*/
public void testSLDParser() throws Exception {
java.net.URL surl = TestData.getResource(this, "example-sld.xml");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
//convert back to xml again
SLDTransformer aTransformer = new SLDTransformer();
String xml = aTransformer.transform(sld);
assertNotNull(xml);
//we're content for the moment if this didn't throw an exception...
//TODO: convert the buffer/resource to a string and compare
}
public void testEmptyElements() throws Exception {
// before GEOT-3042 this would simply fail with an NPE
java.net.URL surl = TestData.getResource(this, "test-empty-elements.sld");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
assertEquals(1, ((UserLayer) sld.getStyledLayers()[0]).getUserStyles().length);
Style style = ((UserLayer) sld.getStyledLayers()[0]).getUserStyles()[0];
assertEquals(1, style.featureTypeStyles().size());
assertEquals(1, style.featureTypeStyles().get(0).rules().size());
assertEquals(1, style.featureTypeStyles().get(0).rules().get(0).symbolizers().size());
}
public void testDashArray1() throws Exception {
// plain text in dasharray
java.net.URL surl = TestData.getResource(this, "dasharray1.sld");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
validateDashArrayStyle(sld);
}
public void testDashArray2() throws Exception {
// using ogc:Literal in dasharray
java.net.URL surl = TestData.getResource(this, "dasharray2.sld");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
validateDashArrayStyle(sld);
}
private void validateDashArrayStyle(StyledLayerDescriptor sld) {
assertEquals(1, ((UserLayer) sld.getStyledLayers()[0]).getUserStyles().length);
Style style = ((UserLayer) sld.getStyledLayers()[0]).getUserStyles()[0];
List<FeatureTypeStyle> fts = style.featureTypeStyles();
assertEquals(1, fts.size());
List<Rule> rules = fts.get(0).rules();
assertEquals(1, rules.size());
List<Symbolizer> symbolizers = rules.get(0).symbolizers();
assertEquals(1, symbolizers.size());
LineSymbolizer ls = (LineSymbolizer) symbolizers.get(0);
assertTrue(Arrays.equals(new float[] {2.0f, 1.0f, 4.0f, 1.0f}, ls.getStroke().getDashArray()));
}
public void testSLDParserWithWhitespaceIsTrimmed() throws Exception {
java.net.URL surl = TestData.getResource(this, "whitespace.sld");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
TextSymbolizer ts = (TextSymbolizer) ((NamedLayer)sld.getStyledLayers()[0])
.getStyles()[0].getFeatureTypeStyles()[0].getRules()[0].getSymbolizers()[0];
PropertyName property = (PropertyName) ts.getLabel();
assertEquals( "testProperty", property.getPropertyName() );
Expression color = ts.getFill().getColor();
assertEquals( Color.BLACK, SLD.color( color ) );
}
public void testSLDParserWithhMixedContent() throws Exception {
java.net.URL surl = TestData.getResource(this, "mixedContent.sld");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
Symbolizer[] symbolizers = ((NamedLayer) sld.getStyledLayers()[0]).getStyles()[0]
.getFeatureTypeStyles()[0].getRules()[0].getSymbolizers();
PolygonSymbolizer polygon = (PolygonSymbolizer) symbolizers[0];
TextSymbolizer text = (TextSymbolizer) symbolizers[1];
Expression fill = polygon.getFill().getColor();
Expression label = text.getLabel();
String fillValue = (String) fill.evaluate(null, String.class);
String labelValue = (String) label.evaluate(null, String.class);
assertEquals("#96C3F5", fillValue);
assertEquals("this is a prefix; this is an expression; this is a postfix", labelValue);
}
public void testSLDExtendedColorMap() throws Exception {
java.net.URL surl = TestData.getResource(this, "colormap.sld");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
Symbolizer[] symbolizers = ((UserLayer) sld.getStyledLayers()[0]).userStyles().get(0).getFeatureTypeStyles()[0].getRules()[0].getSymbolizers();
RasterSymbolizer rs = (RasterSymbolizer) symbolizers[0];
assertTrue(rs.getColorMap().getExtendedColors());
assertTrue(rs.getColorMap().getType()==ColorMap.TYPE_RAMP);
}
public void testSLDParserWithhMixedContentCDATA() throws Exception {
java.net.URL surl = TestData.getResource(this, "mixedContentWithCDATA.xml");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
Symbolizer[] symbolizers = ((NamedLayer) sld.getStyledLayers()[0]).getStyles()[0]
.getFeatureTypeStyles()[0].getRules()[0].getSymbolizers();
TextSymbolizer text = (TextSymbolizer) symbolizers[0];
Expression label = text.getLabel();
String labelValue = (String) label.evaluate(null, String.class);
assertEquals("literal_1\n cdata literal_2", labelValue);
}
public void testSLDParserWithhMixedContentCDATASpaces() throws Exception {
java.net.URL surl = TestData.getResource(this, "mixedContentWithCDATASpaces.xml");
SLDParser stylereader = new SLDParser(sf, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
Symbolizer[] symbolizers = ((NamedLayer) sld.getStyledLayers()[0]).getStyles()[0]
.getFeatureTypeStyles()[0].getRules()[0].getSymbolizers();
TextSymbolizer text = (TextSymbolizer) symbolizers[0];
Expression label = text.getLabel();
String labelValue = (String) label.evaluate(null, String.class);
assertEquals("literal_1\nliteral_2", labelValue);
}
/**
* SLD --> XML --> SLD
* @throws Exception
*/
public void testSLDTransformer() throws Exception {
//create an SLD
StyledLayerDescriptor sld = sf.createStyledLayerDescriptor();
StyledLayerDescriptor sld2;
sld.setName("SLD Name");
sld.setTitle("SLD Title");
UserLayer layer = sf.createUserLayer();
layer.setName("UserLayer Name");
Style style = sf.createStyle();
style.setName("Style Name");
style.setTitle("Style Title");
Rule rule1 = sb.createRule(sb.createLineSymbolizer(new Color(0), 2));
// note: symbolizers containing a fill will likely fail, as the SLD
// transformation loses a little data (background colour?)
FeatureTypeStyle fts1 = sf.createFeatureTypeStyle(new Rule[] {rule1});
fts1.setSemanticTypeIdentifiers(new String[] {"generic:geometry"});
style.setFeatureTypeStyles(new FeatureTypeStyle[] {fts1});
layer.setUserStyles(new Style[] {style});
sld.setStyledLayers(new UserLayer[] {layer});
//convert it to XML
SLDTransformer aTransformer = new SLDTransformer();
String xml = aTransformer.transform(sld);
//back to SLD
InputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
SLDParser stylereader = new SLDParser(sf, is);
sld2 = stylereader.parseSLD();
// UNCOMMENT FOR DEBUGGING
// assertEquals(SLD.rules(SLD.styles(sld)[0]).length, SLD.rules(SLD.styles(sld2)[0]).length);
// for (int i = 0; i < SLD.rules(SLD.styles(sld)[0]).length; i++) {
// Rule aRule = SLD.rules(SLD.styles(sld)[0])[i];
// Rule bRule = SLD.rules(SLD.styles(sld2)[0])[i];
// System.out.println(i+":"+aRule);
// Symbolizer[] symb1 = SLD.symbolizers(aRule);
// Symbolizer[] symb2 = SLD.symbolizers(bRule);
// for (int j = 0; j < symb1.length; j++) {
// //symbolizers are equal
// assertTrue(symb1[j].equals(symb2[j]));
// }
// //rules are equal
// assertTrue(aRule.equals(bRule));
// }
// //feature type styles are equal
// assertTrue(SLD.featureTypeStyles(sld)[0].equals(SLD.featureTypeStyles(sld2)[0]));
// //styles are equal
// assertTrue(SLD.styles(sld)[0].equals(SLD.styles(sld2)[0]));
// //layers are equal
// StyledLayer layer1 = sld.getStyledLayers()[0];
// StyledLayer layer2 = sld2.getStyledLayers()[0];
// boolean result = layer1.equals(layer2);
// assertTrue(result);
//everything is equal
assertEquals(sld2, sld);
}
public void testSLDTransformerIndentation() throws Exception {
//create a simple object
StyledLayerDescriptor sld = sf.createStyledLayerDescriptor();
NamedLayer nl = sf.createNamedLayer();
nl.setName("named_layer_1");
sld.addStyledLayer(nl);
//convert it to XML
SLDTransformer aTransformer = new SLDTransformer();
aTransformer.setIndentation(3); //3 spaces
String xml1 = aTransformer.transform(sld);
aTransformer.setIndentation(4); //4 spaces
String xml2 = aTransformer.transform(sld);
//generated xml contains 4 indents, so if indentation is working, the difference should be 4
assertEquals(xml1.length() + 4, xml2.length());
}
public void testParseSLD_NameSpaceAware() throws Exception {
URL surl = TestData.getResource(this, "test-ns.sld");
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
SLDParser stylereader = new SLDParser(factory, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
assertEquals(1, sld.getStyledLayers().length);
FeatureTypeStyle[] fts = SLD.featureTypeStyles(sld);
assertEquals(2, fts.length);
assertEquals(1, fts[0].getSemanticTypeIdentifiers().length);
assertEquals(2, fts[1].getSemanticTypeIdentifiers().length);
assertEquals("colorbrewer:default", fts[1].getSemanticTypeIdentifiers()[1]);
}
/**
* Test of parseSLD method to ensure NamedLayer/Name and
* NamedLayer/NamedStyle are parsed correctly
*
* @throws Exception boom
*/
public void testParseSLDNamedLayersOnly() throws Exception {
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "namedLayers.sld");
SLDParser stylereader = new SLDParser(factory, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
final int expectedLayerCount = 3;
final String[] layerNames = { "Rivers", "Roads", "Houses" };
final String[] namedStyleNames = { "CenterLine", "CenterLine", "Outline" };
StyledLayer[] layers = sld.getStyledLayers();
assertEquals(expectedLayerCount, layers.length);
for (int i = 0; i < expectedLayerCount; i++) {
assertTrue(layers[i] instanceof NamedLayer);
}
for (int i = 0; i < expectedLayerCount; i++) {
assertEquals(layerNames[i], layers[i].getName());
}
for (int i = 0; i < expectedLayerCount; i++) {
NamedLayer layer = (NamedLayer) layers[i];
assertEquals(1, layer.getStyles().length);
assertTrue(layer.getStyles()[0] instanceof NamedStyle);
assertEquals(namedStyleNames[i], layer.getStyles()[0].getName());
}
// find the rivers layers and test the LayerFeatureConstraints
for (int i = 0; i < expectedLayerCount; i++) {
NamedLayer layer = (NamedLayer) layers[i];
if (layer.getName().equals("Rivers")) {
FeatureTypeConstraint[] featureTypeConstraints = layer.getLayerFeatureConstraints();
final int featureTypeConstraintCount = 1;
assertEquals(featureTypeConstraintCount, featureTypeConstraints.length);
Filter filter = featureTypeConstraints[0].getFilter();
assertTrue(filter instanceof PropertyIsEqualTo);
PropertyIsEqualTo equal = (PropertyIsEqualTo) filter;
assertTrue(equal.getExpression1() instanceof PropertyName);
assertTrue(equal.getExpression2() instanceof Literal);
}
}
}
/**
* Test of parseSLD method to ensure NamedLayer/Name and
* NamedLayer/NamedStyle are parsed correctly
*
* @throws Exception boom
*/
public void testParseSLDNamedAndUserLayers() throws Exception {
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "mixedLayerTypes.sld");
SLDParser stylereader = new SLDParser(factory, surl);
StyledLayerDescriptor sld = stylereader.parseSLD();
final int expectedLayerCount = 4;
StyledLayer[] layers = sld.getStyledLayers();
assertEquals(expectedLayerCount, layers.length);
assertTrue(layers[0] instanceof NamedLayer);
assertTrue(layers[1] instanceof UserLayer);
assertTrue(layers[2] instanceof NamedLayer);
assertTrue(layers[3] instanceof UserLayer);
}
/**
* Verifies that geometry filters inside SLD documents are correctly
* parsed.
*
* @throws IOException boom
*/
public void testParseGeometryFilters() throws IOException {
final String TYPE_NAME = "testType";
final String GEOMETRY_ATTR = "Polygons";
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "spatialFilter.xml");
SLDParser stylereader = new SLDParser(factory, surl);
Style[] styles = stylereader.readXML();
final int expectedStyleCount = 1;
assertEquals(expectedStyleCount, styles.length);
Style notDisjoint = styles[0];
assertEquals(1, notDisjoint.getFeatureTypeStyles().length);
FeatureTypeStyle fts = notDisjoint.getFeatureTypeStyles()[0];
assertEquals(TYPE_NAME, fts.getFeatureTypeName());
assertEquals(1, fts.getRules().length);
Filter filter = fts.getRules()[0].getFilter();
assertTrue( filter instanceof Not );
Filter spatialFilter = ((Not) filter).getFilter();
assertTrue( spatialFilter instanceof Disjoint );
Disjoint disjoint = (Disjoint) spatialFilter;
Expression left = disjoint.getExpression1();
Expression right = disjoint.getExpression2();
assertTrue( left instanceof PropertyName );
assertTrue( right instanceof Literal );
assertTrue( right.evaluate(null) instanceof Geometry );
assertEquals(GEOMETRY_ATTR, ((PropertyName)left).getPropertyName() );
assertTrue( right.evaluate(null) instanceof Polygon);
Envelope bbox = ((Polygon) right.evaluate(null)).getEnvelopeInternal();
assertEquals(-10D, bbox.getMinX(), 0);
assertEquals(-10D, bbox.getMinY(), 0);
assertEquals(10D, bbox.getMaxX(), 0);
assertEquals(10D, bbox.getMaxY(), 0);
}
/**
* Verifies that a FID Filter is correctly parsed (GEOT-992).
*
* @throws IOException boom
*/
public void testParseFidFilter() throws IOException {
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "fidFilter.xml");
SLDParser stylereader = new SLDParser(factory, surl);
Style[] styles = stylereader.readXML();
final int expectedStyleCount = 1;
assertEquals(expectedStyleCount, styles.length);
Style style = styles[0];
assertEquals(1, style.getFeatureTypeStyles().length);
FeatureTypeStyle fts = style.getFeatureTypeStyles()[0];
assertEquals("Feature", fts.getFeatureTypeName());
assertEquals(1, fts.getRules().length);
Filter filter = fts.getRules()[0].getFilter();
assertTrue( filter instanceof Id);
Id fidFilter = (Id) filter;
Set ids = fidFilter.getIDs();
String[] fids = (String[]) ids.toArray(new String[ ids.size()] );
assertEquals("Wrong number of fids", 5, fids.length);
Arrays.sort(fids);
assertEquals("fid.0", fids[0]);
assertEquals("fid.1", fids[1]);
assertEquals("fid.2", fids[2]);
assertEquals("fid.3", fids[3]);
assertEquals("fid.4", fids[4]);
}
public void testParseKmlExtensions() throws IOException {
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "kmlSymbolizer.sld");
SLDParser stylereader = new SLDParser(factory, surl);
// basic checks
Style[] styles = stylereader.readXML();
assertEquals(1, styles.length);
assertEquals(1, styles[0].getFeatureTypeStyles().length);
assertEquals(1, styles[0].getFeatureTypeStyles()[0].getRules().length);
final Rule rule = styles[0].getFeatureTypeStyles()[0].getRules()[0];
assertEquals(1, rule.getSymbolizers().length);
TextSymbolizer2 ts = (TextSymbolizer2) rule.getSymbolizers()[0];
// abstract == property name
assertEquals("propertyOne", ((PropertyName) ts.getSnippet()).getPropertyName());
// abstract == mixed literal + propertyName
Expression desc = ts.getFeatureDescription();
assertTrue(desc instanceof Function);
assertEquals("strConcat", ((Function) desc).getName());
assertEquals(2, ((Function) desc).getParameters().size());
assertTrue(((Function) desc).getParameters().get(0) instanceof Literal);
assertTrue(((Function) desc).getParameters().get(1) instanceof PropertyName);
// other text -> target & literal
assertEquals("extrude", ts.getOtherText().getTarget());
assertTrue(ts.getOtherText().getText() instanceof Literal);
}
/**
* Tests the parsing of a raster symbolizer sld
* @throws IOException
*/
public void testParseRasterSymbolizer() throws IOException{
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "rasterSymbolizer.sld");
SLDParser stylereader = new SLDParser(factory, surl);
Style[] styles = stylereader.readXML();
assertEquals(1, styles.length);
assertEquals(1, styles[0].getFeatureTypeStyles().length);
assertEquals(1, styles[0].getFeatureTypeStyles()[0].getRules().length);
Rule r = styles[0].getFeatureTypeStyles()[0].getRules()[0];
assertEquals(1, r.getSymbolizers().length);
RasterSymbolizer rs = (RasterSymbolizer)r.getSymbolizers()[0];
//opacity
assertEquals(0.75, SLD.opacity(rs));
//channels
ChannelSelection cs = rs.getChannelSelection();
SelectedChannelType redChannel = cs.getRGBChannels()[0];
SelectedChannelType greenChannel = cs.getRGBChannels()[1];
SelectedChannelType blueChannel = cs.getRGBChannels()[2];
//channel names
assertEquals("1", redChannel.getChannelName());
assertEquals("2", greenChannel.getChannelName());
assertEquals("6", blueChannel.getChannelName());
//contrast enhancement
ContrastEnhancement rcs = redChannel.getContrastEnhancement();
String type = (String)rcs.getType().evaluate(null);
assertEquals("Histogram", type);
ContrastEnhancement gcs = greenChannel.getContrastEnhancement();
Double ggamma = (Double)gcs.getGammaValue().evaluate(null);
assertEquals(2.8, ggamma.doubleValue());
ContrastEnhancement bcs = blueChannel.getContrastEnhancement();
type = (String)bcs.getType().evaluate(null);
assertEquals("Normalize", type);
//overlap behaviour
Expression overlapExpr = rs.getOverlap();
type = (String)overlapExpr.evaluate(null);
assertEquals("LATEST_ON_TOP", type);
//ContrastEnhancement
ContrastEnhancement ce = rs.getContrastEnhancement();
Double v = (Double)ce.getGammaValue().evaluate(null);
assertEquals(1.0, v.doubleValue());
}
/**
* Tests the parsing of a raster symbolizer sld with color Map
* @throws IOException
*/
public void testParseRasterSymbolizerColorMap() throws IOException{
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "rasterSymbolizerColorMap.sld");
SLDParser stylereader = new SLDParser(factory, surl);
Style[] styles = stylereader.readXML();
assertEquals(1, styles.length);
assertEquals(1, styles[0].getFeatureTypeStyles().length);
assertEquals(1, styles[0].getFeatureTypeStyles()[0].getRules().length);
Rule r = styles[0].getFeatureTypeStyles()[0].getRules()[0];
assertEquals(1, r.getSymbolizers().length);
RasterSymbolizer rs = (RasterSymbolizer)r.getSymbolizers()[0];
//opacity
Double d = (Double)rs.getOpacity().evaluate(null, Double.class);
assertEquals(1.0, d.doubleValue());
//overlap behaviour
Expression overlapExpr = rs.getOverlap();
String type = (String)overlapExpr.evaluate(null);
assertEquals("AVERAGE", type);
//ColorMap
ColorMap cMap = rs.getColorMap();
assertEquals(20, cMap.getColorMapEntries().length);
ColorMapEntry[] centeries = cMap.getColorMapEntries();
String[] colors = new String[]{"#00ff00","#00fa00","#14f500","#28f502","#3cf505","#50f50a","#64f014","#7deb32","#78c818","#38840c","#2c4b04","#ffff00","#dcdc00","#b47800","#c85000","#be4100","#963000","#3c0200","#ffffff","#ffffff"};
int[] values = new int[]{-500,-417,-333,-250,-167,-83,-1,0,30,105,300,400,700,1200,1400,1600,2000,3000,5000,13000};
for (int i = 0; i < centeries.length; i++) {
ColorMapEntry entry = centeries[i];
String c = (String) entry.getColor().evaluate(null);
Integer q = (Integer) entry.getQuantity().evaluate(null, Integer.class);
assertEquals(colors[i], c);
assertEquals(values[i], q.intValue());
}
}
public void testParseGeometryExpressions() throws Exception {
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "geometryTransformation.sld");
SLDParser stylereader = new SLDParser(factory, surl);
Style[] styles = stylereader.readXML();
assertEquals(1, styles.length);
assertEquals(1, styles[0].featureTypeStyles().size());
assertEquals(1, styles[0].featureTypeStyles().get(0).rules().size());
Rule r = styles[0].featureTypeStyles().get(0).rules().get(0);
assertEquals(1, r.getSymbolizers().length);
PolygonSymbolizer ps = (PolygonSymbolizer) r.getSymbolizers()[0];
Expression geom = ps.getGeometry();
assertNotNull(geom);
assertTrue(geom instanceof FilterFunction_buffer);
FilterFunction_buffer buf = (FilterFunction_buffer) geom;
assertTrue(buf.getParameters().get(0) instanceof PropertyName);
assertTrue(buf.getParameters().get(1) instanceof Literal);
}
public void testParsePlainGeometryExpression() throws Exception {
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "geometryPlain.sld");
SLDParser stylereader = new SLDParser(factory, surl);
Style[] styles = stylereader.readXML();
assertEquals(1, styles.length);
assertEquals(1, styles[0].featureTypeStyles().size());
assertEquals(1, styles[0].featureTypeStyles().get(0).rules().size());
Rule r = styles[0].featureTypeStyles().get(0).rules().get(0);
assertEquals(1, r.getSymbolizers().length);
PolygonSymbolizer ps = (PolygonSymbolizer) r.getSymbolizers()[0];
Expression geom = ps.getGeometry();
assertNotNull(geom);
assertTrue(geom instanceof PropertyName);
PropertyName pn = (PropertyName) geom;
assertEquals("the_geom", pn.getPropertyName());
assertEquals("the_geom", ps.getGeometryPropertyName());
}
public void testDataTransformation() throws Exception {
StyleFactory factory = CommonFactoryFinder.getStyleFactory(null);
java.net.URL surl = TestData.getResource(this, "transformation.xml");
SLDParser stylereader = new SLDParser(factory, surl);
// basic checks
Style[] styles = stylereader.readXML();
assertEquals(1, styles.length);
assertEquals(1, styles[0].featureTypeStyles().size());
final FeatureTypeStyle fts = styles[0].featureTypeStyles().get(0);
assertEquals(1, fts.rules().size());
assertNotNull(fts.getTransformation());
Function tx = (Function) fts.getTransformation();
assertEquals("union", tx.getName());
}
}