/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2002-2016, 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 static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo; import static org.custommonkey.xmlunit.XMLAssert.assertXpathExists; import static org.custommonkey.xmlunit.XMLAssert.assertXpathNotExists; import static org.custommonkey.xmlunit.XMLUnit.buildTestDocument; import static org.custommonkey.xmlunit.XMLUnit.setXpathNamespaceContext; import static org.junit.Assert.*; import java.awt.Color; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.TransformerException; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.SimpleNamespaceContext; import org.custommonkey.xmlunit.exceptions.XpathException; import org.geotools.factory.CommonFactoryFinder; import org.geotools.factory.GeoTools; import org.geotools.util.GrowableInternationalString; import org.junit.Before; import org.junit.Test; import org.opengis.filter.FilterFactory2; 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.style.ContrastMethod; import org.opengis.style.GraphicalSymbol; import org.opengis.style.Rule; import org.opengis.style.Symbolizer; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; /** * This test case captures specific problems encountered with the SLDTransformer code. * <p> * Please note that SLDTransformer is specifically targeted at SLD 1.0; for new code you should be * using the SLD 1.0 (or SE 1.1) xml-xsd bindings. * </p> * * @author Jody * * * * @source $URL$ */ public class SLDTransformerTest { static StyleFactory2 sf = (StyleFactory2) CommonFactoryFinder.getStyleFactory(null); static FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null); static final String NEWLINE = System.getProperty("line.separator"); static SLDTransformer transformer; @Before public void setUp() throws Exception { transformer = new SLDTransformer(); transformer.setIndentation(4); // setup xml unit Map<String, String> namespaces = new HashMap<String, String>(); namespaces.put("sld", "http://www.opengis.net/sld"); namespaces.put("ogc", "http://www.opengis.net/ogc"); namespaces.put("gml", "http://www.opengis.net/gml"); namespaces.put("xlink", "http://www.w3.org/1999/xlink"); setXpathNamespaceContext(new SimpleNamespaceContext(namespaces)); } /** * This problem is reported from uDig 1.2, we are trying to save a RasterSymbolizer (used to * record the opacity of a raster layer) out to an SLD file for safe keeping. */ @Test public void testEncodingRasterSymbolizer() throws Exception { RasterSymbolizer defaultRasterSymbolizer = sf.createRasterSymbolizer(); String xmlFragment = transformer.transform(defaultRasterSymbolizer); assertNotNull(xmlFragment); RasterSymbolizer opacityRasterSymbolizer = sf.createRasterSymbolizer(); opacityRasterSymbolizer.setOpacity(ff.literal(1.0)); xmlFragment = transformer.transform(opacityRasterSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); parser.setInput(new StringReader(xmlFragment)); Object out = parser.parseSLD(); assertNotNull(out); } /** * Now that we have uDig 1.2 handling opacity we can start look at something more exciting - a * complete style object. */ @Test public void testEncodingStyle() throws Exception { // simple default raster symbolizer RasterSymbolizer defaultRasterSymbolizer = sf.createRasterSymbolizer(); String xmlFragment = transformer.transform(defaultRasterSymbolizer); assertNotNull(xmlFragment); // more complex raster symbolizer StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(GeoTools.getDefaultHints()); StyleBuilder styleBuilder = new StyleBuilder(styleFactory); RasterSymbolizer rasterSymbolizer = styleFactory.createRasterSymbolizer(); // set opacity rasterSymbolizer.setOpacity(CommonFactoryFinder.getFilterFactory( GeoTools.getDefaultHints()).literal(0.25)); // set channel selection ChannelSelectionImpl csi = new ChannelSelectionImpl(); // red SelectedChannelTypeImpl redChannel = new SelectedChannelTypeImpl(); redChannel.setChannelName("1"); ContrastEnhancementImpl rcei = new ContrastEnhancementImpl(); rcei.setMethod(ContrastMethod.HISTOGRAM); redChannel.setContrastEnhancement(rcei); // green SelectedChannelTypeImpl greenChannel = new SelectedChannelTypeImpl(); greenChannel.setChannelName("4"); ContrastEnhancementImpl gcei = new ContrastEnhancementImpl(); gcei.setGammaValue(ff.literal(2.5)); greenChannel.setContrastEnhancement(gcei); // blue SelectedChannelTypeImpl blueChannel = new SelectedChannelTypeImpl(); blueChannel.setChannelName("2"); ContrastEnhancementImpl bcei = new ContrastEnhancementImpl(); bcei.setMethod(ContrastMethod.NORMALIZE); blueChannel.setContrastEnhancement(bcei); csi.setRGBChannels(redChannel, greenChannel, blueChannel); rasterSymbolizer.setChannelSelection(csi); Style style = styleBuilder.createStyle(rasterSymbolizer); style.setName("simpleStyle"); // style.setAbstract("Hello World"); NamedLayer layer = styleFactory.createNamedLayer(); layer.addStyle(style); StyledLayerDescriptor sld = styleFactory.createStyledLayerDescriptor(); sld.addStyledLayer(layer); xmlFragment = transformer.transform(sld); // System.out.println(xmlFragment); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); parser.setInput(new StringReader(xmlFragment)); Style[] stuff = parser.readXML(); Style out = stuff[0]; assertNotNull(out); assertEquals(0.25, SLD.rasterOpacity(out), 0d); } /** * This is a problem reported from uDig 1.2; we are trying to save a LineSymbolizer (and then * restore it) and the stroke is comming back black and with width 1 all the time. * * @throws Exception */ @Test public void testStroke() throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><sld:UserStyle xmlns=\"http://www.opengis.net/sld\" xmlns:sld=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:gml=\"http://www.opengis.net/gml\"><sld:Name>Default Styler</sld:Name><sld:Title>Default Styler</sld:Title><sld:FeatureTypeStyle><sld:Name>simple</sld:Name><sld:Title>title</sld:Title><sld:Abstract>abstract</sld:Abstract><sld:FeatureTypeName>Feature</sld:FeatureTypeName><sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier><sld:SemanticTypeIdentifier>simple</sld:SemanticTypeIdentifier><sld:Rule><sld:Title>title</sld:Title><sld:Abstract>abstract</sld:Abstract><sld:MaxScaleDenominator>1.7976931348623157E308</sld:MaxScaleDenominator><sld:LineSymbolizer><sld:Stroke><sld:CssParameter name=\"stroke\"><ogc:Literal>#0000FF</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-linecap\"><ogc:Literal>butt</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-linejoin\"><ogc:Literal>miter</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-opacity\"><ogc:Literal>1.0</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-width\"><ogc:Literal>2.0</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-dashoffset\"><ogc:Literal>0.0</ogc:Literal></sld:CssParameter></sld:Stroke></sld:LineSymbolizer></sld:Rule></sld:FeatureTypeStyle></sld:UserStyle>"; StringReader reader = new StringReader(xml); SLDParser sldParser = new SLDParser(sf, reader); Style[] parsed = sldParser.readXML(); assertNotNull("parsed xml", parsed); assertTrue("parsed xml into style", parsed.length > 0); Style style = parsed[0]; assertNotNull(style); Rule rule = style.featureTypeStyles().get(0).rules().get(0); LineSymbolizer lineSymbolize = (LineSymbolizer) rule.symbolizers().get(0); Stroke stroke = lineSymbolize.getStroke(); Expression color = stroke.getColor(); Color value = color.evaluate(null, Color.class); assertNotNull("color", value); assertEquals("blue", Color.BLUE, value); assertEquals("expected width", 2, (int) stroke.getWidth().evaluate(null, Integer.class)); } /** * SLD Fragment reported to produce error on user list - no related Jira. * * @throws Exception */ @Test public void testTextSymbolizerLabelPalcement() throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" + "<StyledLayerDescriptor version=\"1.0.0\" " + " xsi:schemaLocation=\"http://www.opengis.net/sld StyledLayerDescriptor.xsd\" " + " xmlns=\"http://www.opengis.net/sld\" " + " xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:xlink=\"http://www.w3.org/1999/xlink\" " + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" + " <NamedLayer>" + " <Name>Default Line</Name>" + " <UserStyle>" + " <Title>A boring default style</Title>" + " <Abstract>A sample style that just prints out a blue line</Abstract>" + " <FeatureTypeStyle>" + " <Rule>" + " <Name>Rule 1</Name>" + " <Title>Blue Line</Title>" + " <Abstract>A blue line with a 1 pixel width</Abstract>" + " <LineSymbolizer>" + " <Stroke>" + " <CssParameter name=\"stroke\">#0000ff</CssParameter>" + " </Stroke>" + " </LineSymbolizer>" + " </Rule>" + " <Rule>" + " <TextSymbolizer>" + " <Label><ogc:PropertyName>name</ogc:PropertyName></Label>" + " <Font>" + " <CssParameter name=\"font-family\">Arial</CssParameter>" + " <CssParameter name=\"font-style\">normal</CssParameter>" + " <CssParameter name=\"font-size\">12</CssParameter>" + " <CssParameter name=\"font-weight\">normal</CssParameter>" + " </Font>" + " <LabelPlacement>" + " <LinePlacement>" + " <PerpendicularOffset>0</PerpendicularOffset>" + " </LinePlacement>" + " </LabelPlacement>" + " </TextSymbolizer>" + " </Rule>" + " </FeatureTypeStyle>" + " </UserStyle>" + " </NamedLayer>" + "</StyledLayerDescriptor>"; StringReader reader = new StringReader(xml); SLDParser sldParser = new SLDParser(sf, reader); Style[] parsed = sldParser.readXML(); assertNotNull("parsed xml", parsed); assertTrue("parsed xml into style", parsed.length > 0); Style style = parsed[0]; assertNotNull(style); Rule rule = style.featureTypeStyles().get(0).rules().get(0); LineSymbolizer lineSymbolize = (LineSymbolizer) rule.symbolizers().get(0); Stroke stroke = lineSymbolize.getStroke(); Expression color = stroke.getColor(); Color value = color.evaluate(null, Color.class); assertNotNull("color", value); assertEquals("blue", Color.BLUE, value); } /** * Tests whether LabelPlacement works with a completely empty * PointPlacement as the spec allows. * * See also http://jira.codehaus.org/browse/GEOS-6748 */ @Test public void testPointPlacementEmpty(){ String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<StyledLayerDescriptor version=\"1.0.0\" xmlns=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\"" + " xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + " xsi:schemaLocation=\"http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd\">" + " <NamedLayer>" + " <Name>foo</Name>" + " <UserStyle>" + " <Name>pointplacement</Name>" + " <FeatureTypeStyle>" + " <Rule>" + " <MaxScaleDenominator>32000</MaxScaleDenominator>" + " <TextSymbolizer>" + " <Label>" + " <ogc:PropertyName>NAME</ogc:PropertyName>" + " </Label>" + " <Font>" + " <CssParameter name=\"font-family\">Arial</CssParameter>" + " <CssParameter name=\"font-weight\">Bold</CssParameter>" + " <CssParameter name=\"font-size\">14</CssParameter>" + " </Font>" + " <LabelPlacement>" // completely empty PointPlacement + " <PointPlacement />" + " </LabelPlacement>" + " </TextSymbolizer>" + " </Rule>" + " </FeatureTypeStyle>" + " </UserStyle>" + " </NamedLayer>" + "</StyledLayerDescriptor>"; StringReader reader = new StringReader(xml); SLDParser sldParser = new SLDParser(sf, reader); Style[] parsed = sldParser.readXML(); assertNotNull("parsed xml", parsed); assertTrue("parsed xml into style", parsed.length > 0); Style style = parsed[0]; assertNotNull(style); Rule rule = style.featureTypeStyles().get(0).rules().get(0); TextSymbolizer textSymbolize = (TextSymbolizer) rule.symbolizers().get(0); LabelPlacement labelPlacement = textSymbolize.getLabelPlacement(); assertNotNull(labelPlacement); } /** * Tests whether LabelPlacement works with a PointPlacement that has no * explicit AnchorPoint as the spec allows. * * See also http://jira.codehaus.org/browse/GEOS-6748 * @throws TransformerException */ @Test public void testPointPlacementNoAnchorPoint() throws TransformerException{ String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<StyledLayerDescriptor version=\"1.0.0\" xmlns=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\"" + " xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + " xsi:schemaLocation=\"http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd\">" + " <NamedLayer>" + " <Name>foo</Name>" + " <UserStyle>" + " <Name>pointplacement</Name>" + " <FeatureTypeStyle>" + " <Rule>" + " <TextSymbolizer>" + " <Label>" + " <ogc:PropertyName>NAME</ogc:PropertyName>" + " </Label>" + " <Font>" + " <CssParameter name=\"font-family\">Arial</CssParameter>" + " <CssParameter name=\"font-weight\">Bold</CssParameter>" + " <CssParameter name=\"font-size\">14</CssParameter>" + " </Font>" + " <LabelPlacement>" + " <PointPlacement>" // PointPlacement w/o AnchorPoint + " <Rotation>" + " 42" + " </Rotation>" + " </PointPlacement>" + " </LabelPlacement>" + " </TextSymbolizer>" + " </Rule>" + " </FeatureTypeStyle>" + " </UserStyle>" + " </NamedLayer>" + "</StyledLayerDescriptor>"; StringReader reader = new StringReader(xml); SLDParser sldParser = new SLDParser(sf, reader); Style[] parsed = sldParser.readXML(); assertNotNull("parsed xml", parsed); assertTrue("parsed xml into style", parsed.length > 0); Style style = parsed[0]; assertNotNull(style); Rule rule = style.featureTypeStyles().get(0).rules().get(0); TextSymbolizer textSymbolize = (TextSymbolizer) rule.symbolizers().get(0); PointPlacement pointPlacement = (PointPlacement) textSymbolize.getLabelPlacement(); assertNotNull(pointPlacement); assertNotNull(pointPlacement.getRotation()); assertNull( pointPlacement.getAnchorPoint()); SLDTransformer transform = new SLDTransformer(); String output = transform.transform(style); assertFalse( output.contains("AnchorPoint")); } /** * Another bug reported from uDig 1.2; we are trying to save a LineSymbolizer (and then restore * it) and the stroke is comming back black and with width 1 all the time. * * @throws Exception */ @Test public void testPointSymbolizer() throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<sld:StyledLayerDescriptor xmlns:sld=\"http://www.opengis.net/sld\" " + "xmlns:ogc=\"http://www.opengis.net/ogc\"" + " xmlns:gml=\"http://www.opengis.net/gml\" version=\"1.0.0\">" + " <sld:UserLayer>" + " <sld:LayerFeatureConstraints>" + " <sld:FeatureTypeConstraint/>" + " </sld:LayerFeatureConstraints>" + " <sld:UserStyle>" + " <sld:Name>Default Styler</sld:Name> " + " <sld:Title>Default Styler</sld:Title>" + " <sld:Abstract/>" + " <sld:FeatureTypeStyle>" + " <sld:Name>simple</sld:Name>" + " <sld:Title>title</sld:Title>" + " <sld:Abstract>abstract</sld:Abstract>" + " <sld:FeatureTypeName>Feature</sld:FeatureTypeName>" + " <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>" + " <sld:SemanticTypeIdentifier>simple</sld:SemanticTypeIdentifier>" + " <sld:Rule>" + " <sld:Name>name</sld:Name>" + " <sld:Title>title</sld:Title>" + " <sld:Abstract>Abstract</sld:Abstract>" + " <sld:MaxScaleDenominator>1.7976931348623157E308</sld:MaxScaleDenominator>" + " <sld:PointSymbolizer>" + " <sld:Graphic>" + " <sld:Mark>" + " <sld:WellKnownName>triangle</sld:WellKnownName>" + " <sld:Fill>" + " <sld:CssParameter name=\"fill\">" + " <ogc:Literal>#FFFF00</ogc:Literal>" + " </sld:CssParameter>" + " <sld:CssParameter name=\"fill-opacity\">" + " <ogc:Literal>1.0</ogc:Literal>" + " </sld:CssParameter>" + " </sld:Fill>" + " <sld:Stroke>" + " <sld:CssParameter name=\"stroke\">" + " <ogc:Literal>#008000</ogc:Literal>" + " </sld:CssParameter>" + " <sld:CssParameter name=\"stroke-linecap\">" + " <ogc:Literal>butt</ogc:Literal>" + " </sld:CssParameter>" + " <sld:CssParameter name=\"stroke-linejoin\">" + " <ogc:Literal>miter</ogc:Literal>" + " </sld:CssParameter>" + " <sld:CssParameter name=\"stroke-opacity\">" + " <ogc:Literal>1.0</ogc:Literal>" + " </sld:CssParameter>" + " <sld:CssParameter name=\"stroke-width\">" + " <ogc:Literal>1.0</ogc:Literal>" + " </sld:CssParameter>" + " <sld:CssParameter name=\"stroke-dashoffset\">" + " <ogc:Literal>0.0</ogc:Literal>" + " </sld:CssParameter>" + " </sld:Stroke>" + " </sld:Mark>" + " <sld:Opacity>" + " <ogc:Literal>1.0</ogc:Literal>" + " </sld:Opacity>" + " <sld:Size>" + " <ogc:Literal>10.0</ogc:Literal>" + " </sld:Size>" + " <sld:Rotation>" + " <ogc:Literal>0.0</ogc:Literal>" + " </sld:Rotation>" + " </sld:Graphic>" + " </sld:PointSymbolizer>" + " </sld:Rule>" + " </sld:FeatureTypeStyle>" + " </sld:UserStyle>" + " </sld:UserLayer>" + "</sld:StyledLayerDescriptor>"; StringReader reader = new StringReader(xml); SLDParser sldParser = new SLDParser(sf, reader); Style[] parsed = sldParser.readXML(); assertNotNull("parsed xml", parsed); assertTrue("parsed xml into style", parsed.length > 0); Style style = parsed[0]; assertNotNull(style); Rule rule = style.featureTypeStyles().get(0).rules().get(0); List<? extends Symbolizer> symbolizers = rule.symbolizers(); assertEquals(1, symbolizers.size()); PointSymbolizer symbolize = (PointSymbolizer) symbolizers.get(0); Graphic graphic = symbolize.getGraphic(); List<GraphicalSymbol> symbols = graphic.graphicalSymbols(); assertEquals(1, symbols.size()); Mark mark = (Mark) symbols.get(0); Expression color = mark.getFill().getColor(); Color value = color.evaluate(null, Color.class); assertNotNull("color", value); assertEquals("blue", Color.YELLOW, value); } /** * We have a pretty serious issue with this class not behaving well when logging is turned on! * This is the same test as above but with logging enganged at the FINEST level. * * @throws Exception */ @Test public void testStrokeWithLogging() throws Exception { Logger logger = Logger.getLogger("org.geotools.styling"); Level before = logger.getLevel(); try { logger.setLevel(Level.FINEST); String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><sld:UserStyle xmlns=\"http://www.opengis.net/sld\" xmlns:sld=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:gml=\"http://www.opengis.net/gml\"><sld:Name>Default Styler</sld:Name><sld:Title>Default Styler</sld:Title><sld:FeatureTypeStyle><sld:Name>simple</sld:Name><sld:Title>title</sld:Title><sld:Abstract>abstract</sld:Abstract><sld:FeatureTypeName>Feature</sld:FeatureTypeName><sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier><sld:SemanticTypeIdentifier>simple</sld:SemanticTypeIdentifier><sld:Rule><sld:Title>title</sld:Title><sld:Abstract>abstract</sld:Abstract><sld:MaxScaleDenominator>1.7976931348623157E308</sld:MaxScaleDenominator><sld:LineSymbolizer><sld:Stroke><sld:CssParameter name=\"stroke\"><ogc:Literal>#0000FF</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-linecap\"><ogc:Literal>butt</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-linejoin\"><ogc:Literal>miter</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-opacity\"><ogc:Literal>1.0</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-width\"><ogc:Literal>2.0</ogc:Literal></sld:CssParameter><sld:CssParameter name=\"stroke-dashoffset\"><ogc:Literal>0.0</ogc:Literal></sld:CssParameter></sld:Stroke></sld:LineSymbolizer></sld:Rule></sld:FeatureTypeStyle></sld:UserStyle>"; StringReader reader = new StringReader(xml); SLDParser sldParser = new SLDParser(sf, reader); Style[] parsed = sldParser.readXML(); assertNotNull("parsed xml", parsed); assertTrue("parsed xml into style", parsed.length > 0); Style style = parsed[0]; assertNotNull(style); Rule rule = style.featureTypeStyles().get(0).rules().get(0); LineSymbolizer lineSymbolize = (LineSymbolizer) rule.symbolizers().get(0); Stroke stroke = lineSymbolize.getStroke(); Expression color = stroke.getColor(); Color value = color.evaluate(null, Color.class); assertNotNull("color", value); assertEquals("blue", Color.BLUE, value); assertEquals("expected width", 2, (int) stroke.getWidth().evaluate(null, Integer.class)); } finally { logger.setLevel(before); } } @Test public void testUOMEncodingPointSymbolizer() throws Exception { // simple default line symbolizer PointSymbolizer pointSymbolizer = sf.createPointSymbolizer(); pointSymbolizer.setUnitOfMeasure(UomOgcMapping.FOOT.getUnit()); String xmlFragment = transformer.transform(pointSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); PointSymbolizer pointSymbolizer2 = parser.parsePointSymbolizer( dom.getFirstChild()); assertTrue(pointSymbolizer.getUnitOfMeasure().equals( pointSymbolizer2.getUnitOfMeasure())); } catch (Exception e) { e.printStackTrace(); } } @Test public void testUOMEncodingPolygonSymbolizer() throws Exception { // simple default line symbolizer PolygonSymbolizer polygonSymbolizer = sf.createPolygonSymbolizer(); polygonSymbolizer.setUnitOfMeasure(UomOgcMapping.METRE.getUnit()); String xmlFragment = transformer.transform(polygonSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); PolygonSymbolizer polygonSymbolizer2 = parser.parsePolygonSymbolizer(dom.getFirstChild()); assertTrue(polygonSymbolizer.getUnitOfMeasure().equals( polygonSymbolizer2.getUnitOfMeasure())); } @Test public void testUOMEncodingRasterSymbolizer2() throws Exception { // simple default line symbolizer RasterSymbolizer rasterSymbolizer = sf.createRasterSymbolizer(); rasterSymbolizer.setUnitOfMeasure(UomOgcMapping.PIXEL.getUnit()); String xmlFragment = transformer.transform(rasterSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); RasterSymbolizer rasterSymbolizer2 = parser.parseRasterSymbolizer(dom.getFirstChild()); assertTrue(rasterSymbolizer.getUnitOfMeasure().equals(rasterSymbolizer2.getUnitOfMeasure())); } @Test public void testUOMEncodingLineSymbolizer() throws Exception { // simple default line symbolizer LineSymbolizer lineSymbolizer = sf.createLineSymbolizer(); lineSymbolizer.setUnitOfMeasure(UomOgcMapping.METRE.getUnit()); String xmlFragment = transformer.transform(lineSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); LineSymbolizer lineSymbolizer2 = parser.parseLineSymbolizer(dom.getFirstChild()); assertTrue(lineSymbolizer.getUnitOfMeasure().equals(lineSymbolizer2.getUnitOfMeasure())); } @Test public void testUOMEncodingTextSymbolizer() throws Exception { // simple default text symbolizer TextSymbolizer textSymbolizer = sf.createTextSymbolizer(); textSymbolizer.setUnitOfMeasure(UomOgcMapping.FOOT.getUnit()); String xmlFragment = transformer.transform(textSymbolizer); assertNotNull(xmlFragment); xmlFragment = transformer.transform(textSymbolizer); // System.out.println(xmlFragment); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); TextSymbolizer textSymbolizer2 = parser.parseTextSymbolizer( dom.getFirstChild()); assertTrue(textSymbolizer.getUnitOfMeasure().equals(textSymbolizer2.getUnitOfMeasure())); } @Test public void testNullUOMEncodingPointSymbolizer() throws Exception { // simple default line symbolizer PointSymbolizer pointSymbolizer = sf.createPointSymbolizer(); String xmlFragment = transformer.transform(pointSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); PointSymbolizer pointSymbolizer2 = parser.parsePointSymbolizer(dom.getFirstChild()); assertTrue(pointSymbolizer2.getUnitOfMeasure() == null); } catch (Exception e) { e.printStackTrace(); } } @Test public void testNullUOMEncodingPolygonSymbolizer() throws Exception { // simple default line symbolizer PolygonSymbolizer polygonSymbolizer = sf.createPolygonSymbolizer(); String xmlFragment = transformer.transform(polygonSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); PolygonSymbolizer polygonSymbolizer2 = parser.parsePolygonSymbolizer(dom.getFirstChild()); assertTrue(polygonSymbolizer2.getUnitOfMeasure() == null); } @Test public void testNullUOMEncodingRasterSymbolizer2() throws Exception { // simple default line symbolizer RasterSymbolizer rasterSymbolizer = sf.createRasterSymbolizer(); String xmlFragment = transformer.transform(rasterSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); RasterSymbolizer rasterSymbolizer2 = parser.parseRasterSymbolizer(dom.getFirstChild()); assertTrue(rasterSymbolizer2.getUnitOfMeasure() == null); } @Test public void testNullUOMEncodingLineSymbolizer() throws Exception { // simple default line symbolizer LineSymbolizer lineSymbolizer = sf.createLineSymbolizer(); String xmlFragment = transformer.transform(lineSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); LineSymbolizer lineSymbolizer2 = parser.parseLineSymbolizer(dom.getFirstChild()); assertTrue(lineSymbolizer2.getUnitOfMeasure() == null); } @Test public void testNullUOMEncodingTextSymbolizer() throws Exception { // simple default text symbolizer TextSymbolizer textSymbolizer = sf.createTextSymbolizer(); String xmlFragment = transformer.transform(textSymbolizer); assertNotNull(xmlFragment); SLDParser parser = new SLDParser(sf); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); Document dom = null; DocumentBuilder db = null; db = dbf.newDocumentBuilder(); dom = db.parse(new InputSource(new StringReader(xmlFragment))); TextSymbolizer textSymbolizer2 = parser.parseTextSymbolizer(dom.getFirstChild()); assertTrue(textSymbolizer2.getUnitOfMeasure() == null); } /** * The displacement tag has not been exported to XML for a while... */ @Test public void testDisplacement() throws Exception { StyleBuilder sb = new StyleBuilder(); Graphic graphic; graphic = sb.createGraphic(); Displacement disp = sb.createDisplacement(10.1, -5.5); graphic.setDisplacement(disp); SLDTransformer st = new SLDTransformer(); String xml = st.transform(graphic); assertTrue("XML transformation of this GraphicImpl does not contain the word 'Displacement' ", xml.contains("Displacement")); } @Test public void testTextSymbolizerTransformOutAndInAndOutAgain() throws Exception { StyleBuilder sb = new StyleBuilder(); Style style = sb.createStyle(sb.createTextSymbolizer()); SLDTransformer st = new SLDTransformer(); String firstExport = st.transform(style); SLDParser sldp = new SLDParser(CommonFactoryFinder.getStyleFactory(null)); sldp.setInput(new StringReader(firstExport)); Style[] firstImport = sldp.readXML(); assertNotNull(firstImport[0]); // NPE here String secondExport = st.transform(firstImport); } // GEOT-5726 @Test public void testTextSymbolizerTransformOutAndInAndOutAndInAgainWithEmptyFontFamily() throws Exception { //Construct a style with an empty "" font StyleBuilder sb = new StyleBuilder(); Font font = sb.createFont(ff.literal(""), ff.literal("normal"), ff.literal("normal"), ff.literal(12)); TextSymbolizer ts = sb.createStaticTextSymbolizer(Color.BLACK, font, "label"); Style style = sb.createStyle(ts); assertEquals("", getFontFamily(style)); //Encode the style, and parse it SLDTransformer st = new SLDTransformer(); String firstExport = st.transform(style); SLDParser sldp = new SLDParser(CommonFactoryFinder.getStyleFactory(null)); sldp.setInput(new StringReader(firstExport)); Style[] firstImport = sldp.readXML(); assertNotNull(firstImport[0]); // previously got null here assertEquals("", getFontFamily(firstImport[0])); //Encode the style, and parse it again String secondExport = st.transform(firstImport); sldp.setInput(new StringReader(secondExport)); Style[] secondImport = sldp.readXML(); // previously got "Serif" here assertEquals("", getFontFamily(secondImport[0])); } private String getFontFamily(Style s) { List<org.geotools.styling.Symbolizer> symbolizers = s.featureTypeStyles().get(0).rules().get(0).symbolizers(); for (org.geotools.styling.Symbolizer symbolizer : symbolizers) { if (symbolizer instanceof TextSymbolizer) { Font font = ((TextSymbolizer)symbolizer).fonts().get(0); assertTrue(font.getFamily().size() > 0); return font.getFamily().get(0) == null ? null : font.getFamily().get(0).toString(); } } fail("Style should contain a TextSymbolizer"); return null; } /** * Checks whether the "Priority" parameter of a TextSymbolizer is correctly stored and loaded */ @Test public void testPriorityTransformOutAndIn() throws Exception { StyleBuilder sb = new StyleBuilder(); TextSymbolizer ts = sb.createTextSymbolizer(); PropertyName literalPrio = CommonFactoryFinder.getFilterFactory2(null).property( "quantVariable"); ts.setPriority(literalPrio); Style style = sb.createStyle(ts); SLDTransformer st = new SLDTransformer(); String firstExport = st.transform(style); SLDParser sldp = new SLDParser(CommonFactoryFinder.getStyleFactory(null)); sldp.setInput(new StringReader(firstExport)); Style[] firstImport = sldp.readXML(); assertNotNull(firstImport[0]); { Style reimportedStyle = firstImport[0]; TextSymbolizer reimportedTs = (TextSymbolizer) reimportedStyle.featureTypeStyles().get( 0).rules().get(0).symbolizers().get(0); assertNotNull(reimportedTs.getPriority()); assertEquals("quantVariable", reimportedTs.getPriority().toString()); } // Just for the fun do it again... we had a case where this threw NPE { // NPE here?? String secondExport = st.transform(firstImport); SLDParser sldp2 = new SLDParser(CommonFactoryFinder.getStyleFactory(null)); sldp2.setInput(new StringReader(secondExport)); Style[] readXML = sldp2.readXML(); Style reimportedStyle = readXML[0]; TextSymbolizer reimportedTs = (TextSymbolizer) reimportedStyle.featureTypeStyles().get( 0).rules().get(0).symbolizers().get(0); assertNotNull(reimportedTs.getPriority()); assertEquals("quantVariable", reimportedTs.getPriority().toString()); } } /** * SLD Transformer did't save the type of the colormap */ @Test public void testColorMap() throws Exception { SLDTransformer st = new SLDTransformer(); ColorMap cm = sf.createColorMap(); // Test type = values cm.setType(ColorMap.TYPE_VALUES); assertTrue("parsed xml must contain attribbute type with correct value", st.transform(cm).contains("type=\"values\"")); // Test type = intervals cm.setType(ColorMap.TYPE_INTERVALS); assertTrue("parsed xml must contain attribbute type with correct value", st.transform(cm).contains("type=\"intervals\"")); // Test type = ramp cm.setType(ColorMap.TYPE_RAMP); assertEquals("parsed xml must contain attribbute type with correct value", -1, st.transform(cm).indexOf("type=")); } @Test public void testColorMapExtended() throws Exception { SLDTransformer st = new SLDTransformer(); ColorMap cm = sf.createColorMap(); // Test type = values, extended = true cm.setType(ColorMap.TYPE_VALUES); cm.setExtendedColors(true); assertTrue("parsed xml must contain attribbute type with correct value", st.transform(cm).contains("extended=\"true\"")); // Test type = intervals, extended = true cm.setType(ColorMap.TYPE_INTERVALS); cm.setExtendedColors(true); assertTrue("parsed xml must contain attribbute type with correct value", st.transform(cm).contains("extended=\"true\"")); // Test type = ramp, extended = true cm.setType(ColorMap.TYPE_RAMP); cm.setExtendedColors(true); assertTrue("parsed xml must contain attribbute type with correct value", st.transform(cm).contains("extended=\"true\"")); } /** * Checks the output of encoding a default line symbolizer does not include all the default values * @throws Exception */ @Test public void testMinimumLineSymbolizer() throws Exception { StyleBuilder sb = new StyleBuilder(); LineSymbolizer ls = sb.createLineSymbolizer(); String xml = transformer.transform(ls); //System.out.println(xml); Document doc = buildTestDocument(xml); // check LineSymbolizer has the stroke element inside, but stroke does not have children assertXpathEvaluatesTo("1", "count(/sld:LineSymbolizer/*)", doc); assertXpathEvaluatesTo("0", "count(/sld:LineSymbolizer/sld:Stroke/*)", doc); // setup custom line width and color, and explicitly set the opacity to the default value ls.getStroke().setWidth(ff.literal(3)); ls.getStroke().setColor(ff.literal(Color.YELLOW)); ls.getStroke().setOpacity(ff.literal(1)); xml = transformer.transform(ls); // System.out.println(xml); doc = buildTestDocument(xml); // same as above, but this time we expect the width and color to be set assertXpathEvaluatesTo("1", "count(/sld:LineSymbolizer/*)", doc); assertXpathEvaluatesTo("2", "count(/sld:LineSymbolizer/sld:Stroke/*)", doc); assertXpathEvaluatesTo("#FFFF00", "/sld:LineSymbolizer/sld:Stroke/sld:CssParameter[@name='stroke']", doc); assertXpathEvaluatesTo("3", "/sld:LineSymbolizer/sld:Stroke/sld:CssParameter[@name='stroke-width']", doc); } @Test public void testMinimumPolygonSymbolizer() throws Exception { StyleBuilder sb = new StyleBuilder(); PolygonSymbolizer ps = sb.createPolygonSymbolizer(); String xml = transformer.transform(ps); // System.out.println(xml); Document doc = buildTestDocument(xml); // check PolygonSymbolizer has a fill and a stroke, both empty assertXpathEvaluatesTo("2", "count(/sld:PolygonSymbolizer/*)", doc); assertXpathEvaluatesTo("0", "count(/sld:PolygonSymbolizer/sld:Stroke/*)", doc); assertXpathEvaluatesTo("0", "count(/sld:PolygonSymbolizer/sld:Fill/*)", doc); ps.getFill().setColor(ff.literal(Color.BLUE)); xml = transformer.transform(ps); // System.out.println(xml); doc = buildTestDocument(xml); // this time check the fill has the color assertXpathEvaluatesTo("2", "count(/sld:PolygonSymbolizer/*)", doc); assertXpathEvaluatesTo("0", "count(/sld:PolygonSymbolizer/sld:Stroke/*)", doc); assertXpathEvaluatesTo("1", "count(/sld:PolygonSymbolizer/sld:Fill/*)", doc); assertXpathEvaluatesTo("#0000FF", "/sld:PolygonSymbolizer/sld:Fill/sld:CssParameter[@name='fill']", doc); } @Test public void testMinimumPointSymbolizer() throws Exception { StyleBuilder sb = new StyleBuilder(); PointSymbolizer ps = sb.createPointSymbolizer(); String xml = transformer.transform(ps); // System.out.println(xml); Document doc = buildTestDocument(xml); // check PolygonSymbolizer has a fill and a stroke, both empty assertXpathEvaluatesTo("1", "count(/sld:PointSymbolizer/*)", doc); assertXpathEvaluatesTo("1", "count(/sld:PointSymbolizer/sld:Graphic/*)", doc); assertXpathEvaluatesTo("2", "count(/sld:PointSymbolizer/sld:Graphic/sld:Mark/*)", doc); assertXpathExists("/sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Fill", doc); assertXpathExists("/sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Stroke", doc); assertXpathEvaluatesTo("0", "count(/sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Fill/*)", doc); assertXpathEvaluatesTo("0", "count(/sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Stroke/*)", doc); } @Test public void testMinimumRasterSymbolizer() throws Exception { StyleBuilder sb = new StyleBuilder(); RasterSymbolizer rs = sb.getStyleFactory().createRasterSymbolizer(); String xml = transformer.transform(rs); // System.out.println(xml); Document doc = buildTestDocument(xml); // check RasterSymbolizer just has the default geometry value // (which is not a default in SLD, just in our builder) assertXpathEvaluatesTo("1", "count(/sld:RasterSymbolizer)", doc); assertXpathEvaluatesTo("", "/sld:RasterSymbolizer/sld:Geometry/ogc:PropertyName", doc); } @Test public void testMinimumStyle() throws Exception { StyleBuilder sb = new StyleBuilder(); Style s = sb.createStyle(sb.createPointSymbolizer()); String xml = transformer.transform(s); // System.out.println(xml); Document doc = buildTestDocument(xml); // check RasterSymbolizer just has the default geometry value // (which is not a default in SLD, just in our builder) assertXpathEvaluatesTo("2", "count(/sld:UserStyle/sld:FeatureTypeStyle/*)", doc); assertXpathEvaluatesTo("1", "count(/sld:UserStyle/sld:FeatureTypeStyle/sld:Name)", doc); assertXpathEvaluatesTo("1", "count(/sld:UserStyle/sld:FeatureTypeStyle/sld:Rule)", doc); assertXpathEvaluatesTo("1", "count(/sld:UserStyle/sld:FeatureTypeStyle/sld:Rule/*)", doc); assertXpathEvaluatesTo("1", "count(/sld:UserStyle/sld:FeatureTypeStyle/sld:Rule/sld:PointSymbolizer)", doc); } @Test public void testDefaultStyle() throws Exception { StyleBuilder sb = new StyleBuilder(); Style s = sb.createStyle(sb.createPointSymbolizer()); s.setDefault(true); StyleFactory sf = sb.getStyleFactory(); StyledLayerDescriptor sld = sf.createStyledLayerDescriptor(); NamedLayer layer = sf.createNamedLayer(); layer.setName("layerName"); layer.addStyle(s); sld.addStyledLayer(layer); String xml = transformer.transform(sld); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("1", "/sld:StyledLayerDescriptor/sld:NamedLayer/sld:UserStyle/sld:IsDefault", doc); } @Test public void testLocalizedTitle() throws Exception { RuleImpl rule = new RuleImpl(); GrowableInternationalString intString = new GrowableInternationalString("title") { @Override public String toString() { return super.toString(null); } }; intString.add(Locale.ITALIAN, "titolo"); intString.add(Locale.FRENCH, "titre"); intString.add(Locale.CANADA_FRENCH, "titre"); rule.getDescription().setTitle(intString); String xml = transformer.transform(rule); assertTrue(xml.contains("<sld:Title>title")); assertTrue(xml.contains("<sld:Localized lang=\""+Locale.ITALIAN.toString()+"\">titolo</sld:Localized>")); assertTrue(xml.contains("<sld:Localized lang=\""+Locale.FRENCH.toString()+"\">titre</sld:Localized>")); assertTrue(xml.contains("<sld:Localized lang=\""+Locale.CANADA_FRENCH.toString()+"\">titre</sld:Localized>")); } public void testLocalizedAbstract() throws Exception { RuleImpl rule = new RuleImpl(); GrowableInternationalString intString = new GrowableInternationalString("title"); intString.add(Locale.ITALIAN, "titolo"); intString.add(Locale.FRENCH, "titre"); intString.add(Locale.CANADA_FRENCH, "titre"); rule.getDescription().setAbstract(intString); String xml = transformer.transform(rule); assertTrue(xml.contains("<sld:Abstract>title")); assertTrue(xml.contains("<sld:Localized lang=\""+Locale.ITALIAN.toString()+"\">titolo</sld:Localized>")); assertTrue(xml.contains("<sld:Localized lang=\""+Locale.FRENCH.toString()+"\">titre</sld:Localized>")); assertTrue(xml.contains("<sld:Localized lang=\""+Locale.CANADA_FRENCH.toString()+"\">titre</sld:Localized>")); } @Test public void testEncodeFunction() throws Exception { StyleBuilder sb = new StyleBuilder(); PointSymbolizer ps = sb.createPointSymbolizer(); ps.getGraphic().setSize(sb.getFilterFactory().function("random")); Style s = sb.createStyle(ps); s.setDefault(true); String xml = transformer.transform(s); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("random", "/sld:UserStyle/sld:FeatureTypeStyle/sld:Rule/sld:PointSymbolizer/sld:Graphic/sld:Size/ogc:Function/@name", doc); } /** * TextSymbolizer2 specific properties saved and laoded again must fit */ @Test public void textTextSymbolizer2_InAndOut() throws TransformerException, SAXException, IOException, XpathException { StyleBuilder sb = new StyleBuilder(); TextSymbolizer2 ts2 = (TextSymbolizer2)sf.createTextSymbolizer(); // Create a Graphic with two recognizable values GraphicImpl gr = new GraphicImpl(ff); gr.setOpacity(ff.literal(0.77)); gr.setSize(ff.literal(77)); ts2.setGraphic(gr); Literal snippet = ff.literal("no idea what a snipet is good for"); ts2.setSnippet(snippet); Literal fD = ff.literal("some description"); ts2.setFeatureDescription(fD); OtherTextImpl otherText = new OtherTextImpl(); otherText.setTarget("otherTextTarget"); otherText.setText(ff.literal("otherTextText")); ts2.setOtherText(otherText); // A first check of the XML Document doc = buildTestDocument(transformer.transform(ts2)); assertXpathEvaluatesTo("1", "count(/sld:TextSymbolizer/sld:Graphic)", doc); assertXpathEvaluatesTo("1", "count(/sld:TextSymbolizer/sld:Snippet)", doc); assertXpathEvaluatesTo("1", "count(/sld:TextSymbolizer/sld:OtherText)", doc); assertXpathEvaluatesTo("1", "count(/sld:TextSymbolizer/sld:FeatureDescription)", doc); // Transform and reimport and compare String xml = transformer.transform(sb.createStyle(ts2)); SLDParser sldParser = new SLDParser(sf); sldParser.setInput(new StringReader(xml)); Style importedStyle = sldParser.readXML()[0]; TextSymbolizer2 copy = (TextSymbolizer2)importedStyle.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); // compare it assertEquals("Graphic of TextSymbolizer2 has not been correctly ex- and reimported", gr.getOpacity(), copy .getGraphic().getOpacity()); assertEquals("Graphic of TextSymbolizer2 has not been correctly ex- and reimported", gr.getSize(), copy .getGraphic().getSize()); assertEquals("Snippet of TextSymbolizer2 has not been correctly ex- and reimported", snippet, copy .getSnippet()); assertEquals("FeatureDescription of TextSymbolizer2 has not been correctly ex- and reimported", fD, copy .getFeatureDescription()); assertEquals("OtherText of TextSymbolizer2 has not been correctly ex- and reimported", otherText.getTarget(), copy .getOtherText().getTarget()); assertEquals("OtherText of TextSymbolizer2 has not been correctly ex- and reimported", otherText.getText(), copy .getOtherText().getText()); } /** * Test that perpendicularOffset for LineSymbolizer is correctly exported and reimported * * @throws TransformerException * @throws SAXException * @throws IOException * @throws XpathException */ @Test public void testLineSymbolizerWithPerpendicularOffset() throws TransformerException, SAXException, IOException, XpathException { StyleBuilder sb = new StyleBuilder(); LineSymbolizer ls = sb.createLineSymbolizer(); ls.setPerpendicularOffset(ff.literal(0.77)); //check XML Document doc = buildTestDocument(transformer.transform(ls)); assertXpathEvaluatesTo("1", "count(/sld:LineSymbolizer/sld:PerpendicularOffset)", doc); // Transform, reimport and compare String xml = transformer.transform(sb.createStyle(ls)); SLDParser sldParser = new SLDParser(sf); sldParser.setInput(new StringReader(xml)); Style importedStyle = sldParser.readXML()[0]; LineSymbolizer copy = (LineSymbolizer) importedStyle.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); // compare assertEquals("Perpendicular offset of LineSymbolizer has not been correctly ex- and reimported",ls.getPerpendicularOffset(),copy.getPerpendicularOffset()); } /** * Make sure the FeatureTypeStyle Transformation element survives a SLD to Style to SLD round * trip. * * @throws Exception if an error occurs */ @Test public void testFeatureTypeStyleTransformation() throws Exception { String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<sld:UserStyle xmlns=\"http://www.opengis.net/sld\" " + " xmlns:sld=\"http://www.opengis.net/sld\" " + " xmlns:ogc=\"http://www.opengis.net/ogc\" " + " xmlns:gml=\"http://www.opengis.net/gml\">" + " <sld:Name>Default Styler</sld:Name>" + " <sld:Title/>" + " <sld:FeatureTypeStyle>" + " <sld:Name>Buffer</sld:Name>" + " <sld:Transformation>" + " <ogc:Function name=\"buffer\">" + " <ogc:PropertyName>the_geom</ogc:PropertyName>" + " <ogc:Literal>500</ogc:Literal>" + " </ogc:Function>" + " </sld:Transformation>" + " <sld:Rule>" + " <sld:LineSymbolizer>" + " <sld:Stroke>" + " <sld:CssParameter name=\"stroke\">#312624</sld:CssParameter>" + " <sld:CssParameter name=\"stroke-width\">0.1</sld:CssParameter>" + " </sld:Stroke>" + " </sld:LineSymbolizer>" + " <sld:PolygonSymbolizer>" + " <sld:Fill>" + " <sld:CssParameter name=\"fill\">#f5deb3</sld:CssParameter>" + " </sld:Fill>" + " </sld:PolygonSymbolizer>" + " </sld:Rule>" + " </sld:FeatureTypeStyle>" + "</sld:UserStyle>"; StringReader reader = new StringReader(xml); SLDParser sldParser = new SLDParser(sf, reader); Style[] styles = sldParser.readXML(); assertNotNull("parsed xml", styles); assertTrue("parsed xml into style", styles.length > 0); SLDTransformer styleTransform = new SLDTransformer(); styleTransform.setIndentation(2); StringWriter writer = new StringWriter(); styleTransform.transform(styles[0], writer); String actualXml = writer.toString(); assertTrue(actualXml.contains("<sld:Transformation>")); assertTrue(actualXml.contains("<ogc:Function name=\"buffer\">")); assertTrue(actualXml.contains("<ogc:PropertyName>the_geom</ogc:PropertyName>")); assertTrue(actualXml.contains("<ogc:Literal>500</ogc:Literal>")); assertTrue(actualXml.contains("</ogc:Function>")); assertTrue(actualXml.contains("</sld:Transformation>")); } @Test public void testDynamicSymbolizer() throws Exception { StyleBuilder sb = new StyleBuilder(); String chartURI = "http://chart?cht=p&chd=t:${100 * MALE / PERSONS},${100 * FEMALE / PERSONS}&chf=bg,s,FFFFFF00"; ExternalGraphic eg = sb.createExternalGraphic(chartURI, "image/png"); PointSymbolizer ps = sb.createPointSymbolizer(sb.createGraphic(eg, null, null)); Style s = sb.createStyle(ps); s.setDefault(true); String xml = transformer.transform(s); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo(chartURI, "/sld:UserStyle/sld:FeatureTypeStyle/sld:Rule/sld:PointSymbolizer/sld:Graphic/sld:ExternalGraphic/sld:OnlineResource/@xlink:href", doc); SLDParser parser = new SLDParser(sf); parser.setInput(new StringReader(xml)); Style importedStyle = parser.readXML()[0]; PointSymbolizer psCopy = (PointSymbolizer) importedStyle.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); ExternalGraphic egCopy = (ExternalGraphic) psCopy.getGraphic().graphicalSymbols().get(0); assertEquals(chartURI, egCopy.getLocation().toExternalForm()); } @Test public void testLocalUomPoint() throws Exception { StyleBuilder sb = new StyleBuilder(); PointSymbolizer ps = sb.createPointSymbolizer(); ps.getGraphic().setSize(ff.literal("1m")); StyledLayerDescriptor sld = buildSLDAroundSymbolizer(ps); String xml = transformer.transform(sld); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("1m", "//sld:Graphic/sld:Size", doc); } @Test public void testLocalUomLine() throws Exception { StyleBuilder sb = new StyleBuilder(); LineSymbolizer ls = sb.createLineSymbolizer(); ls.getStroke().setWidth(ff.literal("1m")); StyledLayerDescriptor sld = buildSLDAroundSymbolizer(ls); String xml = transformer.transform(sld); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("1m", "//sld:LineSymbolizer/sld:Stroke/sld:CssParameter[@name='stroke-width']", doc); } @Test public void testLocalUomText() throws Exception { StyleBuilder sb = new StyleBuilder(); TextSymbolizer ts = sb.createTextSymbolizer(); ts.getFont().setSize(ff.literal("1m")); StyledLayerDescriptor sld = buildSLDAroundSymbolizer(ts); String xml = transformer.transform(sld); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("1m", "//sld:TextSymbolizer/sld:Font/sld:CssParameter[@name='font-size']", doc); } @Test public void testLabelMixedContent() throws Exception { StyleBuilder sb = new StyleBuilder(); TextSymbolizer ts = sb.createTextSymbolizer(); ts.setLabel(ff.function("strConcat", ff.literal("abc"), ff.property("myProperty"))); StyledLayerDescriptor sld = buildSLDAroundSymbolizer(ts); String xml = transformer.transform(sld); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("abc", "//sld:Label/text()[1]", doc); assertXpathEvaluatesTo("ogc:PropertyName", "name(//sld:Label/*[1])", doc); assertXpathEvaluatesTo("myProperty", "//sld:Label/*[1]/text()", doc); } @Test public void testLabelCDataStart() throws Exception { StyleBuilder sb = new StyleBuilder(); TextSymbolizer ts = sb.createTextSymbolizer(); ts.setLabel(ff.function("strConcat", ff.literal(" abc"), ff.property("myProperty"))); StyledLayerDescriptor sld = buildSLDAroundSymbolizer(ts); String xml = transformer.transform(sld); assertTrue(xml.contains("<sld:Label><![CDATA[ abc]]>" + NEWLINE + " <ogc:PropertyName>myProperty</ogc:PropertyName>" + NEWLINE + " </sld:Label>")); } @Test public void testLabelCDataEnd() throws Exception { StyleBuilder sb = new StyleBuilder(); TextSymbolizer ts = sb.createTextSymbolizer(); ts.setLabel(ff.function("strConcat", ff.literal("abc "), ff.property("myProperty"))); StyledLayerDescriptor sld = buildSLDAroundSymbolizer(ts); String xml = transformer.transform(sld); assertTrue(xml.contains("<sld:Label><![CDATA[abc ]]>" + NEWLINE + " <ogc:PropertyName>myProperty</ogc:PropertyName>" + NEWLINE + " </sld:Label>")); } @Test public void testLabelCDataMid() throws Exception { StyleBuilder sb = new StyleBuilder(); TextSymbolizer ts = sb.createTextSymbolizer(); ts.setLabel(ff.function("strConcat", ff.literal("a bc"), ff.property("myProperty"))); StyledLayerDescriptor sld = buildSLDAroundSymbolizer(ts); String xml = transformer.transform(sld); assertTrue(xml.contains("<sld:Label><![CDATA[a bc]]>" + NEWLINE + " <ogc:PropertyName>myProperty</ogc:PropertyName>" + NEWLINE + " </sld:Label>")); } @Test public void testLabelNested() throws Exception { StyleBuilder sb = new StyleBuilder(); TextSymbolizer ts = sb.createTextSymbolizer(); ts.setLabel(ff.function("strConcat", ff.literal("abc "), ff.function("strConcat", ff.property("myProperty"), ff.literal(" def")))); StyledLayerDescriptor sld = buildSLDAroundSymbolizer(ts); String xml = transformer.transform(sld); // System.out.println(xml); // Java own xpath processor does not seem to fully support normalize-space() so we resort to string comparisons here assertTrue(xml.contains("<sld:Label><![CDATA[abc ]]>" + NEWLINE + " <ogc:PropertyName>myProperty</ogc:PropertyName><![CDATA[ def]]></sld:Label>")); } /** * Test the transformation of an WellKnownName element that contains an expression. * * @throws Exception */ @Test public void testWellKnownNameWithExpression() throws Exception { String originalStyleXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<sld:StyledLayerDescriptor xmlns=\"http://www.opengis.net/sld\"" + " xmlns:sld=\"http://www.opengis.net/sld\"" + " xmlns:ogc=\"http://www.opengis.net/ogc\"" + " xmlns:gml=\"http://www.opengis.net/gml\" version=\"1.0.0\">" + " <sld:NamedLayer>" + " <sld:Name>test</sld:Name>" + " <sld:UserStyle>" + " <sld:Name>test</sld:Name>" + " <sld:FeatureTypeStyle>" + " <sld:Name>name</sld:Name>" + " <sld:Rule>" + " <sld:PointSymbolizer>" + " <sld:Graphic>" + " <sld:Mark>" + " <sld:WellKnownName>" + " <ogc:Function name=\"strConcat\">" + " <ogc:Literal>mark-</ogc:Literal>" + " <ogc:PropertyName>MARK_NAME</ogc:PropertyName>" + " </ogc:Function>" + " </sld:WellKnownName>" + " </sld:Mark>" + " </sld:Graphic>" + " </sld:PointSymbolizer>" + " </sld:Rule>" + " </sld:FeatureTypeStyle>" + " </sld:UserStyle>" + " </sld:NamedLayer>" + "</sld:StyledLayerDescriptor>"; Style originalStyle = validateWellKnownNameWithExpressionStyle(originalStyleXml); SLDTransformer styleTransform = new SLDTransformer(); styleTransform.setIndentation(2); StringWriter writerWriter = new StringWriter(); styleTransform.transform(originalStyle, writerWriter); String transformedStyleXml = writerWriter.toString(); validateWellKnownNameWithExpressionStyle(transformedStyleXml); } /** * Test the transformation of a stroke-dasharray element that contains expressions. * * @throws Exception */ @Test public void testStrokeDasharrayWithExpressions() throws Exception { String originalStyleXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<sld:StyledLayerDescriptor xmlns=\"http://www.opengis.net/sld\"" + " xmlns:sld=\"http://www.opengis.net/sld\"" + " xmlns:ogc=\"http://www.opengis.net/ogc\"" + " xmlns:gml=\"http://www.opengis.net/gml\" version=\"1.0.0\">" + " <sld:NamedLayer>" + " <sld:Name>test</sld:Name>" + " <sld:UserStyle>" + " <sld:Name>test</sld:Name>" + " <sld:FeatureTypeStyle>" + " <sld:Name>name</sld:Name>" + " <sld:Rule>" + " <LineSymbolizer>" + " <Stroke>" + " <CssParameter name=\"stroke\">#0000FF</CssParameter>" + " <CssParameter name=\"stroke-dasharray\">" + " <PropertyName>stroke1</PropertyName>" + " 1.0" + " <PropertyName>stroke2</PropertyName>" + " <![CDATA[2.0]]>" + " </CssParameter>" + " </Stroke>" + " </LineSymbolizer>" + " </sld:Rule>" + " </sld:FeatureTypeStyle>" + " </sld:UserStyle>" + " </sld:NamedLayer>" + "</sld:StyledLayerDescriptor>"; SLDTransformer styleTransform = new SLDTransformer(); styleTransform.setIndentation(2); StringWriter writerWriter = new StringWriter(); styleTransform.transform(parseStyles(originalStyleXml), writerWriter); String transformedStyleXml = writerWriter.toString(); Style style = parseStyles(transformedStyleXml)[0]; assertNotNull("style is null", style); assertNotNull("feature type styles are null", style.featureTypeStyles()); assertTrue("more or less that one feature type style is available", style.featureTypeStyles().size() == 1); assertNotNull("rules are null", style.featureTypeStyles().get(0).rules()); assertTrue("more or less that one rule is available", style.featureTypeStyles().get(0).rules().size() == 1); Rule rule = style.featureTypeStyles().get(0).rules().get(0); assertNotNull("rule is null", rule); List<? extends Symbolizer> symbolizers = rule.symbolizers(); assertNotNull("symbolizers are null", symbolizers); assertTrue("more or less that one symbolizer is available", symbolizers.size() == 1); LineSymbolizer lineSymbolizer = (LineSymbolizer) symbolizers.get(0); assertNotNull("line symbolizer is null", lineSymbolizer); Stroke stroke = lineSymbolizer.getStroke(); assertNotNull("stroke is null", stroke); assertNotNull("stroke dasharray is null", stroke.dashArray()); List<Expression> expressions = stroke.dashArray(); assertTrue("more or less expressions available", expressions.size() == 4); assertTrue("not expected expression", expressions.get(0).equals(ff.property("stroke1"))); assertTrue("not expected expression", expressions.get(1).equals(ff.literal(1.0))); assertTrue("not expected expression", expressions.get(2).equals(ff.property("stroke2"))); assertTrue("not expected expression", expressions.get(3).equals(ff.literal(2.0))); } /** * Test the transformation of a stroke-dasharray element that contains only literal expressions. * * @throws Exception */ @Test public void testStrokeDasharrayWithOnlyLiteralExpressions() throws Exception { String originalStyleXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<sld:StyledLayerDescriptor xmlns=\"http://www.opengis.net/sld\"" + " xmlns:sld=\"http://www.opengis.net/sld\"" + " xmlns:ogc=\"http://www.opengis.net/ogc\"" + " xmlns:gml=\"http://www.opengis.net/gml\" version=\"1.0.0\">" + " <sld:NamedLayer>" + " <sld:Name>test</sld:Name>" + " <sld:UserStyle>" + " <sld:Name>test</sld:Name>" + " <sld:FeatureTypeStyle>" + " <sld:Name>name</sld:Name>" + " <sld:Rule>" + " <LineSymbolizer>" + " <Stroke>" + " <CssParameter name=\"stroke\">#0000FF</CssParameter>" + " <CssParameter name=\"stroke-dasharray\">" + " 10.0 5.0 20.0 15.0" + " </CssParameter>" + " </Stroke>" + " </LineSymbolizer>" + " </sld:Rule>" + " </sld:FeatureTypeStyle>" + " </sld:UserStyle>" + " </sld:NamedLayer>" + "</sld:StyledLayerDescriptor>"; SLDTransformer styleTransform = new SLDTransformer(); styleTransform.setIndentation(2); StringWriter writerWriter = new StringWriter(); styleTransform.transform(parseStyles(originalStyleXml), writerWriter); String transformedStyleXml = writerWriter.toString(); assertTrue(transformedStyleXml.contains("<sld:CssParameter name=\"stroke-dasharray\">10.0 5.0 20.0 15.0</sld:CssParameter>")); } private Style[] parseStyles(String styleXml) { StringReader stringReader = new StringReader(styleXml); SLDParser sldParser = new SLDParser(sf, stringReader); return sldParser.readXML(); } @Test public void testAnchorPointInGraphic() throws Exception { StyleBuilder sb = new StyleBuilder(); Graphic graphic; graphic = sb.createGraphic(); Displacement disp = sb.createDisplacement(10, 10); AnchorPoint ap = sb.createAnchorPoint(1, 0.3); graphic.setDisplacement(disp); graphic.setAnchorPoint(ap); SLDTransformer st = new SLDTransformer(); String xml = st.transform(graphic); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("10.0", "//sld:Graphic/sld:Displacement/sld:DisplacementX", doc); assertXpathEvaluatesTo("10.0", "//sld:Graphic/sld:Displacement/sld:DisplacementY", doc); assertXpathEvaluatesTo("1.0", "//sld:Graphic/sld:AnchorPoint/sld:AnchorPointX", doc); assertXpathEvaluatesTo("0.3", "//sld:Graphic/sld:AnchorPoint/sld:AnchorPointY", doc); } @Test public void testFeatureTypeStyleOptions() throws Exception { StyleBuilder sb = new StyleBuilder(); Style style = sb.createStyle(sb.createPolygonSymbolizer()); FeatureTypeStyle fts = style.featureTypeStyles().get(0); fts.getOptions().put("key", "value"); SLDTransformer st = new SLDTransformer(); String xml = st.transform(style); //System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("1", "count(//sld:FeatureTypeStyle/sld:VendorOption)", doc); assertXpathEvaluatesTo("value", "//sld:FeatureTypeStyle/sld:VendorOption[@name='key']", doc); } private Style validateWellKnownNameWithExpressionStyle(String xmlStyle) { StringReader stringReader = new StringReader(xmlStyle); SLDParser sldParser = new SLDParser(sf, stringReader); Style[] parsedStyles = sldParser.readXML(); assertNotNull("parsing xml style returns null", parsedStyles); assertTrue("more or less that one style is available", parsedStyles.length == 1); Style style = parsedStyles[0]; assertNotNull("style is null", style); assertNotNull("feature type styles are null", style.featureTypeStyles()); assertTrue("more or less that one feature type style is available", style.featureTypeStyles().size() == 1); assertNotNull("rules are null", style.featureTypeStyles().get(0).rules()); assertTrue("more or less that one rule is available", style.featureTypeStyles().get(0).rules().size() == 1); Rule rule = style.featureTypeStyles().get(0).rules().get(0); assertNotNull("rule is null", rule); List<? extends Symbolizer> symbolizers = rule.symbolizers(); assertNotNull("symbolizers are null", symbolizers); assertTrue("more or less that one symbolizer is available", symbolizers.size() == 1); PointSymbolizer pointSymbolizer = (PointSymbolizer) symbolizers.get(0); assertNotNull("point symbolizer is null", pointSymbolizer); Graphic graphic = pointSymbolizer.getGraphic(); assertNotNull("graphic is null", graphic); assertNotNull("graphic symbols are null", graphic.graphicalSymbols()); assertTrue("more or less that one graphic symbol is available", graphic.graphicalSymbols().size() == 1); Mark mark = (Mark) graphic.graphicalSymbols().get(0); assertNotNull("mark is null", mark); assertNotNull("mark wellKnownName is null", mark.getWellKnownName()); assertTrue("wellKnownName is not a function", mark.getWellKnownName() instanceof Function); Function function = (Function) mark.getWellKnownName(); assertTrue("wellKnownName function is not strConcat", function.getName().equals("strConcat")); assertTrue("wellKnownName function have a wrong number of parameters", function.getParameters().size() == 2); Expression firstParameter = function.getParameters().get(0); assertNotNull("first parameter is null", firstParameter); assertTrue("first parameter is not a literal", firstParameter instanceof Literal); Literal literal = (Literal) firstParameter; assertTrue("literal value is different of 'mark-'", literal.getValue().equals("mark-")); Expression secondParameter = function.getParameters().get(1); assertNotNull("second parameter is null", secondParameter); assertTrue("second parameter is", secondParameter instanceof PropertyName); PropertyName propertyName = (PropertyName) secondParameter; assertTrue("property name is different of 'MARK_NAME'", propertyName.getPropertyName().equals("MARK_NAME")); return style; } @Test public void testContrastEnhancement() throws Exception { StyleBuilder sb = new StyleBuilder(); ContrastEnhancement ce = new ContrastEnhancementImpl(); NormalizeContrastMethodStrategy normal = new NormalizeContrastMethodStrategy(); normal.setAlgorithm(ff.literal("ClipToMinimumMaximum")); normal.addParameter("p1", ff.literal(false)); normal.addParameter("p2", ff.literal(23.5d)); ce.setMethod(normal); SLDTransformer st = new SLDTransformer(); String xml = st.transform(ce); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathExists( "//sld:ContrastEnhancement/sld:Normalize", doc); assertXpathEvaluatesTo("false", "//sld:ContrastEnhancement/sld:Normalize/sld:VendorOption[@name='p1']", doc); assertXpathEvaluatesTo("ClipToMinimumMaximum", "//sld:ContrastEnhancement/sld:Normalize/sld:VendorOption[@name='algorithm']", doc); HistogramContrastMethodStrategy hist = new HistogramContrastMethodStrategy(); ce.setMethod(hist); xml = st.transform(ce); String skeleton = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><sld:ContrastEnhancement xmlns=\"http://www.opengis.net/sld\" xmlns:sld=\"http://www.opengis.net/sld\" xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:gml=\"http://www.opengis.net/gml\"><sld:Histogram/></sld:ContrastEnhancement>"; //System.out.println(xml); Diff myDiff = new Diff(skeleton, xml); assertTrue("test XML matches control skeleton XML " + myDiff, myDiff.similar()); //assertXpathNotExists("//sld:ContrastEnhancement/sld:Histogram/sld:Algorithm",doc); LogarithmicContrastMethodStrategy log = new LogarithmicContrastMethodStrategy(); ce.setMethod(log); xml = st.transform(ce); //System.out.println(xml); skeleton = skeleton.replace("Histogram", "Logarithmic"); myDiff = new Diff(skeleton, xml); assertTrue("test XML matches control skeleton XML " + myDiff, myDiff.similar()); ExponentialContrastMethodStrategy exp = new ExponentialContrastMethodStrategy(); ce.setMethod(exp); xml = st.transform(ce); //System.out.println(xml); skeleton = skeleton.replace("Logarithmic", "Exponential"); myDiff = new Diff(skeleton, xml); assertTrue("test XML matches control skeleton XML " + myDiff, myDiff.similar()); } @Test public void testMultipleFontsUniform() throws Exception { StyleBuilder sb = new StyleBuilder(); Font f1 = sb.createFont("Arial", 10); Font f2 = sb.createFont("Comic Sans MS", 10); TextSymbolizer ts = sb.createTextSymbolizer(Color.BLACK, new Font[] {f1, f2}, "label"); SLDTransformer st = new SLDTransformer(); String xml = st.transform(ts); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("1", "count(//sld:TextSymbolizer/sld:Font)", doc); assertXpathEvaluatesTo("2", "count(//sld:TextSymbolizer/sld:Font/sld:CssParameter[@name=\"font-family\"])", doc); assertXpathEvaluatesTo("Arial", "//sld:TextSymbolizer/sld:Font/sld:CssParameter[@name=\"font-family\"][1]", doc); assertXpathEvaluatesTo("Comic Sans MS", "//sld:TextSymbolizer/sld:Font/sld:CssParameter[@name=\"font-family\"][2]", doc); assertXpathEvaluatesTo("10.0", "//sld:TextSymbolizer/sld:Font/sld:CssParameter[@name=\"font-size\"]", doc); } @Test public void testMultipleFontsNotUniform() throws Exception { StyleBuilder sb = new StyleBuilder(); Font f1 = sb.createFont("Arial", 10); Font f2 = sb.createFont("Comic Sans MS", 12); TextSymbolizer ts = sb.createTextSymbolizer(Color.BLACK, new Font[] {f1, f2}, "label"); SLDTransformer st = new SLDTransformer(); String xml = st.transform(ts); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("2", "count(//sld:TextSymbolizer/sld:Font)", doc); // <sld:CssParameter name="font-family">Comic Sans MS</sld:CssParameter> assertXpathEvaluatesTo("1", "count(//sld:TextSymbolizer/sld:Font[1]/sld:CssParameter[@name=\"font-family\"])", doc); assertXpathEvaluatesTo("Arial", "//sld:TextSymbolizer/sld:Font[1]/sld:CssParameter[@name=\"font-family\"][1]", doc); assertXpathEvaluatesTo("1", "count(//sld:TextSymbolizer/sld:Font[2]/sld:CssParameter[@name=\"font-family\"])", doc); assertXpathEvaluatesTo("Comic Sans MS", "//sld:TextSymbolizer/sld:Font[2]/sld:CssParameter[@name=\"font-family\"]", doc); assertXpathEvaluatesTo("10.0", "//sld:TextSymbolizer/sld:Font/sld:CssParameter[@name=\"font-size\"]", doc); } @Test public void testLineOffsetExpression() throws Exception { StyleBuilder sb = new StyleBuilder(); LineSymbolizer ls = sb.createLineSymbolizer(Color.RED); ls.setPerpendicularOffset(ff.multiply(ff.property("a"), ff.literal(2))); SLDTransformer st = new SLDTransformer(); st.setIndentation(2); String xml = st.transform(ls); // System.out.println(xml); Document doc = buildTestDocument(xml); assertXpathEvaluatesTo("a", "//sld:LineSymbolizer/sld:PerpendicularOffset/ogc:Mul/ogc:PropertyName", doc); assertXpathEvaluatesTo("2", "//sld:LineSymbolizer/sld:PerpendicularOffset/ogc:Mul/ogc:Literal", doc); } /** * See https://osgeo-org.atlassian.net/browse/GEOT-5613 * @throws Exception */ @Test public void testDefaults() throws Exception { StyleBuilder sb = new StyleBuilder(); LineSymbolizer ls = sb.createLineSymbolizer(Color.BLACK); SLDTransformer st = new SLDTransformer(); st.setExportDefaultValues(true); st.setIndentation(2); String xml = st.transform(ls); Document doc = buildTestDocument(xml); assertXpathExists("//sld:LineSymbolizer/sld:Stroke", doc); assertXpathEvaluatesTo("#000000", "//sld:LineSymbolizer/sld:Stroke/sld:CssParameter[@name='stroke']", doc); st.setExportDefaultValues(false); xml = st.transform(ls); //System.out.println(xml); doc = buildTestDocument(xml); assertXpathNotExists("//sld:LineSymbolizer/sld:Stroke/sld:CssParameter[@name='stroke']", doc); st.setExportDefaultValues(true); PolygonSymbolizer ps = sb.createPolygonSymbolizer(Color.GRAY, Color.black,1.0); xml = st.transform(ps); doc = buildTestDocument(xml); assertXpathExists("//sld:PolygonSymbolizer/sld:Stroke", doc); assertXpathEvaluatesTo("#000000", "//sld:PolygonSymbolizer/sld:Stroke/sld:CssParameter[@name='stroke']", doc); assertXpathExists("//sld:PolygonSymbolizer/sld:Fill", doc); assertXpathEvaluatesTo("#808080", "//sld:PolygonSymbolizer/sld:Fill/sld:CssParameter[@name='fill']", doc); st.setExportDefaultValues(false); xml = st.transform(ps); //System.out.println(xml); doc = buildTestDocument(xml); assertXpathExists("//sld:PolygonSymbolizer/sld:Stroke", doc); assertXpathNotExists("//sld:PolygonSymbolizer/sld:Stroke/sld:CssParameter[@name='stroke']", doc); assertXpathExists("//sld:PolygonSymbolizer/sld:Fill", doc); assertXpathNotExists("//sld:PolygonSymbolizer/sld:Fill/sld:CssParameter[@name='fill']", doc); st.setExportDefaultValues(true); PointSymbolizer pos = sb.createPointSymbolizer(sb.createGraphic(null, sb.createMark("square"), null)); xml = st.transform(pos); //System.out.println(xml); doc = buildTestDocument(xml); assertXpathExists("//sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Stroke", doc); assertXpathEvaluatesTo("#000000", "//sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Stroke/sld:CssParameter[@name='stroke']", doc); assertXpathExists("//sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Fill", doc); assertXpathEvaluatesTo("#808080", "//sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Fill/sld:CssParameter[@name='fill']", doc); assertXpathExists("//sld:WellKnownName", doc); st.setExportDefaultValues(false); xml = st.transform(pos); //System.out.println(xml); doc = buildTestDocument(xml); assertXpathExists("//sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Stroke", doc); assertXpathNotExists("//sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Stroke/sld:CssParameter[@name='stroke']", doc); assertXpathExists("//sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Fill", doc); assertXpathNotExists("//sld:PointSymbolizer/sld:Graphic/sld:Mark/sld:Fill/sld:CssParameter[@name='fill']", doc); assertXpathNotExists("//sld:WellKnownName", doc); } private StyledLayerDescriptor buildSLDAroundSymbolizer(org.geotools.styling.Symbolizer symbolizer) { StyleBuilder sb = new StyleBuilder(); Style s = sb.createStyle(symbolizer); s.setDefault(true); StyleFactory sf = sb.getStyleFactory(); StyledLayerDescriptor sld = sf.createStyledLayerDescriptor(); NamedLayer layer = sf.createNamedLayer(); layer.setName("layerName"); layer.addStyle(s); sld.addStyledLayer(layer); return sld; } }