From c9d181e4731764810431700263b1db87c6592788 Mon Sep 17 00:00:00 2001 From: etj Date: Tue, 18 Jun 2013 15:18:03 +0200 Subject: [PATCH 1/7] Back to SNAPSHOT version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 16f977e..5cb9542 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ it.geosolutions geoserver-manager - 1.5.2 + 1.5-SNAPSHOT jar From ee6b428e633540f146a371b9b27c1eef4e351d1e Mon Sep 17 00:00:00 2001 From: eblondel Date: Tue, 25 Jun 2013 14:04:20 +0200 Subject: [PATCH 2/7] #81 - 1.5.x - fix PostGIS / OracleNG Estimated extends param --- .../rest/encoder/datastore/GSOracleNGDatastoreEncoder.java | 6 ++++++ .../rest/encoder/datastore/GSPostGISDatastoreEncoder.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSOracleNGDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSOracleNGDatastoreEncoder.java index b4c53fc..ca5927c 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSOracleNGDatastoreEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSOracleNGDatastoreEncoder.java @@ -44,6 +44,7 @@ public class GSOracleNGDatastoreEncoder extends GSAbstractDatastoreEncoder { static final boolean DEFAULT_LOOSE_BBOX = true; static final boolean DEFAULT_PREPARED_STATEMENTS = true; static final int DEFAULT_MAX_OPEN_PREPARED_STATEMENTS = 50; + static final boolean DEFAULT_ESTIMATED_EXTENDS = false; /** * Create an {@value #TYPE} datastore with default connection parameters, @@ -80,6 +81,7 @@ public class GSOracleNGDatastoreEncoder extends GSAbstractDatastoreEncoder { setLooseBBox(DEFAULT_LOOSE_BBOX); setPreparedStatements(DEFAULT_PREPARED_STATEMENTS); setMaxOpenPreparedStatements(DEFAULT_MAX_OPEN_PREPARED_STATEMENTS); + setEstimatedExtends(DEFAULT_ESTIMATED_EXTENDS); } /** @@ -172,6 +174,10 @@ public class GSOracleNGDatastoreEncoder extends GSAbstractDatastoreEncoder { connectionParameters.set("Max open prepared statements", Integer.toString(maxOpenPreparedStatements)); } + public void setEstimatedExtends(boolean estimatedExtends){ + connectionParameters.set("Estimated extends", Boolean.toString(estimatedExtends)); + } + /** * Check database validity. * diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSPostGISDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSPostGISDatastoreEncoder.java index f4fd813..621a983 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSPostGISDatastoreEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/datastore/GSPostGISDatastoreEncoder.java @@ -43,6 +43,7 @@ public class GSPostGISDatastoreEncoder extends GSAbstractDatastoreEncoder { static final boolean DEFAULT_LOOSE_BBOX = true; static final boolean DEFAULT_PREPARED_STATEMENTS = false; static final int DEFAULT_MAX_OPEN_PREPARED_STATEMENTS = 50; + static final boolean DEFAULT_ESTIMATED_EXTENDS = false; /** * @@ -63,6 +64,7 @@ public class GSPostGISDatastoreEncoder extends GSAbstractDatastoreEncoder { setLooseBBox(DEFAULT_LOOSE_BBOX); setPreparedStatements(DEFAULT_PREPARED_STATEMENTS); setMaxOpenPreparedStatements(DEFAULT_MAX_OPEN_PREPARED_STATEMENTS); + setEstimatedExtends(DEFAULT_ESTIMATED_EXTENDS); } @@ -142,6 +144,10 @@ public class GSPostGISDatastoreEncoder extends GSAbstractDatastoreEncoder { connectionParameters.set("Max open prepared statements", Integer.toString(maxOpenPreparedStatements)); } + public void setEstimatedExtends(boolean estimatedExtends){ + connectionParameters.set("Estimated extends", Boolean.toString(estimatedExtends)); + } + /** * @return {@value #TYPE} */ From c61a5055cd0f08048c5b0f349ff9921e4cfb3e53 Mon Sep 17 00:00:00 2001 From: carlo cancellieri Date: Tue, 2 Jul 2013 16:39:13 +0200 Subject: [PATCH 3/7] port: simplify the publisher --- .../rest/GeoServerRESTPublisher.java | 155 ++++++++---------- .../manager/GeoServerRESTStoreManager.java | 3 + 2 files changed, 69 insertions(+), 89 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index f31c4fd..37d91ed 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -371,8 +371,7 @@ public class GeoServerRESTPublisher { sUrl += "?name=" + encode(name); } LOGGER.debug("POSTing new style " + name + " to " + sUrl); - String result = HTTPUtils - .post(sUrl, sldFile, Format.SLD.getContentType(), gsuser, gspass); + String result = HTTPUtils.post(sUrl, sldFile, Format.SLD.getContentType(), gsuser, gspass); return result != null; } @@ -513,7 +512,7 @@ public class GeoServerRESTPublisher { * @return */ public static String getTypeName(StoreType type) { - return StoreType.getTypeNameWithFormat(type,Format.XML); + return StoreType.getTypeNameWithFormat(type, Format.XML); } /** @@ -552,9 +551,9 @@ public class GeoServerRESTPublisher { * @return "featureTypes.{xml|html|...}" for DATASTORES, "coverages.{xml|html|...}" otherwise. */ public static String getTypeNameWithFormat(StoreType type, Format format) { - return getTypeName(type)+"."+format; + return getTypeName(type) + "." + format; } - + /** * Get the type name of a StoreType with the specified format. * @@ -563,9 +562,9 @@ public class GeoServerRESTPublisher { * @return "featuretypes.{xml|html|...}" for DATASTORES, "coverages.{xml|html|...}" otherwise. */ public String getTypeNameWithFormat(Format format) { - return getTypeName(this).toLowerCase()+"."+format; + return getTypeName(this).toLowerCase() + "." + format; } - + /** * Get the type name of a StoreType. * @@ -582,7 +581,7 @@ public class GeoServerRESTPublisher { return "coverages"; } } - + /** * Get the type name of a StoreType. * @@ -599,7 +598,7 @@ public class GeoServerRESTPublisher { return "coverageStore"; } } - + /** * Get the type name of a StoreType. * @@ -608,7 +607,7 @@ public class GeoServerRESTPublisher { public String getTypeName() { return getTypeName(this); } - + /** * Get the type of a StoreType. * @@ -774,7 +773,7 @@ public class GeoServerRESTPublisher { ParameterConfigure configure, NameValuePair... params) throws FileNotFoundException, IllegalArgumentException { if (workspace == null || dsType == null || storeName == null || method == null - | extension == null || mimeType == null || uri == null) { + || extension == null || mimeType == null || uri == null) { throw new IllegalArgumentException("Null argument"); } StringBuilder sbUrl = new StringBuilder(restURL).append("/rest/workspaces/") @@ -876,7 +875,7 @@ public class GeoServerRESTPublisher { /** * Create a PostGIS datastore. * - * @deprecated Will be deleted in next version 1.6.x, use {@link GeoServerRESTStoreManager} instead. + * @deprecated Will be deleted in next version 1.5.x, use {@link GeoServerRESTDatastoreManager} instead. * * @param workspace Name of the workspace to contain the database. This will also be the prefix of any layer names created from tables in the * database. @@ -885,7 +884,7 @@ public class GeoServerRESTPublisher { * @return true if the PostGIS datastore has been successfully created, false otherwise */ public boolean createPostGISDatastore(String workspace, - it.geosolutions.geoserver.rest.encoder.GSPostGISDatastoreEncoder datastoreEncoder) { + GSPostGISDatastoreEncoder datastoreEncoder) { String sUrl = restURL + "/rest/workspaces/" + workspace + "/datastores/"; String xml = datastoreEncoder.toString(); String result = HTTPUtils.postXml(sUrl, xml, gsuser, gspass); @@ -1368,7 +1367,7 @@ public class GeoServerRESTPublisher { return null; } } - + /** * Gets the mime type from a format. * @@ -1378,7 +1377,7 @@ public class GeoServerRESTPublisher { public String getContentType() { return getContentType(this); } - + /** * Returns a lowercase representation of the parameter. Useful when constructing the REST request. */ @@ -2008,32 +2007,7 @@ public class GeoServerRESTPublisher { */ public boolean removeDatastore(String workspace, String storename, final boolean recurse) throws IllegalArgumentException { - try { - 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!"); - - final StringBuilder url = new StringBuilder(restURL); - url.append("/rest/workspaces/").append(workspace).append("/datastores/") - .append(storename); - if (recurse) - url.append("?recurse=true"); - final URL deleteStore = new URL(url.toString()); - - boolean deleted = HTTPUtils.delete(deleteStore.toExternalForm(), gsuser, gspass); - if (!deleted) { - LOGGER.warn("Could not delete datastore " + workspace + ":" + storename); - } else { - LOGGER.info("Datastore successfully deleted " + workspace + ":" + storename); - } - - return deleted; - } catch (MalformedURLException ex) { - if (LOGGER.isErrorEnabled()) - LOGGER.error(ex.getLocalizedMessage(), ex); - return false; - } + return removeStore(workspace, storename, StoreType.DATASTORES, recurse); } /** @@ -2045,13 +2019,7 @@ public class GeoServerRESTPublisher { * @deprecated use {@link #removeCoverageStore(String, String, boolean)} */ public boolean removeCoverageStore(String workspace, String storename) { - try { - return removeCoverageStore(workspace, storename, true); - } catch (IllegalArgumentException e) { - if (LOGGER.isErrorEnabled()) - LOGGER.error("Arguments may not be null or empty!", e); - } - return false; + return removeCoverageStore(workspace, storename, true); } /** @@ -2064,6 +2032,21 @@ public class GeoServerRESTPublisher { */ public boolean removeCoverageStore(final String workspace, final String storename, final boolean recurse) throws IllegalArgumentException { + return removeStore(workspace, storename, StoreType.COVERAGESTORES, recurse); + } + + /** + * Remove a given Datastore in a given Workspace. + * + * @param workspace The name of the workspace + * @param storename The name of the Datastore to remove. + * @param the {@link StoreType} type + * @param recurse if remove should be performed recursively + * @throws IllegalArgumentException if workspace or storename are null or empty + * @return true if the store was successfully removed. + */ + private boolean removeStore(String workspace, String storename, StoreType type, + final boolean recurse) throws IllegalArgumentException { try { if (workspace == null || storename == null) throw new IllegalArgumentException("Arguments may not be null!"); @@ -2071,7 +2054,7 @@ public class GeoServerRESTPublisher { throw new IllegalArgumentException("Arguments may not be empty!"); final StringBuilder url = new StringBuilder(restURL); - url.append("/rest/workspaces/").append(workspace).append("/coveragestores/") + url.append("/rest/workspaces/").append(workspace).append("/").append(type).append("/") .append(storename); if (recurse) url.append("?recurse=true"); @@ -2079,12 +2062,12 @@ public class GeoServerRESTPublisher { boolean deleted = HTTPUtils.delete(deleteStore.toExternalForm(), gsuser, gspass); if (!deleted) { - LOGGER.warn("Could not delete CoverageStore " + workspace + ":" + storename); + LOGGER.warn("Could not delete store " + workspace + ":" + storename); } else { - LOGGER.info("CoverageStore successfully deleted " + workspace + ":" + storename); + LOGGER.info("Store successfully deleted " + workspace + ":" + storename); } - return deleted; + return deleted; } catch (MalformedURLException ex) { if (LOGGER.isErrorEnabled()) LOGGER.error(ex.getLocalizedMessage(), ex); @@ -2101,13 +2084,7 @@ public class GeoServerRESTPublisher { * @deprecated {@link #removeWorkspace(String, boolean)} */ public boolean removeWorkspace(String workspace) { - try { - return removeWorkspace(workspace, false); - } catch (IllegalArgumentException e) { - if (LOGGER.isErrorEnabled()) - LOGGER.error("Arguments may not be null or empty!", e); - } - return false; + return removeWorkspace(workspace, false); } /** @@ -2154,15 +2131,15 @@ public class GeoServerRESTPublisher { * @param workspace the layer group workspace. * @param name the layer group name. * @return true if succeeded. - */ + */ public boolean removeLayerGroup(String workspace, String name) { String url = restURL + "/rest"; if (workspace == null) { url += "/layergroups/" + name; } else { url += "/workspaces/" + workspace + "/layergroups/" + name; - } - + } + try { URL deleteUrl = new URL(url); boolean deleted = HTTPUtils.delete(deleteUrl.toExternalForm(), gsuser, gspass); @@ -2179,9 +2156,9 @@ public class GeoServerRESTPublisher { if (LOGGER.isErrorEnabled()) LOGGER.error(ex.getLocalizedMessage(), ex); return false; - } + } } - + /** * Remove a layer group. * @@ -2261,17 +2238,17 @@ public class GeoServerRESTPublisher { final String store = HTTPUtils.get(url, this.gsuser, this.gspass); if (store != null) { - String storeTag=storeType.getTypeName(); -// switch (storeType) { -// case COVERAGESTORES: -// storeTag = storeType.toString().replaceAll("store", ""); -// break; -// case DATASTORES: -// storeTag = "featureTypes"; -// break; -// default: -// throw new IllegalArgumentException("Unrecognized type"); -// } + String storeTag = storeType.getTypeName(); + // switch (storeType) { + // case COVERAGESTORES: + // storeTag = storeType.toString().replaceAll("store", ""); + // break; + // case DATASTORES: + // storeTag = "featureTypes"; + // break; + // default: + // throw new IllegalArgumentException("Unrecognized type"); + // } String startTag = "<" + storeTag + ">"; int start = store.indexOf(startTag); @@ -2363,7 +2340,7 @@ public class GeoServerRESTPublisher { public boolean createLayerGroup(String name, GSLayerGroupEncoder group) { return createLayerGroup(null, name, group); } - + /** * Create a new LayerGroup using the specified encoder * @@ -2374,15 +2351,15 @@ public class GeoServerRESTPublisher { */ public boolean createLayerGroup(String workspace, String name, GSLayerGroupEncoder group) { String url = restURL + "/rest"; - if (workspace == null) { + if (workspace == null) { url += "/layergroups/"; } else { group.setWorkspace(workspace); url += "/workspaces/" + workspace + "/layergroups/"; - } - + } + group.setName(name); - + String sendResult = HTTPUtils.postXml(url, group.toString(), gsuser, gspass); if (sendResult != null) { if (LOGGER.isInfoEnabled()) { @@ -2393,9 +2370,9 @@ public class GeoServerRESTPublisher { LOGGER.warn("Error configuring LayerGroup " + name + " (" + sendResult + ")"); } - return sendResult != null; + return sendResult != null; } - + /** * Update a LayerGroup using the specified encoder * @@ -2406,7 +2383,7 @@ public class GeoServerRESTPublisher { public boolean configureLayerGroup(String name, GSLayerGroupEncoder group) { return configureLayerGroup(null, name, group); } - + /** * Update a LayerGroup using the specified encoder * @@ -2414,15 +2391,15 @@ public class GeoServerRESTPublisher { * @param name name of the layer group * @param group group encoder * @return true if operation was successful - */ + */ public boolean configureLayerGroup(String workspace, String name, GSLayerGroupEncoder group) { String url = restURL + "/rest"; if (workspace == null) { url += "/layergroups/" + name; } else { url += "/workspaces/" + workspace + "/layergroups/" + name; - } - + } + String sendResult = HTTPUtils.putXml(url, group.toString(), gsuser, gspass); if (sendResult != null) { if (LOGGER.isInfoEnabled()) { @@ -2433,9 +2410,9 @@ public class GeoServerRESTPublisher { LOGGER.warn("Error configuring LayerGroup " + name + " (" + sendResult + ")"); } - return sendResult != null; + return sendResult != null; } - + /** * Configure an existent coverage in a given workspace and coverage store * @@ -2538,7 +2515,7 @@ public class GeoServerRESTPublisher { * * configured - Only setup or configured feature types are returned. This is the default value. available - Only unconfigured feature types * (not yet setup) but are available from the specified datastore will be returned. available_with_geom - Same as available but only - * includes feature types that have a geometry attribute. all - The union of configured and available. + * includes feature types that have a geometry granule. all - The union of configured and available. * * * @return true if success diff --git a/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStoreManager.java b/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStoreManager.java index 34dad05..7097a24 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStoreManager.java +++ b/src/main/java/it/geosolutions/geoserver/rest/manager/GeoServerRESTStoreManager.java @@ -25,6 +25,7 @@ package it.geosolutions.geoserver.rest.manager; import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.Format; +import it.geosolutions.geoserver.rest.GeoServerRESTPublisher.StoreType; import it.geosolutions.geoserver.rest.HTTPUtils; import it.geosolutions.geoserver.rest.encoder.GSAbstractStoreEncoder; import it.geosolutions.geoserver.rest.encoder.datastore.GSAbstractDatastoreEncoder; @@ -120,4 +121,6 @@ public class GeoServerRESTStoreManager extends GeoServerRESTAbstractManager { // } return deleted; } + + } From 93b4aa8041197348f41ef299adf08e873f36a2a7 Mon Sep 17 00:00:00 2001 From: eblondel Date: Fri, 5 Jul 2013 08:21:54 +0200 Subject: [PATCH 4/7] #84 - 1.5.x - support encoding of multiple styles + tests --- .../rest/encoder/GSLayerEncoder.java | 37 ++++++++ .../rest/encoder/GSLayerEncoderTest.java | 85 +++++++++++++++++++ .../encoder/feature/GSFeatureEncoderTest.java | 7 ++ 3 files changed, 129 insertions(+) create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoderTest.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java index 9a474d4..52ab292 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java @@ -26,6 +26,7 @@ package it.geosolutions.geoserver.rest.encoder; import org.jdom.Element; +import org.jdom.filter.Filter; import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; @@ -38,10 +39,14 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; * */ public class GSLayerEncoder extends PropertyXMLEncoder { + + public final static String STYLES = "styles"; + final private Element stylesEncoder = new Element(STYLES); public GSLayerEncoder() { super("layer"); addEnabled(); + addContent(stylesEncoder); } /** @@ -130,4 +135,36 @@ public class GSLayerEncoder extends PropertyXMLEncoder { throw new IllegalArgumentException("Unable to set an empty or null parameter"); set("defaultStyle", defaultStyle); } + + /** + * Adds a style + * + * @param style + */ + public void addStyle(String style) { + final Element el = new Element("style"); + el.setText(style); + stylesEncoder.addContent(el); + } + + /** + * delete a style from the list + * + * @param style + * @return true if something is removed, false otherwise + */ + public boolean delStyle(final String style) { + final Element el = new Element("style"); + el.setText(style); + return (stylesEncoder.removeContent(new Filter() { + private static final long serialVersionUID = 1L; + + public boolean matches(Object obj) { + if (((Element) obj).getText().equals(style)) { + return true; + } + return false; + } + })).size() == 0 ? false : true; + } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoderTest.java new file mode 100644 index 0000000..8774bb1 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoderTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2007 - 2011 GeoSolutions S.A.S. + * http://www.geo-solutions.it + * + * GPLv3 + Classpath exception + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package it.geosolutions.geoserver.rest.encoder; + +import junit.framework.Assert; + +import org.jdom.Element; +import org.junit.Before; +import org.junit.Test; + +/** + * GSLayerEncoderTest + * + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | + * emmanuel.blondel@fao.org + */ +public class GSLayerEncoderTest { + + GSLayerEncoder layerEncoder; + + @Before + public void setup() { + layerEncoder = new GSLayerEncoder(); + layerEncoder.setEnabled(true); + layerEncoder.setQueryable(true); + layerEncoder.setDefaultStyle("point"); + layerEncoder.addStyle("additional_style1"); + layerEncoder.addStyle("additional_style2"); + } + + @Test + public void testProperties() { + Assert.assertEquals( + true, + Boolean.parseBoolean(layerEncoder.getRoot().getChild("enabled") + .getValue())); + Assert.assertEquals( + true, + Boolean.parseBoolean(layerEncoder.getRoot() + .getChild("queryable").getValue())); + } + + @Test + public void testDefaultStyle() { + Assert.assertEquals("point", + layerEncoder.getRoot().getChild("defaultStyle").getValue()); + } + + @Test + public void testMultipleStyles() { + Assert.assertEquals(2, layerEncoder.getRoot().getChild("styles") + .getChildren().size()); + Assert.assertEquals("additional_style1", ((Element) layerEncoder + .getRoot().getChild("styles").getChildren().get(0)).getText()); + Assert.assertEquals("additional_style2", ((Element) layerEncoder + .getRoot().getChild("styles").getChildren().get(1)).getText()); + } + + @Test + public void testRemoveStyle() { + Assert.assertTrue(layerEncoder.delStyle("additional_style1")); + Assert.assertEquals(1, layerEncoder.getRoot().getChild("styles") + .getChildren().size()); + Assert.assertEquals("additional_style2", ((Element) layerEncoder + .getRoot().getChild("styles").getChildren().get(0)).getText()); + } + +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java index 019183c..8f3ba2a 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java @@ -48,9 +48,14 @@ import org.slf4j.LoggerFactory; import org.springframework.core.io.ClassPathResource; /** + * Note on adding multiple available styles to the GSLayerEncoder: - to run the + * testIntegration(), 2 clones of the "point" style, named "point2" and "point3" + * have to be created. * * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | + * emmanuel.blondel@fao.org */ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest { protected final static Logger LOGGER = LoggerFactory.getLogger(GSFeatureEncoderTest.class); @@ -86,6 +91,8 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest { layerEncoder.setQueryable(true); layerEncoder.setDefaultStyle("point"); + layerEncoder.addStyle("point2"); + layerEncoder.addStyle("point3"); publisher.createWorkspace(DEFAULT_WS); From fca8dd65bc76f2f7c5d5d31b4c51510fd4528636 Mon Sep 17 00:00:00 2001 From: eblondel Date: Mon, 30 Sep 2013 14:13:38 +0200 Subject: [PATCH 5/7] #95 - add keyword decoder + ResourceDecoderTest --- .../geoserver/rest/decoder/RESTResource.java | 16 +++ .../decoder/MetadataDecoderTest.java | 19 --- .../decoder/ResourceDecoderTest.java | 120 ++++++++++++++++++ .../resources/testdata/coverageExample.xml | 6 + 4 files changed, 142 insertions(+), 19 deletions(-) create mode 100644 src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java index e3f01ba..9de1981 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java @@ -71,6 +71,22 @@ public class RESTResource { public String getAbstract() { return rootElem.getChildText("abstract"); } + + public List getKeywords(){ + List kwdsList = null; + + final Element keywordsRoot = rootElem.getChild("keywords"); + if(keywordsRoot != null){ + final List keywords = keywordsRoot.getChildren(); + if(keywords != null){ + kwdsList = new ArrayList(keywords.size()); + for(Element keyword : keywords){ + kwdsList.add(keyword.getValue()); + } + } + } + return kwdsList; + } public String getNameSpace() { return rootElem.getChild("namespace").getChildText("name"); diff --git a/src/test/java/it/geosolutions/geoserver/decoder/MetadataDecoderTest.java b/src/test/java/it/geosolutions/geoserver/decoder/MetadataDecoderTest.java index f608866..bf40d27 100644 --- a/src/test/java/it/geosolutions/geoserver/decoder/MetadataDecoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/decoder/MetadataDecoderTest.java @@ -69,23 +69,4 @@ public class MetadataDecoderTest { } } - @Test - public void testMetadataLinkInfo() throws IOException{ - File coverageFile = new ClassPathResource("testdata/coverageExample.xml").getFile(); - String coverageString = FileUtils.readFileToString(coverageFile); - RESTCoverage coverage = RESTCoverage.build(coverageString); - - List list = coverage.getEncodedMetadataLinkInfoList(); - - GSMetadataLinkInfoEncoder metadataLinkInfo1 = list.get(0); - Assert.assertEquals("text/xml", metadataLinkInfo1.getType()); - Assert.assertEquals("ISO19115:2003", metadataLinkInfo1.getMetadataType()); - Assert.assertEquals("http://www.organization.org/metadata1", metadataLinkInfo1.getContent()); - - GSMetadataLinkInfoEncoder metadataLinkInfo2 = list.get(1); - Assert.assertEquals("text/html",metadataLinkInfo2.getType()); - Assert.assertEquals("ISO19115:2003",metadataLinkInfo2.getMetadataType()); - Assert.assertEquals("http://www.organization.org/metadata2",metadataLinkInfo2.getContent()); - - } } diff --git a/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java b/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java new file mode 100644 index 0000000..bc20bc0 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/decoder/ResourceDecoderTest.java @@ -0,0 +1,120 @@ +package it.geosolutions.geoserver.decoder; + +import it.geosolutions.geoserver.rest.decoder.RESTCoverage; +import it.geosolutions.geoserver.rest.encoder.metadatalink.GSMetadataLinkInfoEncoder; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.springframework.core.io.ClassPathResource; + +/** +* ResourceDecoderTest +* +* @author eblondel +* +*/ +public class ResourceDecoderTest { + + + RESTCoverage coverage; + + @Before + public void setup() throws IOException { + File coverageFile = new ClassPathResource( + "testdata/coverageExample.xml").getFile(); + String coverageString = FileUtils.readFileToString(coverageFile); + coverage = RESTCoverage.build(coverageString); + } + + @Test + public void testName() { + Assert.assertEquals(coverage.getName(), "granuleTestMosaic"); + } + + @Test + public void testNativeName() { + Assert.assertEquals(coverage.getNativeName(), "granuleTestMosaic"); + } + + @Test + public void testTitle() { + Assert.assertEquals(coverage.getNativeName(), "granuleTestMosaic"); + } + + @Test + public void testAbstract() { + Assert.assertEquals(coverage.getAbstract(), "this is an abstract"); + } + + @Test + public void testKeywords() { + List keywords = coverage.getKeywords(); + Assert.assertEquals(keywords.get(0), "keyword1"); + Assert.assertEquals(keywords.get(1), "keyword2"); + Assert.assertEquals(keywords.get(2), "keyword3"); + } + + @Test + public void testNameSpace() { + Assert.assertEquals(coverage.getNameSpace(), "topp"); + } + + @Test + public void testStoreName() { + Assert.assertEquals(coverage.getStoreName(), "granuleTestMosaic"); + } + + @Test + public void testStoreType() { + Assert.assertEquals(coverage.getStoreType(), "coverageStore"); + } + + @Test + public void testStoreUrl() { + Assert.assertEquals( + coverage.getStoreUrl(), + "http://localhost:8080/geoserver/rest/workspaces/topp/coveragestores/granuleTestMosaic.xml"); + } + + @Test + public void testCRS() { + Assert.assertEquals(coverage.getCRS(), "EPSG:4326"); + } + + @Test + public void testBoundingBox() { + Assert.assertEquals(coverage.getMinX(), -180.0, 0); + Assert.assertEquals(coverage.getMaxX(), 180.0, 0); + Assert.assertEquals(coverage.getMinY(), -90, 0); + Assert.assertEquals(coverage.getMaxY(), 90, 0); + } + + @Test + public void testMetadataLinkInfo() throws IOException { + + List list = coverage + .getEncodedMetadataLinkInfoList(); + + GSMetadataLinkInfoEncoder metadataLinkInfo1 = list.get(0); + Assert.assertEquals("text/xml", metadataLinkInfo1.getType()); + Assert.assertEquals("ISO19115:2003", + metadataLinkInfo1.getMetadataType()); + Assert.assertEquals("http://www.organization.org/metadata1", + metadataLinkInfo1.getContent()); + + GSMetadataLinkInfoEncoder metadataLinkInfo2 = list.get(1); + Assert.assertEquals("text/html", metadataLinkInfo2.getType()); + Assert.assertEquals("ISO19115:2003", + metadataLinkInfo2.getMetadataType()); + Assert.assertEquals("http://www.organization.org/metadata2", + metadataLinkInfo2.getContent()); + + } + +} \ No newline at end of file diff --git a/src/test/resources/testdata/coverageExample.xml b/src/test/resources/testdata/coverageExample.xml index 4230091..8603547 100644 --- a/src/test/resources/testdata/coverageExample.xml +++ b/src/test/resources/testdata/coverageExample.xml @@ -2,11 +2,17 @@ granuleTestMosaic granuleTestMosaic + this is an abstract topp granuleTestMosaic + + keyword1 + keyword2 + keyword3 + text/xml From 8414e18ee572e8998a1d45d18512f93bbbe72ae4 Mon Sep 17 00:00:00 2001 From: carlo cancellieri Date: Mon, 30 Sep 2013 13:49:28 +0200 Subject: [PATCH 6/7] fix inheritance for RESTFeatureTyle getAttribute methods Conflicts: src/main/java/it/geosolutions/geoserver/rest/decoder/RESTFeatureType.java src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java --- .../rest/decoder/RESTFeatureType.java | 52 ++++++++++++ .../geoserver/rest/decoder/RESTResource.java | 84 +++---------------- 2 files changed, 64 insertions(+), 72 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTFeatureType.java b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTFeatureType.java index b5c34f5..5e8f0b2 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTFeatureType.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTFeatureType.java @@ -27,8 +27,14 @@ package it.geosolutions.geoserver.rest.decoder; import it.geosolutions.geoserver.rest.decoder.utils.JDOMBuilder; import it.geosolutions.geoserver.rest.decoder.utils.JDOMListIterator; +import it.geosolutions.geoserver.rest.encoder.feature.FeatureTypeAttribute; +import it.geosolutions.geoserver.rest.encoder.feature.GSAttributeEncoder; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; +import java.util.List; +import java.util.Map; import org.jdom.Element; /** @@ -244,4 +250,50 @@ public class RESTFeatureType extends RESTResource { } }; } + + /** + * @return + */ + public List> getAttributeList() { + List> attrsList = null; + + final Element attrsRoot = rootElem.getChild("attributes"); + if(attrsRoot!=null){ + final List attrs = attrsRoot.getChildren(); + if (attrs != null) { + attrsList = new ArrayList>(attrs.size()); + for (Element attr : attrs) { + Map attrsMap = new HashMap(); + attrsList.add(attrsMap); + for (FeatureTypeAttribute at : FeatureTypeAttribute.values()) { + String key = at.toString(); + attrsMap.put(at, attr.getChildText(key)); + } + } + } + } + return attrsList; + } + + public List getEncodedAttributeList() { + List attrsList = null; + + final Element attrsRoot = rootElem.getChild("attributes"); + if(attrsRoot!=null){ + final List attrs = attrsRoot.getChildren(); + if (attrs != null) { + attrsList = new ArrayList(attrs.size()); + for (Element attr : attrs) { + final GSAttributeEncoder attrEnc = new GSAttributeEncoder(); + for (FeatureTypeAttribute at : FeatureTypeAttribute.values()) { + String key = at.toString(); + attrEnc.setAttribute(at, attr.getChildText(key)); + } + attrsList.add(attrEnc); + } + + } + } + return attrsList; + } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java index 9de1981..a6f3411 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTResource.java @@ -133,43 +133,22 @@ public class RESTResource { return getLatLonEdge("maxy"); } + /** + * @deprecated use {@link RESTFeatureType#getAttributeList()} + * @return + * @throws UnsupportedOperationException + */ public List> getAttributeList() { - List> attrsList = null; - - final Element attrsRoot = rootElem.getChild("attributes"); - final List attrs = attrsRoot.getChildren(); - if (attrs != null) { - attrsList = new ArrayList>(attrs.size()); - for (Element attr : attrs) { - Map attrsMap = new HashMap(); - attrsList.add(attrsMap); - for (FeatureTypeAttribute at : FeatureTypeAttribute.values()) { - String key = at.toString(); - attrsMap.put(at, attr.getChildText(key)); - } - } - } - return attrsList; + throw new UnsupportedOperationException("This method is specific for RESTFeatureType"); } + /** + * @deprecated use {@link RESTFeatureType#getEncodedAttributeList()} + * @return + * @throws UnsupportedOperationException + */ public List getEncodedAttributeList() { - List attrsList = null; - - final Element attrsRoot = rootElem.getChild("attributes"); - final List attrs = attrsRoot.getChildren(); - if (attrs != null) { - attrsList = new ArrayList(attrs.size()); - for (Element attr : attrs) { - final GSAttributeEncoder attrEnc = new GSAttributeEncoder(); - for (FeatureTypeAttribute at : FeatureTypeAttribute.values()) { - String key = at.toString(); - attrEnc.setAttribute(at, attr.getChildText(key)); - } - attrsList.add(attrEnc); - } - - } - return attrsList; + throw new UnsupportedOperationException("This method is specific for RESTFeatureType"); } @@ -198,43 +177,4 @@ public class RESTResource { return metaLinksList; } - // /** - // * @return the list of available attribute names - // */ - // public List getAttributeNames() { - // return getAttributes("name"); - // } - // - // /** - // * @return a list of object which are String representation of Classes - // */ - // public List getAttributeBinding() { - // return getAttributes("binding"); - // } - - // /** - // *
- // * NATION
- // * 0
- // * 1
- // * true
- // * java.lang.Integer
- // * 3
- // *

