From 017deeae253afff1a6d9392e8b13560944f5a5f6 Mon Sep 17 00:00:00 2001 From: r3sist3nt Date: Tue, 27 Dec 2016 12:06:46 +0100 Subject: [PATCH 1/3] Added the datastore encoder for the WMS-Datastore in GeoServer. --- .../rest/GeoServerRESTPublisher.java | 43 ++++++--- .../datastore/GSWMSDatastoreEncoder.java | 95 +++++++++++++++++++ 2 files changed, 124 insertions(+), 14 deletions(-) create mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSWMSDatastoreEncoder.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index c68c533..d3e4b75 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -562,8 +562,13 @@ public class GeoServerRESTPublisher { * Vector based data sources. Can be a file in the case of a Shapefile, a database connection in the case of PostGIS, or a server in the case * of a remote Web Feature Service. */ - DATASTORES; + DATASTORES, + /** + * WMS-Service Based Data Source. + * Can be used to publish WMS data from other Servers. + */ + WMSSTORES; /** * @deprecated use {@link StoreType#getTypeNameWithFormat(StoreType, Format)} * @param type @@ -600,7 +605,13 @@ public class GeoServerRESTPublisher { * Vector based data sources. Can be a file in the case of a Shapefile, a database connection in the case of PostGIS, or a server in the case * of a remote Web Feature Service. */ - DATASTORES; + DATASTORES, + + /** + * WMS-Service Based Data Source. + * Can be used to publish WMS data from other Servers. + */ + WMSSTORES; /** * Get the type name of a StoreType with the specified format. @@ -632,12 +643,14 @@ public class GeoServerRESTPublisher { */ public static String getTypeName(StoreType type) { switch (type) { - case COVERAGESTORES: - return "coverages"; // Format - case DATASTORES: - return "featureTypes"; - default: - return "coverages"; + case COVERAGESTORES: + return "coverages"; // Format + case DATASTORES: + return "featureTypes"; + case WMSSTORES: + return "wmsStore"; + default: + return "coverages"; } } @@ -649,12 +662,14 @@ public class GeoServerRESTPublisher { */ public static String getType(StoreType type) { switch (type) { - case COVERAGESTORES: - return "coverageStore"; // Format - case DATASTORES: - return "dataStore"; - default: - return "coverageStore"; + case COVERAGESTORES: + return "coverageStore"; // Format + case DATASTORES: + return "dataStore"; + case WMSSTORES: + return "wmsStore"; + default: + return "coverageStore"; } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSWMSDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSWMSDatastoreEncoder.java new file mode 100644 index 0000000..1ab06c1 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSWMSDatastoreEncoder.java @@ -0,0 +1,95 @@ +package it.geosolutions.geoserver.rest.encoder.datastore; + +import it.geosolutions.geoserver.rest.encoder.GSAbstractStoreEncoder; +import it.geosolutions.geoserver.rest.GeoServerRESTPublisher; +import it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder; + +import java.net.URL; + +/** + * Created by r3sist3nt on 21.12.2016. + */ +public class GSWMSDatastoreEncoder extends GSAbstractStoreEncoder { + static final String TYPE = "wmsStore"; + + static final int DEFAULT_MAX_CONNECTIONS = 10; + static final int DEFAULT_READ_TIMEOUT = 16; + static final int DEFAULT_CONNECTION_TIMEOUT = 16; + static final boolean DEFAULT_USE_CONNECTION_POOLING = true; + + /** + * Encoder for the WMS-Datastore + * @author r3sist3nt + * + * Can be used to create a WMS Datastore on the Server. + */ + public GSWMSDatastoreEncoder(String workspace,String name) { + // Set fixed values + super(GeoServerRESTPublisher.StoreType.WMSSTORES,"wmsStores"); + setType(TYPE); + setRoot("wmsStore"); + set("name" , name); + set("type","WMS"); + + + //Set Metadata + NestedElementEncoder e = new NestedElementEncoder("metadata"); + e.add("useConnectionPooling", Boolean.toString(DEFAULT_USE_CONNECTION_POOLING)); + addContent(e.getRoot()); + + //Set Default Values + setMaxConnections(DEFAULT_MAX_CONNECTIONS); + setReadTimeout(DEFAULT_READ_TIMEOUT); + setConnectTimeout(DEFAULT_CONNECTION_TIMEOUT); + + + } + + + /** + * Set the URL for the the remote Capabilities Document. + * @param capabilitiesURL Service Endpoint. + */ + public void setCapabilitiesURL(String capabilitiesURL){ + set("capabilitiesURL", capabilitiesURL); + } + + public void setReadTimeout(int readTimeout){ + set("readTimeout", ""+readTimeout); + } + + public void setConnectTimeout(int connectTimeout){ + set("connectTimeout",""+connectTimeout); + } + + public void setEnabled(boolean e){ + set("enabled",Boolean.toString(e)); + } + + public void setMaxConnections(int maxConnections){ + set("maxConnections", ""+maxConnections); + + } + + + + /** + * 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().equals("")) { + throw new IllegalArgumentException( + "Shapefile store URL cannot be null or empty"); + } + } + + /** + * @return {@value #TYPE} + */ + protected String getValidType() { + return TYPE; + } +} From 62089714d5fd18b57751f750797b5fc09307928a Mon Sep 17 00:00:00 2001 From: jmaczuga Date: Tue, 27 Dec 2016 15:04:10 +0100 Subject: [PATCH 2/3] Added Support for WMS-Layer publishing from WMS-Stores. --- .../rest/GeoServerRESTPublisher.java | 43 ++++++ .../geoserver/rest/GeoServerRESTReader.java | 6 + .../GSWMSDatastoreEncoder.java | 2 +- .../encoder/wmsstore/GSWMSTypeEncoder.java | 133 ++++++++++++++++++ 4 files changed, 183 insertions(+), 1 deletion(-) rename src/main/java/it/geosolutions/geoserver/rest/encoder/{datastore => wmsstore}/GSWMSDatastoreEncoder.java (97%) create mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSTypeEncoder.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index d3e4b75..f0f2157 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -39,6 +39,7 @@ import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy import it.geosolutions.geoserver.rest.encoder.GSWorkspaceEncoder; import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; +import it.geosolutions.geoserver.rest.encoder.wmsstore.GSWMSTypeEncoder; import it.geosolutions.geoserver.rest.manager.GeoServerRESTStructuredGridCoverageReaderManager; import it.geosolutions.geoserver.rest.manager.GeoServerRESTStructuredGridCoverageReaderManager.ConfigureCoveragesOption; import it.geosolutions.geoserver.rest.manager.GeoServerRESTStyleManager; @@ -985,6 +986,48 @@ public class GeoServerRESTPublisher { return publishDBLayer(workspace, storename, fte, layerEncoder); } + public boolean publishWMSLayer(final String workspace, final String storename, final GSWMSTypeEncoder fte, final GSLayerEncoder layerEncoder){ + String ftypeXml = fte.toString(); + + StringBuilder postUrl = new StringBuilder(restURL).append("/rest/workspaces/") + .append(workspace).append("/wmsstores/").append(storename).append("/wmslayers.xml"); + + final String layername = fte.getName(); + if (layername == null || layername.isEmpty()) { + if (LOGGER.isErrorEnabled()) + LOGGER.error("GSFeatureTypeEncoder has no valid name associated, try using GSFeatureTypeEncoder.setName(String)"); + return false; + } + + String configuredResult = HTTPUtils.postXml(postUrl.toString(), ftypeXml, this.gsuser, + this.gspass); + boolean published = configuredResult != null; + boolean configured = false; + + if (!published) { + LOGGER.warn("Error in publishing (" + configuredResult + ") " + workspace + ":" + + storename + "/" + layername); + } else { + LOGGER.info("DB layer successfully added (layer:" + layername + ")"); + + if (layerEncoder == null) { + if (LOGGER.isErrorEnabled()) + LOGGER.error("GSLayerEncoder is null: Unable to find the defaultStyle for this layer"); + return false; + } + + configured = configureLayer(workspace, layername, layerEncoder); + + if (!configured) { + LOGGER.warn("Error in configuring (" + configuredResult + ") " + workspace + ":" + + storename + "/" + layername); + } else { + LOGGER.info("DB layer successfully configured (layer:" + layername + ")"); + } + } + + return published && configured; + } /** * Publish and configure a new layer from an existing DataStore (v. gr. a layer from a DB table). * diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTReader.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTReader.java index 5aa06ef..8297477 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTReader.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTReader.java @@ -833,6 +833,12 @@ public class GeoServerRESTReader { return RESTFeatureTypeList.build(load(url)); } + public RESTFeatureTypeList getWMSFeatureTypes(String workspace){ + String url; + + return null; + } + /** * Get detailed info about a given Layer. * diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSWMSDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSDatastoreEncoder.java similarity index 97% rename from src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSWMSDatastoreEncoder.java rename to src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSDatastoreEncoder.java index 1ab06c1..675cf48 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSWMSDatastoreEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSDatastoreEncoder.java @@ -1,4 +1,4 @@ -package it.geosolutions.geoserver.rest.encoder.datastore; +package it.geosolutions.geoserver.rest.encoder.wmsstore; import it.geosolutions.geoserver.rest.encoder.GSAbstractStoreEncoder; import it.geosolutions.geoserver.rest.GeoServerRESTPublisher; diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSTypeEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSTypeEncoder.java new file mode 100644 index 0000000..573f706 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSTypeEncoder.java @@ -0,0 +1,133 @@ +/* + * 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.encoder.wmsstore; + +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; +import it.geosolutions.geoserver.rest.encoder.feature.FeatureTypeAttribute; +import it.geosolutions.geoserver.rest.encoder.feature.GSAttributeEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.GSFeatureDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.GSVirtualTableEncoder; + +import org.jdom.Element; + +/** + * + * Encode a GeoServer resource as FeatureType + * + * @author ETj (etj at geo-solutions.it) + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + */ +public class GSWMSTypeEncoder extends GSResourceEncoder { + + public final static String ATTRIBUTES = "attributes"; + + final private Element attributes = new Element(ATTRIBUTES); + + public GSWMSTypeEncoder() { + super("wmsLayer"); + addContent(attributes); + } + + + /** + * @deprecated Use {@link GSResourceEncoder#addMetadataDimension(String, GSDimensionInfoEncoder)} this method will be removed soon + * @param key + * @param dimensionInfo + * + */ + protected void addMetadata(String key, GSFeatureDimensionInfoEncoder dimensionInfo) { + super.addMetadata(key, dimensionInfo); + } + + + /** + * @deprecated Use {@link GSResourceEncoder#setMetadataDimension(String, GSDimensionInfoEncoder)} this method will be removed soon + * @param key + * @param dimensionInfo + * + */ + public void setMetadata(String key, GSFeatureDimensionInfoEncoder dimensionInfo) { + super.setMetadata(key, dimensionInfo); + } + + /** + * Add a VirtualTable (SQL View feature type) + * + * @param virtualtable + */ + protected void addMetadataVirtualTable( + final GSVirtualTableEncoder virtualtable) { + super.addMetadata("JDBC_VIRTUAL_TABLE", virtualtable); + } + + /** + * Set a VirtualTable (SQL View feature type) + * + * @param virtualtable + */ + public void setMetadataVirtualTable(final GSVirtualTableEncoder virtualtable) { + super.setMetadata("JDBC_VIRTUAL_TABLE", virtualtable); + } + + /** + * Deletes the VirtualTable metadata + * + * @return true if deleted, false otherwise + */ + public boolean delMetadataVirtualTable(){ + return super.delMetadata("JDB_VIRTUAL_TABLE"); + } + + /** + * delete a keyword from the list + * + * @param keyword + * @return true if something is removed, false otherwise + */ + public boolean delAttribute(final String keyword) { + final Element el = new Element("string"); + el.setText(keyword); + return (attributes.removeContent(GSAttributeEncoder.getFilterByName(keyword))).size() == 0 ? false + : true; + } + + /** + * @param attribute the attribute to add + */ + protected void addAttribute(GSAttributeEncoder attribute) { + attributes.addContent(attribute.getRoot()); + } + + /** + * @param attribute the attribute to set (overriding an attribute with the same name if present) + */ + public void setAttribute(GSAttributeEncoder attribute) { + delAttribute(attribute.getAttribute(FeatureTypeAttribute.name)); + addAttribute(attribute); + } + +} \ No newline at end of file From 607d3298d67bc67e8297f92d017093000e4ae91a Mon Sep 17 00:00:00 2001 From: jmaczuga Date: Tue, 27 Dec 2016 15:07:20 +0100 Subject: [PATCH 3/3] Removed unused code. --- .../it/geosolutions/geoserver/rest/GeoServerRESTReader.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTReader.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTReader.java index 8297477..5aa06ef 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTReader.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTReader.java @@ -833,12 +833,6 @@ public class GeoServerRESTReader { return RESTFeatureTypeList.build(load(url)); } - public RESTFeatureTypeList getWMSFeatureTypes(String workspace){ - String url; - - return null; - } - /** * Get detailed info about a given Layer. *