package org.geoserver.config; import static org.junit.Assert.*; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.net.URL; import java.nio.file.Files; import org.geoserver.catalog.CatalogFactory; import org.geoserver.catalog.StyleInfo; import org.geoserver.catalog.impl.CatalogFactoryImpl; import org.geoserver.catalog.impl.CatalogImpl; import org.geoserver.catalog.impl.StyleInfoImpl; import org.geotools.styling.ExternalGraphic; import org.geotools.styling.Graphic; import org.geotools.styling.PointSymbolizer; import org.geotools.styling.Style; import org.geotools.styling.Symbolizer; import org.geotools.util.Version; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.opengis.style.GraphicalSymbol; import org.springframework.context.support.ClassPathXmlApplicationContext; public class GeoServerDataDirectoryTest { ClassPathXmlApplicationContext ctx; GeoServerDataDirectory dataDir; CatalogFactory factory = new CatalogFactoryImpl(new CatalogImpl()); @Before public void setUp() throws Exception { ctx = new ClassPathXmlApplicationContext( "GeoServerDataDirectoryTest-applicationContext.xml", getClass()); ctx.refresh(); dataDir = new GeoServerDataDirectory(Files.createTempDirectory("data").toFile()); dataDir.root().deleteOnExit(); } @After public void tearDown() throws Exception { ctx.destroy(); } @Test public void testParsedStyle() throws IOException { File styleDir = new File(dataDir.root(), "styles"); styleDir.mkdir(); //Copy the sld to the temp style dir File styleFile = new File(styleDir, "external.sld"); Files.copy(this.getClass().getResourceAsStream("external.sld"), styleFile.toPath()); File iconFile = new File(styleDir, "icon.png"); assertFalse(iconFile.exists()); StyleInfoImpl si = new StyleInfoImpl(null); si.setName(""); si.setId(""); si.setFormat("sld"); si.setFormatVersion(new Version("1.0.0")); si.setFilename(styleFile.getName()); Style s = dataDir.parsedStyle(si); //Verify style is actually parsed correctly Symbolizer symbolizer = s.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); assertTrue(symbolizer instanceof PointSymbolizer); GraphicalSymbol graphic = ((PointSymbolizer) symbolizer).getGraphic().graphicalSymbols().get(0); assertTrue(graphic instanceof ExternalGraphic); assertEquals(((ExternalGraphic) graphic).getLocation(), iconFile.toURI().toURL()); //GEOS-7025: verify the icon file is not created if it doesn't already exist assertFalse(iconFile.exists()); } @Test public void testParsedStyleExternalWithParams() throws IOException { File styleDir = new File(dataDir.root(), "styles"); styleDir.mkdir(); //Copy the sld to the temp style dir File styleFile = new File(styleDir, "external_with_params.sld"); Files.copy(this.getClass().getResourceAsStream("external_with_params.sld"), styleFile.toPath()); File iconFile = new File(styleDir, "icon.png"); assertFalse(iconFile.exists()); StyleInfoImpl si = new StyleInfoImpl(null); si.setName(""); si.setId(""); si.setFormat("sld"); si.setFormatVersion(new Version("1.0.0")); si.setFilename(styleFile.getName()); Style s = dataDir.parsedStyle(si); //Verify style is actually parsed correctly Symbolizer symbolizer = s.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); assertTrue(symbolizer instanceof PointSymbolizer); GraphicalSymbol graphic = ((PointSymbolizer) symbolizer).getGraphic().graphicalSymbols().get(0); assertTrue(graphic instanceof ExternalGraphic); assertEquals(((ExternalGraphic) graphic).getLocation().getPath(), iconFile.toURI().toURL().getPath()); assertEquals("param1=1", ((ExternalGraphic) graphic).getLocation().getQuery()); //GEOS-7025: verify the icon file is not created if it doesn't already exist assertFalse(iconFile.exists()); } /** * Test loading a parsed style with an external graphic URL that contains both ?queryParams and * a URL #fragment, and assert that those URL components are preserved. * * @throws IOException */ @Test public void testParsedStyleExternalWithParamsAndFragment() throws IOException { File styleDir = new File(dataDir.root(), "styles"); styleDir.mkdir(); // Copy the sld to the temp style dir File styleFile = new File(styleDir, "external_with_params_and_fragment.sld"); Files.copy(this.getClass().getResourceAsStream("external_with_params_and_fragment.sld"), styleFile.toPath()); File iconFile = new File(styleDir, "icon.png"); assertFalse(iconFile.exists()); StyleInfoImpl si = new StyleInfoImpl(null); si.setName(""); si.setId(""); si.setFormat("sld"); si.setFormatVersion(new Version("1.0.0")); si.setFilename(styleFile.getName()); Style s = dataDir.parsedStyle(si); // Verify style is actually parsed correctly Symbolizer symbolizer = s.featureTypeStyles().get(0).rules().get(0).symbolizers().get(0); assertTrue(symbolizer instanceof PointSymbolizer); GraphicalSymbol graphic = ((PointSymbolizer) symbolizer).getGraphic().graphicalSymbols() .get(0); assertTrue(graphic instanceof ExternalGraphic); assertEquals(((ExternalGraphic) graphic).getLocation().getPath(), iconFile.toURI().toURL().getPath()); assertEquals("param1=1", ((ExternalGraphic) graphic).getLocation().getQuery()); assertEquals("textAfterHash", ((ExternalGraphic) graphic).getLocation().getRef()); // GEOS-7025: verify the icon file is not created if it doesn't already exist assertFalse(iconFile.exists()); } }