diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index b27149d..28c380b 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -646,7 +646,7 @@ public class GeoServerRESTPublisher { case DATASTORES: return "dataStore"; case WMSSTORES: - return "wmsstores"; + return "wmsStore"; default: return "coverageStore"; } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWmsStoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWmsStoreEncoder.java new file mode 100644 index 0000000..ffeb786 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWmsStoreEncoder.java @@ -0,0 +1,114 @@ +package it.geosolutions.geoserver.rest.encoder.wmsstore; + +import it.geosolutions.geoserver.rest.GeoServerRESTPublisher; +import it.geosolutions.geoserver.rest.encoder.GSAbstractStoreEncoder; +import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; +import it.geosolutions.geoserver.rest.encoder.datastore.GSAbstractDatastoreEncoder; +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; +import org.jdom.Element; + +import java.net.URL; + +/** + * Created by drakiko on 15/09/2015. + */ +public class GSWmsStoreEncoder extends GSAbstractStoreEncoder { + + static final String TYPE = "WMS"; + + final static String ROOT = "wmsStore"; + + static final String DEFAULT_MIN_CONNECTIONS = "1"; + static final String DEFAULT_MAX_CONNECTIONS = "6"; + static final String DEFAULT_CONNECTION_TIMEOUT = "30"; + static final String DEFAULT_READ_TIMEOUT = "60"; + + + public GSWmsStoreEncoder(String storeName, URL url) { + super(GeoServerRESTPublisher.StoreType.WMSSTORES, ROOT); + setType(TYPE); + ensureValidName(storeName); + setName(storeName); + + ensureValidURL(url); + setCapabilitiesURL(url.toString()); + + setMaxConnections(DEFAULT_MAX_CONNECTIONS); + setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT); + setReadTimeout(DEFAULT_READ_TIMEOUT); + } + + public void setCapabilitiesURL(String capabilitiesURL){ + set("capabilitiesURL", capabilitiesURL); + } + + public String getCapabilitiesURL(){ + Element e = ElementUtils.contains(getRoot(), "capabilitiesURL"); + return e!=null?e.getTextTrim():null; + } + + public void setUser(String user) { + set("user", user); + } + + public String getUser() { + Element e = ElementUtils.contains(getRoot(), "user"); + return e!=null?e.getTextTrim():null; + } + + public void setPassword(String password) { + set("password", password); + } + + public String getPassword() { + Element e = ElementUtils.contains(getRoot(), "password"); + return e!=null?e.getTextTrim():null; + } + + public void setMaxConnections(String maxConnections) { + set("maxConnections", maxConnections); + } + + public String getMaxConnections() { + Element e = ElementUtils.contains(getRoot(), "maxConnections"); + return e!=null?e.getTextTrim():null; + } + + public void setReadTimeout(String readTimeout) { + set("readTimeout", readTimeout); + } + + public String getReadTimeout() { + Element e = ElementUtils.contains(getRoot(), "readTimeout"); + return e!=null?e.getTextTrim():null; + } + + public void setConnectTimeout(String connectTimeout) { + set("connectTimeout", connectTimeout); + } + + public String getConnectTimeout() { + Element e = ElementUtils.contains(getRoot(), "connectTimeout"); + return e!=null?e.getTextTrim():null; + } + /** + * @return {@value #TYPE} + */ + protected String getValidType() { + return TYPE; + } + + /** + * Check url validity. + * + * @param url the url + * @throws IllegalArgumentException if url is null or empty + */ + private static void ensureValidURL(URL url) { + if (url == null || url.toString().isEmpty()) { + throw new IllegalArgumentException( + "Wms store URL cannot be null or empty"); + } + } + +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/GSWMSLayerEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSWMSLayerEncoderTest.java new file mode 100644 index 0000000..5853401 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSWMSLayerEncoderTest.java @@ -0,0 +1,49 @@ +package it.geosolutions.geoserver.rest.encoder; + +import junit.framework.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Created by drakiko on 14/09/2015. + */ +public class GSWMSLayerEncoderTest { + + GSWMSLayerEncoder gswmsLayerEncoder; + + @Before + public void setUp() { + gswmsLayerEncoder = new GSWMSLayerEncoder(); + + gswmsLayerEncoder.setName("WMS_NAME"); + + gswmsLayerEncoder.setNativeName("WMS_NATIVE_NAME"); + gswmsLayerEncoder.setTitle("WMS_TITLE"); + gswmsLayerEncoder.setNativeCRS("EPSG:4326"); + gswmsLayerEncoder.setEnabled(true); + + } + + /** + * Test method for {@link GSWMSLayerEncoder#GSWMSLayerEncoder()}. + */ + @Test + public void testProperties() { + Assert.assertEquals( + true, + Boolean.parseBoolean(gswmsLayerEncoder.getRoot().getChild("enabled") + .getValue())); + Assert.assertEquals( + "WMS_NAME", + gswmsLayerEncoder.getRoot().getChild("name").getValue()); + Assert.assertEquals( + "WMS_NATIVE_NAME", + gswmsLayerEncoder.getRoot().getChild("nativeName").getValue()); + Assert.assertEquals( + "WMS_TITLE", + gswmsLayerEncoder.getRoot().getChild("title").getValue()); + Assert.assertEquals( + "EPSG:4326", + gswmsLayerEncoder.getRoot().getChild("nativeCRS").getValue()); + } +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPublisherWmsTest.java b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPublisherWmsTest.java new file mode 100644 index 0000000..717c89b --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/publisher/GeoserverRESTPublisherWmsTest.java @@ -0,0 +1,68 @@ +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.GSAbstractStoreEncoder; +import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; +import it.geosolutions.geoserver.rest.encoder.GSWMSLayerEncoder; +import it.geosolutions.geoserver.rest.manager.GeoServerRESTStoreManager; +import org.junit.After; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.FileNotFoundException; +import java.io.IOException; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + * Testcase for publishing wms 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 draktina + */ +public class GeoserverRESTPublisherWmsTest extends GeoserverRESTTest { + private final static Logger LOGGER = LoggerFactory.getLogger(GeoserverRESTPublisherWmsTest.class); + + + @After + public void cleanUp(){ + } + + @Test + public void testPublishUnexistingWmsLayer(){ + if (!enabled()) { + return; + } + + String wsName = "this_ws_does_not_exist"; + String storeName = "this_store_does_not_exist"; + String layerName ="this_layer_does_not_exist"; + + GSWMSLayerEncoder gswmsLayerEncoder = new GSWMSLayerEncoder(); + gswmsLayerEncoder.setName(layerName); + GSLayerEncoder layerEncoder = new GSLayerEncoder(); + + boolean ok = publisher.publishWMSLayer(wsName, storeName, gswmsLayerEncoder, layerEncoder); + assertFalse("added not existing layer", ok); + } + + + @Test + public void testUnpublishUnexistingWmsLayer() throws IOException { + if (!enabled()) { + return; + } + + String wsName = "this_ws_does_not_exist"; + String storeName = "this_store_does_not_exist"; + String layerName ="this_layer_does_not_exist"; + + boolean ok = publisher.unpublishWmsLayer(wsName, storeName, layerName); + assertFalse("removed not existing layer", ok); + } +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/wmsstore/WmsStoreEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/wmsstore/WmsStoreEncoderTest.java new file mode 100644 index 0000000..325b8e4 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/wmsstore/WmsStoreEncoderTest.java @@ -0,0 +1,36 @@ +package it.geosolutions.geoserver.rest.wmsstore; + +import it.geosolutions.geoserver.rest.encoder.GSAbstractStoreEncoder; +import it.geosolutions.geoserver.rest.encoder.datastore.GSOracleNGDatastoreEncoder; +import it.geosolutions.geoserver.rest.encoder.wmsstore.GSWmsStoreEncoder; +import java.net.URL; + +import java.net.MalformedURLException; + +/** + * Created by drakiko on 15/09/2015. + */ +public class WmsStoreEncoderTest extends WmsStoreIntegrationTest{ + + public WmsStoreEncoderTest() throws IllegalArgumentException, MalformedURLException { + super(System.getProperty("wmsIgnore", "true").equalsIgnoreCase("true")); + + } + + @Override + public GSAbstractStoreEncoder getStoreEncoderTest() { + + URL url = null; + try { + url = new URL(System.getProperty("wmsStoreUrl", "test")); + } catch (MalformedURLException e) { + // + } + + GSWmsStoreEncoder wmsStoreEncoder = new GSWmsStoreEncoder(System.getProperty("wmsDataStoreName", "testWmsIntegration"), url); + + wmsStoreEncoder.setEnabled(true); + + return wmsStoreEncoder; + } +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/wmsstore/WmsStoreIntegrationTest.java b/src/test/java/it/geosolutions/geoserver/rest/wmsstore/WmsStoreIntegrationTest.java new file mode 100644 index 0000000..5d7f127 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/wmsstore/WmsStoreIntegrationTest.java @@ -0,0 +1,166 @@ +package it.geosolutions.geoserver.rest.wmsstore; + +import it.geosolutions.geoserver.rest.GeoserverRESTTest; +import it.geosolutions.geoserver.rest.decoder.RESTWmsStore; +import it.geosolutions.geoserver.rest.encoder.GSAbstractStoreEncoder; +import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; +import it.geosolutions.geoserver.rest.encoder.GSWMSLayerEncoder; +import it.geosolutions.geoserver.rest.encoder.wmsstore.GSWmsStoreEncoder; +import it.geosolutions.geoserver.rest.manager.GeoServerRESTStoreManager; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.MalformedURLException; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +/** + *

+ * Since these tests require a running Store instance, this is more like integration tests.
+ * + * For testing that a wmsstore is properly configured, a layer publication has to be attempted + * + * @see GeoserverRESTTest + */ +public abstract class WmsStoreIntegrationTest extends GeoserverRESTTest { + + protected final GeoServerRESTStoreManager storeManager; + + /** + * ignore integration tests + */ + protected final boolean ignore; + + private final static Logger LOGGER = LoggerFactory.getLogger(WmsStoreIntegrationTest.class); + + public boolean isIgnore() { + return ignore; + } + + /** + * + * @param ignore true if this test should be disabled + * @throws IllegalArgumentException + * @throws MalformedURLException + */ + public WmsStoreIntegrationTest(boolean ignore) throws IllegalArgumentException, + MalformedURLException { + super(); + this.storeManager = new GeoServerRESTStoreManager(URL, RESTUSER, RESTPW); + this.ignore = ignore; + } + + public abstract GSAbstractStoreEncoder getStoreEncoderTest(); + + @Test + public void testCreateWmsStore() throws IllegalArgumentException, MalformedURLException { + if (!enabled() || ignore) { + return; + } +// deleteAll(); + + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + // creation test + GSAbstractStoreEncoder storeEncoder = getStoreEncoderTest(); + + String storeName = storeEncoder.getName(); + // String description = storeEncoder.getDescription(); + + boolean created = storeManager.create(DEFAULT_WS, storeEncoder); + + assertTrue("*** store " + storeName + " has not been created.", created); + + RESTWmsStore wmsStore = reader.getWmsStore(DEFAULT_WS, storeName); + assertNotNull(wmsStore); + + // check if the wmsstore is properly configured in GS for publishing layers + String layername = "wmsStoreLayer"; + + if (storeEncoder instanceof GSWmsStoreEncoder) + layername = layername.toUpperCase(); + + GSWMSLayerEncoder fte = new GSWMSLayerEncoder(); + fte.setName(layername); + fte.setNativeName(layername); + fte.setTitle(layername); + fte.setNativeCRS("EPSG:4326"); + fte.setEnabled(true); + + GSLayerEncoder layerEncoder = new GSLayerEncoder(); + layerEncoder.setEnabled(true); + layerEncoder.setQueryable(true); + layerEncoder.setDefaultStyle("polygon"); + + boolean published = publisher.publishWMSLayer(DEFAULT_WS, storeName, fte, layerEncoder); + + assertTrue("*** Test layer " + layername + + " has not been published. Problem in wms store configuration", published); + + // removing test + boolean removed = storeManager.remove(DEFAULT_WS, storeEncoder, true); + assertTrue("*** Wmsstore " + storeName + " has not been removed.", removed); + assertTrue(publisher.removeWorkspace(DEFAULT_WS, false)); + } + + @Test + public void testUnpublishWmsStore() throws IllegalArgumentException, MalformedURLException { + if (!enabled() || ignore) { + return; + } +// deleteAll(); + + assertTrue(publisher.createWorkspace(DEFAULT_WS)); + + // creation test + GSAbstractStoreEncoder storeEncoder = getStoreEncoderTest(); + + String storeName = storeEncoder.getName(); + // String description = storeEncoder.getDescription(); + + boolean created = storeManager.create(DEFAULT_WS, storeEncoder); + + assertTrue("*** store " + storeName + " has not been created.", created); + + RESTWmsStore wmsStore = reader.getWmsStore(DEFAULT_WS, storeName); + assertNotNull(wmsStore); + + // check if the wmsstore is properly configured in GS for publishing layers + String layername = "wmsStoreLayer"; + + if (storeEncoder instanceof GSWmsStoreEncoder) + layername = layername.toUpperCase(); + + GSWMSLayerEncoder fte = new GSWMSLayerEncoder(); + fte.setName(layername); + fte.setNativeName(layername); + fte.setTitle(layername); + fte.setNativeCRS("EPSG:4326"); + fte.setEnabled(true); + + GSLayerEncoder layerEncoder = new GSLayerEncoder(); + layerEncoder.setEnabled(true); + layerEncoder.setQueryable(true); + layerEncoder.setDefaultStyle("polygon"); + + boolean published = publisher.publishWMSLayer(DEFAULT_WS, storeName, fte, layerEncoder); + + assertTrue("*** Test layer " + layername + + " has not been published. Problem in wms store configuration", published); + + boolean unpublished = publisher.unpublishWmsLayer(DEFAULT_WS, storeName, layername); + + assertTrue("*** Test layer " + layername + + " has not been unpublished. Problem in wms store configuration", unpublished); + + + // removing test + boolean removed = storeManager.remove(DEFAULT_WS, storeEncoder, true); + assertTrue("*** Wmsstore " + storeName + " has not been removed.", removed); + assertTrue(publisher.removeWorkspace(DEFAULT_WS, false)); + + } + } +