- // * - // * @param name - // * @return - // */ - // private List getAttributes(String name) { - // final Element attrsRoot = rootElem.getChild("attributes"); - // final List attrs = attrsRoot.getChildren(); - // List attrNames = null; - // if (attrs != null) { - // attrNames = new ArrayList(attrs.size()); - // for (Element attr : attrs) { - // attrNames.add(attr.getChildText(name)); - // } - // } - // return attrNames; - // } } From a610bc3de96e5b411ceceb26355ef63164169bce Mon Sep 17 00:00:00 2001 From: etj Date: Tue, 8 Oct 2013 11:49:56 +0200 Subject: [PATCH 7/7] RESTLayer: provide workspace info in default style. Close #100. --- .../it/geosolutions/geoserver/rest/decoder/RESTLayer.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTLayer.java b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTLayer.java index 6013d27..dee1742 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTLayer.java +++ b/src/main/java/it/geosolutions/geoserver/rest/decoder/RESTLayer.java @@ -113,6 +113,14 @@ public class RESTLayer { return defaultStyle == null? null : defaultStyle.getChildText("name"); } + /** + * @see this issue + */ + public String getDefaultStyleWorkspace() { + Element defaultStyle = layerElem.getChild("defaultStyle"); + return defaultStyle == null? null : defaultStyle.getChildText("workspace"); + } + public String getTitle() { Element resource = layerElem.getChild("resource"); return resource.getChildText("title");