diff --git a/src/wms/src/main/java/org/geoserver/wms/svg/StreamingSVGMap.java b/src/wms/src/main/java/org/geoserver/wms/svg/StreamingSVGMap.java index ac9e5b011e0..28ec695be57 100644 --- a/src/wms/src/main/java/org/geoserver/wms/svg/StreamingSVGMap.java +++ b/src/wms/src/main/java/org/geoserver/wms/svg/StreamingSVGMap.java @@ -5,6 +5,8 @@ */ package org.geoserver.wms.svg; +import static org.apache.commons.text.StringEscapeUtils.escapeXml10; + import java.io.IOException; import java.io.OutputStream; import java.util.List; @@ -138,10 +140,10 @@ private void writeLayers() throws IOException { String styleName = layer.getStyle().getName(); - writer.write("\n"); diff --git a/src/wms/src/test/java/org/geoserver/wms/svg/SVGMapProducerTest.java b/src/wms/src/test/java/org/geoserver/wms/svg/SVGMapProducerTest.java index 6d341ab7364..21191605439 100644 --- a/src/wms/src/test/java/org/geoserver/wms/svg/SVGMapProducerTest.java +++ b/src/wms/src/test/java/org/geoserver/wms/svg/SVGMapProducerTest.java @@ -6,11 +6,7 @@ package org.geoserver.wms.svg; import java.awt.Color; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; -import java.io.StringReader; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; import org.geoserver.wms.WMSMapContent; @@ -31,13 +27,31 @@ import org.locationtech.jts.geom.LineString; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; -import org.w3c.dom.Document; -import org.xml.sax.InputSource; public class SVGMapProducerTest extends WMSTestSupport { - @Test - public void testHeterogeneousGeometry() throws Exception { + private static String EXPECTED_DOC = + "" + + "" + + " " + + " " + + " " + + " " + + " " + + ""; + + private void doTestSVGMapProducer(String layer, String style, String expectedDoc) + throws Exception { GeometryFactory gf = new GeometryFactory(); Point point = gf.createPoint(new Coordinate(10, 10)); LineString line = @@ -56,7 +70,7 @@ public void testHeterogeneousGeometry() throws Exception { null); SimpleFeatureTypeBuilder ftb = new SimpleFeatureTypeBuilder(); - ftb.setName("test"); + ftb.setName(layer); ftb.add("geom", Geometry.class); SimpleFeatureType type = ftb.buildFeatureType(); @@ -68,7 +82,7 @@ public void testHeterogeneousGeometry() throws Exception { ds.createSchema(type); ds.addFeatures(f1, f2, f3); - FeatureSource fs = ds.getFeatureSource("test"); + FeatureSource fs = ds.getFeatureSource(layer); final WMSMapContent map = new WMSMapContent(); map.getViewport().setBounds(new ReferencedEnvelope(-250, 250, -250, 250, null)); @@ -78,6 +92,7 @@ public void testHeterogeneousGeometry() throws Exception { map.setTransparent(false); Style basicStyle = getCatalog().getStyleByName("Default").getStyle(); + basicStyle.setName(style); map.addLayer(new FeatureLayer(fs, basicStyle)); SVGStreamingMapOutputFormat producer = new SVGStreamingMapOutputFormat(); @@ -86,33 +101,27 @@ public void testHeterogeneousGeometry() throws Exception { encodeSVG.encode(out); // System.out.println(out.toString()); - String expectedDoc = - "" - + " " // - + " " // - + " " // - + " " // - + " " // - + " " // - + " "; - - DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - Document expected = builder.parse(new InputSource(new StringReader(expectedDoc))); - Document result = builder.parse(new ByteArrayInputStream(out.toByteArray())); - XMLUnit.setIgnoreWhitespace(true); XMLUnit.setIgnoreAttributeOrder(true); - XMLUnit.setIgnoreComments(true); - XMLAssert.assertXMLEqual(expected, result); + XMLAssert.assertXMLEqual(expectedDoc, out.toString()); + } + + @Test + public void testHeterogeneousGeometry() throws Exception { + String layer = "test"; + String style = "Default"; + String expectedDoc = EXPECTED_DOC.replace("LAYER", layer).replace("STYLE", style); + doTestSVGMapProducer(layer, style, expectedDoc); + } + + @Test + public void testEscaping() throws Exception { + String unescapedLayer = "layer\"<>"; + String escapedLayer = "layer"<>"; + String unescapedStyle = "style\"<>"; + String escapedStyle = "style"<>"; + String expectedDoc = + EXPECTED_DOC.replace("LAYER", escapedLayer).replace("STYLE", escapedStyle); + doTestSVGMapProducer(unescapedLayer, unescapedStyle, expectedDoc); } }