From e0a033ea71a16c87b8978b26f49da53c2cfe20af Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Mon, 23 Jan 2012 19:31:16 +0100 Subject: [PATCH] added worldimage, imagemosaic and fixed geotiff publication. Added tests and splitted Test classes. --- README | 2 +- pom.xml | 4 +- .../rest/GeoServerRESTPublisher.java | 242 +++++++-- .../rest/GeoserverRESTPublisherTest.java | 478 ------------------ .../geoserver/rest/GeoserverRESTTest.java | 4 + .../publisher/GeoserverRESTGeoTiffTest.java | 108 ++++ .../GeoserverRESTImageMosaicTest.java | 3 +- .../GeoserverRESTPostgisDatastoreTest.java | 3 +- .../publisher/GeoserverRESTPublisherTest.java | 120 +++++ .../publisher/GeoserverRESTShapeTest.java | 176 +++++++ .../publisher/GeoserverRESTStyleTest.java | 213 ++++++++ .../publisher/GeoserverRESTWorkspaceTest.java | 92 ++++ .../GeoserverRESTWorldImageTest.java | 95 ++++ src/test/resources/testdata/sw.zip | Bin 0 -> 119594 bytes 14 files changed, 1016 insertions(+), 524 deletions(-) delete mode 100644 src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java create mode 100644 src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java rename src/test/java/it/geosolutions/geoserver/rest/{ => publisher}/GeoserverRESTImageMosaicTest.java (98%) rename src/test/java/it/geosolutions/geoserver/rest/{ => publisher}/GeoserverRESTPostgisDatastoreTest.java (98%) create mode 100644 src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPublisherTest.java create mode 100644 src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTShapeTest.java create mode 100644 src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTStyleTest.java create mode 100644 src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTWorkspaceTest.java create mode 100644 src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTWorldImageTest.java create mode 100644 src/test/resources/testdata/sw.zip diff --git a/README b/README index 5d1ca2e..af2037c 100644 --- a/README +++ b/README @@ -4,4 +4,4 @@ The purpose of this project is to hold a REST client library to interact with Ge For more information see this page: -http://code.google.com/p/geoserver-manager/ \ No newline at end of file +https://github.com/geosolutions-it/geoserver-manager \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7e3b530..bb8e6f3 100644 --- a/pom.xml +++ b/pom.xml @@ -129,8 +129,8 @@ maven-compiler-plugin 2.0.2 - 1.5 - 1.5 + 1.6 + 1.6 diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index 5a77450..b22f5b8 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -40,13 +40,11 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.Iterator; -import java.util.List; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.io.FilenameUtils; import org.apache.log4j.Level; import org.apache.log4j.Logger; -import org.apache.log4j.Priority; /** * Connect to a GeoServer instance to publish or modify data. @@ -257,7 +255,7 @@ public class GeoServerRESTPublisher { try { GSLayerEncoder layerEncoder = new GSLayerEncoder(); - layerEncoder.addDefaultStyle(defaultStyle); + layerEncoder.setDefaultStyle(defaultStyle); configureLayer(workspace, layerName, layerEncoder); } catch (Exception e) { LOGGER.warn("Error in publishing shapefile " + e.getMessage(), @@ -334,17 +332,7 @@ public class GeoServerRESTPublisher { .append("/datastores/").append(storename).append("/file.shp?"); // append parameters - if (params != null) { - final int paramsSize = params.length; - if (paramsSize > 0) { - sbUrl.append(params[0].getName()).append("=") - .append(params[0].getValue()); - for (int i = 1; i < paramsSize; i++) { - sbUrl.append("&").append(params[i].getName()).append("=") - .append(params[i].getValue()); - } - } - } + sbUrl.append(appendParameters(params)); // if (workspace != null) { // sbUrl.append("namespace=").append(workspace); @@ -492,7 +480,7 @@ public class GeoServerRESTPublisher { /** * The configure parameter is used to control how the data store is * configured upon file upload. It can take one of the three values “first”, - * “none”, or “all”.
+ * none, or all.
* first - Only setup the first feature type available in the data store. * This is the default.
* none - Do not configure any feature types.
@@ -516,7 +504,7 @@ public class GeoServerRESTPublisher { * The update parameter is used to control how existing data is handled when * the file is PUT into a datastore that (a) already exists and (b) already * contains a schema that matches the content of the file. It can take one - * of the two values “append”, or “overwrite”.
+ * of the two values append, or overwrite.
* append - Data being uploaded is appended to the existing data. This is * the default.
* overwrite - Data being uploaded replaces any existing data.
@@ -537,6 +525,75 @@ public class GeoServerRESTPublisher { // === COVERAGES // ========================================================================== + /** + * + * Publish a zipped worldimage file. It is assumed that the the zip-file + * contain the *.prj to set the srs. + *

+ * This is equivalent call with cUrl: + * + *

+	 * {@code
+	 * curl -u admin:geoserver -XPUT -H 'Content-type: application/zip' \
+	 * 
+	 *       --data-binary @$ZIPFILE \
+	 * 
+	 *       http://$GSIP:$GSPORT/$SERVLET/rest/workspaces/$WORKSPACE/coveragestores/$COVERAGESTORE/file.worldimage
+	 * 
+ * + * @param workspace + * Workspace to use + * @param coveragestore + * Name of the coveragestore + * @param file + * zip file to upload + * @param configure + * Configure parameter. It may be null. + * @param params + * parameters to append to the url (can be null).
+ * Accepted parameters are: + * + * @see #{@link ParameterConfigure} + * @return true if the operation completed successfully. + */ + private boolean publishCoverage(String workspace, String coveragestore, String format, String mimeType, + File file, ParameterConfigure configure, NameValuePair... params) + throws FileNotFoundException { + // build full URL + StringBuilder sbUrl = new StringBuilder(restURL) + .append("/rest/workspaces/").append(workspace) + .append("/coveragestores/").append(coveragestore) + .append("/file.").append(format); + + if (configure != null) { + sbUrl.append("?configure=").append(configure); + if (params!= null && !configure.equals(ParameterConfigure.NONE)){ + final String paramString=appendParameters(params); + if (!paramString.isEmpty()){ + sbUrl.append("&").append(paramString); + } + } + } + String sentResult = HTTPUtils.put(sbUrl.toString(), file, + mimeType, gsuser, gspass); + boolean fileSent = sentResult != null; + + if (fileSent) { + if (LOGGER.isInfoEnabled()) + LOGGER.info("File successfully uploaded ( " + file + + ")"); + } else { + if (LOGGER.isEnabledFor(Level.WARN)) + LOGGER.warn("Error in sending file " + file); + } + return fileSent; + } + // ========================================================================== // === GEOTIFF // ========================================================================== @@ -555,16 +612,10 @@ public class GeoServerRESTPublisher { * * * @return true if the operation completed successfully. - * @deprecated UNTESTED */ public boolean publishGeoTIFF(String workspace, String storeName, File geotiff) throws FileNotFoundException { - String sUrl = restURL + "/rest/workspaces/" + workspace - + "/coveragestores/" + storeName + "/geotiff"; - String sendResult = HTTPUtils - .put(sUrl, geotiff, "text", gsuser, gspass); // CHECKME: text?!? - boolean sent = sendResult != null; - return sent; + return publishCoverage(workspace, storeName, "geotiff", "image/geotiff", geotiff, ParameterConfigure.FIRST, (NameValuePair[])null); } /** @@ -629,9 +680,84 @@ public class GeoServerRESTPublisher { return store; } + // ========================================================================== + // === WORLDIMAGE + // ========================================================================== + + /** + * {@link #publishWorldImage(String, String, File, ParameterConfigure, NameValuePair...)} + */ + public boolean publishWorldImage(String workspace, String coveragestore, File zipFile) + throws FileNotFoundException { + return publishWorldImage(workspace, coveragestore, zipFile, ParameterConfigure.FIRST,(NameValuePair)null); + } + + /** + * + * Publish a zipped worldimage file. It is assumed that the the zip-file + * contain the *.prj to set the srs. + *

+ * This is equivalent call with cUrl: + * + *

+	 * {@code
+	 * curl -u admin:geoserver -XPUT -H 'Content-type: application/zip' \
+	 * 
+	 *       --data-binary @$ZIPFILE \
+	 * 
+	 *       http://$GSIP:$GSPORT/$SERVLET/rest/workspaces/$WORKSPACE/coveragestores/$COVERAGESTORE/file.worldimage
+	 * 
+ * + * @param workspace + * Workspace to use + * @param coveragestore + * Name of the coveragestore + * @param zipFile + * zip file to upload + * @param configure + * Configure parameter. It may be null. + * @param params + * parameters to append to the url (can be null).
+ * Accepted parameters are: + * + * @see #{@link ParameterConfigure} + * @return true if the operation completed successfully. + */ + public boolean publishWorldImage(String workspace, String coveragestore, + File zipFile, ParameterConfigure configure, NameValuePair... params) + throws FileNotFoundException { + return publishCoverage(workspace, coveragestore, "worldimage", "application/zip", zipFile, configure, params); + } + + // ========================================================================== // === MOSAIC // ========================================================================== + + /** + * Publish imagemosaic as zip file + * + * @see {@link #publishWorldImage(String, String, File)} + */ + public boolean publishImageMosaic(String workspace, String storeName, + File zipFile) throws FileNotFoundException { + return publishCoverage(workspace, storeName, "imagemosaic", "application/zip", zipFile, ParameterConfigure.FIRST, (NameValuePair[])null); + } + + /** + * Publish imagemosaic as zip file + * + * @see {@link #publishWorldImage(String, String, File, ParameterConfigure, NameValuePair...)} + */ + public boolean publishImageMosaic(String workspace, String storeName, + File zipFile, ParameterConfigure configure, NameValuePair... params) throws FileNotFoundException { + return publishCoverage(workspace, storeName, "imagemosaic", "application/zip", zipFile, configure, params); + } /** * Publish a Mosaic from a filesystem currently readable by GeoServer. @@ -659,7 +785,7 @@ public class GeoServerRESTPublisher { /* * Carlo (23 Nov 2011): commented out since this directory should be - * readable by targhet GeoServer not the calling client! + * readable by target GeoServer not the calling client! */ if (!mosaicDir.isDirectory()) { if (LOGGER.isEnabledFor(Level.WARN)) @@ -779,7 +905,7 @@ public class GeoServerRESTPublisher { if (store == null) { LOGGER.warn("Unable to get the store" + workspace + ":" + storeName - + " from the targhet geoserver."); + + " from the target geoserver."); return null; } @@ -1051,11 +1177,12 @@ public class GeoServerRESTPublisher { public boolean removeDatastore(String workspace, String storename, final boolean recurse) throws IllegalArgumentException { try { - if (workspace==null || storename==null) + if (workspace == null || storename == null) throw new IllegalArgumentException("Arguments may not be null!"); if (workspace.isEmpty() || storename.isEmpty()) - throw new IllegalArgumentException("Arguments may not be empty!"); - + throw new IllegalArgumentException( + "Arguments may not be empty!"); + final StringBuilder url = new StringBuilder(restURL); url.append("/rest/workspaces/").append(workspace) .append("/datastores/").append(storename); @@ -1113,13 +1240,15 @@ public class GeoServerRESTPublisher { * @return true if the CoverageStore was successfully removed. */ public boolean removeCoverageStore(final String workspace, - final String storename, final boolean recurse) throws IllegalArgumentException { + final String storename, final boolean recurse) + throws IllegalArgumentException { try { - if (workspace==null || storename==null) + if (workspace == null || storename == null) throw new IllegalArgumentException("Arguments may not be null!"); if (workspace.isEmpty() || storename.isEmpty()) - throw new IllegalArgumentException("Arguments may not be empty!"); - + throw new IllegalArgumentException( + "Arguments may not be empty!"); + final StringBuilder url = new StringBuilder(restURL); url.append("/rest/workspaces/").append(workspace) .append("/coveragestores/").append(storename); @@ -1173,18 +1302,20 @@ public class GeoServerRESTPublisher { * The recurse parameter is used to recursively delete all * resources contained by the specified workspace. This includes * data stores, coverage stores, feature types, etc... Allowable - * values for this parameter are “true” or “false”. The default - * value is “false”. + * values for this parameter are true or false. The + * default value is false. * @return true if the WorkSpace was successfully removed. */ - public boolean removeWorkspace(String workspace, boolean recurse) throws IllegalArgumentException { + public boolean removeWorkspace(String workspace, boolean recurse) + throws IllegalArgumentException { workspace = sanitize(workspace); try { - if (workspace==null) + if (workspace == null) throw new IllegalArgumentException("Arguments may not be null!"); if (workspace.isEmpty()) - throw new IllegalArgumentException("Arguments may not be empty!"); - + throw new IllegalArgumentException( + "Arguments may not be empty!"); + StringBuffer url = new StringBuffer(restURL).append( "/rest/workspaces/").append(workspace); if (recurse) @@ -1315,8 +1446,8 @@ public class GeoServerRESTPublisher { } /** - * Allows to configure some layer attributes such and DefaultStyle TODO - * WmsPath + * Allows to configure some layer attributes such and DefaultStyle + * @TODO WmsPath */ public boolean configureLayer(final String workspace, final String layerName, final GSLayerEncoder layer) { @@ -1492,7 +1623,8 @@ public class GeoServerRESTPublisher { * coverage name (if != null will override the CoverageEncoder * name) * @return true if success - * @deprecated use {@link GeoServerRESTPublisher#configureCoverage(GSCoverageEncoder, String, String)} + * @deprecated use + * {@link GeoServerRESTPublisher#configureCoverage(GSCoverageEncoder, String, String)} */ protected boolean configureCoverage(final GSCoverageEncoder ce, final String wsname, final String csname, String cname) { @@ -1514,6 +1646,34 @@ public class GeoServerRESTPublisher { return s; } + /** + * Append params generating a string in the form:
+ *

+ * NAME_0=VALUE_0&NAME_1=VALUE_1&....&NAME_n-1=VALUE_n-1 + *

+ *
+ * + * @param params + * an array of NameValuePair + * @return the parameter string or empty an string + */ + private String appendParameters(NameValuePair... params) { + StringBuilder sbUrl = new StringBuilder(); + // append parameters + if (params != null) { + final int paramsSize = params.length; + if (paramsSize > 0) { + sbUrl.append(params[0].getName()).append("=") + .append(params[0].getValue()); + for (int i = 1; i < paramsSize; i++) { + sbUrl.append("&").append(params[i].getName()).append("=") + .append(params[i].getValue()); + } + } + } + return sbUrl.toString(); + } + protected String encode(String s) { // try { // return URLEncoder.encode(s,"UTF-8"); diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java deleted file mode 100644 index 60e45ee..0000000 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java +++ /dev/null @@ -1,478 +0,0 @@ -/* - * GeoServer-Manager - Simple Manager Library for GeoServer - * - * Copyright (C) 2007,2011 GeoSolutions S.A.S. - * http://www.geo-solutions.it - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package it.geosolutions.geoserver.rest; - -import it.geosolutions.geoserver.rest.decoder.RESTLayer; -import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore; -import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder; -import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; - -import org.apache.commons.httpclient.NameValuePair; -import org.apache.commons.io.IOUtils; -import org.apache.log4j.Logger; -import org.jdom.Element; -import org.jdom.Namespace; -import org.springframework.core.io.ClassPathResource; - -/** - * Testcase for publishing layers on geoserver. - * We need a running GeoServer to properly run the tests. - * If such geoserver instance cannot be contacted, tests will be skipped. - * - * @author etj - */ -public class GeoserverRESTPublisherTest extends GeoserverRESTTest { - - private final static Logger LOGGER = Logger.getLogger(GeoserverRESTPublisherTest.class); - - public GeoserverRESTPublisherTest(String testName) { - super(testName); - } - - public void testWorkspaces() { - if (!enabled()) return; - deleteAll(); - - assertEquals(0, reader.getWorkspaces().size()); - - assertTrue(publisher.createWorkspace("WS1")); - assertTrue(publisher.createWorkspace("WS2")); - assertEquals(2, reader.getWorkspaces().size()); - - assertFalse(publisher.createWorkspace("WS2")); - assertEquals(2, reader.getWorkspaces().size()); - } - - /** - * remove workspace and all of its contents - * @throws IOException - */ - public void testWorkspaceRemoval() throws IOException { - if (!enabled()) return; - deleteAll(); - - String storeName = "testRESTStoreGeotiff"; - String layerName = "resttestdem"; - - assertTrue(reader.getWorkspaces().isEmpty()); - assertTrue(publisher.createWorkspace(DEFAULT_WS)); - - File geotiff = new ClassPathResource("testdata/resttestdem.tif").getFile(); - - // known state? - assertFalse("Cleanup failed", existsLayer(layerName)); - - // test insert - RESTCoverageStore pc = publisher.publishExternalGeoTIFF(DEFAULT_WS, storeName, geotiff, null, null); - - // remove workspace and all of its contents - assertTrue(publisher.removeWorkspace(DEFAULT_WS,true)); - } - - public void testStyles() throws IOException { - if (!enabled()) return; - deleteAll(); - - assertEquals(0, reader.getStyles().size()); - - final String styleName = "restteststyle"; - File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); - - // insert style - assertTrue(publisher.publishStyle(sldFile)); - assertTrue(reader.existsStyle(styleName)); - - assertFalse(publisher.publishStyle(sldFile)); - assertTrue(reader.existsStyle(styleName)); - - String sld = reader.getSLD(styleName); - assertNotNull(sld); - - Element styleEl = JDOMBuilder.buildElement(sld); - assertNotNull(styleEl); - - Namespace SLDNS = Namespace.getNamespace("sld", "http://www.opengis.net/sld"); - - try{ - - assertEquals(styleName, styleEl.getChild("NamedLayer", SLDNS).getChild("Name",SLDNS).getText()); - assertEquals("STYLE FOR TESTING PURPOSES", styleEl.getChild("NamedLayer", SLDNS).getChild("UserStyle", SLDNS).getChild("Title", SLDNS).getText()); - } catch(NullPointerException npe) { - fail("Error in SLD"); - } - -// assertEquals(1475, sld.length()); - - assertEquals(1, reader.getStyles().size()); - } - - public void testExternalGeotiff() throws FileNotFoundException, IOException { - if (!enabled()) return; - deleteAll(); - - String storeName = "testRESTStoreGeotiff"; - String layerName = "resttestdem"; - - assertTrue(reader.getWorkspaces().isEmpty()); - assertTrue(publisher.createWorkspace(DEFAULT_WS)); - - File geotiff = new ClassPathResource("testdata/resttestdem.tif").getFile(); - - // known state? - assertFalse("Cleanup failed", existsLayer(layerName)); - - // test insert - RESTCoverageStore pc = publisher.publishExternalGeoTIFF(DEFAULT_WS, storeName, geotiff, null, null); - assertNotNull("publish() failed", pc); - assertTrue(existsLayer(layerName)); - LOGGER.info(pc); - RESTCoverageStore reloadedCS = reader.getCoverageStore(DEFAULT_WS, storeName); - - assertEquals(pc.getName(), reloadedCS.getName()); - assertEquals(pc.getWorkspaceName(), reloadedCS.getWorkspaceName()); - - //test delete - assertTrue("Unpublish() failed", publisher.unpublishCoverage(DEFAULT_WS, storeName, layerName)); - assertTrue("Unpublish() failed", publisher.removeCoverageStore(DEFAULT_WS, storeName)); - assertFalse("Bad unpublish()", publisher.unpublishCoverage(DEFAULT_WS, storeName, layerName)); - assertFalse(existsLayer(layerName)); - } - - protected void cleanupTestFT(String layerName, String ns, String storeName) { - // dry run delete to work in a known state - RESTLayer testLayer = reader.getLayer(layerName); - if (testLayer != null) { - LOGGER.info("Clearing stale test layer " + layerName); - boolean ok = publisher.unpublishFeatureType(ns, storeName, layerName); - if (!ok) { - fail("Could not unpublish layer " + layerName); - } - } - if (publisher.removeDatastore(ns, storeName)) { - LOGGER.info("Cleared stale datastore " + storeName); - } - - assertFalse("Cleanup failed", existsLayer(layerName)); - } - - protected void cleanupTestStyle(final String styleName) { - // dry run delete to work in a known state - if (reader.existsStyle(styleName)) { - LOGGER.info("Clearing stale test style " + styleName); - boolean ok = publisher.removeStyle(styleName); - if (!ok) { - fail("Could not unpublish style " + styleName); - } - } - assertFalse("Cleanup failed", reader.existsStyle(styleName)); - } - - public void testPublishDeleteShapeZip() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } -// Assume.assumeTrue(enabled); - deleteAllWorkspaces(); - assertTrue(publisher.createWorkspace(DEFAULT_WS)); - - String storeName = "resttestshp"; - String layerName = "cities"; - - File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); - - // known state? - cleanupTestFT(layerName, DEFAULT_WS, storeName); - - // test insert - boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile); - assertTrue("publish() failed", published); - assertTrue(existsLayer(layerName)); - - RESTLayer layer = reader.getLayer(layerName); - - LOGGER.info("Layer style is " + layer.getDefaultStyle()); - - //test delete - boolean ok = publisher.unpublishFeatureType(DEFAULT_WS, storeName, layerName); - assertTrue("Unpublish() failed", ok); - assertFalse(existsLayer(layerName)); - - // remove also datastore - boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, storeName,false); - assertTrue("removeDatastore() failed", dsRemoved); - - } - - public void testPublishDeleteStyledShapeZip() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } -// Assume.assumeTrue(enabled); - - String ns = "geosolutions"; - String storeName = "resttestshp"; - String layerName = "cities"; - - File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); - cleanupTestFT(layerName, ns, storeName); - - final String styleName = "restteststyle"; - File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); - cleanupTestStyle(styleName); - - // insert style - boolean sldpublished = publisher.publishStyle(sldFile); // Will take the name from sld contents - assertTrue("style publish() failed", sldpublished); - assertTrue(reader.existsStyle(styleName)); - - // test insert - boolean published = publisher.publishShp(ns, storeName, layerName, zipFile, "EPSG:4326", 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()); - - //test delete - boolean ok = publisher.unpublishFeatureType(ns, storeName, layerName); - assertTrue("Unpublish() failed", ok); - assertFalse(existsLayer(layerName)); - - // remove also datastore - boolean dsRemoved = publisher.removeDatastore(ns, storeName); - assertTrue("removeDatastore() failed", dsRemoved); - - //test delete style - boolean oksld = publisher.removeStyle(styleName); - assertTrue("Unpublish() failed", oksld); - assertFalse(reader.existsStyle(styleName)); - } - - public void testPublishDeleteShapeZipWithParams() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } -// Assume.assumeTrue(enabled); - deleteAllWorkspaces(); - assertTrue(publisher.createWorkspace(DEFAULT_WS)); - - String storeName = "resttestshp"; - String layerName = "cities"; - - File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); - - // known state? - cleanupTestFT(layerName, DEFAULT_WS, storeName); - - // test insert - boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile,"EPSG:4326",new NameValuePair("charset","UTF-8")); - assertTrue("publish() failed", published); - assertTrue(existsLayer(layerName)); - - RESTLayer layer = reader.getLayer(layerName); - - LOGGER.info("Layer style is " + layer.getDefaultStyle()); - - //test delete - boolean ok = publisher.unpublishFeatureType(DEFAULT_WS, storeName, layerName); - assertTrue("Unpublish() failed", ok); - assertFalse(existsLayer(layerName)); - - // remove also datastore - boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, storeName); - assertTrue("removeDatastore() failed", dsRemoved); - - } - - public void testPublishDeleteStyleFile() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } -// Assume.assumeTrue(enabled); - final String styleName = "restteststyle"; - - File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); - - // known state? - cleanupTestStyle(styleName); - - // test insert - boolean published = publisher.publishStyle(sldFile); // Will take the name from sld contents - assertTrue("publish() failed", published); - assertTrue(reader.existsStyle(styleName)); - - //test delete - boolean ok = publisher.removeStyle(styleName); - assertTrue("Unpublish() failed", ok); - assertFalse(reader.existsStyle(styleName)); - } - - public void testPublishDeleteStyleString() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } -// Assume.assumeTrue(enabled); - final String styleName = "restteststyle"; - - File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); - - // known state? - cleanupTestStyle(styleName); - - // test insert - String sldContent = IOUtils.toString(new FileInputStream(sldFile)); - - boolean published = publisher.publishStyle(sldContent); // Will take the name from sld contents - assertTrue("publish() failed", published); - assertTrue(reader.existsStyle(styleName)); - - //test delete - boolean ok = publisher.removeStyle(styleName); - assertTrue("Unpublish() failed", ok); - assertFalse(reader.existsStyle(styleName)); - } - - public void testDeleteUnexistingCoverage() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } -// Assume.assumeTrue(enabled); - - String wsName = "this_ws_does_not_exist"; - String storeName = "this_store_does_not_exist"; - String layerName = "this_layer_does_not_exist"; - - boolean ok = publisher.unpublishCoverage(wsName, storeName, layerName); - assertFalse("unpublished not existing layer", ok); - } - - public void testDeleteUnexistingFeatureType() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } -// Assume.assumeTrue(enabled); - - String wsName = "this_ws_does_not_exist"; - String storeName = "this_store_does_not_exist"; - String layerName = "this_layer_does_not_exist"; - - boolean ok = publisher.unpublishFeatureType(wsName, storeName, layerName); - assertFalse("unpublished not existing layer", ok); - } - - public void testDeleteUnexistingDatastore() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } -// Assume.assumeTrue(enabled); - - String wsName = "this_ws_does_not_exist"; - String storeName = "this_store_does_not_exist"; - - boolean ok = publisher.removeDatastore(wsName, storeName); - assertFalse("removed not existing datastore", ok); - } - - - public void testUpdateDefaultStyle() throws FileNotFoundException, IOException { - if (!enabled()) { - return; - } - - String storeName = "resttestshp"; - String layerName = "cities"; - - final String styleName = "restteststyle"; - { - File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); - cleanupTestStyle(styleName); - boolean sldpublished = publisher.publishStyle(sldFile); // Will take the name from sld contents - assertTrue("style publish() failed", sldpublished); - assertTrue(reader.existsStyle(styleName)); - } - - final String styleName2 = "restteststyle2"; - { - File sldFile = new ClassPathResource("testdata/restteststyle2.sld").getFile(); - cleanupTestStyle(styleName2); - boolean sldpublished = publisher.publishStyle(sldFile); // Will take the name from sld contents - assertTrue("style publish() failed", sldpublished); - assertTrue(reader.existsStyle(styleName2)); - } - - - File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); - - // known state? - cleanupTestFT(layerName, DEFAULT_WS, storeName); - - // test insert - boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile, "EPSG:4326", styleName); - assertTrue("publish() failed", published); - assertTrue(existsLayer(layerName)); - - { - RESTLayer layer = reader.getLayer(layerName); - LOGGER.info("Layer style is " + layer.getDefaultStyle()); - assertEquals(styleName, layer.getDefaultStyle()); - } - - GSLayerEncoder le = new GSLayerEncoder(); - le.addDefaultStyle(styleName2); - publisher.configureLayer(DEFAULT_WS, layerName, le); - - { - RESTLayer layer = reader.getLayer(layerName); - LOGGER.info("Layer style is " + layer.getDefaultStyle()); - assertEquals(styleName2, layer.getDefaultStyle()); - } - - - // remove layer and datastore - boolean ok = publisher.unpublishFeatureType(DEFAULT_WS, storeName, layerName); - assertFalse(existsLayer(layerName)); - boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, storeName); - assertTrue("removeDatastore() failed", dsRemoved); - } - -// public void testDeleteUnexistingFT() throws FileNotFoundException, IOException { -// String wsName = "this_ws_does_not_exist"; -// String storeName = "this_store_does_not_exist"; -// String layerName = "this_layer_does_not_exist"; -// -// boolean ok = publisher.unpublishFT(wsName, storeName, layerName); -// assertFalse("unpublished not existing layer", ok); -// } - private boolean existsLayer(String layername) { - return reader.getLayer(layername) != null; - } -} diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java index b976a21..e90f9a3 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java @@ -283,5 +283,9 @@ public abstract class GeoserverRESTTest extends TestCase { + coverage.getName(), removed); } + + protected boolean existsLayer(String layername) { + return reader.getLayer(layername) != null; + } } \ No newline at end of file diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java new file mode 100644 index 0000000..a584a98 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTGeoTiffTest.java @@ -0,0 +1,108 @@ +/* + * GeoServer-Manager - Simple Manager Library for GeoServer + * + * Copyright (C) 2007,2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package it.geosolutions.geoserver.rest.publisher; + +import it.geosolutions.geoserver.rest.GeoserverRESTTest; +import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +import org.apache.log4j.Logger; +import org.springframework.core.io.ClassPathResource; + +/** + * Testcase for publishing layers on geoserver. + * We need a running GeoServer to properly run the tests. + * If such geoserver instance cannot be contacted, tests will be skipped. + * + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + */ +public class GeoserverRESTGeoTiffTest extends GeoserverRESTTest { + + private final static Logger LOGGER = Logger.getLogger(GeoserverRESTGeoTiffTest.class); + + public GeoserverRESTGeoTiffTest(String testName) { + super(testName); + } + + public void testExternalGeotiff() throws FileNotFoundException, IOException { + if (!enabled()) return; + deleteAll(); + + String storeName = "testRESTStoreGeotiff"; + String layerName = "resttestdem"; + + assertTrue(reader.getWorkspaces().isEmpty()); + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + File geotiff = new ClassPathResource("testdata/resttestdem.tif").getFile(); + + // known state? + assertFalse("Cleanup failed", existsLayer(layerName)); + + // test insert + RESTCoverageStore pc = publisher.publishExternalGeoTIFF(DEFAULT_WS, storeName, geotiff, null, null); + assertNotNull("publish() failed", pc); + assertTrue(existsLayer(layerName)); + LOGGER.info(pc); + RESTCoverageStore reloadedCS = reader.getCoverageStore(DEFAULT_WS, storeName); + + assertEquals(pc.getName(), reloadedCS.getName()); + assertEquals(pc.getWorkspaceName(), reloadedCS.getWorkspaceName()); + + //test delete + assertTrue("Unpublish() failed", publisher.unpublishCoverage(DEFAULT_WS, storeName, layerName)); + assertTrue("Unpublish() failed", publisher.removeCoverageStore(DEFAULT_WS, storeName)); + assertFalse("Bad unpublish()", publisher.unpublishCoverage(DEFAULT_WS, storeName, layerName)); + assertFalse(existsLayer(layerName)); + } + + public void testGeotiff() throws FileNotFoundException, IOException { + if (!enabled()) return; + deleteAll(); + + String storeName = "testRESTStoreGeotiff"; + String layerName = "resttestdem"; + + assertTrue(reader.getWorkspaces().isEmpty()); + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + File geotiff = new ClassPathResource("testdata/resttestdem.tif").getFile(); + + // known state? + assertFalse("Cleanup failed", existsLayer(layerName)); + + // test insert + boolean pub = publisher.publishGeoTIFF(DEFAULT_WS, storeName, geotiff); + + assertNotNull("publish() failed", pub); + + //delete + assertTrue("Unpublish() failed", publisher.removeCoverageStore(DEFAULT_WS, storeName,true)); + } +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTImageMosaicTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java similarity index 98% rename from src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTImageMosaicTest.java rename to src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java index 8175229..6399925 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTImageMosaicTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTImageMosaicTest.java @@ -23,9 +23,10 @@ * THE SOFTWARE. */ -package it.geosolutions.geoserver.rest; +package it.geosolutions.geoserver.rest.publisher; +import it.geosolutions.geoserver.rest.GeoserverRESTTest; import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPostgisDatastoreTest.java similarity index 98% rename from src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java rename to src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPostgisDatastoreTest.java index 9511abf..8f61849 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPostgisDatastoreTest.java @@ -23,9 +23,10 @@ * THE SOFTWARE. */ -package it.geosolutions.geoserver.rest; +package it.geosolutions.geoserver.rest.publisher; +import it.geosolutions.geoserver.rest.GeoserverRESTTest; import it.geosolutions.geoserver.rest.decoder.RESTDataStore; import it.geosolutions.geoserver.rest.encoder.GSPostGISDatastoreEncoder; import org.apache.log4j.Logger; diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPublisherTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPublisherTest.java new file mode 100644 index 0000000..7a19fd2 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPublisherTest.java @@ -0,0 +1,120 @@ +/* + * GeoServer-Manager - Simple Manager Library for GeoServer + * + * Copyright (C) 2007,2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package it.geosolutions.geoserver.rest.publisher; + +import it.geosolutions.geoserver.rest.GeoserverRESTTest; +import it.geosolutions.geoserver.rest.decoder.RESTLayer; + +import java.io.FileNotFoundException; +import java.io.IOException; + +import org.apache.log4j.Logger; + +/** + * Testcase for publishing layers on geoserver. + * We need a running GeoServer to properly run the tests. + * If such geoserver instance cannot be contacted, tests will be skipped. + * + * @author etj + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + */ +public class GeoserverRESTPublisherTest extends GeoserverRESTTest { + + private final static Logger LOGGER = Logger.getLogger(GeoserverRESTPublisherTest.class); + + public GeoserverRESTPublisherTest(String testName) { + super(testName); + } + + protected void cleanupTestFT(String layerName, String ns, String storeName) { + // dry run delete to work in a known state + RESTLayer testLayer = reader.getLayer(layerName); + if (testLayer != null) { + LOGGER.info("Clearing stale test layer " + layerName); + boolean ok = publisher.unpublishFeatureType(ns, storeName, layerName); + if (!ok) { + fail("Could not unpublish layer " + layerName); + } + } + if (publisher.removeDatastore(ns, storeName)) { + LOGGER.info("Cleared stale datastore " + storeName); + } + + assertFalse("Cleanup failed", existsLayer(layerName)); + } + + public void testDeleteUnexistingCoverage() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } +// Assume.assumeTrue(enabled); + + String wsName = "this_ws_does_not_exist"; + String storeName = "this_store_does_not_exist"; + String layerName = "this_layer_does_not_exist"; + + boolean ok = publisher.unpublishCoverage(wsName, storeName, layerName); + assertFalse("unpublished not existing layer", ok); + } + + public void testDeleteUnexistingFeatureType() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } +// Assume.assumeTrue(enabled); + + String wsName = "this_ws_does_not_exist"; + String storeName = "this_store_does_not_exist"; + String layerName = "this_layer_does_not_exist"; + + boolean ok = publisher.unpublishFeatureType(wsName, storeName, layerName); + assertFalse("unpublished not existing layer", ok); + } + + public void testDeleteUnexistingDatastore() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } +// Assume.assumeTrue(enabled); + + String wsName = "this_ws_does_not_exist"; + String storeName = "this_store_does_not_exist"; + + boolean ok = publisher.removeDatastore(wsName, storeName); + assertFalse("removed not existing datastore", ok); + } + + + // public void testDeleteUnexistingFT() throws FileNotFoundException, IOException { +// String wsName = "this_ws_does_not_exist"; +// String storeName = "this_store_does_not_exist"; +// String layerName = "this_layer_does_not_exist"; +// +// boolean ok = publisher.unpublishFT(wsName, storeName, layerName); +// assertFalse("unpublished not existing layer", ok); +// } + +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTShapeTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTShapeTest.java new file mode 100644 index 0000000..9ff27c4 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTShapeTest.java @@ -0,0 +1,176 @@ +/* + * GeoServer-Manager - Simple Manager Library for GeoServer + * + * Copyright (C) 2007,2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package it.geosolutions.geoserver.rest.publisher; + +import it.geosolutions.geoserver.rest.GeoserverRESTTest; +import it.geosolutions.geoserver.rest.decoder.RESTLayer; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + +import org.apache.commons.httpclient.NameValuePair; +import org.apache.log4j.Logger; +import org.springframework.core.io.ClassPathResource; + +/** + * Testcase for publishing layers on geoserver. + * We need a running GeoServer to properly run the tests. + * If such geoserver instance cannot be contacted, tests will be skipped. + * + * @author etj + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + */ +public class GeoserverRESTShapeTest extends GeoserverRESTTest { + + private final static Logger LOGGER = Logger.getLogger(GeoserverRESTShapeTest.class); + + public GeoserverRESTShapeTest(String testName) { + super(testName); + } + + public void testPublishDeleteShapeZip() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } +// Assume.assumeTrue(enabled); + deleteAllWorkspaces(); + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + String storeName = "resttestshp"; + String layerName = "cities"; + + File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); + + + // test insert + boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile); + assertTrue("publish() failed", published); + assertTrue(existsLayer(layerName)); + + RESTLayer layer = reader.getLayer(layerName); + + LOGGER.info("Layer style is " + layer.getDefaultStyle()); + + //test delete + boolean ok = publisher.unpublishFeatureType(DEFAULT_WS, storeName, layerName); + assertTrue("Unpublish() failed", ok); + assertFalse(existsLayer(layerName)); + + // remove also datastore + boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, storeName,false); + assertTrue("removeDatastore() failed", dsRemoved); + + } + + public void testPublishDeleteStyledShapeZip() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } +// Assume.assumeTrue(enabled); + + String ns = "geosolutions"; + String storeName = "resttestshp"; + String layerName = "cities"; + + File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); + publisher.removeDatastore(DEFAULT_WS, storeName,true); + + final String styleName = "restteststyle"; + File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); + + // insert style + boolean sldpublished = publisher.publishStyle(sldFile); // Will take the name from sld contents + assertTrue("style publish() failed", sldpublished); + assertTrue(reader.existsStyle(styleName)); + + // test insert + boolean published = publisher.publishShp(ns, storeName, layerName, zipFile, "EPSG:4326", 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()); + + // remove also datastore + boolean dsRemoved = publisher.removeDatastore(ns, storeName,true); + assertTrue("removeDatastore() failed", dsRemoved); + + //test delete style + boolean oksld = publisher.removeStyle(styleName); + assertTrue("Unpublish() failed", oksld); + assertFalse(reader.existsStyle(styleName)); + } + + public void testPublishDeleteShapeZipWithParams() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } +// Assume.assumeTrue(enabled); + deleteAllWorkspaces(); + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + String storeName = "resttestshp"; + String layerName = "cities"; + + File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); + + // known state? + publisher.removeDatastore(DEFAULT_WS, storeName,true); + + // test insert + boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile,"EPSG:4326",new NameValuePair("charset","UTF-8")); + assertTrue("publish() failed", published); + assertTrue(existsLayer(layerName)); + + RESTLayer layer = reader.getLayer(layerName); + + LOGGER.info("Layer style is " + layer.getDefaultStyle()); + + //test delete + boolean ok = publisher.unpublishFeatureType(DEFAULT_WS, storeName, layerName); + assertTrue("Unpublish() failed", ok); + assertFalse(existsLayer(layerName)); + + // remove also datastore + boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, storeName); + assertTrue("removeDatastore() failed", dsRemoved); + + } + + + // public void testDeleteUnexistingFT() throws FileNotFoundException, IOException { +// String wsName = "this_ws_does_not_exist"; +// String storeName = "this_store_does_not_exist"; +// String layerName = "this_layer_does_not_exist"; +// +// boolean ok = publisher.unpublishFT(wsName, storeName, layerName); +// assertFalse("unpublished not existing layer", ok); +// } + +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTStyleTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTStyleTest.java new file mode 100644 index 0000000..8f50fb3 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTStyleTest.java @@ -0,0 +1,213 @@ +/* + * GeoServer-Manager - Simple Manager Library for GeoServer + * + * Copyright (C) 2007,2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package it.geosolutions.geoserver.rest.publisher; + +import it.geosolutions.geoserver.rest.GeoserverRESTTest; +import it.geosolutions.geoserver.rest.decoder.RESTLayer; +import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder; +import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; + +import org.apache.commons.io.IOUtils; +import org.apache.log4j.Logger; +import org.jdom.Element; +import org.jdom.Namespace; +import org.springframework.core.io.ClassPathResource; + +/** + * Testcase for publishing layers on geoserver. + * We need a running GeoServer to properly run the tests. + * If such geoserver instance cannot be contacted, tests will be skipped. + * + * @author etj + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + */ +public class GeoserverRESTStyleTest extends GeoserverRESTTest { + + private final static Logger LOGGER = Logger.getLogger(GeoserverRESTStyleTest.class); + + public GeoserverRESTStyleTest(String testName) { + super(testName); + } + + public void testStyles() throws IOException { + if (!enabled()) return; + deleteAll(); + + assertEquals(0, reader.getStyles().size()); + + final String styleName = "restteststyle"; + File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); + + // insert style + assertTrue(publisher.publishStyle(sldFile)); + assertTrue(reader.existsStyle(styleName)); + + assertFalse(publisher.publishStyle(sldFile)); + assertTrue(reader.existsStyle(styleName)); + + String sld = reader.getSLD(styleName); + assertNotNull(sld); + + Element styleEl = JDOMBuilder.buildElement(sld); + assertNotNull(styleEl); + + Namespace SLDNS = Namespace.getNamespace("sld", "http://www.opengis.net/sld"); + + try{ + + assertEquals(styleName, styleEl.getChild("NamedLayer", SLDNS).getChild("Name",SLDNS).getText()); + assertEquals("STYLE FOR TESTING PURPOSES", styleEl.getChild("NamedLayer", SLDNS).getChild("UserStyle", SLDNS).getChild("Title", SLDNS).getText()); + } catch(NullPointerException npe) { + fail("Error in SLD"); + } + +// assertEquals(1475, sld.length()); + + assertEquals(1, reader.getStyles().size()); + } + + protected void cleanupTestStyle(final String styleName) { + // dry run delete to work in a known state + if (reader.existsStyle(styleName)) { + LOGGER.info("Clearing stale test style " + styleName); + boolean ok = publisher.removeStyle(styleName); + if (!ok) { + fail("Could not unpublish style " + styleName); + } + } + assertFalse("Cleanup failed", reader.existsStyle(styleName)); + } + + public void testPublishDeleteStyleFile() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } +// Assume.assumeTrue(enabled); + final String styleName = "restteststyle"; + + File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); + + // known state? + cleanupTestStyle(styleName); + + // test insert + boolean published = publisher.publishStyle(sldFile); // Will take the name from sld contents + assertTrue("publish() failed", published); + assertTrue(reader.existsStyle(styleName)); + + //test delete + boolean ok = publisher.removeStyle(styleName); + assertTrue("Unpublish() failed", ok); + assertFalse(reader.existsStyle(styleName)); + } + + public void testPublishDeleteStyleString() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } +// Assume.assumeTrue(enabled); + final String styleName = "restteststyle"; + + File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); + + // known state? + cleanupTestStyle(styleName); + + // test insert + String sldContent = IOUtils.toString(new FileInputStream(sldFile)); + + boolean published = publisher.publishStyle(sldContent); // Will take the name from sld contents + assertTrue("publish() failed", published); + assertTrue(reader.existsStyle(styleName)); + + //test delete + boolean ok = publisher.removeStyle(styleName); + assertTrue("Unpublish() failed", ok); + assertFalse(reader.existsStyle(styleName)); + } + + public void testUpdateDefaultStyle() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } + deleteAll(); + + String storeName = "resttestshp"; + String layerName = "cities"; + + final String styleName = "restteststyle"; + { + File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); + cleanupTestStyle(styleName); + boolean sldpublished = publisher.publishStyle(sldFile); // Will take the name from sld contents + assertTrue("style publish() failed", sldpublished); + assertTrue(reader.existsStyle(styleName)); + } + + final String styleName2 = "restteststyle2"; + { + File sldFile = new ClassPathResource("testdata/restteststyle2.sld").getFile(); + cleanupTestStyle(styleName2); + boolean sldpublished = publisher.publishStyle(sldFile,styleName2); + assertTrue("style publish() failed", sldpublished); + assertTrue(reader.existsStyle(styleName2)); + } + + File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); + + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + // test insert + boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile, "EPSG:4326", styleName); + assertTrue("publish() failed", published); + assertTrue(existsLayer(layerName)); + + { + RESTLayer layer = reader.getLayer(layerName); + LOGGER.info("Layer style is " + layer.getDefaultStyle()); + assertEquals(styleName, layer.getDefaultStyle()); + } + + GSLayerEncoder le = new GSLayerEncoder(); + le.setDefaultStyle(styleName2); + publisher.configureLayer(DEFAULT_WS, layerName, le); + + { + RESTLayer layer = reader.getLayer(layerName); + LOGGER.info("Layer style is " + layer.getDefaultStyle()); + assertEquals(styleName2, layer.getDefaultStyle()); + } + + // remove layer and datastore + boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, storeName, true); + assertTrue("removeDatastore() failed", dsRemoved); + } +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTWorkspaceTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTWorkspaceTest.java new file mode 100644 index 0000000..d8aba9c --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTWorkspaceTest.java @@ -0,0 +1,92 @@ +/* + * GeoServer-Manager - Simple Manager Library for GeoServer + * + * Copyright (C) 2007,2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package it.geosolutions.geoserver.rest.publisher; + +import it.geosolutions.geoserver.rest.GeoserverRESTTest; +import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore; + +import java.io.File; +import java.io.IOException; + +import org.apache.log4j.Logger; +import org.springframework.core.io.ClassPathResource; + +/** + * Testcase for publishing layers on geoserver. + * We need a running GeoServer to properly run the tests. + * If such geoserver instance cannot be contacted, tests will be skipped. + * + * @author etj + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + */ +public class GeoserverRESTWorkspaceTest extends GeoserverRESTTest { + + private final static Logger LOGGER = Logger.getLogger(GeoserverRESTWorkspaceTest.class); + + public GeoserverRESTWorkspaceTest(String testName) { + super(testName); + } + + public void testWorkspaces() { + if (!enabled()) return; + deleteAll(); + + assertEquals(0, reader.getWorkspaces().size()); + + assertTrue(publisher.createWorkspace("WS1")); + assertTrue(publisher.createWorkspace("WS2")); + assertEquals(2, reader.getWorkspaces().size()); + + assertFalse(publisher.createWorkspace("WS2")); + assertEquals(2, reader.getWorkspaces().size()); + } + + /** + * remove workspace and all of its contents + * @throws IOException + */ + public void testWorkspaceRemoval() throws IOException { + if (!enabled()) return; + deleteAll(); + + String storeName = "testRESTStoreGeotiff"; + String layerName = "resttestdem"; + + assertTrue(reader.getWorkspaces().isEmpty()); + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + File geotiff = new ClassPathResource("testdata/resttestdem.tif").getFile(); + + // known state? + assertFalse("Cleanup failed", existsLayer(layerName)); + + // test insert + RESTCoverageStore pc = publisher.publishExternalGeoTIFF(DEFAULT_WS, storeName, geotiff, null, null); + + // remove workspace and all of its contents + assertTrue(publisher.removeWorkspace(DEFAULT_WS,true)); + } +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTWorldImageTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTWorldImageTest.java new file mode 100644 index 0000000..d4ce426 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTWorldImageTest.java @@ -0,0 +1,95 @@ +/* + * GeoServer-Manager - Simple Manager Library for GeoServer + * + * Copyright (C) 2007,2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package it.geosolutions.geoserver.rest.publisher; + +import it.geosolutions.geoserver.rest.GeoserverRESTTest; +import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.ParameterConfigure; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.httpclient.NameValuePair; +import org.apache.log4j.Logger; +import org.springframework.core.io.ClassPathResource; + +/** + * Testcase for publishing layers on geoserver. + * We need a running GeoServer to properly run the tests. + * If such geoserver instance cannot be contacted, tests will be skipped. + * + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + */ +public class GeoserverRESTWorldImageTest extends GeoserverRESTTest { + + private final static Logger LOGGER = Logger.getLogger(GeoserverRESTWorldImageTest.class); + + public GeoserverRESTWorldImageTest(String testName) { + super(testName); + } + + public void testPublishWorldImage() throws IOException { + + if (!enabled()) { + return; + } + deleteAll(); + String storeName = "testWorldimage"; + + assertTrue(reader.getWorkspaces().isEmpty()); + + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + File worldImageFile = new ClassPathResource( + "testdata/sw.zip").getFile(); + + // test publish + + boolean wp = publisher.publishWorldImage(DEFAULT_WS, storeName, + worldImageFile, ParameterConfigure.NONE, null); + + assertTrue("Publish worldfile with no layer configured, failed.", wp); + + assertTrue("Unpublish() failed", publisher.removeCoverageStore(DEFAULT_WS, storeName, true)); + + // create default style + File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); + assertTrue(publisher.publishStyle(sldFile,"raster")); + + wp = publisher.publishWorldImage(DEFAULT_WS, storeName, + worldImageFile, ParameterConfigure.FIRST, new NameValuePair("coverageName", "worldImage_test")); + + assertTrue("Publish worldfile configuring layer name, failed.", wp); + + assertTrue("Unpublish() failed", publisher.removeCoverageStore(DEFAULT_WS, storeName, true)); + + wp = publisher.publishWorldImage(DEFAULT_WS, storeName, + worldImageFile, ParameterConfigure.ALL,null); + + assertTrue("Publish worldfile configuring all available layers, failed.", wp); + + assertTrue("Unpublish() failed", publisher.removeCoverageStore(DEFAULT_WS, storeName, true)); + } +} diff --git a/src/test/resources/testdata/sw.zip b/src/test/resources/testdata/sw.zip new file mode 100644 index 0000000000000000000000000000000000000000..ef00400c3011d8d572711718de09902e7179d1c4 GIT binary patch literal 119594 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�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 literal 0 HcmV?d00001