diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index c68c533..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; @@ -562,8 +563,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 +606,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 +644,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 +663,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"; } } @@ -970,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/encoder/wmsstore/GSWMSDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSDatastoreEncoder.java new file mode 100644 index 0000000..675cf48 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/wmsstore/GSWMSDatastoreEncoder.java @@ -0,0 +1,95 @@ +package it.geosolutions.geoserver.rest.encoder.wmsstore; + +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; + } +} 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