From 28a72e2691099a06efcd6b8cbb4a6d0d482ebca0 Mon Sep 17 00:00:00 2001 From: Mauro Bartolomeoli Date: Wed, 24 Feb 2016 10:06:29 +0100 Subject: [PATCH] Fixes #162: Improved style in workspace support for GeoTiffs and Shapefiles --- .../rest/GeoServerRESTPublisher.java | 20 ++++++-- .../rest/encoder/GSLayerEncoder.java | 27 ++++++++++- .../manager/GeoServerRESTStyleManager.java | 2 +- .../rest/encoder/GSLayerEncoderTest.java | 8 ++++ .../publisher/GeoserverRESTGeoTiffTest.java | 38 ++++++++++++++- .../publisher/GeoserverRESTShapeTest.java | 46 +++++++++++++++++++ 6 files changed, 133 insertions(+), 8 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index d3cff04..39f4407 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -1152,13 +1152,24 @@ public class GeoServerRESTPublisher { } // config layer props (style, ...) - final GSLayerEncoder layerEncoder = new GSLayerEncoder(); - if (defaultStyle != null && !defaultStyle.isEmpty()) - layerEncoder.setDefaultStyle(defaultStyle); + final GSLayerEncoder layerEncoder = configureDefaultStyle(defaultStyle); return configureLayer(workspace, datasetName, layerEncoder); } + private GSLayerEncoder configureDefaultStyle(String defaultStyle) { + final GSLayerEncoder layerEncoder = new GSLayerEncoder(); + if (defaultStyle != null && !defaultStyle.isEmpty()) { + if(defaultStyle.indexOf(":") != -1) { + String[] wsAndName = defaultStyle.split(":"); + layerEncoder.setDefaultStyle(wsAndName[0], wsAndName[1]); + } else { + layerEncoder.setDefaultStyle(defaultStyle); + } + } + return layerEncoder; + } + /** * Publish a shapefile. * @@ -1621,8 +1632,7 @@ public class GeoServerRESTPublisher { } // config layer props (style, ...) - final GSLayerEncoder layerEncoder = new GSLayerEncoder(); - layerEncoder.setDefaultStyle(defaultStyle); + final GSLayerEncoder layerEncoder = configureDefaultStyle(defaultStyle); return configureLayer(workspace, coverageName, layerEncoder); } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java index b75b438..e022c2d 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java @@ -74,9 +74,11 @@ public class GSLayerEncoder extends PropertyXMLEncoder { public final static String STYLES = "styles"; public final static String AUTHORITY_URLS="authorityURLs"; - public final static String IDENTIFIERS="identifiers"; + public final static String IDENTIFIERS="identifiers"; + public final static String DEFAULT_STYLE = "defaultStyle"; final private Element stylesEncoder = new Element(STYLES); + final private Element defaultStyleEncoder = new Element(DEFAULT_STYLE); final private Element authorityURLListEncoder = new Element(AUTHORITY_URLS); final private Element identifierListEncoder = new Element(IDENTIFIERS); @@ -164,6 +166,20 @@ public class GSLayerEncoder extends PropertyXMLEncoder { protected void addDefaultStyle(String defaultStyle) { add("defaultStyle", defaultStyle); } + + /** + * @see {@link GSLayerEncoder#setDefaultStyle(String)} + * @param defaultStyle + */ + protected void addDefaultStyle(String workspace, String defaultStyle) { + addContent(defaultStyleEncoder); + Element el = new Element("name"); + el.setText(defaultStyle); + defaultStyleEncoder.addContent(el); + el = new Element("workspace"); + el.setText(workspace); + defaultStyleEncoder.addContent(el); + } /** * @param defaultStyle The style that will be applied if no style is specified. @@ -175,6 +191,15 @@ public class GSLayerEncoder extends PropertyXMLEncoder { set("defaultStyle", defaultStyle); } + /** + * @see {@link GSLayerEncoder#setDefaultStyle(String)} + * @param defaultStyle + */ + public void setDefaultStyle(String workspace, String defaultStyle) { + remove("defaultStyle"); + addDefaultStyle(workspace, defaultStyle); + } + /** * Add a style * diff --git a/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStyleManager.java b/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStyleManager.java index 00dc28d..769fcb3 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStyleManager.java +++ b/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStyleManager.java @@ -528,7 +528,7 @@ public class GeoServerRESTStyleManager extends GeoServerRESTAbstractManager { */ public boolean publishStyleInWorkspace(final String workspace, String sldBody) { try { - return publishStyleInWorkspace(workspace, sldBody); + return publishStyleInWorkspace(workspace, sldBody, null); } catch (IllegalArgumentException e) { if (LOGGER.isErrorEnabled()) { LOGGER.error(e.getLocalizedMessage(), e); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoderTest.java index 1d71e58..ed90fdf 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoderTest.java @@ -111,4 +111,12 @@ public class GSLayerEncoderTest { Assert.assertEquals("authority1", el.getChild("authority").getValue()); Assert.assertEquals("identifier1", el.getChild("identifier").getValue()); } + + @Test + public void testDefaultStyleWithWorkspace(){ + layerEncoder.setDefaultStyle("ws", "style"); + Element el = (Element) layerEncoder.getRoot().getChild("defaultStyle"); + Assert.assertEquals("style", el.getChild("name").getValue()); + Assert.assertEquals("ws", el.getChild("workspace").getValue()); + } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java index 7056b2f..f72f6b5 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java @@ -25,9 +25,14 @@ package it.geosolutions.geoserver.rest.publisher; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.StoreType; import it.geosolutions.geoserver.rest.GeoserverRESTTest; import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore; +import it.geosolutions.geoserver.rest.decoder.RESTLayer; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; import java.io.File; @@ -35,7 +40,6 @@ import java.io.FileNotFoundException; import java.io.IOException; import org.junit.Test; -import static org.junit.Assert.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; @@ -125,6 +129,38 @@ public class GeoserverRESTGeoTiffTest extends GeoserverRESTTest { assertFalse(reader.existsCoveragestore(DEFAULT_WS, storeName)); } + @Test + public void testGeoTiffWithStyleInWorkspace() throws IOException { + if (!enabled()) return; + deleteAll(); + + File geotiff = new ClassPathResource("testdata/resttestdem.tif").getFile(); + + assertTrue(reader.getWorkspaces().isEmpty()); + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + File sldFile = new ClassPathResource("testdata/raster.sld").getFile(); + + + // insert style + assertTrue(publisher.publishStyleInWorkspace(DEFAULT_WS, sldFile, "mystyle")); + assertTrue(reader.existsStyle(DEFAULT_WS, "mystyle")); + + // known state? + assertFalse("Cleanup failed", existsLayer(layerName)); + + // test insert + boolean pub = publisher.publishGeoTIFF(DEFAULT_WS, storeName, storeName, + geotiff, "EPSG:4326", ProjectionPolicy.FORCE_DECLARED, DEFAULT_WS + ":" + "mystyle", null); + + assertNotNull("publish() failed", pub); + // Test exists + assertTrue(reader.existsCoveragestore(DEFAULT_WS, storeName)); + assertTrue(reader.existsCoverage(DEFAULT_WS, storeName, storeName)); + RESTLayer layer = reader.getLayer(DEFAULT_WS, storeName); + assertEquals("mystyle", layer.getDefaultStyle()); + assertEquals(DEFAULT_WS, layer.getDefaultStyleWorkspace()); + } @Test public void testReloadCoverageStore() throws FileNotFoundException, IOException { diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTShapeTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTShapeTest.java index 39ceae0..2f28857 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTShapeTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTShapeTest.java @@ -240,6 +240,52 @@ public class GeoserverRESTShapeTest extends GeoserverRESTTest { assertTrue("Unpublish() failed", oksld); assertFalse(reader.existsStyle(styleName)); } + + @Test + public void testPublishDeleteStyledInWorkspaceShapeZip() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } + deleteAllWorkspacesRecursively(); +// Assume.assumeTrue(enabled); + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + String ns = "geosolutions"; + String storeName = "resttestshp"; + String layerName = "cities"; + final String styleName = "restteststyle"; + + File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); + publisher.removeDatastore(DEFAULT_WS, storeName,true); + publisher.removeStyleInWorkspace(DEFAULT_WS, styleName); + + File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); + + // insert style + boolean sldpublished = publisher.publishStyleInWorkspace(DEFAULT_WS, sldFile); // Will take the name from sld contents + assertTrue("style publish() failed", sldpublished); + assertTrue(reader.existsStyle(DEFAULT_WS, styleName)); + + // test insert + boolean published = publisher.publishShp(ns, storeName, layerName, zipFile, "EPSG:4326", DEFAULT_WS + ":" + styleName); + assertTrue("publish() failed", published); + assertTrue(existsLayer(layerName)); + + RESTLayer layer = reader.getLayer(layerName); +// RESTLayer layerDecoder = new RESTLayer(layer); + LOGGER.info("Layer style is " + layer.getDefaultStyle()); + assertEquals("Style not assigned properly", styleName, layer.getDefaultStyle()); + assertEquals("Style not assigned properly", DEFAULT_WS, layer.getDefaultStyleWorkspace()); + + // remove also datastore + boolean dsRemoved = publisher.removeDatastore(ns, storeName,true); + assertTrue("removeDatastore() failed", dsRemoved); + + //test delete style + boolean oksld = publisher.removeStyleInWorkspace(DEFAULT_WS, styleName); + assertTrue("Unpublish() failed", oksld); + assertFalse(reader.existsStyle(styleName)); + } @Test public void testPublishDeleteShapeZipWithParams() throws FileNotFoundException, IOException {