From 11204e4e294c28b9952c51e21838f4a8f24342b0 Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Thu, 14 Jul 2011 17:05:40 +0200 Subject: [PATCH 01/12] changes implementing enhancement 8 and code review 10, 11 --- .../rest/GeoServerRESTPublisher.java | 33 ++-- .../rest/encoder/GSCoverageEncoder.java | 62 -------- .../rest/encoder/GSFeatureTypeEncoder.java | 42 ----- .../rest/encoder/GSLayerEncoder.java | 8 +- .../encoder/GSPostGISDatastoreEncoder.java | 69 +++++---- .../rest/encoder/GSResourceEncoder.java | 73 +++++---- .../rest/encoder/GSWorkspaceEncoder.java | 6 +- .../encoder/coverage/GSCoverageEncoder.java | 64 -------- .../coverage/GSImageMosaicEncoder.java | 104 +++++++++++++ .../GSFeatureDimensionInfoEncoder.java | 25 +++ .../encoder/feature/GSFeatureTypeEncoder.java | 2 + .../metadata/GSDimensionInfoEncoder.java | 64 +++++++- .../encoder/metadata/GSMetadataEncoder.java | 29 +++- .../rest/encoder/utils/ElementUtils.java | 145 ++++++++++++++++++ ...Encoder.java => NestedElementEncoder.java} | 50 ++---- .../encoder/utils/PropertyXMLEncoder.java | 123 +++++---------- .../encoder/utils/TextNodeListEncoder.java | 66 -------- .../{XMLSerializer.java => XmlElement.java} | 42 +++-- .../GeoserverRESTPostgisDatastoreTest.java | 24 +-- .../GSCoverageEncoderTest.java | 40 +++-- .../coverage/GSImageMosaicEncoderTest.java | 86 +++++++++++ .../GSFeatureEncoderTest.java | 6 +- .../utils/EntryKeyListEncoderTest.java | 4 +- 23 files changed, 691 insertions(+), 476 deletions(-) delete mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/GSCoverageEncoder.java delete mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/GSFeatureTypeEncoder.java create mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java create mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtils.java rename src/main/java/it/geosolutions/geoserver/rest/encoder/utils/{EntryKeyListEncoder.java => NestedElementEncoder.java} (70%) delete mode 100644 src/main/java/it/geosolutions/geoserver/rest/encoder/utils/TextNodeListEncoder.java rename src/main/java/it/geosolutions/geoserver/rest/encoder/utils/{XMLSerializer.java => XmlElement.java} (70%) rename src/test/java/it/geosolutions/geoserver/rest/encoder/{utils => coverage}/GSCoverageEncoderTest.java (60%) create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoderTest.java rename src/test/java/it/geosolutions/geoserver/rest/encoder/{utils => feature}/GSFeatureEncoderTest.java (91%) diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index eb3b3f4..28bd0bc 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -38,6 +38,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; +import org.apache.commons.io.FilenameUtils; import org.apache.log4j.Logger; /** @@ -217,7 +218,7 @@ public class GeoServerRESTPublisher { try { GSLayerEncoder layerEncoder = new GSLayerEncoder(); - layerEncoder.setDefaultStyle(defaultStyle); + layerEncoder.addDefaultStyle(defaultStyle); configureLayer(layerEncoder, layerName); } catch (Exception e) { LOGGER.warn("Error in publishing shapefile " + e.getMessage(), e); @@ -267,8 +268,8 @@ public class GeoServerRESTPublisher { .append("/featuretypes/").append(layername); GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); - fte.setName(layername); - fte.setSRS(srs); + fte.addName(layername); + fte.addSRS(srs); String configuredResult = HTTPUtils.putXml(postUrl.toString(), fte.toString(), this.gsuser, this.gspass); boolean shpConfigured = configuredResult != null; @@ -308,8 +309,8 @@ public class GeoServerRESTPublisher { .append("/featuretypes"); GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); - fte.setName(layername); - fte.setSRS(srs); // srs=null?"EPSG:4326":srs); + fte.addName(layername); + fte.addSRS(srs); // srs=null?"EPSG:4326":srs); String ftypeXml = fte.toString(); String configuredResult = HTTPUtils.postXml(postUrl.toString(), ftypeXml, this.gsuser, this.gspass); @@ -323,7 +324,7 @@ public class GeoServerRESTPublisher { LOGGER.info("DB layer successfully added (layer:" + layername + ")"); GSLayerEncoder layerEncoder = new GSLayerEncoder(); - layerEncoder.setDefaultStyle(defaultStyle); + layerEncoder.addDefaultStyle(defaultStyle); configured = configureLayer(layerEncoder, layername); if (!configured) { @@ -385,16 +386,17 @@ public class GeoServerRESTPublisher { LOGGER.error("No coverages found in new coveragestore " + storeName); return null; } - String coverageName = covList.get(0).getName(); + final String coverageName = covList.get(0).getName(); // config coverage props (srs) GSCoverageEncoder coverageEncoder = new GSCoverageEncoder(); - coverageEncoder.setSRS(srs); + coverageEncoder.addName(FilenameUtils.getBaseName(geotiff.getName())); + coverageEncoder.addSRS(srs); configureCoverage(coverageEncoder, workspace, storeName, coverageName); // config layer props (style, ...) GSLayerEncoder layerEncoder = new GSLayerEncoder(); - layerEncoder.setDefaultStyle(defaultStyle); + layerEncoder.addDefaultStyle(defaultStyle); configureLayer(layerEncoder, coverageName); } catch (Exception e) { @@ -452,10 +454,10 @@ public class GeoServerRESTPublisher { */ public RESTCoverageStore publishExternalMosaic(String workspace, String storeName, File mosaicDir, String srs, String defaultStyle) throws FileNotFoundException { GSCoverageEncoder coverageEncoder = new GSCoverageEncoder(); - coverageEncoder.setSRS(srs); - + coverageEncoder.addSRS(srs); + coverageEncoder.addName(FilenameUtils.getBaseName(mosaicDir.getName())); GSLayerEncoder layerEncoder = new GSLayerEncoder(); - layerEncoder.setDefaultStyle(defaultStyle); + layerEncoder.addDefaultStyle(defaultStyle); return publishExternalMosaic(workspace, storeName, mosaicDir, coverageEncoder, layerEncoder); } @@ -754,6 +756,11 @@ public class GeoServerRESTPublisher { } protected String encode(String s) { - return URLEncoder.encode(s); +// try { +// return URLEncoder.encode(s,"UTF-8"); +// } catch (UnsupportedEncodingException e) { +// LOGGER.warn("Error encoding :"+s+" with UTF-8: "+e.getLocalizedMessage()); + return URLEncoder.encode(s); +// } } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSCoverageEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSCoverageEncoder.java deleted file mode 100644 index c512958..0000000 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSCoverageEncoder.java +++ /dev/null @@ -1,62 +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.encoder; - -import it.geosolutions.geoserver.rest.encoder.utils.EntryKeyListEncoder; -import it.geosolutions.geoserver.rest.encoder.utils.TextNodeListEncoder; -import org.jdom.Element; - -/** - * Creates an XML - * - * @author ETj (etj at geo-solutions.it) - */ -public class GSCoverageEncoder extends GSResourceEncoder { - - private EntryKeyListEncoder metadataEncoder = new EntryKeyListEncoder("metadata"); - private TextNodeListEncoder keywordsListEncoder = new TextNodeListEncoder("keywords"); - - - public GSCoverageEncoder() { - super("coverage"); - set("enabled", "true"); - } - - public void addMetadata(String key, String value) { - metadataEncoder.add(key, value); - } - - public void addKeyword(String keyword) { - keywordsListEncoder.add("string", keyword); - } - - @Override - protected void addNodesBeforeOutput(Element e) { - super.addNodesBeforeOutput(e); - keywordsListEncoder.attachList(e); - metadataEncoder.attachList(e); - } -} diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSFeatureTypeEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSFeatureTypeEncoder.java deleted file mode 100644 index 0cc6cf5..0000000 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSFeatureTypeEncoder.java +++ /dev/null @@ -1,42 +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.encoder; - -/** - * - * @author ETj (etj at geo-solutions.it) - */ -public class GSFeatureTypeEncoder extends GSResourceEncoder { - - public GSFeatureTypeEncoder() { - super("featureType"); - set("enabled", "true"); - } - - public void setName(String name) { - setOrRemove("name", name); - } -} \ No newline at end of file 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 ab71790..c192563 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java @@ -30,6 +30,8 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; /** * * @author ETj (etj at geo-solutions.it) + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + * */ public class GSLayerEncoder extends PropertyXMLEncoder { @@ -38,12 +40,8 @@ public class GSLayerEncoder extends PropertyXMLEncoder { // enable layer add("enabled","true"); } - -// public void setWmsPath(String wmspath) { -// add("wmspath", wmspath); -// } - public void setDefaultStyle(String defaultStyle) { + public void addDefaultStyle(String defaultStyle) { add("defaultStyle", defaultStyle); } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java index d0d604b..7b5c68e 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java @@ -25,7 +25,7 @@ package it.geosolutions.geoserver.rest.encoder; -import it.geosolutions.geoserver.rest.encoder.utils.EntryKeyListEncoder; +import it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder; import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; /** @@ -33,16 +33,17 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; * * @author Eric Grosso * @author ETj + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it */ public class GSPostGISDatastoreEncoder extends PropertyXMLEncoder { - private EntryKeyListEncoder connectionParameters = new EntryKeyListEncoder("connectionParameters"); + private NestedElementEncoder connectionParameters = new NestedElementEncoder("connectionParameters"); public GSPostGISDatastoreEncoder() { super("dataStore"); - setType("PostGIS"); // may be overwritten with e.g. "PostGIS (JNDI)" - setDatabaseType("postgis"); + addType("PostGIS"); // may be overwritten with e.g. "PostGIS (JNDI)" + addDatabaseType("postgis"); } /** @@ -59,104 +60,104 @@ public class GSPostGISDatastoreEncoder extends PropertyXMLEncoder { * */ public void defaultInit() { - setMinConnections(1); - setMaxConnections(10); - setFetchSize(1000); - setConnectionTimeout(20); - setLooseBBox(true); - setPreparedStatements(false); - setMaxOpenPreparedStatements(50); + addMinConnections(1); + addMaxConnections(10); + addFetchSize(1000); + addConnectionTimeout(20); + addLooseBBox(true); + addPreparedStatements(false); + addMaxOpenPreparedStatements(50); } - public void setName(String name) { + public void addName(String name) { add("name", name); } - public void setDescription(String description) { + public void addDescription(String description) { add("description", description); } - public void setType(String type) { + public void addType(String type) { add("type", type); } - public void setEnabled(boolean enabled) { + public void addEnabled(boolean enabled) { add("enabled", Boolean.toString(enabled)); } - public void setNamespace(String namespace) { + public void addNamespace(String namespace) { connectionParameters.add("namespace", namespace); } - public void setHost(String host) { + public void addHost(String host) { connectionParameters.add("host", host); } - public void setPort(int port) { + public void addPort(int port) { connectionParameters.add("port", Integer.toString(port)); } - public void setDatabase(String database) { + public void addDatabase(String database) { connectionParameters.add("database", database); } - public void setSchema(String schema) { + public void addSchema(String schema) { connectionParameters.add("schema", schema); } - public void setUser(String user) { + public void addUser(String user) { connectionParameters.add("user", user); } - public void setPassword(String password) { + public void addPassword(String password) { connectionParameters.add("passwd", password); } - public void setDatabaseType(String dbtype) { + public void addDatabaseType(String dbtype) { connectionParameters.add("dbtype", dbtype); } - public void setJndiReferenceName(String jndiReferenceName) { + public void addJndiReferenceName(String jndiReferenceName) { connectionParameters.add("jndiReferenceName", jndiReferenceName); } - public void setExposePrimaryKeys(boolean exposePrimaryKeys) { + public void addExposePrimaryKeys(boolean exposePrimaryKeys) { connectionParameters.add("Expose primary keys", Boolean.toString(exposePrimaryKeys)); } - public void setMaxConnections(int maxConnections) { + public void addMaxConnections(int maxConnections) { connectionParameters.add("max connections", Integer.toString(maxConnections)); } - public void setMinConnections(int minConnections) { + public void addMinConnections(int minConnections) { connectionParameters.add("min connections", Integer.toString(minConnections)); } - public void setFetchSize(int fetchSize) { + public void addFetchSize(int fetchSize) { connectionParameters.add("fetch size", Integer.toString(fetchSize)); } - public void setConnectionTimeout(int seconds) { + public void addConnectionTimeout(int seconds) { connectionParameters.add("Connection timeout", Integer.toString(seconds)); } - public void setValidateConnections(boolean validateConnections) { + public void addValidateConnections(boolean validateConnections) { connectionParameters.add("validate connections", Boolean.toString(validateConnections)); } - public void setPrimaryKeyMetadataTable(String primaryKeyMetadataTable) { + public void addPrimaryKeyMetadataTable(String primaryKeyMetadataTable) { connectionParameters.add("Primary key metadata table", primaryKeyMetadataTable); } - public void setLooseBBox(boolean looseBBox) { + public void addLooseBBox(boolean looseBBox) { connectionParameters.add("Loose bbox", Boolean.toString(looseBBox)); } - public void setPreparedStatements(boolean preparedStatements) { + public void addPreparedStatements(boolean preparedStatements) { connectionParameters.add("preparedStatements", Boolean.toString(preparedStatements)); } - public void setMaxOpenPreparedStatements(int maxOpenPreparedStatements) { + public void addMaxOpenPreparedStatements(int maxOpenPreparedStatements) { connectionParameters.add("Max open prepared statements", Integer.toString(maxOpenPreparedStatements)); } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java index 5d21f28..b869fc0 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -25,26 +25,55 @@ package it.geosolutions.geoserver.rest.encoder; +import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; +import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSMetadataEncoder; import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; -import it.geosolutions.geoserver.rest.encoder.utils.TextNodeListEncoder; + +import org.jdom.Element; /** + * + * Encode a GeoServer resouce. + * The type regards the GDSDimensionInfoEncoder metadata Type which has + * different specialization for Features. + * + * @see GSDimensionInfoEncoder + * @see GSFeatureDimensionInfoEncoder * * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it */ public abstract class GSResourceEncoder extends PropertyXMLEncoder { + /** + * @param rootName Actually 'feature' or 'coverage' + * @see GSFeatureTypeEncoder + * @see GSCoverageEncoder + */ + protected GSResourceEncoder(final String rootName) { + super(rootName); + add("enabled", "true"); + + // Link members to the parent + addContent(metadata); + addContent(keywordsListEncoder); + } + final private GSMetadataEncoder metadata=new GSMetadataEncoder(); - public void addMetadata(String key, T dimensionInfo) { metadata.add(key, dimensionInfo); } - private TextNodeListEncoder keywordsListEncoder = new TextNodeListEncoder("keywords"); + final private Element keywordsListEncoder = new Element("keywords"); + + public void addKeyword(String keyword) { + final Element el=new Element("string"); + el.setText(keyword); + keywordsListEncoder.addContent(el); + } /** * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED @@ -52,29 +81,32 @@ public abstract class GSResourceEncoder extend public enum ProjectionPolicy { REPROJECT_TO_DECLARED, FORCE_DECLARED, NONE } - - protected GSResourceEncoder(final String rootName) { - super(rootName); - add("enabled", "true"); - // Link members to the parent - addContent(metadata.getElement()); - addContent(keywordsListEncoder.getElement()); + /** + * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED + */ + public void addProjectionPolicy(ProjectionPolicy policy) { + add("projectionPolicy", policy.toString()); } - public void setName(final String name) { + /** + * Add the 'name' node with a text value from 'name' + * @note REQUIRED to configure a resource + * + */ + public void addName(final String name) { add("name", name); } - public void setTitle(final String title) { + public void addTitle(final String title) { add("title", title); } - public void setSRS(final String srs) { + public void addSRS(final String srs) { add("srs", srs); } - public void setLatLonBoundingBox(double minx, double maxy, double maxx, + public void addLatLonBoundingBox(double minx, double maxy, double maxx, double miny, final String crs) { add("latLonBoundingBox/minx", String.valueOf(minx)); add("latLonBoundingBox/maxy", String.valueOf(maxy)); @@ -83,7 +115,7 @@ public abstract class GSResourceEncoder extend add("latLonBoundingBox/crs", crs); } - public void setNativeBoundingBox(double minx, double maxy, double maxx, + public void addNativeBoundingBox(double minx, double maxy, double maxx, double miny, final String crs) { add("nativeBoundingBox/minx", String.valueOf(minx)); add("nativeBoundingBox/maxy", String.valueOf(maxy)); @@ -92,16 +124,5 @@ public abstract class GSResourceEncoder extend add("nativeBoundingBox/crs", crs); } - /** - * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED - */ - public void setProjectionPolicy(ProjectionPolicy policy) { - add("projectionPolicy", policy.toString()); - } - - - public void addKeyword(String keyword) { - keywordsListEncoder.add("string", keyword); - } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java index 954b699..46c3e78 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java @@ -42,15 +42,15 @@ public class GSWorkspaceEncoder extends PropertyXMLEncoder { public GSWorkspaceEncoder(String name) { this(); - setName(name); + addName(name); } - public void setName(String name) { + public void addName(String name) { add("name", name); } public String getName(){ - final Element el=get("name"); + final Element el=contains("name"); if (el!=null) return el.getName(); else diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java index 61e5099..a3f8b68 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java @@ -39,73 +39,9 @@ import org.jdom.Element; * */ public class GSCoverageEncoder extends GSResourceEncoder { - - - final private Element parameters=new Element("parameters"); public GSCoverageEncoder() { super("coverage"); - // Link members to the parent - addContent(parameters); - } - - - /** - * @param val - */ - public void setAllowMultithreading(final boolean val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("AllowMultithreading")); - param.addContent(new Element("string").setText((val)?"true":"false")); - parameters.addContent(param); } - public void setFilter(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("Filter")); - param.addContent(new Element("string").setText(val)); - parameters.addContent(param); - } - - public void setMaxAllowedTiles(final int val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("MaxAllowedTiles")); - param.addContent(new Element("string").setText(String.valueOf(val))); - parameters.addContent(param); - } - - public void setInputTransparentColor(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("InputTransparentColor")); - param.addContent(new Element("string").setText(val)); - parameters.addContent(param); - } - - public void setOutputTransparentColor(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("OutputTransparentColor")); - param.addContent(new Element("string").setText(val)); - parameters.addContent(param); - } - - public void setSUGGESTED_TILE_SIZE(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("SUGGESTED_TILE_SIZE")); - param.addContent(new Element("string").setText(val)); - parameters.addContent(param); - } - - public void setUSE_JAI_IMAGEREAD(final boolean val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("USE_JAI_IMAGEREAD")); - param.addContent(new Element("string").setText((val)?"true":"false")); - parameters.addContent(param); - } - - public void setBackgroundValues(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("BackgroundValues")); - param.addContent(new Element("string").setText(val)); - parameters.addContent(param); - } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java new file mode 100644 index 0000000..b3d8bb8 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java @@ -0,0 +1,104 @@ +/* + * 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.coverage; + +import it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder; + +import org.jdom.Element; + +/** + * + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + * + */ +public class GSImageMosaicEncoder extends GSCoverageEncoder { + + final private NestedElementEncoder parameters=new NestedElementEncoder("parameters"); + + public GSImageMosaicEncoder() { + // Link members to the parent + addContent(parameters); + } + + /** + * @param val + */ + public void addAllowMultithreading(final boolean val){ + final Element param=new Element("entry"); + param.addContent(new Element("string").setText("AllowMultithreading")); + param.addContent(new Element("string").setText((val)?"true":"false")); + parameters.addContent(param); + } + + public void addFilter(final String val){ + final Element param=new Element("entry"); + param.addContent(new Element("string").setText("Filter")); + param.addContent(new Element("string").setText(val)); + parameters.addContent(param); + } + + public void addMaxAllowedTiles(final int val){ + final Element param=new Element("entry"); + param.addContent(new Element("string").setText("MaxAllowedTiles")); + param.addContent(new Element("string").setText(String.valueOf(val))); + parameters.addContent(param); + } + + public void addInputTransparentColor(final String val){ + final Element param=new Element("entry"); + param.addContent(new Element("string").setText("InputTransparentColor")); + param.addContent(new Element("string").setText(val)); + parameters.addContent(param); + } + + public void addOutputTransparentColor(final String val){ + final Element param=new Element("entry"); + param.addContent(new Element("string").setText("OutputTransparentColor")); + param.addContent(new Element("string").setText(val)); + parameters.addContent(param); + } + + public void addSUGGESTED_TILE_SIZE(final String val){ + final Element param=new Element("entry"); + param.addContent(new Element("string").setText("SUGGESTED_TILE_SIZE")); + param.addContent(new Element("string").setText(val)); + parameters.addContent(param); + } + + public void addUSE_JAI_IMAGEREAD(final boolean val){ + final Element param=new Element("entry"); + param.addContent(new Element("string").setText("USE_JAI_IMAGEREAD")); + param.addContent(new Element("string").setText((val)?"true":"false")); + parameters.addContent(param); + } + + public void addBackgroundValues(final String val){ + final Element param=new Element("entry"); + param.addContent(new Element("string").setText("BackgroundValues")); + param.addContent(new Element("string").setText(val)); + parameters.addContent(param); + } + +} diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoder.java index 68111f9..af03bfc 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoder.java @@ -1,3 +1,28 @@ +/* + * 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.feature; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureTypeEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureTypeEncoder.java index 688d108..ff94c09 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureTypeEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureTypeEncoder.java @@ -28,6 +28,8 @@ package it.geosolutions.geoserver.rest.encoder.feature; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; /** + * + * Encode a GeoServer resource as FeatureType * * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSDimensionInfoEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSDimensionInfoEncoder.java index 76136db..a636ebc 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSDimensionInfoEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSDimensionInfoEncoder.java @@ -1,45 +1,97 @@ +/* + * 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.metadata; +import it.geosolutions.geoserver.rest.encoder.utils.XmlElement; + import java.math.BigDecimal; -import it.geosolutions.geoserver.rest.encoder.utils.TextNodeListEncoder; +import org.jdom.Element; -public class GSDimensionInfoEncoder extends TextNodeListEncoder { +/** + * + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + * + */ +public class GSDimensionInfoEncoder extends XmlElement{ final boolean enabled; + /** + * Enum for presentation mode + */ public enum Presentation{ LIST, CONTINUOUS_INTERVAL } - - public enum DiscretePresentation{ + /** + * Enum for presentation mode which needs arguments + */ + public enum PresentationDiscrete{ DISCRETE_INTERVAL } + /** + * Build a dimension + * @param enabled enable dimension if true + * @note a enabled dimension also need a presentation mode set. + */ public GSDimensionInfoEncoder(final boolean enabled) { super("dimensionInfo"); add("enabled", (enabled)?"true":"false"); this.enabled=enabled; } + /** + * build an not enabled dimension + */ public GSDimensionInfoEncoder() { super("dimensionInfo"); add("enabled", "false"); this.enabled=Boolean.FALSE; } - public void setPresentation(final Presentation pres){ + public void addPresentation(final Presentation pres){ if (enabled){ add("presentation",pres.toString()); } } - public void setPresentation(final DiscretePresentation pres, final BigDecimal interval){ + public void addPresentation(final PresentationDiscrete pres, final BigDecimal interval){ if (enabled){ add("presentation",pres.toString()); add("resolution",String.valueOf(interval)); } } + + public void add(String nodename, String nodetext) { + final Element el=new Element(nodename); + el.setText(nodetext); + this.addContent(el); + } + } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java index 9dd2482..b75356f 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java @@ -1,8 +1,33 @@ +/* + * 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.metadata; -import it.geosolutions.geoserver.rest.encoder.utils.EntryKeyListEncoder; +import it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder; -public class GSMetadataEncoder extends EntryKeyListEncoder{ +public class GSMetadataEncoder extends NestedElementEncoder{ public GSMetadataEncoder() { super("metadata"); diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtils.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtils.java new file mode 100644 index 0000000..23ff7f6 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtils.java @@ -0,0 +1,145 @@ +/* + * 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.utils; + +import java.util.Iterator; +import java.util.List; + +import org.jdom.Element; + +/** + * + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + * + */ +public abstract class ElementUtils { + + /** + * + * @param root + * @param el + * @return true if the FIRST element EQUALS to the 'el' starting from root + * is found AND can be deleted. If it is the root true is returned + * and all of its child are removed. + * + */ + public static boolean remove(Element root, final Element el) { + if (root.equals(el)) { + if (!el.isRootElement()) { + root = el.getParentElement(); + // removing all child + el.removeContent(); + root.removeContent(el); + } else { + // log warn this is root! + // removing all child + el.removeContent(); + } + } else if ((root = ElementUtils.contains(root, el)) != null) { + return remove(root, el); + } else { + return false; + } + + return true; + } + + /** + * @param root + * @param el + * @return the FIRST element EQUALS to the 'el' starting from root or null + */ + public static Element contains(final Element root, final Element el) { + + if (root != null && el != null) { + if (root.equals(el)) + return root; + + final List childrenList = root.getChildren(); + if (childrenList.size() > 0) { + Iterator it = childrenList.iterator(); + while (it.hasNext()) { + final Element ret; + if ((ret = contains(it.next(), el)) != null) + return ret; + } + } + } + return null; + } + + /** + * @param root + * @param name + * @param val + * @return the FIRST element EQUALS to a node with name and a text value + * starting from root or null + */ + public static Element contains(final Element root, final String name, + final String val) { + if (root != null && name != null && val != null) { + if (root.getName().equals(name) && root.getText().equals(val)) + return root; + + final List childrenList = root.getChildren(); + if (childrenList.size() > 0) { + Iterator it = childrenList.iterator(); + while (it.hasNext()) { + final Element ret; + if ((ret = contains(it.next(), name, val)) != null) + return ret; + } + } + } + return null; + } + + /** + * return the FIRST element with name equals to the passed key + * + * @param root + * @param name + * @return + */ + public static Element contains(final Element root, final String name) { + if (root != null && name != null) { + if (root.getName().equals(name)) + return root; + + final List childrenList = root.getChildren(); + if (childrenList.size() > 0) { + Iterator it = childrenList.iterator(); + while (it.hasNext()) { + final Element ret; + if ((ret = contains(it.next(), name)) != null) + return ret; + } + } + } + return null; + } + +} diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java similarity index 70% rename from src/main/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoder.java rename to src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java index 0ea5043..db321bc 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java @@ -25,8 +25,6 @@ package it.geosolutions.geoserver.rest.encoder.utils; -import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; - import org.jdom.Element; /** @@ -43,9 +41,7 @@ import org.jdom.Element; * *
  * 
- * This can be also used in compounded to the PropertyXMLEncoder 
- * or other objects overriding the toString() method
- * 
+ * This can be also add compounded Elements
* e.g.: * *
@@ -71,40 +67,26 @@ import org.jdom.Element;
  * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
  * 
  */
-public class EntryKeyListEncoder  extends XMLSerializer{
+public class NestedElementEncoder extends XmlElement {
 
-	private final Element root;
-	
-	public EntryKeyListEncoder(String listName) {
-		root=new Element(listName);
+	public NestedElementEncoder(String listName) {
+		super(listName);
 	}
 
 	public void add(String key, T value) {
 		final Element entryElem = new Element("entry");
-		entryElem.setAttribute("key", key);
-		if (value instanceof String)
-			entryElem.setText((String)value);
-		else if (value instanceof Element)
-			entryElem.addContent((Element)value);
-		else if (value instanceof GSDimensionInfoEncoder)
-			entryElem.addContent(((GSDimensionInfoEncoder)value).getElement());
-		else
-			throw new IllegalArgumentException("Unable to add entry: unrecognized object");
-		
-		root.addContent(entryElem);
-	}
-	
+		if (key != null)
+			entryElem.setAttribute("key", key);
 
-	/**
-     * add a node to the root
-     * 
-     * @param el the node to add
-     */
-	public void addContent(final Element el){
-		root.addContent(el);
-	}
-	
-	public Element getElement() {
-			return root;
+		if (value instanceof String)
+			entryElem.setText((String) value);
+		else if (value instanceof Element)
+			entryElem.addContent((Element) value);
+		else
+			throw new IllegalArgumentException(
+					"Unable to add entry: unrecognized object");
+
+		this.addContent(entryElem);
 	}
+
 }
diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java
index 2c8b700..853daa0 100644
--- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java
+++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java
@@ -29,98 +29,57 @@ import org.jdom.Element;
 
 /**
  * Creates an XML document by mapping properties to XML nodes.
- * You can set the root element name in the constructor. - * Any key/value pair will be encoded as {@code value} node.

+ * You can set the root element name in the constructor. Any key/value pair will + * be encoded as {@code value} node.
+ *
* - *

Nested nodes

- * Any key containing one or more slash ("/") will be encoded as nested nodes; - *
e.g.: - *
 {@code 
- *          key = "k1/k2/k3", value = "value" }
will be encoded as - *
 {@code        value }
+ *

Nested nodes

Any key containing one or more slash ("/") will be + * encoded as nested nodes;
+ * e.g.: + * + *
+ * {@code 
+ *          key = "k1/k2/k3", value = "value" }
+ * 
+ * + * will be encoded as + * + *
+ * {@code        value }
+ * 
* * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it */ -public class PropertyXMLEncoder extends XMLSerializer{ +public class PropertyXMLEncoder extends XmlElement { -// private final Map configElements = new HashMap(); - private final Element root; + public PropertyXMLEncoder(final String rootName) { + super(rootName); + } - public PropertyXMLEncoder(final String rootName) { - root=new Element(rootName); - } - - /** - * add a node (as child) to the root node - * - * @param el the node to add - */ - @Override - public void addContent(final Element el){ - root.addContent(el); - } - - /** - * @Deprecated use add() - */ - @Deprecated - protected void setOrRemove(String key, String value) { - final Element e=root.getChild(key); - if (value != null && e==null) { - add(root, key, value); - } else { - root.removeChild(key); - } - } - - protected void add(String key, String value) { - final Element e=root.getChild(key); - if (value != null && e==null) { - add(root, key, value); - } - } + protected void add(String key, String value) { + if (key != null && value != null) { + add(this, key, value); + } + } - public boolean isEmpty() { -// return configElements.isEmpty(); - return root.getChildren().isEmpty(); - } + private void add(Element e, String key, String value) { + if (!key.contains("/")) { + e.addContent(new Element(key).setText(value)); + } else { + final int i = key.indexOf("/"); + final String childName = key.substring(0, i); + final String newkey = key.substring(i + 1); - public Element get(final String key){ - return root.getChild(key); -// return configElements.get(key); - } + Element child = e.getChild(childName); + if (child == null) { + child = new Element(childName); + e.addContent(child); + } + add(child, newkey, value); + } - /** - * Subclasses may need to override this method if some more info in the XML - * string are needed when calling {@link #encodeXml() encodeXml()}. - * - * @param root the root element that will be converted into String by encodeXml - */ - @Override - public Element getElement(){ - return root; - } - - private void add(Element e, String key, String value) { - if( ! key.contains("/") ) { - e.addContent(new Element(key).setText(value)); - } else { - int i = key.indexOf("/"); - String childName = key.substring(0,i); - String newkey = key.substring(i+1); - - Element child = e.getChild(childName); - if(child == null) { - child = new Element(childName); - e.addContent(child); - } - - add(child, newkey, value); - } - - } - + } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/TextNodeListEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/TextNodeListEncoder.java deleted file mode 100644 index 09ab87b..0000000 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/TextNodeListEncoder.java +++ /dev/null @@ -1,66 +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.encoder.utils; - -import org.jdom.Element; - -/** - * Encodes lists of simple text nodes. - *
e.g.: - *
- * {@code 
- *  
- *   nodetext1
- *   nodetext2
- *   nodetext3
- * }
- * 
- * 
- * @author ETj (etj at geo-solutions.it)
- * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
- */
-public class TextNodeListEncoder extends XMLSerializer{
-
-    private final Element root;
-    public TextNodeListEncoder(String listName) {
-    	root=new Element(listName);
-    }   
-                    
-    public void add(String nodename, String nodetext) {
-    	final Element el=new Element(nodename);
-    	el.setText(nodetext);
-    	root.addContent(el);
-    }
-
-    public Element getElement() {
-        return root;
-    }
-    
-    public void addContent(final Element el){
-		root.addContent(el);
-	}
-
-}
diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XMLSerializer.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java
similarity index 70%
rename from src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XMLSerializer.java
rename to src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java
index 4abb0dc..a126811 100644
--- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XMLSerializer.java
+++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java
@@ -25,6 +25,7 @@
 
 package it.geosolutions.geoserver.rest.encoder.utils;
 
+
 import org.jdom.Element;
 import org.jdom.output.Format;
 import org.jdom.output.XMLOutputter;
@@ -34,24 +35,45 @@ import org.jdom.output.XMLOutputter;
  * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
  *
  */
-public abstract class XMLSerializer {
+public abstract class XmlElement extends Element {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+	
 	private final static XMLOutputter OUTPUTTER = new XMLOutputter(Format.getCompactFormat());
 	
-	public XMLSerializer(){}
-
-	public abstract Element getElement();
+	public XmlElement(final String name){
+		super(name);
+	}
 	
-	public abstract void addContent(final Element el);
+	private XmlElement(){};
+	
+	public boolean isEmpty() {
+        return getChildren().isEmpty();
+    }
+	
+	public boolean remove(final Element el){
+		return ElementUtils.remove(this,el);
+	}
+	
+	public Element contains(final Element el){
+		return ElementUtils.contains(this,el);
+	}
+	
+	public Element contains(final String key, final String val){
+		return ElementUtils.contains(this,key,val);
+	}
+	
+	public Element contains(final String key){
+		return ElementUtils.contains(this,key);
+	}
 	
 	/**
      * @return an xml String 
      */
     @Override
     public String toString() {
-    	final Element root= getElement();
-    	if (root!=null)
-    		return OUTPUTTER.outputString(root);
-    	else
-    		return "";
+		return OUTPUTTER.outputString(this);
     }
 }
diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java
index 2930d6c..eff5c46 100644
--- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java
+++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java
@@ -94,18 +94,18 @@ public class GeoserverRESTPostgisDatastoreTest extends GeoserverRESTTest {
 
         GSPostGISDatastoreEncoder datastoreEncoder = new GSPostGISDatastoreEncoder();
         datastoreEncoder.defaultInit();
-        datastoreEncoder.setName(datastoreName);
-        datastoreEncoder.setDescription(description);
-        datastoreEncoder.setNamespace(dsNamespace);
-        datastoreEncoder.setHost(pgHost);
-        datastoreEncoder.setPort(pgPort);
-        datastoreEncoder.setDatabase(pgDatabase);
-        datastoreEncoder.setSchema(pgSchema);
-        datastoreEncoder.setUser(pgUser);
-        datastoreEncoder.setPassword(pgPassword);
-        datastoreEncoder.setExposePrimaryKeys(exposePrimaryKeys);
-        datastoreEncoder.setValidateConnections(validateConnections);
-        datastoreEncoder.setPrimaryKeyMetadataTable(primaryKeyMetadataTable);
+        datastoreEncoder.addName(datastoreName);
+        datastoreEncoder.addDescription(description);
+        datastoreEncoder.addNamespace(dsNamespace);
+        datastoreEncoder.addHost(pgHost);
+        datastoreEncoder.addPort(pgPort);
+        datastoreEncoder.addDatabase(pgDatabase);
+        datastoreEncoder.addSchema(pgSchema);
+        datastoreEncoder.addUser(pgUser);
+        datastoreEncoder.addPassword(pgPassword);
+        datastoreEncoder.addExposePrimaryKeys(exposePrimaryKeys);
+        datastoreEncoder.addValidateConnections(validateConnections);
+        datastoreEncoder.addPrimaryKeyMetadataTable(primaryKeyMetadataTable);
 
         // creation test
         boolean created = publisher.createPostGISDatastore(wsName, datastoreEncoder);
diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/GSCoverageEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java
similarity index 60%
rename from src/test/java/it/geosolutions/geoserver/rest/encoder/utils/GSCoverageEncoderTest.java
rename to src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java
index bdb0913..826680d 100644
--- a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/GSCoverageEncoderTest.java
+++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java
@@ -17,7 +17,7 @@
  *  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.utils;
+package it.geosolutions.geoserver.rest.encoder.coverage;
 
 import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder;
 import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder;
@@ -25,11 +25,12 @@ import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Pr
 import junit.framework.TestCase;
 
 import org.apache.log4j.Logger;
+import org.jdom.Element;
+import org.junit.Assert;
 import org.junit.Test;
 
 /**
  *
- * @author ETj (etj at geo-solutions.it)
  * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
  */
 public class GSCoverageEncoderTest extends TestCase {
@@ -44,21 +45,40 @@ public class GSCoverageEncoderTest extends TestCase {
     
     @Test
     public void testAll() {
-    	GSCoverageEncoder encoder=new GSCoverageEncoder();
+    	final GSCoverageEncoder encoder=new GSCoverageEncoder();
     	encoder.addKeyword("KEYWORD_1");
     	encoder.addKeyword("KEYWORD_2");
     	encoder.addKeyword("...");
     	encoder.addKeyword("KEYWORD_N");
-    	GSDimensionInfoEncoder dim=new GSDimensionInfoEncoder(true);
-    	dim.setPresentation(Presentation.CONTINUOUS_INTERVAL);
+    	final GSDimensionInfoEncoder dim=new GSDimensionInfoEncoder(true);
+    	dim.addPresentation(Presentation.CONTINUOUS_INTERVAL);
     	encoder.addMetadata("time", dim);
-    	GSDimensionInfoEncoder dim2=new GSDimensionInfoEncoder(true);
-    	dim2.setPresentation(Presentation.LIST);
+    	final GSDimensionInfoEncoder dim2=new GSDimensionInfoEncoder(true);
+    	dim2.addPresentation(Presentation.LIST);
     	encoder.addMetadata("elev", dim2);
-    	encoder.setAllowMultithreading(true);
-        
+
     	LOGGER.info(encoder.toString());
-// TODO TESTS
+    	
+    	final Element el=encoder.contains("metadata");
+    	Assert.assertNotNull(el);
+    	LOGGER.info("contains_key:"+el.toString());
+    	
+    	final Element el2=encoder.contains("presentation");
+    	Assert.assertNotNull(el2);
+    	LOGGER.info("contains_key:"+el2.toString());
+    	
+    	final Element el3=encoder.contains(encoder.contains("metadata"));
+    	Assert.assertNotNull(el3);
+    	LOGGER.info("contains_by_node:"+el3.toString());
+    	
+    	final boolean removed=encoder.remove(el3);
+    	LOGGER.info("remove:"+removed);
+    	Assert.assertTrue(removed);
+    	
+    	final Element el4=encoder.contains("metadata");
+    	Assert.assertNull(el4);
+    	if (el4==null)
+    		LOGGER.info("REMOVED");
     	
     	
     }
diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoderTest.java
new file mode 100644
index 0000000..2a3ce96
--- /dev/null
+++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoderTest.java
@@ -0,0 +1,86 @@
+/*
+ *  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.coverage;
+
+import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder;
+import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation;
+import junit.framework.TestCase;
+
+import org.apache.log4j.Logger;
+import org.jdom.Element;
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ *
+ * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
+ */
+public class GSImageMosaicEncoderTest extends TestCase {
+
+    public GSImageMosaicEncoderTest() {
+    }
+
+    /**
+     * Default logger
+     */
+    protected final static Logger LOGGER = Logger.getLogger(GSImageMosaicEncoderTest.class);
+    
+    @Test
+    public void testAll() {
+    	final GSImageMosaicEncoder encoder=new GSImageMosaicEncoder();
+    	encoder.addKeyword("KEYWORD_1");
+    	encoder.addKeyword("KEYWORD_2");
+    	encoder.addKeyword("...");
+    	encoder.addKeyword("KEYWORD_N");
+    	final GSDimensionInfoEncoder dim=new GSDimensionInfoEncoder(true);
+    	dim.addPresentation(Presentation.CONTINUOUS_INTERVAL);
+    	encoder.addMetadata("time", dim);
+    	final GSDimensionInfoEncoder dim2=new GSDimensionInfoEncoder(true);
+    	dim2.addPresentation(Presentation.LIST);
+    	encoder.addMetadata("elev", dim2);
+    	encoder.addAllowMultithreading(true);
+    	encoder.addSUGGESTED_TILE_SIZE("512,512");
+
+    	LOGGER.info(encoder.toString());
+    	
+    	final Element el=encoder.contains("metadata");
+    	Assert.assertNotNull(el);
+    	LOGGER.info("contains_key:"+el.toString());
+    	
+    	final Element el2=encoder.contains("presentation");
+    	Assert.assertNotNull(el2);
+    	LOGGER.info("contains_key:"+el2.toString());
+    	
+    	final Element el3=encoder.contains(encoder.contains("metadata"));
+    	Assert.assertNotNull(el3);
+    	LOGGER.info("contains_by_node:"+el3.toString());
+    	
+    	final boolean removed=encoder.remove(el3);
+    	LOGGER.info("remove:"+removed);
+    	Assert.assertTrue(removed);
+    	
+    	final Element el4=encoder.contains("metadata");
+    	Assert.assertNull(el4);
+    	if (el4==null)
+    		LOGGER.info("REMOVED");
+    	
+    	
+    }
+}
diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/GSFeatureEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java
similarity index 91%
rename from src/test/java/it/geosolutions/geoserver/rest/encoder/utils/GSFeatureEncoderTest.java
rename to src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java
index fcce197..00e6360 100644
--- a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/GSFeatureEncoderTest.java
+++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureEncoderTest.java
@@ -17,11 +17,11 @@
  *  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.utils;
+package it.geosolutions.geoserver.rest.encoder.feature;
 
 import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureDimensionInfoEncoder;
 import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder;
-import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.DiscretePresentation;
+import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.PresentationDiscrete;
 
 import java.math.BigDecimal;
 
@@ -48,7 +48,7 @@ public class GSFeatureEncoderTest extends TestCase {
 		feature.addKeyword("KEYWORD_N");
 		GSFeatureDimensionInfoEncoder dim2 = new GSFeatureDimensionInfoEncoder(
 				"ELE");
-		dim2.setPresentation(DiscretePresentation.DISCRETE_INTERVAL,
+		dim2.addPresentation(PresentationDiscrete.DISCRETE_INTERVAL,
 				BigDecimal.valueOf(10));
 		feature.addMetadata("elevation", dim2);
 
diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoderTest.java
index eb49356..98437a0 100644
--- a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoderTest.java
+++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoderTest.java
@@ -36,13 +36,13 @@ public class EntryKeyListEncoderTest extends TestCase {
 
     @Test
     public void testAll() {
-        EntryKeyListEncoder ekle = new EntryKeyListEncoder("EKL");
+        NestedElementEncoder ekle = new NestedElementEncoder("EKL");
         ekle.add("k1", "v1");
         ekle.add("k2", "v2");
         ekle.add("k3", "v3");
 
         Element root = new Element("root");
-        root.addContent(ekle.getElement());
+        root.addContent(ekle);
 
         assertEquals(1, root.getChildren().size());
         assertNotNull(root.getChild("EKL"));

From a899315650c4b0e7d5fa6df3105023883251d0bf Mon Sep 17 00:00:00 2001
From: ccancellieri 
Date: Sun, 31 Jul 2011 12:15:34 +0200
Subject: [PATCH 02/12] Fix serialization of GSWorkspaceEncoder and introducing
 test Class. Fix defect #12

---
 .../rest/GeoServerRESTPublisher.java          | 10 ++--
 .../encoder/GSPostGISDatastoreEncoder.java    |  2 +-
 .../rest/encoder/GSResourceEncoder.java       |  4 +-
 .../rest/encoder/GSWorkspaceEncoder.java      | 29 +++++++--
 .../coverage/GSImageMosaicEncoder.java        |  4 +-
 .../encoder/metadata/GSMetadataEncoder.java   |  4 +-
 .../encoder/utils/NestedElementEncoder.java   | 24 ++++----
 .../encoder/utils/PropertyXMLEncoder.java     |  2 +-
 .../rest/encoder/utils/XmlElement.java        | 31 +++++++---
 .../rest/encoder/GSWorkspaceEncoderTest.java  | 59 +++++++++++++++++++
 .../utils/EntryKeyListEncoderTest.java        |  2 +-
 11 files changed, 134 insertions(+), 37 deletions(-)
 create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoderTest.java

diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java
index 28bd0bc..7e15c91 100644
--- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java
+++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java
@@ -86,11 +86,11 @@ public class GeoServerRESTPublisher {
      *      http://$GSIP:$GSPORT/$SERVLET/rest/workspaces
      * }
*/ - public boolean createWorkspace(String workspace) { - String sUrl = restURL + "/rest/workspaces"; - GSWorkspaceEncoder wsenc = new GSWorkspaceEncoder(workspace); - String wsxml = wsenc.toString(); - String result = HTTPUtils.postXml(sUrl, wsxml, gsuser, gspass); + public boolean createWorkspace(final String workspace) { + final String sUrl = restURL + "/rest/workspaces"; + final GSWorkspaceEncoder wsenc = new GSWorkspaceEncoder(workspace); + final String wsxml = wsenc.toString(); + final String result = HTTPUtils.postXml(sUrl, wsxml, gsuser, gspass); return result != null; } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java index 7b5c68e..92a229d 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java @@ -37,7 +37,7 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; */ public class GSPostGISDatastoreEncoder extends PropertyXMLEncoder { - private NestedElementEncoder connectionParameters = new NestedElementEncoder("connectionParameters"); + private NestedElementEncoder connectionParameters = new NestedElementEncoder("connectionParameters"); public GSPostGISDatastoreEncoder() { diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java index b869fc0..79d3b87 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -57,14 +57,14 @@ public abstract class GSResourceEncoder extend add("enabled", "true"); // Link members to the parent - addContent(metadata); + addContent(metadata.getRoot()); addContent(keywordsListEncoder); } final private GSMetadataEncoder metadata=new GSMetadataEncoder(); public void addMetadata(String key, T dimensionInfo) { - metadata.add(key, dimensionInfo); + metadata.add(key, dimensionInfo.getRoot()); } final private Element keywordsListEncoder = new Element("keywords"); diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java index 46c3e78..32e07df 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java @@ -41,20 +41,41 @@ public class GSWorkspaceEncoder extends PropertyXMLEncoder { } public GSWorkspaceEncoder(String name) { - this(); + super("workspace"); addName(name); } + /** + * Add the name to this workspace + * @param name + * @throws IllegalStateException if name is already set + */ public void addName(String name) { - add("name", name); + final Element el=contains("name"); + if (el==null) + add("name", name); + else + throw new IllegalStateException("Workspace name is already set: "+el.getText()); + } + + /** + * add or change (if already set) the workspace name + * @param name + */ + public void setName(String name) { + final Element el=contains("name"); + if (el==null) + add("name", name); + else + el.setText(name); } public String getName(){ final Element el=contains("name"); if (el!=null) - return el.getName(); + return el.getTextTrim(); else - return ""; + return null; } } \ No newline at end of file diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java index b3d8bb8..336d11c 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java @@ -35,11 +35,11 @@ import org.jdom.Element; */ public class GSImageMosaicEncoder extends GSCoverageEncoder { - final private NestedElementEncoder parameters=new NestedElementEncoder("parameters"); + final private NestedElementEncoder parameters=new NestedElementEncoder("parameters"); public GSImageMosaicEncoder() { // Link members to the parent - addContent(parameters); + addContent(parameters.getRoot()); } /** diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java index b75356f..25bbe74 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java @@ -27,14 +27,14 @@ package it.geosolutions.geoserver.rest.encoder.metadata; import it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder; -public class GSMetadataEncoder extends NestedElementEncoder{ +public class GSMetadataEncoder extends NestedElementEncoder{ public GSMetadataEncoder() { super("metadata"); } public void addMetadata(final String key, final T value) { - this.add(key, value); + this.add(key, value.getRoot()); } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java index db321bc..7ba3776 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java @@ -67,26 +67,30 @@ import org.jdom.Element; * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it * */ -public class NestedElementEncoder extends XmlElement { +public class NestedElementEncoder extends XmlElement { public NestedElementEncoder(String listName) { super(listName); } - public void add(String key, T value) { + public void add(String key, String value) { + final Element entryElem = new Element("entry"); + + if (key != null) + entryElem.setAttribute("key", key); + + entryElem.setText(value); + + this.addContent(entryElem); + } + + public void add(String key, Element value) { final Element entryElem = new Element("entry"); if (key != null) entryElem.setAttribute("key", key); - if (value instanceof String) - entryElem.setText((String) value); - else if (value instanceof Element) - entryElem.addContent((Element) value); - else - throw new IllegalArgumentException( - "Unable to add entry: unrecognized object"); + entryElem.addContent(value); this.addContent(entryElem); } - } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java index 853daa0..29ede05 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java @@ -59,7 +59,7 @@ public class PropertyXMLEncoder extends XmlElement { protected void add(String key, String value) { if (key != null && value != null) { - add(this, key, value); + add(this.getRoot(), key, value); } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java index a126811..3d3735d 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java @@ -26,6 +26,7 @@ package it.geosolutions.geoserver.rest.encoder.utils; +import org.jdom.Content; import org.jdom.Element; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; @@ -35,7 +36,10 @@ import org.jdom.output.XMLOutputter; * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it * */ -public abstract class XmlElement extends Element { +public class XmlElement{ + + private final Element root; + /** * */ @@ -44,29 +48,38 @@ public abstract class XmlElement extends Element { private final static XMLOutputter OUTPUTTER = new XMLOutputter(Format.getCompactFormat()); public XmlElement(final String name){ - super(name); + root=new Element(name); } - private XmlElement(){}; + public Element getRoot(){ + return root; + } + + private XmlElement(){root=null;}; + + + public Element addContent(Content child){ + return root.addContent(child); + } public boolean isEmpty() { - return getChildren().isEmpty(); + return root.getChildren().isEmpty(); } public boolean remove(final Element el){ - return ElementUtils.remove(this,el); + return ElementUtils.remove(root,el); } public Element contains(final Element el){ - return ElementUtils.contains(this,el); + return ElementUtils.contains(root,el); } public Element contains(final String key, final String val){ - return ElementUtils.contains(this,key,val); + return ElementUtils.contains(root,key,val); } public Element contains(final String key){ - return ElementUtils.contains(this,key); + return ElementUtils.contains(root,key); } /** @@ -74,6 +87,6 @@ public abstract class XmlElement extends Element { */ @Override public String toString() { - return OUTPUTTER.outputString(this); + return OUTPUTTER.outputString(root); } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoderTest.java new file mode 100644 index 0000000..0ba3aaf --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoderTest.java @@ -0,0 +1,59 @@ +/* + * 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.TestCase; + +import org.apache.log4j.Logger; +import org.junit.Assert; +import org.junit.Test; + +/** + * + * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it + */ +public class GSWorkspaceEncoderTest extends TestCase { + + public GSWorkspaceEncoderTest() { + } + + /** + * Default logger + */ + protected final static Logger LOGGER = Logger.getLogger(GSWorkspaceEncoderTest.class); + + @Test + public void testAll() { + final GSWorkspaceEncoder wsenc = new GSWorkspaceEncoder("WS1"); + LOGGER.info(wsenc.toString()); + + try{ + wsenc.addName("test_name"); + // NEVER HERE + Assert.assertTrue(false); + }catch (IllegalStateException e){ + Assert.assertTrue(true); + } + wsenc.setName("new_name"); + LOGGER.info(wsenc.toString()); + + + } +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoderTest.java index 98437a0..994fabb 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/EntryKeyListEncoderTest.java @@ -42,7 +42,7 @@ public class EntryKeyListEncoderTest extends TestCase { ekle.add("k3", "v3"); Element root = new Element("root"); - root.addContent(ekle); + root.addContent(ekle.getRoot()); assertEquals(1, root.getChildren().size()); assertNotNull(root.getChild("EKL")); From 31d4aae4a46e1428a88f4ea36db978388602e3a0 Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Tue, 13 Sep 2011 22:58:46 +0200 Subject: [PATCH 03/12] changes implementing fix to the defects #14 and #15 --- .../rest/GeoServerRESTPublisher.java | 2 + .../rest/encoder/GSResourceEncoder.java | 181 ++++++++++++++---- .../encoder/utils/PropertyXMLEncoder.java | 14 +- .../coverage/GSCoverageEncoderTest.java | 2 - .../coverage/GSResourceEncoderTest.java | 26 +++ 5 files changed, 182 insertions(+), 43 deletions(-) create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSResourceEncoderTest.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index 7e15c91..93e1296 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -29,6 +29,7 @@ import it.geosolutions.geoserver.rest.decoder.RESTCoverageStore; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; import it.geosolutions.geoserver.rest.encoder.GSPostGISDatastoreEncoder; import it.geosolutions.geoserver.rest.encoder.GSWorkspaceEncoder; +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; @@ -392,6 +393,7 @@ public class GeoServerRESTPublisher { GSCoverageEncoder coverageEncoder = new GSCoverageEncoder(); coverageEncoder.addName(FilenameUtils.getBaseName(geotiff.getName())); coverageEncoder.addSRS(srs); + coverageEncoder.setProjectionPolicy(ProjectionPolicy.REPROJECT_TO_DECLARED); configureCoverage(coverageEncoder, workspace, storeName, coverageName); // config layer props (style, ...) diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java index 79d3b87..f271b15 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -27,6 +27,7 @@ package it.geosolutions.geoserver.rest.encoder; import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSMetadataEncoder; import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; @@ -35,20 +36,21 @@ import org.jdom.Element; /** * - * Encode a GeoServer resouce. - * The type regards the GDSDimensionInfoEncoder metadata Type which has - * different specialization for Features. + * Encode a GeoServer resouce. The type regards the GDSDimensionInfoEncoder + * metadata Type which has different specialization for Features. * - * @see GSDimensionInfoEncoder - * @see GSFeatureDimensionInfoEncoder + * @see GSDimensionInfoEncoder + * @see GSFeatureDimensionInfoEncoder * * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it */ -public abstract class GSResourceEncoder extends PropertyXMLEncoder { - +public abstract class GSResourceEncoder + extends PropertyXMLEncoder { + /** - * @param rootName Actually 'feature' or 'coverage' + * @param rootName + * Actually 'feature' or 'coverage' * @see GSFeatureTypeEncoder * @see GSCoverageEncoder */ @@ -56,21 +58,21 @@ public abstract class GSResourceEncoder extend super(rootName); add("enabled", "true"); - // Link members to the parent + // Link members to the parent addContent(metadata.getRoot()); addContent(keywordsListEncoder); } - - final private GSMetadataEncoder metadata=new GSMetadataEncoder(); - + + final private GSMetadataEncoder metadata = new GSMetadataEncoder(); + public void addMetadata(String key, T dimensionInfo) { metadata.add(key, dimensionInfo.getRoot()); } final private Element keywordsListEncoder = new Element("keywords"); - + public void addKeyword(String keyword) { - final Element el=new Element("string"); + final Element el = new Element("string"); el.setText(keyword); keywordsListEncoder.addContent(el); } @@ -82,47 +84,146 @@ public abstract class GSResourceEncoder extend REPROJECT_TO_DECLARED, FORCE_DECLARED, NONE } + private final static String PROJECTIONPOLICY="projectionPolicy"; + /** + * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED + * + * @deprecated use the setProjectionPolicy.
+ * This method will be set as private in the next release + */ + public void addProjectionPolicy(ProjectionPolicy policy) { + add(PROJECTIONPOLICY, policy.toString()); + } + /** * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED */ - public void addProjectionPolicy(ProjectionPolicy policy) { - add("projectionPolicy", policy.toString()); + public void setProjectionPolicy(ProjectionPolicy policy) { + set(PROJECTIONPOLICY, policy.toString()); + } + + private final static String NAME="name"; + /** + * Add the 'name' node with a text value from 'name' + * + * @note REQUIRED to configure a resource + * @deprecated use the setName.
+ * This method will be set as private in the next release + */ + public void addName(final String name) { + add(NAME, name); + } + /** + * Set or modify the 'name' node with a text value from 'name' + * + * @note REQUIRED to configure a resource + */ + public void setName(final String name) { + set(NAME, name); + } + + private final static String TITLE="title"; + /** + * Add the 'title' node with a text value from 'title' + * + * @deprecated use the setTitle.
+ * This method will be set as private in the next release + */ + public void addTitle(final String title) { + add(TITLE, title); } /** - * Add the 'name' node with a text value from 'name' - * @note REQUIRED to configure a resource - * + * Set or modify the 'title' node with a text value from 'title' */ - public void addName(final String name) { - add("name", name); - } - - public void addTitle(final String title) { - add("title", title); - } - - public void addSRS(final String srs) { - add("srs", srs); + public void setTitle(final String title) { + set(TITLE, title); } + private final static String SRS="srs"; + /** + * Add the 'SRS' node with a text value from 'srs' + * + * @deprecated use the setSRS.
+ * This method will be set as private in the next release + */ + public void addSRS(final String srs) { + add(SRS, srs); + } + + /** + * Set or modify the 'SRS' node with a text value from 'srs' + */ + public void setSRS(final String srs) { + set(SRS, srs); + } + + private final static String LATLONBBMINX="latLonBoundingBox/minx"; + private final static String LATLONBBMAXX="latLonBoundingBox/maxx"; + private final static String LATLONBBMINY="latLonBoundingBox/miny"; + private final static String LATLONBBMAXY="latLonBoundingBox/maxy"; + private final static String LATLONBBCRS="latLonBoundingBox/crs"; + + /** + * @deprecated use the setSRS.
+ * This method will be set as private in the next release + * + * @param minx + * @param maxy + * @param maxx + * @param miny + * @param crs + */ public void addLatLonBoundingBox(double minx, double maxy, double maxx, double miny, final String crs) { - add("latLonBoundingBox/minx", String.valueOf(minx)); - add("latLonBoundingBox/maxy", String.valueOf(maxy)); - add("latLonBoundingBox/maxx", String.valueOf(maxx)); - add("latLonBoundingBox/miny", String.valueOf(miny)); - add("latLonBoundingBox/crs", crs); + add(LATLONBBMINX, String.valueOf(minx)); + add(LATLONBBMAXY, String.valueOf(maxy)); + add(LATLONBBMAXX, String.valueOf(maxx)); + add(LATLONBBMINY, String.valueOf(miny)); + add(LATLONBBCRS, crs); } + public void setLatLonBoundingBox(double minx, double maxy, double maxx, + double miny, final String crs) { + set(LATLONBBMINX, String.valueOf(minx)); + set(LATLONBBMAXY, String.valueOf(maxy)); + set(LATLONBBMAXX, String.valueOf(maxx)); + set(LATLONBBMINY, String.valueOf(miny)); + set(LATLONBBCRS, crs); + } + + private final static String NATIVEBBMINX="nativeBoundingBox/minx"; + private final static String NATIVEBBMAXX="nativeBoundingBox/maxx"; + private final static String NATIVEBBMINY="nativeBoundingBox/miny"; + private final static String NATIVEBBMAXY="nativeBoundingBox/maxy"; + private final static String NATIVEBBCRS="nativeBoundingBox/crs"; + + /** + * @deprecated use the setSRS.
+ * This method will be set as private in the next release + * + * @param minx + * @param maxy + * @param maxx + * @param miny + * @param crs + */ public void addNativeBoundingBox(double minx, double maxy, double maxx, double miny, final String crs) { - add("nativeBoundingBox/minx", String.valueOf(minx)); - add("nativeBoundingBox/maxy", String.valueOf(maxy)); - add("nativeBoundingBox/maxx", String.valueOf(maxx)); - add("nativeBoundingBox/miny", String.valueOf(miny)); - add("nativeBoundingBox/crs", crs); + add(NATIVEBBMINX, String.valueOf(minx)); + add(NATIVEBBMAXY, String.valueOf(maxy)); + add(NATIVEBBMAXX, String.valueOf(maxx)); + add(NATIVEBBMINY, String.valueOf(miny)); + add(NATIVEBBCRS, crs); + } + + public void setNativeBoundingBox(double minx, double maxy, double maxx, + double miny, final String crs) { + set(NATIVEBBMINX, String.valueOf(minx)); + set(NATIVEBBMAXY, String.valueOf(maxy)); + set(NATIVEBBMAXX, String.valueOf(maxx)); + set(NATIVEBBMINY, String.valueOf(miny)); + set(NATIVEBBCRS, crs); } - } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java index 29ede05..4221618 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java @@ -57,11 +57,23 @@ public class PropertyXMLEncoder extends XmlElement { super(rootName); } - protected void add(String key, String value) { + protected void add(final String key, final String value) { if (key != null && value != null) { add(this.getRoot(), key, value); } } + + protected void set(final String key, final String value) { + if (key != null && value != null) { + Element pp = null; + if ((pp = contains(key)) == null) + add(key, value); + else { + remove(pp); + add(key, value); + } + } + } private void add(Element e, String key, String value) { if (!key.contains("/")) { diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java index 826680d..d26e5bb 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java @@ -79,7 +79,5 @@ public class GSCoverageEncoderTest extends TestCase { Assert.assertNull(el4); if (el4==null) LOGGER.info("REMOVED"); - - } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSResourceEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSResourceEncoderTest.java new file mode 100644 index 0000000..d67945e --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSResourceEncoderTest.java @@ -0,0 +1,26 @@ +package it.geosolutions.geoserver.rest.encoder.coverage; + +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; + +import org.junit.Assert; +import org.junit.Test; + +public class GSResourceEncoderTest { + + /** + * test set or reset of reprojection + */ + @Test + public void testReprojection(){ + GSResourceEncoder re=new GSCoverageEncoder(); + + re.setProjectionPolicy(ProjectionPolicy.FORCE_DECLARED); + Assert.assertNotNull(re.contains("projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); + + re.setProjectionPolicy(ProjectionPolicy.NONE); + Assert.assertNull(re.contains("projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); + Assert.assertNotNull(re.contains("projectionPolicy",ProjectionPolicy.NONE.toString())); + } +} From 76452fb5fe6b7c6004bc40ba2847311ac6ee802e Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Tue, 13 Sep 2011 23:47:30 +0200 Subject: [PATCH 04/12] changes implementing fix for defect #16 --- .../encoder/utils/PropertyXMLEncoder.java | 30 +++++++++++++---- .../rest/encoder/GSResourceEncoderTest.java | 14 ++++++++ .../coverage/GSCoverageEncoderTest.java | 33 +++++++++++++++++++ .../coverage/GSResourceEncoderTest.java | 26 --------------- 4 files changed, 70 insertions(+), 33 deletions(-) create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoderTest.java delete mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSResourceEncoderTest.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java index 4221618..8475fcf 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java @@ -64,14 +64,30 @@ public class PropertyXMLEncoder extends XmlElement { } protected void set(final String key, final String value) { - if (key != null && value != null) { - Element pp = null; - if ((pp = contains(key)) == null) - add(key, value); - else { - remove(pp); - add(key, value); + set(getRoot(), key, value); + } + + private void set(final Element e, final String key, final String value){ + if (!key.contains("/")) { + if (key != null && value != null) { + Element pp = null; + if ((pp = contains(key)) == null) + add(key, value); + else { + remove(pp); + add(key, value); + } } + } else { + final int i = key.indexOf("/"); + final String childName = key.substring(0, i); + final String newkey = key.substring(i + 1); + + Element child = e.getChild(childName); + if (child == null) { + child = new Element(childName); + } + set(child, newkey, value); } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoderTest.java new file mode 100644 index 0000000..c74bf02 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoderTest.java @@ -0,0 +1,14 @@ +package it.geosolutions.geoserver.rest.encoder; + +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; +import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; + +import org.junit.Assert; +import org.junit.Test; + +public class GSResourceEncoderTest { + + +} diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java index d26e5bb..11ffb99 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java @@ -19,6 +19,8 @@ */ package it.geosolutions.geoserver.rest.encoder.coverage; +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; +import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; @@ -43,6 +45,37 @@ public class GSCoverageEncoderTest extends TestCase { */ protected final static Logger LOGGER = Logger.getLogger(GSCoverageEncoderTest.class); + /** + * test set or reset of reprojection + */ + @Test + public void testReprojection(){ + GSResourceEncoder re=new GSCoverageEncoder(); + + re.setProjectionPolicy(ProjectionPolicy.FORCE_DECLARED); + Assert.assertNotNull(re.contains("projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); + + re.setProjectionPolicy(ProjectionPolicy.NONE); + Assert.assertNull(re.contains("projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); + Assert.assertNotNull(re.contains("projectionPolicy",ProjectionPolicy.NONE.toString())); + } + + /** + * test set or reset of BB + */ + @Test + public void testBB(){ + GSResourceEncoder re=new GSCoverageEncoder(); + + re.setLatLonBoundingBox(-180d, 90d, 180d, -90d, null); + Assert.assertNotNull(re.contains("minx","-180.0")); + + re.setLatLonBoundingBox(-90d, 45d, 180d, -90d, null); + + Assert.assertNull(re.contains("minx","-180.0")); + Assert.assertNotNull(re.contains("minx","-90.0")); + } + @Test public void testAll() { final GSCoverageEncoder encoder=new GSCoverageEncoder(); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSResourceEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSResourceEncoderTest.java deleted file mode 100644 index d67945e..0000000 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSResourceEncoderTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package it.geosolutions.geoserver.rest.encoder.coverage; - -import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; -import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; -import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; - -import org.junit.Assert; -import org.junit.Test; - -public class GSResourceEncoderTest { - - /** - * test set or reset of reprojection - */ - @Test - public void testReprojection(){ - GSResourceEncoder re=new GSCoverageEncoder(); - - re.setProjectionPolicy(ProjectionPolicy.FORCE_DECLARED); - Assert.assertNotNull(re.contains("projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); - - re.setProjectionPolicy(ProjectionPolicy.NONE); - Assert.assertNull(re.contains("projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); - Assert.assertNotNull(re.contains("projectionPolicy",ProjectionPolicy.NONE.toString())); - } -} From ee61857f6c156a108cfb28d3af69d6c9ad2a711e Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Wed, 14 Sep 2011 01:24:17 +0200 Subject: [PATCH 05/12] more fix for defect #16 --- .../encoder/utils/PropertyXMLEncoder.java | 26 ++++++++++--------- .../coverage/GSCoverageEncoderTest.java | 3 ++- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java index 8475fcf..9dbcb66 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java @@ -56,28 +56,22 @@ public class PropertyXMLEncoder extends XmlElement { public PropertyXMLEncoder(final String rootName) { super(rootName); } - - protected void add(final String key, final String value) { - if (key != null && value != null) { - add(this.getRoot(), key, value); - } - } - protected void set(final String key, final String value) { - set(getRoot(), key, value); + public void set(final String key, final String value) { + if (key != null && value != null) { + set(getRoot(), key, value); + } } private void set(final Element e, final String key, final String value){ if (!key.contains("/")) { - if (key != null && value != null) { Element pp = null; if ((pp = contains(key)) == null) - add(key, value); + add(e,key, value); else { remove(pp); - add(key, value); + add(e,key, value); } - } } else { final int i = key.indexOf("/"); final String childName = key.substring(0, i); @@ -86,11 +80,19 @@ public class PropertyXMLEncoder extends XmlElement { Element child = e.getChild(childName); if (child == null) { child = new Element(childName); + e.addContent(child); + add(child,newkey,value); } set(child, newkey, value); } } + public void add(final String key, final String value) { + if (key != null && value != null) { + add(this.getRoot(), key, value); + } + } + private void add(Element e, String key, String value) { if (!key.contains("/")) { e.addContent(new Element(key).setText(value)); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java index 11ffb99..54b1b0e 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java @@ -90,7 +90,8 @@ public class GSCoverageEncoderTest extends TestCase { dim2.addPresentation(Presentation.LIST); encoder.addMetadata("elev", dim2); - LOGGER.info(encoder.toString()); + if (LOGGER.isInfoEnabled()) + LOGGER.info(encoder.toString()); final Element el=encoder.contains("metadata"); Assert.assertNotNull(el); From 9a811e56b3031251d5ecd3448aa2fea0fb8d64ac Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Wed, 28 Sep 2011 17:36:48 +0200 Subject: [PATCH 06/12] added reload support --- .../rest/GeoServerRESTPublisher.java | 11 ++++- .../encoder/utils/NestedElementEncoder.java | 42 +++++++++++++++++-- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index 93e1296..5720594 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -680,14 +680,21 @@ public class GeoServerRESTPublisher { } } + public boolean reload() { + String sUrl = restURL + "/rest/reload"; + String result = HTTPUtils.post(sUrl, "", "text/plain", gsuser, gspass); + return result != null; + } + public boolean removeLayerGroup(String name) { try { URL deleteUrl = new URL(restURL + "/rest/layergroups/" + name); boolean deleted = HTTPUtils.delete(deleteUrl.toExternalForm(), gsuser, gspass); if (!deleted) { - LOGGER.warn("Could not delete layergroup " + name); + LOGGER.warn("Could not delete layergroup " + name); } else { - LOGGER.info("Layergroup successfully deleted: " + name); + if (LOGGER.isInfoEnabled()) + LOGGER.info("Layergroup successfully deleted: " + name); } return deleted; diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java index 7ba3776..65d4acf 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java @@ -73,18 +73,52 @@ public class NestedElementEncoder extends XmlElement { super(listName); } - public void add(String key, String value) { + public void set(final String key, final String value) { + final Element entryElem = new Element("entry"); + + if (key != null) { + entryElem.setAttribute("key", key); + } + entryElem.setText(value); + + final Element el = contains(entryElem); + if (el != null) { + addContent(entryElem); + } + + } + + public void set(final String key, final Element value) { + final Element entryElem = new Element("entry"); + + if (key != null) { + entryElem.setAttribute("key", key); + } + entryElem.addContent(value); + + final Element el = contains(entryElem); + + if (el != null) { + addContent(entryElem); + } else { + if (remove(el)) + addContent(entryElem); + } + + } + + public void add(final String key, final String value) { final Element entryElem = new Element("entry"); if (key != null) entryElem.setAttribute("key", key); entryElem.setText(value); - + this.addContent(entryElem); } - - public void add(String key, Element value) { + + public void add(final String key, final Element value) { final Element entryElem = new Element("entry"); if (key != null) entryElem.setAttribute("key", key); From 76e615a400a71e199291c6ee82fb887ede4d3a3f Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Tue, 4 Oct 2011 15:39:12 +0200 Subject: [PATCH 07/12] added reset function --- .../rest/GeoServerRESTPublisher.java | 20 ++++++++++++++++++- .../geoserver/rest/HTTPUtils.java | 13 ++++++++++++ .../rest/encoder/GSResourceEncoderTest.java | 14 ------------- 3 files changed, 32 insertions(+), 15 deletions(-) delete mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoderTest.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index 5720594..0a88c6e 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -65,7 +65,7 @@ public class GeoServerRESTPublisher { * @param password password auth credential */ public GeoServerRESTPublisher(String restURL, String username, String password) { - this.restURL = restURL; + this.restURL = HTTPUtils.decurtSlash(restURL); this.gsuser = username; this.gspass = password; } @@ -680,12 +680,30 @@ public class GeoServerRESTPublisher { } } + /** + * reload the target geoserver configuration + * @return true if success + * + * @see http://docs.geoserver.org/stable/en/user/restconfig/rest-config-api.html + */ public boolean reload() { String sUrl = restURL + "/rest/reload"; String result = HTTPUtils.post(sUrl, "", "text/plain", gsuser, gspass); return result != null; } + /** + * reset the target geoserver configuration + * @return true if success + * + * @see http://docs.geoserver.org/stable/en/user/restconfig/rest-config-api.html + */ + public boolean reset() { + String sUrl = restURL + "/rest/reset"; + String result = HTTPUtils.post(sUrl, "", "text/plain", gsuser, gspass); + return result != null; + } + public boolean removeLayerGroup(String name) { try { URL deleteUrl = new URL(restURL + "/rest/layergroups/" + name); diff --git a/src/main/java/it/geosolutions/geoserver/rest/HTTPUtils.java b/src/main/java/it/geosolutions/geoserver/rest/HTTPUtils.java index 8a612ac..bb40204 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/HTTPUtils.java +++ b/src/main/java/it/geosolutions/geoserver/rest/HTTPUtils.java @@ -426,5 +426,18 @@ class HTTPUtils { } } } + + /** + * recursively remove ending slashes + * + * @param geoserverURL + * @return + */ + public static String decurtSlash(String geoserverURL) { + if (geoserverURL.endsWith("/")) { + geoserverURL = decurtSlash(geoserverURL.substring(0, geoserverURL.length() - 1)); + } + return geoserverURL; + } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoderTest.java deleted file mode 100644 index c74bf02..0000000 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoderTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package it.geosolutions.geoserver.rest.encoder; - -import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; -import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; -import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; -import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; - -import org.junit.Assert; -import org.junit.Test; - -public class GSResourceEncoderTest { - - -} From fa2247187829d7d0260a789623fedc3731352f3c Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Tue, 11 Oct 2011 15:50:42 +0200 Subject: [PATCH 08/12] fix GeoserverRESTPostgisDatastore options pubblication and tests --- .../rest/encoder/GSPostGISDatastoreEncoder.java | 1 + .../geoserver/rest/encoder/GSResourceEncoder.java | 4 ++-- .../rest/GeoserverRESTPostgisDatastoreTest.java | 11 ++++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java index 92a229d..6cbc336 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java @@ -44,6 +44,7 @@ public class GSPostGISDatastoreEncoder extends PropertyXMLEncoder { super("dataStore"); addType("PostGIS"); // may be overwritten with e.g. "PostGIS (JNDI)" addDatabaseType("postgis"); + addContent(connectionParameters.getRoot()); } /** diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java index f271b15..811d46d 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -48,6 +48,8 @@ import org.jdom.Element; public abstract class GSResourceEncoder extends PropertyXMLEncoder { + final private GSMetadataEncoder metadata = new GSMetadataEncoder(); + final private Element keywordsListEncoder = new Element("keywords"); /** * @param rootName * Actually 'feature' or 'coverage' @@ -63,13 +65,11 @@ public abstract class GSResourceEncoder addContent(keywordsListEncoder); } - final private GSMetadataEncoder metadata = new GSMetadataEncoder(); public void addMetadata(String key, T dimensionInfo) { metadata.add(key, dimensionInfo.getRoot()); } - final private Element keywordsListEncoder = new Element("keywords"); public void addKeyword(String keyword) { final Element el = new Element("string"); diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java index eff5c46..b6611ca 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java @@ -83,8 +83,9 @@ public class GeoserverRESTPostgisDatastoreTest extends GeoserverRESTTest { if (!enabled()) { return; } - - String wsName = "it.geosolutions"; + deleteAll(); + + String wsName = DEFAULT_WS; String datastoreName = "resttestpostgis"; String description = "description"; String dsNamespace = "http://www.geo-solutions.it"; @@ -106,7 +107,9 @@ public class GeoserverRESTPostgisDatastoreTest extends GeoserverRESTTest { datastoreEncoder.addExposePrimaryKeys(exposePrimaryKeys); datastoreEncoder.addValidateConnections(validateConnections); datastoreEncoder.addPrimaryKeyMetadataTable(primaryKeyMetadataTable); - + + assertTrue(publisher.createWorkspace(wsName)); + // creation test boolean created = publisher.createPostGISDatastore(wsName, datastoreEncoder); @@ -125,6 +128,8 @@ public class GeoserverRESTPostgisDatastoreTest extends GeoserverRESTTest { assertTrue("PostGIS datastore not removed", removed); else if( ! removed ) LOGGER.error("*** Datastore " + datastoreName + " has not been removed."); + + assertTrue(publisher.removeWorkspace(wsName)); } } From bbd13b3aa97289a7e829f6c857f0e3bfcbcc8514 Mon Sep 17 00:00:00 2001 From: ETj Date: Fri, 14 Oct 2011 16:15:27 +0200 Subject: [PATCH 09/12] #17 Create a method to update the default style of a given layer --- .../rest/GeoServerRESTPublisher.java | 2 +- .../rest/GeoserverRESTPublisherTest.java | 84 ++++++++++++++++++- .../resources/testdata/restteststyle2.sld | 35 ++++++++ 3 files changed, 119 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/testdata/restteststyle2.sld diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index 0a88c6e..fe1d8e7 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -730,7 +730,7 @@ public class GeoServerRESTPublisher { * Allows to configure some layer attributes such as WmsPath and DefaultStyle * */ - protected boolean configureLayer(final GSLayerEncoder layer, final String layerName) { + public boolean configureLayer(final GSLayerEncoder layer, final String layerName) { if (layer.isEmpty()) { return true; diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java index e83d082..c712f1e 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java @@ -27,6 +27,8 @@ 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; @@ -34,6 +36,8 @@ 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; /** @@ -84,7 +88,21 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { String sld = reader.getSLD(styleName); assertNotNull(sld); - assertEquals(1475, sld.length()); + + 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()); } @@ -320,6 +338,70 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { assertFalse("removed not existing datastore", ok); } + + public void testUpdateDefaultStyle() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } + + String ns = "it.geosolutions"; + 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, ns, storeName); + + // 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); + LOGGER.info("Layer style is " + layer.getDefaultStyle()); + assertEquals(styleName, layer.getDefaultStyle()); + } + + GSLayerEncoder le = new GSLayerEncoder(); + le.addDefaultStyle(styleName2); + publisher.configureLayer(le, layerName); + + { + RESTLayer layer = reader.getLayer(layerName); + LOGGER.info("Layer style is " + layer.getDefaultStyle()); + assertEquals(styleName2, layer.getDefaultStyle()); + } + + + // remove layer and datastore + boolean ok = publisher.unpublishFeatureType(ns, storeName, layerName); + assertFalse(existsLayer(layerName)); + boolean dsRemoved = publisher.removeDatastore(ns, 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"; diff --git a/src/test/resources/testdata/restteststyle2.sld b/src/test/resources/testdata/restteststyle2.sld new file mode 100644 index 0000000..b06c44e --- /dev/null +++ b/src/test/resources/testdata/restteststyle2.sld @@ -0,0 +1,35 @@ + + + + country + + restteststyle2 + STYLE2 FOR TESTING PURPOSES + A sample style that just draws out a solid gray interior with a black 1px outline + + name2 + Feature + SemanticType[ANY] + + Polygon + + + + #C8B679 + + + 1.0 + + + + + #000000 + + + + + + + + + From 562600f3861e3ea3169b53e54c6fc0e92118f09d Mon Sep 17 00:00:00 2001 From: ETj Date: Wed, 19 Oct 2011 18:28:19 +0200 Subject: [PATCH 10/12] Fixed configureLayer Improved base test. WIP --- .../rest/GeoServerRESTPublisher.java | 18 ++++---- .../rest/GeoserverRESTPublisherTest.java | 13 +++--- .../geoserver/rest/GeoserverRESTTest.java | 44 ++++++++++++++----- 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index fe1d8e7..d5c0fed 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -220,7 +220,7 @@ public class GeoServerRESTPublisher { try { GSLayerEncoder layerEncoder = new GSLayerEncoder(); layerEncoder.addDefaultStyle(defaultStyle); - configureLayer(layerEncoder, layerName); + configureLayer(workspace, layerName, layerEncoder); } catch (Exception e) { LOGGER.warn("Error in publishing shapefile " + e.getMessage(), e); sent = false; @@ -326,7 +326,7 @@ public class GeoServerRESTPublisher { GSLayerEncoder layerEncoder = new GSLayerEncoder(); layerEncoder.addDefaultStyle(defaultStyle); - configured = configureLayer(layerEncoder, layername); + configured = configureLayer(workspace, layername, layerEncoder); if (!configured) { LOGGER.warn("Error in configuring (" + configuredResult + ") " @@ -399,7 +399,7 @@ public class GeoServerRESTPublisher { // config layer props (style, ...) GSLayerEncoder layerEncoder = new GSLayerEncoder(); layerEncoder.addDefaultStyle(defaultStyle); - configureLayer(layerEncoder, coverageName); + configureLayer(workspace, coverageName, layerEncoder); } catch (Exception e) { LOGGER.warn("Could not configure external GEOTiff:" + storeName, e); @@ -510,7 +510,7 @@ public class GeoServerRESTPublisher { String coverageName = covList.get(0).getName(); configureCoverage(coverageEncoder, store.getWorkspaceName(), storeName, coverageName); - configureLayer(layerEncoder, storeName); + configureLayer(workspace, storeName, layerEncoder); } catch (Exception e) { LOGGER.warn("Could not configure external mosaic:" + storeName, e); @@ -730,22 +730,24 @@ public class GeoServerRESTPublisher { * Allows to configure some layer attributes such as WmsPath and DefaultStyle * */ - public boolean configureLayer(final GSLayerEncoder layer, final String layerName) { + public boolean configureLayer(final String workspace, final String layerName, final GSLayerEncoder layer) { if (layer.isEmpty()) { return true; } - final String url = restURL + "/rest/layers/" + layerName; + String fqLayerName = workspace + ":" + layerName; + + final String url = restURL + "/rest/layers/" + fqLayerName; String layerXml = layer.toString(); String sendResult = HTTPUtils.putXml(url, layerXml, gsuser, gspass); if (sendResult != null) { if (LOGGER.isInfoEnabled()) { - LOGGER.info("Layer successfully configured: " + layerName); + LOGGER.info("Layer successfully configured: " + fqLayerName); } } else { - LOGGER.warn("Error configuring layer " + layerName + " (" + sendResult + ")"); + LOGGER.warn("Error configuring layer " + fqLayerName + " (" + sendResult + ")"); } return sendResult != null; diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java index c712f1e..ce70bbd 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java @@ -344,11 +344,10 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { return; } - String ns = "it.geosolutions"; + String ws = "it.geosolutions"; String storeName = "resttestshp"; String layerName = "cities"; - final String styleName = "restteststyle"; { File sldFile = new ClassPathResource("testdata/restteststyle.sld").getFile(); @@ -371,10 +370,10 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); // known state? - cleanupTestFT(layerName, ns, storeName); + cleanupTestFT(layerName, ws, storeName); // test insert - boolean published = publisher.publishShp(ns, storeName, layerName, zipFile, "EPSG:4326", styleName); + boolean published = publisher.publishShp(ws, storeName, layerName, zipFile, "EPSG:4326", styleName); assertTrue("publish() failed", published); assertTrue(existsLayer(layerName)); @@ -386,7 +385,7 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { GSLayerEncoder le = new GSLayerEncoder(); le.addDefaultStyle(styleName2); - publisher.configureLayer(le, layerName); + publisher.configureLayer(ws, layerName, le); { RESTLayer layer = reader.getLayer(layerName); @@ -396,9 +395,9 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { // remove layer and datastore - boolean ok = publisher.unpublishFeatureType(ns, storeName, layerName); + boolean ok = publisher.unpublishFeatureType(ws, storeName, layerName); assertFalse(existsLayer(layerName)); - boolean dsRemoved = publisher.removeDatastore(ns, storeName); + boolean dsRemoved = publisher.removeDatastore(ws, storeName); assertTrue("removeDatastore() failed", dsRemoved); } diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java index 142ba6c..a7cb1b4 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java @@ -65,14 +65,22 @@ public abstract class GeoserverRESTTest extends TestCase { public static final GeoServerRESTPublisher publisher; private static boolean enabled = false; + private static Boolean existgs = null; static { - RESTURL = System.getProperty("resturl", "http://localhost:8080/geoserver"); - RESTUSER = System.getProperty("restuser", "admin"); - RESTPW = System.getProperty("restpw", "geoserver"); +// for (String propName : System.getProperties().stringPropertyNames()) { +// System.out.println("PROP " + propName); +// } + for (String envName : System.getenv().keySet()) { + System.out.println("ENVVAR " + envName + " = \""+System.getenv(envName)+"\""); + } + + RESTURL = getenv("gsmgr_resturl", "http://localhost:8080/geoserver"); + RESTUSER = getenv("gsmgr_restuser", "admin"); + RESTPW = getenv("gsmgr_restpw", "geoserver"); // These tests will destroy data, so let's make sure we do want to run them - enabled = System.getProperty("resttest", "false").equalsIgnoreCase("true"); + enabled = getenv("gsmgr_resttest", "false").equalsIgnoreCase("true"); if( ! enabled ) LOGGER.warn("Tests are disabled. Please read the documentation to enable them."); @@ -87,6 +95,13 @@ public abstract class GeoserverRESTTest extends TestCase { publisher = new GeoServerRESTPublisher(RESTURL, RESTUSER, RESTPW); } + private static String getenv(String envName, String envDefault) { + String env = System.getenv(envName); + String ret = System.getProperty(envName, env); + LOGGER.debug("env var " + envName + " is " + ret); + return ret != null? ret : envDefault; + } + public GeoserverRESTTest(String testName) { super(testName); } @@ -97,18 +112,23 @@ public abstract class GeoserverRESTTest extends TestCase { super.setUp(); if(enabled) { - if( ! reader.existGeoserver()) { - System.out.println(getClass().getSimpleName() + ": TESTS WILL BE SKIPPED SINCE NO GEOSERVER WAS FOUND AT " + RESTURL + " ("+ RESTUSER+":"+RESTPW+")"); - enabled = false; - } else { - System.out.println(getClass().getSimpleName() + ": using geoserver instance " + RESTUSER+":"+RESTPW+ " @ " + RESTURL); + if(existgs == null) { + existgs = reader.existGeoserver(); + if ( ! existgs ) { + LOGGER.error("TESTS WILL FAIL BECAUSE NO GEOSERVER WAS FOUND AT " + RESTURL + " ("+ RESTUSER+":"+RESTPW+")"); + } else { + LOGGER.info("Using geoserver instance " + RESTUSER+":"+RESTPW+ " @ " + RESTURL); + } } - } - if(enabled) + if ( ! existgs ) { + System.out.println("Failing test " + this.getClass().getSimpleName() + "::" + this.getName() + " : geoserver not found"); + fail("GeoServer not found"); + } System.out.println("\n-------------------> RUNNING TEST " + this.getName()); - else + } else { System.out.println("Skipping test " + this.getClass().getSimpleName() + "::" + this.getName()); + } } protected boolean enabled() { From 0c4229df6bc42a67c5f35d85986bc6cf0d1f5f92 Mon Sep 17 00:00:00 2001 From: ETj Date: Wed, 19 Oct 2011 19:27:15 +0200 Subject: [PATCH 11/12] Readded old configureLayer as deprecated for backward compat. Fixed some tests. --- .../rest/GeoServerRESTPublisher.java | 16 +++++++++++ .../rest/GeoserverRESTPublisherTest.java | 27 ++++++++++--------- .../geoserver/rest/GeoserverRESTTest.java | 11 +++----- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index d5c0fed..12d3309 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -726,18 +726,34 @@ public class GeoServerRESTPublisher { //=== //========================================================================== + /** + * @deprecated please use {@link configureLayer(String workspace, String layerName, GSLayerEncoder layer) } + */ + public boolean configureLayer(final GSLayerEncoder layer, final String layerName) + { + return configureLayer(null, layerName, layer); + } + /** * Allows to configure some layer attributes such as WmsPath and DefaultStyle * */ public boolean configureLayer(final String workspace, final String layerName, final GSLayerEncoder layer) { + // TODO: check this usecase, layer should always be defined if (layer.isEmpty()) { + LOGGER.warn("Null layer name while configuring layer -- This behavior is suspicious."); return true; } String fqLayerName = workspace + ":" + layerName; + // this null check is here only for backward compatibility. workspace shall be mandatory. + if(workspace == null) { + LOGGER.warn("Null workspace while configuring layer : " + layerName + " -- This behavior is deprecated."); + fqLayerName = layerName; + } + final String url = restURL + "/rest/layers/" + fqLayerName; String layerXml = layer.toString(); diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java index ce70bbd..fb1de65 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java @@ -50,7 +50,6 @@ import org.springframework.core.io.ClassPathResource; public class GeoserverRESTPublisherTest extends GeoserverRESTTest { private final static Logger LOGGER = Logger.getLogger(GeoserverRESTPublisherTest.class); - private static final String DEFAULT_WS = "it.geosolutions"; public GeoserverRESTPublisherTest(String testName) { super(testName); @@ -152,6 +151,7 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { if (publisher.removeDatastore(ns, storeName)) { LOGGER.info("Cleared stale datastore " + storeName); } + assertFalse("Cleanup failed", existsLayer(layerName)); } @@ -172,18 +172,20 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { return; } // Assume.assumeTrue(enabled); + deleteAllWorkspaces(); + assertTrue(publisher.createWorkspace(DEFAULT_WS)); - String ns = "it.geosolutions"; +// String ns = "it.geosolutions"; String storeName = "resttestshp"; String layerName = "cities"; File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); // known state? - cleanupTestFT(layerName, ns, storeName); + cleanupTestFT(layerName, DEFAULT_WS, storeName); // test insert - boolean published = publisher.publishShp(ns, storeName, layerName, zipFile); + boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile); assertTrue("publish() failed", published); assertTrue(existsLayer(layerName)); @@ -192,12 +194,12 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { LOGGER.info("Layer style is " + layer.getDefaultStyle()); //test delete - boolean ok = publisher.unpublishFeatureType(ns, storeName, layerName); + boolean ok = publisher.unpublishFeatureType(DEFAULT_WS, storeName, layerName); assertTrue("Unpublish() failed", ok); assertFalse(existsLayer(layerName)); // remove also datastore - boolean dsRemoved = publisher.removeDatastore(ns, storeName); + boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, storeName); assertTrue("removeDatastore() failed", dsRemoved); } @@ -208,7 +210,7 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { } // Assume.assumeTrue(enabled); - String ns = "it.geosolutions"; + String ns = "geosolutions"; String storeName = "resttestshp"; String layerName = "cities"; @@ -344,7 +346,6 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { return; } - String ws = "it.geosolutions"; String storeName = "resttestshp"; String layerName = "cities"; @@ -370,10 +371,10 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { File zipFile = new ClassPathResource("testdata/resttestshp.zip").getFile(); // known state? - cleanupTestFT(layerName, ws, storeName); + cleanupTestFT(layerName, DEFAULT_WS, storeName); // test insert - boolean published = publisher.publishShp(ws, storeName, layerName, zipFile, "EPSG:4326", styleName); + boolean published = publisher.publishShp(DEFAULT_WS, storeName, layerName, zipFile, "EPSG:4326", styleName); assertTrue("publish() failed", published); assertTrue(existsLayer(layerName)); @@ -385,7 +386,7 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { GSLayerEncoder le = new GSLayerEncoder(); le.addDefaultStyle(styleName2); - publisher.configureLayer(ws, layerName, le); + publisher.configureLayer(DEFAULT_WS, layerName, le); { RESTLayer layer = reader.getLayer(layerName); @@ -395,9 +396,9 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { // remove layer and datastore - boolean ok = publisher.unpublishFeatureType(ws, storeName, layerName); + boolean ok = publisher.unpublishFeatureType(DEFAULT_WS, storeName, layerName); assertFalse(existsLayer(layerName)); - boolean dsRemoved = publisher.removeDatastore(ws, storeName); + boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, storeName); assertTrue("removeDatastore() failed", dsRemoved); } diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java index a7cb1b4..7e0f4ba 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java @@ -56,6 +56,8 @@ import org.apache.log4j.Logger; public abstract class GeoserverRESTTest extends TestCase { private final static Logger LOGGER = Logger.getLogger(GeoserverRESTTest.class); + protected static final String DEFAULT_WS = "geosolutions"; + public static final String RESTURL; public static final String RESTUSER; public static final String RESTPW; @@ -68,13 +70,6 @@ public abstract class GeoserverRESTTest extends TestCase { private static Boolean existgs = null; static { -// for (String propName : System.getProperties().stringPropertyNames()) { -// System.out.println("PROP " + propName); -// } - for (String envName : System.getenv().keySet()) { - System.out.println("ENVVAR " + envName + " = \""+System.getenv(envName)+"\""); - } - RESTURL = getenv("gsmgr_resturl", "http://localhost:8080/geoserver"); RESTUSER = getenv("gsmgr_restuser", "admin"); RESTPW = getenv("gsmgr_restpw", "geoserver"); @@ -221,7 +216,7 @@ public abstract class GeoserverRESTTest extends TestCase { } } - private void deleteAllWorkspaces() { + protected void deleteAllWorkspaces() { List workspaces = reader.getWorkspaceNames(); for (String workspace : workspaces) { LOGGER.warn("Deleting Workspace " + workspace ); From 04449f8bdb8d9599a319397e13fb2341573302be Mon Sep 17 00:00:00 2001 From: ccancellieri Date: Mon, 7 Nov 2011 20:03:27 +0100 Subject: [PATCH 12/12] Added some test class for encoder. Some improvements to the ElementUtils class. Many improvements adding setter to the Encoders classes --- .../rest/GeoServerRESTPublisher.java | 3 +- .../rest/encoder/GSLayerEncoder.java | 28 +- .../encoder/GSPostGISDatastoreEncoder.java | 232 +++++++++++++--- .../rest/encoder/GSResourceEncoder.java | 56 +++- .../rest/encoder/GSWorkspaceEncoder.java | 18 +- .../encoder/coverage/GSCoverageEncoder.java | 2 - .../coverage/GSImageMosaicEncoder.java | 173 ++++++++++-- .../GSFeatureDimensionInfoEncoder.java | 14 +- .../metadata/GSDimensionInfoEncoder.java | 52 +++- .../encoder/metadata/GSMetadataEncoder.java | 10 +- .../rest/encoder/utils/ElementUtils.java | 262 +++++++++++++----- .../encoder/utils/NestedElementEncoder.java | 135 +++++---- .../encoder/utils/PropertyXMLEncoder.java | 83 +++++- .../rest/encoder/utils/XmlElement.java | 51 ++-- .../GeoserverRESTPostgisDatastoreTest.java | 24 +- .../coverage/GSCoverageEncoderTest.java | 51 ++-- .../coverage/GSImageMosaicEncoderTest.java | 39 +-- .../GSFeatureDimensionInfoEncoderTest.java | 71 +++++ .../encoder/feature/GSFeatureEncoderTest.java | 110 +++++++- .../rest/encoder/utils/ElementUtilsTest.java | 166 +++++++++++ 20 files changed, 1259 insertions(+), 321 deletions(-) create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoderTest.java create mode 100644 src/test/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtilsTest.java diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index 12d3309..c452bdc 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java +++ b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java @@ -271,6 +271,7 @@ public class GeoServerRESTPublisher { GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder(); fte.addName(layername); fte.addSRS(srs); + fte.addProjectionPolicy(ProjectionPolicy.REPROJECT_TO_DECLARED); String configuredResult = HTTPUtils.putXml(postUrl.toString(), fte.toString(), this.gsuser, this.gspass); boolean shpConfigured = configuredResult != null; @@ -393,7 +394,7 @@ public class GeoServerRESTPublisher { GSCoverageEncoder coverageEncoder = new GSCoverageEncoder(); coverageEncoder.addName(FilenameUtils.getBaseName(geotiff.getName())); coverageEncoder.addSRS(srs); - coverageEncoder.setProjectionPolicy(ProjectionPolicy.REPROJECT_TO_DECLARED); + coverageEncoder.addProjectionPolicy(ProjectionPolicy.REPROJECT_TO_DECLARED); configureCoverage(coverageEncoder, workspace, storeName, coverageName); // config layer props (style, ...) 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 c192563..a58f313 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSLayerEncoder.java @@ -32,17 +32,41 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; * @author ETj (etj at geo-solutions.it) * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it * + * The layer encoder is enabled by default + * */ public class GSLayerEncoder extends PropertyXMLEncoder { public GSLayerEncoder() { super("layer"); - // enable layer + addEnabled(); + } + + protected void addEnabled(){ add("enabled","true"); } + + /** + * @param enable true if layer should be set to enabled + */ + public void setEnabled(boolean enable){ + if (enable) + set("enabled","true"); + else + set("enabled","false"); + } + /** + * + * @param defaultStyle + * @deprecated will be set to protected in the next release, please use setDefaultStyle + * + */ public void addDefaultStyle(String defaultStyle) { add("defaultStyle", defaultStyle); } - + + public void setDefaultStyle(String defaultStyle) { + set("defaultStyle", defaultStyle); + } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java index 6cbc336..b4c57e8 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSPostGISDatastoreEncoder.java @@ -39,7 +39,6 @@ public class GSPostGISDatastoreEncoder extends PropertyXMLEncoder { private NestedElementEncoder connectionParameters = new NestedElementEncoder("connectionParameters"); - public GSPostGISDatastoreEncoder() { super("dataStore"); addType("PostGIS"); // may be overwritten with e.g. "PostGIS (JNDI)" @@ -61,105 +60,266 @@ public class GSPostGISDatastoreEncoder extends PropertyXMLEncoder { * */ public void defaultInit() { - addMinConnections(1); - addMaxConnections(10); - addFetchSize(1000); - addConnectionTimeout(20); - addLooseBBox(true); - addPreparedStatements(false); - addMaxOpenPreparedStatements(50); + setMinConnections(1); + setMaxConnections(10); + setFetchSize(1000); + setConnectionTimeout(20); + setLooseBBox(true); + setPreparedStatements(false); + setMaxOpenPreparedStatements(50); } - public void addName(String name) { + /** + * @deprecated will be set to protected in the next release + */ + public void addName(String name) { add("name", name); } + + public void setName(String name) { + set("name", name); + } - public void addDescription(String description) { + /** + * @deprecated will be set to protected in the next release + */ + public void addDescription(String description) { add("description", description); } - - public void addType(String type) { - add("type", type); + + public void setDescription(String description) { + set("description", description); } - public void addEnabled(boolean enabled) { + /** + * @deprecated will be set to protected in the next release + */ + public void addType(String type) { + add("type", type); + } + + public void setType(String type) { + set("type", type); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addEnabled(boolean enabled) { add("enabled", Boolean.toString(enabled)); } - public void addNamespace(String namespace) { + public void setEnabled(boolean enabled) { + set("enabled", Boolean.toString(enabled)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addNamespace(String namespace) { connectionParameters.add("namespace", namespace); } - public void addHost(String host) { + public void setNamespace(String namespace) { + connectionParameters.set("namespace", namespace); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addHost(String host) { connectionParameters.add("host", host); } + + public void setHost(String host) { + connectionParameters.set("host", host); + } - public void addPort(int port) { + /** + * @deprecated will be set to protected in the next release + */ + public void addPort(int port) { connectionParameters.add("port", Integer.toString(port)); } + + public void setPort(int port) { + connectionParameters.set("port", Integer.toString(port)); + } - public void addDatabase(String database) { + /** + * @deprecated will be set to protected in the next release + */ + public void addDatabase(String database) { connectionParameters.add("database", database); } + + public void setDatabase(String database) { + connectionParameters.set("database", database); + } - public void addSchema(String schema) { + /** + * @deprecated will be set to protected in the next release + */ + public void addSchema(String schema) { connectionParameters.add("schema", schema); } + + public void setSchema(String schema) { + connectionParameters.set("schema", schema); + } - public void addUser(String user) { + /** + * @deprecated will be set to protected in the next release + */ + public void addUser(String user) { connectionParameters.add("user", user); } - - public void addPassword(String password) { - connectionParameters.add("passwd", password); + + public void setUser(String user) { + connectionParameters.set("user", user); } - public void addDatabaseType(String dbtype) { + /** + * @deprecated will be set to protected in the next release + */ + public void addPassword(String password) { + connectionParameters.add("passwd", password); + } + + public void setPassword(String password) { + connectionParameters.set("passwd", password); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addDatabaseType(String dbtype) { connectionParameters.add("dbtype", dbtype); } - public void addJndiReferenceName(String jndiReferenceName) { - connectionParameters.add("jndiReferenceName", jndiReferenceName); + public void setDatabaseType(String dbtype) { + connectionParameters.set("dbtype", dbtype); } - public void addExposePrimaryKeys(boolean exposePrimaryKeys) { + /** + * @deprecated will be set to protected in the next release + */ + public void addJndiReferenceName(String jndiReferenceName) { + connectionParameters.add("jndiReferenceName", jndiReferenceName); + } + + public void setJndiReferenceName(String jndiReferenceName) { + connectionParameters.set("jndiReferenceName", jndiReferenceName); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addExposePrimaryKeys(boolean exposePrimaryKeys) { connectionParameters.add("Expose primary keys", Boolean.toString(exposePrimaryKeys)); } - public void addMaxConnections(int maxConnections) { + public void setExposePrimaryKeys(boolean exposePrimaryKeys) { + connectionParameters.set("Expose primary keys", Boolean.toString(exposePrimaryKeys)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addMaxConnections(int maxConnections) { connectionParameters.add("max connections", Integer.toString(maxConnections)); } - public void addMinConnections(int minConnections) { + public void setMaxConnections(int maxConnections) { + connectionParameters.set("max connections", Integer.toString(maxConnections)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addMinConnections(int minConnections) { connectionParameters.add("min connections", Integer.toString(minConnections)); } - public void addFetchSize(int fetchSize) { + public void setMinConnections(int minConnections) { + connectionParameters.set("min connections", Integer.toString(minConnections)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addFetchSize(int fetchSize) { connectionParameters.add("fetch size", Integer.toString(fetchSize)); } - public void addConnectionTimeout(int seconds) { + public void setFetchSize(int fetchSize) { + connectionParameters.set("fetch size", Integer.toString(fetchSize)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addConnectionTimeout(int seconds) { connectionParameters.add("Connection timeout", Integer.toString(seconds)); } - public void addValidateConnections(boolean validateConnections) { + public void setConnectionTimeout(int seconds) { + connectionParameters.set("Connection timeout", Integer.toString(seconds)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addValidateConnections(boolean validateConnections) { connectionParameters.add("validate connections", Boolean.toString(validateConnections)); } - public void addPrimaryKeyMetadataTable(String primaryKeyMetadataTable) { + public void setValidateConnections(boolean validateConnections) { + connectionParameters.set("validate connections", Boolean.toString(validateConnections)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addPrimaryKeyMetadataTable(String primaryKeyMetadataTable) { connectionParameters.add("Primary key metadata table", primaryKeyMetadataTable); } - public void addLooseBBox(boolean looseBBox) { + public void setPrimaryKeyMetadataTable(String primaryKeyMetadataTable) { + connectionParameters.set("Primary key metadata table", primaryKeyMetadataTable); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addLooseBBox(boolean looseBBox) { connectionParameters.add("Loose bbox", Boolean.toString(looseBBox)); } - public void addPreparedStatements(boolean preparedStatements) { + public void setLooseBBox(boolean looseBBox) { + connectionParameters.set("Loose bbox", Boolean.toString(looseBBox)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addPreparedStatements(boolean preparedStatements) { connectionParameters.add("preparedStatements", Boolean.toString(preparedStatements)); } - public void addMaxOpenPreparedStatements(int maxOpenPreparedStatements) { + public void setPreparedStatements(boolean preparedStatements) { + connectionParameters.set("preparedStatements", Boolean.toString(preparedStatements)); + } + + /** + * @deprecated will be set to protected in the next release + */ + public void addMaxOpenPreparedStatements(int maxOpenPreparedStatements) { connectionParameters.add("Max open prepared statements", Integer.toString(maxOpenPreparedStatements)); } + + public void setMaxOpenPreparedStatements(int maxOpenPreparedStatements) { + connectionParameters.set("Max open prepared statements", Integer.toString(maxOpenPreparedStatements)); + } } \ No newline at end of file diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java index 811d46d..4d6d33f 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSResourceEncoder.java @@ -33,6 +33,7 @@ import it.geosolutions.geoserver.rest.encoder.metadata.GSMetadataEncoder; import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; import org.jdom.Element; +import org.jdom.filter.Filter; /** * @@ -47,6 +48,7 @@ import org.jdom.Element; */ public abstract class GSResourceEncoder extends PropertyXMLEncoder { + private final static String NAME="name"; final private GSMetadataEncoder metadata = new GSMetadataEncoder(); final private Element keywordsListEncoder = new Element("keywords"); @@ -64,11 +66,31 @@ public abstract class GSResourceEncoder addContent(metadata.getRoot()); addContent(keywordsListEncoder); } + + public void setEnabled(boolean enabled){ + set("enabled",(enabled)?"true":"false"); + } - + /** + * @param key + * @param dimensionInfo + * @deprecated will be set to protected in the next release + */ public void addMetadata(String key, T dimensionInfo) { metadata.add(key, dimensionInfo.getRoot()); } + + /** + * @param key the name of the metadata to add (f.e.: elevation, time) + * @return true if something is removed, false otherwise + */ + public boolean delMetadata(String key) { + return metadata.remove(key); + } + + public void setMetadata(String key, T dimensionInfo) { + metadata.set(key, dimensionInfo.getRoot()); + } public void addKeyword(String keyword) { @@ -76,6 +98,25 @@ public abstract class GSResourceEncoder el.setText(keyword); keywordsListEncoder.addContent(el); } + + /** + * delete a keyword from the list + * @param keyword + * @return true if something is removed, false otherwise + */ + public boolean delKeyword(final String keyword) { + final Element el = new Element("string"); + el.setText(keyword); + return (keywordsListEncoder.removeContent(new Filter() { + private static final long serialVersionUID = 1L; + public boolean matches(Object obj) { + if (((Element)obj).getText().equals(keyword)){ + return true; + } + return false; + } + })).size()==0?false:true; + } /** * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED @@ -89,7 +130,7 @@ public abstract class GSResourceEncoder * NONE, REPROJECT_TO_DECLARED, FORCE_DECLARED * * @deprecated use the setProjectionPolicy.
- * This method will be set as private in the next release + * This method will be set as protected in the next release */ public void addProjectionPolicy(ProjectionPolicy policy) { add(PROJECTIONPOLICY, policy.toString()); @@ -102,13 +143,12 @@ public abstract class GSResourceEncoder set(PROJECTIONPOLICY, policy.toString()); } - private final static String NAME="name"; /** * Add the 'name' node with a text value from 'name' * * @note REQUIRED to configure a resource * @deprecated use the setName.
- * This method will be set as private in the next release + * This method will be set as protected in the next release */ public void addName(final String name) { add(NAME, name); @@ -127,7 +167,7 @@ public abstract class GSResourceEncoder * Add the 'title' node with a text value from 'title' * * @deprecated use the setTitle.
- * This method will be set as private in the next release + * This method will be set as protected in the next release */ public void addTitle(final String title) { add(TITLE, title); @@ -145,7 +185,7 @@ public abstract class GSResourceEncoder * Add the 'SRS' node with a text value from 'srs' * * @deprecated use the setSRS.
- * This method will be set as private in the next release + * This method will be set as protected in the next release */ public void addSRS(final String srs) { add(SRS, srs); @@ -166,7 +206,7 @@ public abstract class GSResourceEncoder /** * @deprecated use the setSRS.
- * This method will be set as private in the next release + * This method will be set as protected in the next release * * @param minx * @param maxy @@ -200,7 +240,7 @@ public abstract class GSResourceEncoder /** * @deprecated use the setSRS.
- * This method will be set as private in the next release + * This method will be set as protected in the next release * * @param minx * @param maxy diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java index 32e07df..e7fc68c 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/GSWorkspaceEncoder.java @@ -27,6 +27,7 @@ package it.geosolutions.geoserver.rest.encoder; import org.jdom.Element; +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; /** @@ -35,13 +36,15 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it */ public class GSWorkspaceEncoder extends PropertyXMLEncoder { + public final static String WORKSPACE="workspace"; + public final static String NAME="name"; public GSWorkspaceEncoder() { - super("workspace"); + super(WORKSPACE); } public GSWorkspaceEncoder(String name) { - super("workspace"); + super(WORKSPACE); addName(name); } @@ -49,11 +52,12 @@ public class GSWorkspaceEncoder extends PropertyXMLEncoder { * Add the name to this workspace * @param name * @throws IllegalStateException if name is already set + * @deprecated will be set to protected in the next release */ public void addName(String name) { - final Element el=contains("name"); + final Element el=ElementUtils.contains(getRoot(),NAME); if (el==null) - add("name", name); + add(NAME, name); else throw new IllegalStateException("Workspace name is already set: "+el.getText()); } @@ -63,15 +67,15 @@ public class GSWorkspaceEncoder extends PropertyXMLEncoder { * @param name */ public void setName(String name) { - final Element el=contains("name"); + final Element el=ElementUtils.contains(getRoot(),NAME); if (el==null) - add("name", name); + add(NAME, name); else el.setText(name); } public String getName(){ - final Element el=contains("name"); + final Element el=ElementUtils.contains(getRoot(),NAME); if (el!=null) return el.getTextTrim(); else diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java index a3f8b68..714f380 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoder.java @@ -28,8 +28,6 @@ package it.geosolutions.geoserver.rest.encoder.coverage; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; -import org.jdom.Element; - /** * Creates an XML diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java index 336d11c..81b126a 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoder.java @@ -24,9 +24,13 @@ */ package it.geosolutions.geoserver.rest.encoder.coverage; +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; import it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder; +import java.util.Iterator; + import org.jdom.Element; +import org.jdom.filter.Filter; /** * @@ -35,70 +39,191 @@ import org.jdom.Element; */ public class GSImageMosaicEncoder extends GSCoverageEncoder { + final private static String STRING="string"; + final private static String ENTRY="entry"; + final private NestedElementEncoder parameters=new NestedElementEncoder("parameters"); public GSImageMosaicEncoder() { // Link members to the parent addContent(parameters.getRoot()); } + + static class parametersFilter implements Filter { + final String name; + public parametersFilter(final String name){ + this.name=name; + } + + private static final long serialVersionUID = 1L; + public boolean matches(Object obj) { + if (obj instanceof Element) { + if (((Element)obj).getName().equals(ENTRY)){ + final Element el=((Element)obj).getChild(STRING); + if (el.getText().equals(this.name)){ + return true; + } + } + } + return false; + } + }; + + private final boolean removeParameter(final Filter filter){ + final Iterator it=ElementUtils.search(getRoot(), filter).iterator(); + if (it.hasNext()){ + final Element el=it.next(); +// if (it.hasNext()) +// return false; +// else + return ElementUtils.remove(el,el); + } + return false; + } + private final static String allowMultithreading="AllowMultithreading"; /** + * @deprecated will be set to protected in the next release * @param val */ public void addAllowMultithreading(final boolean val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("AllowMultithreading")); - param.addContent(new Element("string").setText((val)?"true":"false")); + final Element param=new Element(ENTRY); + param.addContent(new Element(STRING).setText(allowMultithreading)); + param.addContent(new Element(STRING).setText((val)?"true":"false")); parameters.addContent(param); } + private final static Filter allowMultithreadingFilter=new parametersFilter(allowMultithreading); + public void setAllowMultithreading(final boolean val){ + removeParameter(allowMultithreadingFilter); + addAllowMultithreading(val); + } + + private final static String filter="Filter"; + /** + * @deprecated will be set to protected in the next release + * @param val + */ public void addFilter(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("Filter")); - param.addContent(new Element("string").setText(val)); + final Element param=new Element(ENTRY); + param.addContent(new Element(STRING).setText(filter)); + param.addContent(new Element(STRING).setText(val)); parameters.addContent(param); } + + private final static Filter filterFilter=new parametersFilter(filter); + public void setFilter(final String val){ + removeParameter(filterFilter); + addFilter(val); + } + private final static String maxAllowedTiles="MaxAllowedTiles"; + /** + * @deprecated will be set to protected in the next release + * @param val + */ public void addMaxAllowedTiles(final int val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("MaxAllowedTiles")); - param.addContent(new Element("string").setText(String.valueOf(val))); + final Element param=new Element(ENTRY); + param.addContent(new Element(STRING).setText(maxAllowedTiles)); + param.addContent(new Element(STRING).setText(String.valueOf(val))); parameters.addContent(param); } + private final static Filter maxAllowedTilesFilter=new parametersFilter(maxAllowedTiles); + public void setMaxAllowedTiles(final int val){ + removeParameter(maxAllowedTilesFilter); + addMaxAllowedTiles(val); + } + + private final static String inputTransparentColor="InputTransparentColor"; + /** + * @deprecated will be set to protected in the next release + * @param val + */ public void addInputTransparentColor(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("InputTransparentColor")); - param.addContent(new Element("string").setText(val)); + final Element param=new Element(ENTRY); + param.addContent(new Element(STRING).setText(inputTransparentColor)); + param.addContent(new Element(STRING).setText(val)); parameters.addContent(param); } + private final static Filter inputTransparentColorFilter=new parametersFilter(inputTransparentColor); + public void setInputTransparentColor(final String val){ + removeParameter(inputTransparentColorFilter); + addInputTransparentColor(val); + } + + private final static String outputTransparentColor="OutputTransparentColor"; + /** + * @deprecated will be set to protected in the next release + * @param val + */ public void addOutputTransparentColor(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("OutputTransparentColor")); - param.addContent(new Element("string").setText(val)); + final Element param=new Element(ENTRY); + param.addContent(new Element(STRING).setText(outputTransparentColor)); + param.addContent(new Element(STRING).setText(val)); parameters.addContent(param); } + private final static Filter outputTransparentColorFilter=new parametersFilter(outputTransparentColor); + public void setOutputTransparentColor(final String val){ + removeParameter(outputTransparentColorFilter); + addInputTransparentColor(val); + } + + private final static String SUGGESTED_TILE_SIZE="SUGGESTED_TILE_SIZE"; + /** + * + * @param val + * @deprecated will be set to protected in the next release + */ public void addSUGGESTED_TILE_SIZE(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("SUGGESTED_TILE_SIZE")); - param.addContent(new Element("string").setText(val)); + final Element param=new Element(ENTRY); + param.addContent(new Element(STRING).setText(SUGGESTED_TILE_SIZE)); + param.addContent(new Element(STRING).setText(val)); parameters.addContent(param); } + private final static Filter SUGGESTED_TILE_SIZEFilter=new parametersFilter(SUGGESTED_TILE_SIZE); + public void setSUGGESTED_TILE_SIZE(final String val){ + removeParameter(SUGGESTED_TILE_SIZEFilter); + addSUGGESTED_TILE_SIZE(val); + } + + private final static String USE_JAI_IMAGEREAD="USE_JAI_IMAGEREAD"; + /** + * @deprecated will be set to protected in the next release + * @param val + */ public void addUSE_JAI_IMAGEREAD(final boolean val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("USE_JAI_IMAGEREAD")); - param.addContent(new Element("string").setText((val)?"true":"false")); + final Element param=new Element(ENTRY); + param.addContent(new Element(STRING).setText(USE_JAI_IMAGEREAD)); + param.addContent(new Element(STRING).setText((val)?"true":"false")); parameters.addContent(param); } + private final static Filter USE_JAI_IMAGEREADFilter=new parametersFilter(USE_JAI_IMAGEREAD); + public void setUSE_JAI_IMAGEREAD(final boolean val){ + removeParameter(USE_JAI_IMAGEREADFilter); + addUSE_JAI_IMAGEREAD(val); + } + + private final static String backgroundValues="BackgroundValues"; + /** + * @deprecated will be set to protected in the next release + * @param val + */ public void addBackgroundValues(final String val){ - final Element param=new Element("entry"); - param.addContent(new Element("string").setText("BackgroundValues")); - param.addContent(new Element("string").setText(val)); + final Element param=new Element(ENTRY); + param.addContent(new Element(STRING).setText(backgroundValues)); + param.addContent(new Element(STRING).setText(val)); parameters.addContent(param); } + + private final static Filter backgroundValuesFilter=new parametersFilter(backgroundValues); + public void setBackgroundValues(final String val){ + removeParameter(backgroundValuesFilter); + addBackgroundValues(val); + } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoder.java index af03bfc..b3d5431 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoder.java @@ -28,15 +28,25 @@ package it.geosolutions.geoserver.rest.encoder.feature; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; public class GSFeatureDimensionInfoEncoder extends GSDimensionInfoEncoder { + public final static String ATTRIBUTE="attribute"; /** * if this dimension is enabled this constructor should be called. - * @param attribute the attribute to use as dimension + * @param attribute the attribute field name to use as dimension */ public GSFeatureDimensionInfoEncoder(final String attribute){ super(true); - add("attribute", attribute); + add(ATTRIBUTE, attribute); } + /** + * Change the attribute used as dimension + * @param attribute the attribute to use as dimension + */ + public void setAttribute(final String attribute){ + set(ATTRIBUTE, attribute); + } + + } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSDimensionInfoEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSDimensionInfoEncoder.java index a636ebc..2bfbc57 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSDimensionInfoEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSDimensionInfoEncoder.java @@ -29,15 +29,18 @@ import it.geosolutions.geoserver.rest.encoder.utils.XmlElement; import java.math.BigDecimal; -import org.jdom.Element; - /** * * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it * */ public class GSDimensionInfoEncoder extends XmlElement{ - final boolean enabled; + public final static String DIMENSIONINFO="dimensionInfo"; + + public final static String RESOLUTION="resolution"; + public final static String PRESENTATION="presentation"; + + private boolean enabled; /** * Enum for presentation mode @@ -59,7 +62,7 @@ public class GSDimensionInfoEncoder extends XmlElement{ * @note a enabled dimension also need a presentation mode set. */ public GSDimensionInfoEncoder(final boolean enabled) { - super("dimensionInfo"); + super(DIMENSIONINFO); add("enabled", (enabled)?"true":"false"); this.enabled=enabled; } @@ -68,30 +71,51 @@ public class GSDimensionInfoEncoder extends XmlElement{ * build an not enabled dimension */ public GSDimensionInfoEncoder() { - super("dimensionInfo"); + super(DIMENSIONINFO); add("enabled", "false"); this.enabled=Boolean.FALSE; } + public void setEnabled(final boolean enabled){ + set("enabled", "true"); + this.enabled=Boolean.TRUE; + } + + /** + * @deprecated will be set to protected in the next release {@link setPresentation(final Presentation pres)} + * @param pres + */ public void addPresentation(final Presentation pres){ if (enabled){ - add("presentation",pres.toString()); + add(PRESENTATION,pres.toString()); } } + public void setPresentation(final Presentation pres){ + if (enabled){ + set(PRESENTATION,pres.toString()); + remove(RESOLUTION); + } + } + + /** + * @param pres + * @param interval + * @deprecated will be set to protected in the next release {@link setPresentation(final PresentationDiscrete pres, final BigDecimal interval)} + */ public void addPresentation(final PresentationDiscrete pres, final BigDecimal interval){ if (enabled){ - add("presentation",pres.toString()); - add("resolution",String.valueOf(interval)); + add(PRESENTATION,pres.toString()); + add(RESOLUTION,String.valueOf(interval)); } } - - public void add(String nodename, String nodetext) { - final Element el=new Element(nodename); - el.setText(nodetext); - this.addContent(el); - } + public void setPresentation(final PresentationDiscrete pres, final BigDecimal interval){ + if (enabled){ + set(PRESENTATION,pres.toString()); + set(RESOLUTION,String.valueOf(interval)); + } + } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java index 25bbe74..54e1501 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSMetadataEncoder.java @@ -29,12 +29,14 @@ import it.geosolutions.geoserver.rest.encoder.utils.NestedElementEncoder; public class GSMetadataEncoder extends NestedElementEncoder{ + public final static String METADATA="metadata"; + public GSMetadataEncoder() { - super("metadata"); + super(METADATA); } - public void addMetadata(final String key, final T value) { - this.add(key, value.getRoot()); - } +// public void addMetadata(final String key, final T value) { +// this.add(key, value.getRoot()); +// } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtils.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtils.java index 23ff7f6..35c6fc6 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtils.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtils.java @@ -25,72 +25,148 @@ package it.geosolutions.geoserver.rest.encoder.utils; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.apache.log4j.Logger; import org.jdom.Element; +import org.jdom.filter.Filter; /** * * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it - * + * */ public abstract class ElementUtils { + /** + * Default logger + */ + private final static Logger LOGGER = Logger.getLogger(ElementUtils.class); /** * - * @param root - * @param el - * @return true if the FIRST element EQUALS to the 'el' starting from root - * is found AND can be deleted. If it is the root true is returned - * and all of its child are removed. + * @param root the root where to start searching to element to remove + * @param el the element to remove (will be set to null since this node is unusable after removal) + * @return true if the element EQUALS to the 'el' starting from root + * (including) is found, false if object 'el' is not found * */ - public static boolean remove(Element root, final Element el) { + public static boolean remove(final Element root, Element el) throws IllegalArgumentException { + if (root == null || el == null) { + throw new IllegalArgumentException("Bad arguments: root=" + root + + " element=" + el); + } + // root is the element to remove + // note: equals checks references on Element type if (root.equals(el)) { - if (!el.isRootElement()) { - root = el.getParentElement(); - // removing all child - el.removeContent(); - root.removeContent(el); - } else { - // log warn this is root! - // removing all child - el.removeContent(); - } - } else if ((root = ElementUtils.contains(root, el)) != null) { - return remove(root, el); - } else { - return false; + // detach + el.detach(); + // removing all child + el.removeContent(); + + el=null; + + return true; } - return true; + // search for the element to remove + final Element search = ElementUtils.contains(root, el); + if (search != null) { + return remove(search, el); + } + return false; } /** + * * @param root - * @param el - * @return the FIRST element EQUALS to the 'el' starting from root or null + * @param filter + * @param depth + * the max depth to search. Use {@link contains(final Element + * root, final Filter filter)} for an infinite depth search + * @return + * @throws IllegalArgumentException */ - public static Element contains(final Element root, final Element el) { + public static List search(final Element root, + final Filter filter, final int depth) + throws IllegalArgumentException { - if (root != null && el != null) { - if (root.equals(el)) - return root; - - final List childrenList = root.getChildren(); - if (childrenList.size() > 0) { - Iterator it = childrenList.iterator(); - while (it.hasNext()) { - final Element ret; - if ((ret = contains(it.next(), el)) != null) - return ret; + if (root == null || filter == null || depth < 0) { + throw new IllegalArgumentException("Bad arguments: root=" + root + + " filter=" + filter + " depth=" + depth); + } + final List ret = new ArrayList(); + // if match add myself + if (filter.matches(root)) { + if (LOGGER.isDebugEnabled()) + LOGGER.debug("LOCATED-> name:" + root.getName() + " text:" + + root.getText()); + ret.add(root); + } + // check my children + if (depth > 1) { + final List childrenList = root.getContent(); + final Iterator it = childrenList.iterator(); + while (it.hasNext()) { + final Object obj = it.next(); + if (obj instanceof Element) { + final Element childEl = (Element) obj; + ret.addAll(search(childEl, filter, depth - 1)); } } } - return null; + return ret; } + public static List search(final Element root, final Filter filter) { + if (root == null || filter == null) { + throw new IllegalArgumentException("Bad arguments: root=" + root + + " filter=" + filter); + } + final List ret = new ArrayList(); + // if match add myself + if (filter.matches(root)) { + if (LOGGER.isDebugEnabled()) + LOGGER.debug("LOCATED-> name:" + root.getName() + " text:" + + root.getText()); + ret.add(root); + } + // navigate through children + final Iterator it = root.getDescendants(filter); + while (it.hasNext()) { + Object obj = it.next(); + if (obj instanceof Element) { + Element el = (Element) obj; + + if (LOGGER.isDebugEnabled()) + LOGGER.debug("LOCATED-> name:" + el.getName() + " text:" + + el.getText()); + + ret.add(el); + } + } + return ret; + } + + /** + * @param root + * @param name + * @param val + * @return the FIRST element matching the passed filter or null + */ + public static Element contains(final Element root, final Filter filter) throws IllegalArgumentException { + if (root == null || filter == null ) { + throw new IllegalArgumentException("Bad arguments: root=" + root + + " name=" + filter); + } + final Iterator it = search(root, filter).iterator(); + if (it.hasNext()) + return it.next(); + else + return null; + } + /** * @param root * @param name @@ -99,22 +175,29 @@ public abstract class ElementUtils { * starting from root or null */ public static Element contains(final Element root, final String name, - final String val) { - if (root != null && name != null && val != null) { - if (root.getName().equals(name) && root.getText().equals(val)) - return root; - - final List childrenList = root.getChildren(); - if (childrenList.size() > 0) { - Iterator it = childrenList.iterator(); - while (it.hasNext()) { - final Element ret; - if ((ret = contains(it.next(), name, val)) != null) - return ret; - } - } + final String val) throws IllegalArgumentException { + if (root == null || name == null || val == null) { + throw new IllegalArgumentException("Bad arguments: root=" + root + + " name=" + name + " val=" + val); } - return null; + final Filter filter = new Filter() { + private static final long serialVersionUID = 1L; + + public boolean matches(Object obj) { + if (obj instanceof Element) { + final Element el = ((Element) obj); + if (el.getName().equals(name) && el.getText().equals(val)) { + return true; + } + } + return false; + } + }; + final Iterator it = search(root, filter).iterator(); + if (it.hasNext()) + return it.next(); + else + return null; } /** @@ -124,22 +207,67 @@ public abstract class ElementUtils { * @param name * @return */ - public static Element contains(final Element root, final String name) { - if (root != null && name != null) { - if (root.getName().equals(name)) - return root; - - final List childrenList = root.getChildren(); - if (childrenList.size() > 0) { - Iterator it = childrenList.iterator(); - while (it.hasNext()) { - final Element ret; - if ((ret = contains(it.next(), name)) != null) - return ret; - } - } + public static Element contains(final Element root, final String name) + throws IllegalArgumentException { + if (root == null || name == null) { + throw new IllegalArgumentException("Bad arguments: root=" + root + + " name=" + name); } - return null; + + final Filter filter = new Filter() { + private static final long serialVersionUID = 1L; + + public boolean matches(Object obj) { + if (obj instanceof Element) { + final Element el = ((Element) obj); + if (el.getName().equals(name)) { + return true; + } + } + return false; + } + }; + final Iterator it = search(root, filter).iterator(); + if (it.hasNext()) + return it.next(); + else + return null; } + /** + * @param root + * @param el + * @return the FIRST element EQUALS to the 'el' starting from root or null + * This tests for equality of this Content object to the supplied + * object. Content items are considered equal only if they are + * referentially equal (i.e. the same object). + */ + public static Element contains(final Element root, final Element el) + throws IllegalArgumentException { + if (root == null || el == null) { + throw new IllegalArgumentException("Bad arguments: root=" + root + + " element=" + el); + } + final Filter filter = new Filter() { + /** + * + */ + private static final long serialVersionUID = 1L; + + public boolean matches(Object obj) { + if (obj instanceof Element) { + final Element element = ((Element) obj); + if (element.equals(el)) { + return true; + } + } + return false; + } + }; + final Iterator it = search(root, filter).iterator(); + if (it.hasNext()) + return it.next(); + else + return null; + } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java index 65d4acf..14c1fcb 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/NestedElementEncoder.java @@ -25,7 +25,9 @@ package it.geosolutions.geoserver.rest.encoder.utils; +import org.jdom.Content; import org.jdom.Element; +import org.jdom.filter.Filter; /** * Encodes lists of entries with key attribute.
@@ -68,63 +70,102 @@ import org.jdom.Element; * */ public class NestedElementEncoder extends XmlElement { + public final static String ENTRY = "entry"; + public final static String KEY = "key"; + + static class NestedElementFilter implements Filter { + private static final long serialVersionUID = 1L; + private final String key; + private final Element root; + public NestedElementFilter(Element root, String key) { + this.key=key; + this.root=root; + } + + public boolean matches(Object obj) { + if (obj instanceof Element) { + final Element el = ((Element) obj); + if (root.isAncestor(el)){ + if (el.getName().equals(ENTRY)/* && el.getText().equals(value) */) { + if (key != null) { + if (el.getAttribute(KEY).getValue().equals(key)) + return true; + else + return false; + } + return true; + } + } + } + return false; + } + }; public NestedElementEncoder(String listName) { super(listName); } - public void set(final String key, final String value) { - final Element entryElem = new Element("entry"); +// public void set(final String key, final String value) { +// // if some previous similar object is found +// final Element search; +// if ((search = ElementUtils.contains(getRoot(), new NestedElementFilter(getRoot(), key))) != null) { +// // remove it +// ElementUtils.remove(getRoot(), search); +// } +// // add the new entry +// add(key,value); +// } - if (key != null) { - entryElem.setAttribute("key", key); - } - entryElem.setText(value); - - final Element el = contains(entryElem); - if (el != null) { - addContent(entryElem); - } +// public void add(final String key, final Element value) { +// final Element entryElem = new Element(ENTRY); +// if (key != null) +// entryElem.setAttribute(KEY, key); +// +// entryElem.addContent(value); +// +// this.addContent(entryElem); +// } + +// public void add(final String key, final String value) { +// final Element entryElem = new Element(ENTRY); +// +// if (key != null) +// entryElem.setAttribute(KEY, key); +// +// entryElem.setText(value); +// +// this.addContent(entryElem); +// } + public void add(final String key, final Content value) { + final Element entryElem = new Element(ENTRY); + if (key != null) + entryElem.setAttribute(KEY, key); + + entryElem.setContent(value); + + this.addContent(entryElem); } - public void set(final String key, final Element value) { - final Element entryElem = new Element("entry"); - - if (key != null) { - entryElem.setAttribute("key", key); + public void set(final String key, final Content value) { + // if some previous similar object is found + final Element search; + if ((search = ElementUtils.contains(getRoot(), new NestedElementFilter(getRoot(), key))) != null) { + // remove it + ElementUtils.remove(search, search); } - entryElem.addContent(value); - - final Element el = contains(entryElem); - - if (el != null) { - addContent(entryElem); - } else { - if (remove(el)) - addContent(entryElem); + // add the new entry + add(key,value); + } + + public boolean remove(final String key){ + // if some previous similar object is found + final Element search; + if ((search = ElementUtils.contains(getRoot(), new NestedElementFilter(getRoot(), key))) != null) { + return ElementUtils.remove(search,search); } - - } - - public void add(final String key, final String value) { - final Element entryElem = new Element("entry"); - - if (key != null) - entryElem.setAttribute("key", key); - - entryElem.setText(value); - - this.addContent(entryElem); - } - - public void add(final String key, final Element value) { - final Element entryElem = new Element("entry"); - if (key != null) - entryElem.setAttribute("key", key); - - entryElem.addContent(value); - - this.addContent(entryElem); + else + return false; } } + diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java index 9dbcb66..b3440be 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/PropertyXMLEncoder.java @@ -57,6 +57,7 @@ public class PropertyXMLEncoder extends XmlElement { super(rootName); } + public void set(final String key, final String value) { if (key != null && value != null) { set(getRoot(), key, value); @@ -64,15 +65,7 @@ public class PropertyXMLEncoder extends XmlElement { } private void set(final Element e, final String key, final String value){ - if (!key.contains("/")) { - Element pp = null; - if ((pp = contains(key)) == null) - add(e,key, value); - else { - remove(pp); - add(e,key, value); - } - } else { + if (key.contains("/")) { final int i = key.indexOf("/"); final String childName = key.substring(0, i); final String newkey = key.substring(i + 1); @@ -83,7 +76,15 @@ public class PropertyXMLEncoder extends XmlElement { e.addContent(child); add(child,newkey,value); } - set(child, newkey, value); + set(child, newkey, value); + } else { + Element pp = null; + if ((pp = ElementUtils.contains(e,key)) == null) + add(e,key, value); + else { + ElementUtils.remove(e,pp); + add(e,key, value); + } } } @@ -94,9 +95,7 @@ public class PropertyXMLEncoder extends XmlElement { } private void add(Element e, String key, String value) { - if (!key.contains("/")) { - e.addContent(new Element(key).setText(value)); - } else { + if (key.contains("/")) { final int i = key.indexOf("/"); final String childName = key.substring(0, i); final String newkey = key.substring(i + 1); @@ -108,8 +107,66 @@ public class PropertyXMLEncoder extends XmlElement { } add(child, newkey, value); + + } else { + e.addContent(new Element(key).setText(value)); } } + +// public void set(final String key, final String value) { +// if (key != null && value != null) { +// set(getRoot(), key, value); +// } +// } +// +// private void set(final Element e, final String key, final String value){ +// if (!key.contains("/")) { +// Element pp = null; +// if ((pp = contains(key)) == null) +// add(e,key, value); +// else { +// remove(pp); +// add(e,key, value); +// } +// } else { +// final int i = key.indexOf("/"); +// final String childName = key.substring(0, i); +// final String newkey = key.substring(i + 1); +// +// Element child = e.getChild(childName); +// if (child == null) { +// child = new Element(childName); +// e.addContent(child); +// add(child,newkey,value); +// } +// set(child, newkey, value); +// } +// } +// +// public void add(final String key, final String value) { +// if (key != null && value != null) { +// add(this.getRoot(), key, value); +// } +// } +// +// private void add(Element e, String key, String value) { +// if (!key.contains("/")) { +// e.addContent(new Element(key).setText(value)); +// } else { +// final int i = key.indexOf("/"); +// final String childName = key.substring(0, i); +// final String newkey = key.substring(i + 1); +// +// Element child = e.getChild(childName); +// if (child == null) { +// child = new Element(childName); +// e.addContent(child); +// } +// +// add(child, newkey, value); +// } +// +// } } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java index 3d3735d..b3d6178 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/utils/XmlElement.java @@ -28,6 +28,7 @@ package it.geosolutions.geoserver.rest.encoder.utils; import org.jdom.Content; import org.jdom.Element; +import org.jdom.Text; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; @@ -40,9 +41,6 @@ public class XmlElement{ private final Element root; - /** - * - */ private static final long serialVersionUID = 1L; private final static XMLOutputter OUTPUTTER = new XMLOutputter(Format.getCompactFormat()); @@ -55,9 +53,33 @@ public class XmlElement{ return root; } + @SuppressWarnings("unused") private XmlElement(){root=null;}; - + public void add(final String nodename, final String nodetext) { + add(nodename,new Text(nodetext)); + } + + public void add(final String nodename, final Content nodetext) { + final Element el=new Element(nodename); + el.setContent(nodetext); + this.addContent(el); + } + + public void set(final String nodename, final String nodetext) { + set(nodename,new Text(nodetext)); + } + + public void set(final String nodename, final Content nodeContent) { + final Element el=ElementUtils.contains(getRoot(),nodename); + if (el==null){ + add(nodename,nodeContent); + } + else { + el.setContent(nodeContent); + } + } + public Element addContent(Content child){ return root.addContent(child); } @@ -66,20 +88,13 @@ public class XmlElement{ return root.getChildren().isEmpty(); } - public boolean remove(final Element el){ - return ElementUtils.remove(root,el); - } - - public Element contains(final Element el){ - return ElementUtils.contains(root,el); - } - - public Element contains(final String key, final String val){ - return ElementUtils.contains(root,key,val); - } - - public Element contains(final String key){ - return ElementUtils.contains(root,key); + public boolean remove(final String key){ + final Element el=ElementUtils.contains(root,key); + if (el!=null){ + return ElementUtils.remove(root,el); + } + else + return false; } /** diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java index b6611ca..9511abf 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java @@ -95,18 +95,18 @@ public class GeoserverRESTPostgisDatastoreTest extends GeoserverRESTTest { GSPostGISDatastoreEncoder datastoreEncoder = new GSPostGISDatastoreEncoder(); datastoreEncoder.defaultInit(); - datastoreEncoder.addName(datastoreName); - datastoreEncoder.addDescription(description); - datastoreEncoder.addNamespace(dsNamespace); - datastoreEncoder.addHost(pgHost); - datastoreEncoder.addPort(pgPort); - datastoreEncoder.addDatabase(pgDatabase); - datastoreEncoder.addSchema(pgSchema); - datastoreEncoder.addUser(pgUser); - datastoreEncoder.addPassword(pgPassword); - datastoreEncoder.addExposePrimaryKeys(exposePrimaryKeys); - datastoreEncoder.addValidateConnections(validateConnections); - datastoreEncoder.addPrimaryKeyMetadataTable(primaryKeyMetadataTable); + datastoreEncoder.setName(datastoreName); + datastoreEncoder.setDescription(description); + datastoreEncoder.setNamespace(dsNamespace); + datastoreEncoder.setHost(pgHost); + datastoreEncoder.setPort(pgPort); + datastoreEncoder.setDatabase(pgDatabase); + datastoreEncoder.setSchema(pgSchema); + datastoreEncoder.setUser(pgUser); + datastoreEncoder.setPassword(pgPassword); + datastoreEncoder.setExposePrimaryKeys(exposePrimaryKeys); + datastoreEncoder.setValidateConnections(validateConnections); + datastoreEncoder.setPrimaryKeyMetadataTable(primaryKeyMetadataTable); assertTrue(publisher.createWorkspace(wsName)); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java index 54b1b0e..e63e1df 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSCoverageEncoderTest.java @@ -23,7 +23,9 @@ import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder.ProjectionPolicy; import it.geosolutions.geoserver.rest.encoder.coverage.GSCoverageEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.GSMetadataEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; import junit.framework.TestCase; import org.apache.log4j.Logger; @@ -53,11 +55,11 @@ public class GSCoverageEncoderTest extends TestCase { GSResourceEncoder re=new GSCoverageEncoder(); re.setProjectionPolicy(ProjectionPolicy.FORCE_DECLARED); - Assert.assertNotNull(re.contains("projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); + Assert.assertNotNull(ElementUtils.contains(re.getRoot(),"projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); re.setProjectionPolicy(ProjectionPolicy.NONE); - Assert.assertNull(re.contains("projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); - Assert.assertNotNull(re.contains("projectionPolicy",ProjectionPolicy.NONE.toString())); + Assert.assertNull(ElementUtils.contains(re.getRoot(),"projectionPolicy",ProjectionPolicy.FORCE_DECLARED.toString())); + Assert.assertNotNull(ElementUtils.contains(re.getRoot(),"projectionPolicy",ProjectionPolicy.NONE.toString())); } /** @@ -68,12 +70,12 @@ public class GSCoverageEncoderTest extends TestCase { GSResourceEncoder re=new GSCoverageEncoder(); re.setLatLonBoundingBox(-180d, 90d, 180d, -90d, null); - Assert.assertNotNull(re.contains("minx","-180.0")); + Assert.assertNotNull(ElementUtils.contains(re.getRoot(),"minx","-180.0")); re.setLatLonBoundingBox(-90d, 45d, 180d, -90d, null); - Assert.assertNull(re.contains("minx","-180.0")); - Assert.assertNotNull(re.contains("minx","-90.0")); + Assert.assertNull(ElementUtils.contains(re.getRoot(),"minx","-180.0")); + Assert.assertNotNull(ElementUtils.contains(re.getRoot(),"minx","-90.0")); } @Test @@ -83,33 +85,42 @@ public class GSCoverageEncoderTest extends TestCase { encoder.addKeyword("KEYWORD_2"); encoder.addKeyword("..."); encoder.addKeyword("KEYWORD_N"); - final GSDimensionInfoEncoder dim=new GSDimensionInfoEncoder(true); - dim.addPresentation(Presentation.CONTINUOUS_INTERVAL); - encoder.addMetadata("time", dim); - final GSDimensionInfoEncoder dim2=new GSDimensionInfoEncoder(true); - dim2.addPresentation(Presentation.LIST); - encoder.addMetadata("elev", dim2); + + final GSDimensionInfoEncoder timeDimension=new GSDimensionInfoEncoder(true); + timeDimension.setPresentation(Presentation.CONTINUOUS_INTERVAL); + encoder.setMetadata("time", timeDimension); + + if (LOGGER.isInfoEnabled()) + LOGGER.info(encoder.toString()); + + final Element el=ElementUtils.contains(encoder.getRoot(),GSMetadataEncoder.METADATA); + Assert.assertNotNull(el); + LOGGER.info("contains_key:"+el.toString()); + + final GSDimensionInfoEncoder elevationDimension=new GSDimensionInfoEncoder(true); + elevationDimension.setPresentation(Presentation.LIST); + encoder.setMetadata("elevation", elevationDimension); if (LOGGER.isInfoEnabled()) LOGGER.info(encoder.toString()); - final Element el=encoder.contains("metadata"); - Assert.assertNotNull(el); - LOGGER.info("contains_key:"+el.toString()); - - final Element el2=encoder.contains("presentation"); + final Element el2=ElementUtils.contains(encoder.getRoot(),GSDimensionInfoEncoder.PRESENTATION); Assert.assertNotNull(el2); LOGGER.info("contains_key:"+el2.toString()); - final Element el3=encoder.contains(encoder.contains("metadata")); + encoder.delMetadata("time"); + if (LOGGER.isInfoEnabled()) + LOGGER.info(encoder.toString()); + + final Element el3=ElementUtils.contains(encoder.getRoot(),GSMetadataEncoder.METADATA); Assert.assertNotNull(el3); LOGGER.info("contains_by_node:"+el3.toString()); - final boolean removed=encoder.remove(el3); + final boolean removed=ElementUtils.remove(encoder.getRoot(),el3); LOGGER.info("remove:"+removed); Assert.assertTrue(removed); - final Element el4=encoder.contains("metadata"); + final Element el4=ElementUtils.contains(encoder.getRoot(),GSMetadataEncoder.METADATA); Assert.assertNull(el4); if (el4==null) LOGGER.info("REMOVED"); diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoderTest.java index 2a3ce96..6e4190d 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoderTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/coverage/GSImageMosaicEncoderTest.java @@ -19,13 +19,9 @@ */ package it.geosolutions.geoserver.rest.encoder.coverage; -import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; -import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; import junit.framework.TestCase; import org.apache.log4j.Logger; -import org.jdom.Element; -import org.junit.Assert; import org.junit.Test; /** @@ -45,41 +41,20 @@ public class GSImageMosaicEncoderTest extends TestCase { @Test public void testAll() { final GSImageMosaicEncoder encoder=new GSImageMosaicEncoder(); - encoder.addKeyword("KEYWORD_1"); - encoder.addKeyword("KEYWORD_2"); - encoder.addKeyword("..."); - encoder.addKeyword("KEYWORD_N"); - final GSDimensionInfoEncoder dim=new GSDimensionInfoEncoder(true); - dim.addPresentation(Presentation.CONTINUOUS_INTERVAL); - encoder.addMetadata("time", dim); - final GSDimensionInfoEncoder dim2=new GSDimensionInfoEncoder(true); - dim2.addPresentation(Presentation.LIST); - encoder.addMetadata("elev", dim2); + encoder.addAllowMultithreading(true); - encoder.addSUGGESTED_TILE_SIZE("512,512"); - + LOGGER.info(encoder.toString()); + encoder.setAllowMultithreading(false); LOGGER.info(encoder.toString()); - final Element el=encoder.contains("metadata"); - Assert.assertNotNull(el); - LOGGER.info("contains_key:"+el.toString()); - final Element el2=encoder.contains("presentation"); - Assert.assertNotNull(el2); - LOGGER.info("contains_key:"+el2.toString()); + encoder.addSUGGESTED_TILE_SIZE("512,512"); + + + - final Element el3=encoder.contains(encoder.contains("metadata")); - Assert.assertNotNull(el3); - LOGGER.info("contains_by_node:"+el3.toString()); - final boolean removed=encoder.remove(el3); - LOGGER.info("remove:"+removed); - Assert.assertTrue(removed); - final Element el4=encoder.contains("metadata"); - Assert.assertNull(el4); - if (el4==null) - LOGGER.info("REMOVED"); } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoderTest.java new file mode 100644 index 0000000..c1c15a2 --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSFeatureDimensionInfoEncoderTest.java @@ -0,0 +1,71 @@ +package it.geosolutions.geoserver.rest.encoder.feature; + +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.PresentationDiscrete; +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; + +import java.math.BigDecimal; +import java.util.List; + +import org.jdom.Element; +import org.jdom.filter.Filter; +import org.junit.Assert; +import org.junit.Test; + +public class GSFeatureDimensionInfoEncoderTest { + + @Test + public void dimensionTest() { + final GSFeatureDimensionInfoEncoder elevationDimension = new GSFeatureDimensionInfoEncoder( + "elevation_field"); + + // if (LOGGER.isInfoEnabled()) + // LOGGER.info(encoder.toString()); + + elevationDimension.setPresentation( + PresentationDiscrete.DISCRETE_INTERVAL, BigDecimal.valueOf(10)); + + elevationDimension.setPresentation( + PresentationDiscrete.DISCRETE_INTERVAL, BigDecimal.valueOf(12)); + + List elList = ElementUtils.search( + elevationDimension.getRoot(), new Filter() { + public boolean matches(Object obj) { + if (obj instanceof Element) { + final Element el = ((Element) obj); + if (el.getName().equals( + GSDimensionInfoEncoder.DIMENSIONINFO)) { + return true; + } + } + return false; + } + }); + // using set we get only one element called + // PresentationDiscrete.DISCRETE_INTERVAL + Assert.assertEquals(Integer.valueOf(elList.size()), Integer.valueOf(1)); + + + elevationDimension.setPresentation(Presentation.LIST); + + // this kind of presentation do not support a resolution parameter + elList = ElementUtils.search( + elevationDimension.getRoot(), new Filter() { + public boolean matches(Object obj) { + if (obj instanceof Element) { + final Element el = ((Element) obj); + if (el.getName().equals( + GSDimensionInfoEncoder.RESOLUTION)) { + return true; + } + } + return false; + } + }); + + Assert.assertEquals(Integer.valueOf(elList.size()), Integer.valueOf(0)); + + } + +} 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 00e6360..fcd92ce 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 @@ -19,14 +19,21 @@ */ package it.geosolutions.geoserver.rest.encoder.feature; -import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureDimensionInfoEncoder; -import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.Presentation; import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.PresentationDiscrete; +import it.geosolutions.geoserver.rest.encoder.metadata.GSMetadataEncoder; +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; import java.math.BigDecimal; +import java.util.List; import junit.framework.TestCase; +import org.apache.log4j.Logger; +import org.jdom.Element; +import org.jdom.filter.Filter; +import org.junit.Assert; import org.junit.Test; /** @@ -35,24 +42,103 @@ import org.junit.Test; * @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it */ public class GSFeatureEncoderTest extends TestCase { - + protected final static Logger LOGGER = Logger.getLogger(GSFeatureEncoderTest.class); + public GSFeatureEncoderTest() { } @Test public void testAll() { - GSFeatureTypeEncoder feature = new GSFeatureTypeEncoder(); - feature.addKeyword("KEYWORD_1"); - feature.addKeyword("KEYWORD_2"); - feature.addKeyword("..."); - feature.addKeyword("KEYWORD_N"); - GSFeatureDimensionInfoEncoder dim2 = new GSFeatureDimensionInfoEncoder( - "ELE"); + + GSFeatureTypeEncoder encoder = new GSFeatureTypeEncoder(); + encoder.addKeyword("KEYWORD_1"); + encoder.addKeyword("KEYWORD_2"); + encoder.addKeyword("..."); + encoder.addKeyword("KEYWORD_N"); + + GSFeatureDimensionInfoEncoder dim2 = new GSFeatureDimensionInfoEncoder("ELE"); + + if (LOGGER.isInfoEnabled()) + LOGGER.info(encoder.toString()); + + encoder.addMetadata("elevation", dim2); + dim2.addPresentation(PresentationDiscrete.DISCRETE_INTERVAL, BigDecimal.valueOf(10)); - feature.addMetadata("elevation", dim2); + + Element el=ElementUtils.contains(encoder.getRoot(),GSDimensionInfoEncoder.PRESENTATION); + Assert.assertNotNull(el); + + + LOGGER.info("contains_key:"+el.toString()); + + dim2.setPresentation(PresentationDiscrete.DISCRETE_INTERVAL, + BigDecimal.valueOf(12)); + + el=ElementUtils.contains(encoder.getRoot(),GSDimensionInfoEncoder.RESOLUTION); + Assert.assertNotNull(el); + Assert.assertEquals("12", el.getText()); + + dim2.setPresentation(Presentation.CONTINUOUS_INTERVAL); + + + + encoder.setMetadata("time", new GSFeatureDimensionInfoEncoder("time")); + + el=ElementUtils.contains(encoder.getRoot(),GSDimensionInfoEncoder.PRESENTATION); + Assert.assertNotNull(el); + el=ElementUtils.contains(encoder.getRoot(),GSDimensionInfoEncoder.RESOLUTION); + Assert.assertNull(el); - // TODO TESTS + el=ElementUtils.contains(encoder.getRoot(),GSMetadataEncoder.METADATA); + Assert.assertNotNull(el); + LOGGER.info("contains_key:"+el.toString()); + + final boolean removed=ElementUtils.remove(encoder.getRoot(),el); + LOGGER.info("remove:"+removed); + Assert.assertTrue(removed); + + el=ElementUtils.contains(encoder.getRoot(),"metadata"); + Assert.assertNull(el); + if (el==null) + LOGGER.info("REMOVED"); + + } + + @Test + public void testModifyFeature() { + GSFeatureTypeEncoder encoder = new GSFeatureTypeEncoder(); + encoder.addKeyword("KEYWORD_1"); + encoder.addKeyword("KEYWORD_2"); + encoder.addKeyword("..."); + encoder.addKeyword("KEYWORD_N"); + + Assert.assertTrue(encoder.delKeyword("KEYWORD_2")); + Assert.assertFalse(encoder.delKeyword("KEYWORD_M")); + + final GSFeatureDimensionInfoEncoder elevationDimension = new GSFeatureDimensionInfoEncoder("elevation_field"); + +// if (LOGGER.isInfoEnabled()) +// LOGGER.info(encoder.toString()); + + final String metadata="elevation"; + encoder.setMetadata(metadata, elevationDimension); + + elevationDimension.setPresentation(PresentationDiscrete.DISCRETE_INTERVAL, + BigDecimal.valueOf(10)); + + if (LOGGER.isInfoEnabled()) + LOGGER.info(encoder.toString()); + + Assert.assertTrue(encoder.delMetadata(metadata)); + + if (LOGGER.isInfoEnabled()) + LOGGER.info(encoder.toString()); + + final Element el=ElementUtils.contains(encoder.getRoot(),GSDimensionInfoEncoder.DIMENSIONINFO); + Assert.assertNull(el); + if (el==null) + LOGGER.info("REMOVED"); } } diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtilsTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtilsTest.java new file mode 100644 index 0000000..ec5b40b --- /dev/null +++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/utils/ElementUtilsTest.java @@ -0,0 +1,166 @@ +package it.geosolutions.geoserver.rest.encoder.utils; + + +import it.geosolutions.geoserver.rest.encoder.GSWorkspaceEncoderTest; + +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +import org.apache.log4j.Logger; +import org.jdom.Content; +import org.jdom.Element; +import org.jdom.filter.Filter; +import org.jdom.output.XMLOutputter; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class ElementUtilsTest { + + + /** + * Default logger + */ + protected final static Logger LOGGER = Logger.getLogger(ElementUtilsTest.class); + + + final static String NAME="TEST"; + final Element root=new Element(NAME); + final int maxDepth=5; + final Filter filter=new Filter(){ + public boolean matches(Object obj) { + if (obj instanceof Element){ + if (((Element)obj).getName().equals(NAME)){ + return true; + } + } + return false; + } + }; + + @Before + public void setUp() throws Exception { + root.addContent("1"); + final Element child1=new Element(NAME); + child1.addContent("2"); + final Element child2=new Element(NAME); + child2.addContent("3"); + final Element child3=new Element(NAME); + child3.addContent("4"); + final Element child4=new Element(NAME); + child4.addContent("5"); + + root.addContent(child1); + child1.addContent(child2); + child2.addContent(child3); + child3.addContent(child4); + + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void containsFilterDepthTest(){ + LOGGER.info("STARTING-> containsFilterDepthTest"); + + final List list=ElementUtils.search(this.root, filter, 1); + Assert.assertEquals(1,list.size()); + + final List list2=ElementUtils.search(this.root, filter, 6); + Assert.assertEquals(maxDepth,list2.size()); + + final Filter myFilter=new Filter() { + public boolean matches(Object obj) { + if (obj instanceof Element){ + final Element el=((Element)obj); + if (el.getName().equals(NAME)){ + if (el.getText().equals("1") || el.getText().equals("3")) + return true; + } + } + return false; + } + }; + final List list3=ElementUtils.search(this.root, myFilter, 3); + Assert.assertEquals(2,list3.size()); + final Iterator it=list3.iterator(); + while (it.hasNext()){ + final Object obj=it.next(); + if (obj instanceof Element){ + final Element el=(Element)obj; + LOGGER.info("LOCATED-> "+el.getName()+" level "+el.getText()); + } + } + } + + @Test + public void containsFilterTest(){ + LOGGER.info("STARTING-> containsFilterTest"); + + final Iterator it=ElementUtils.search(this.root, filter).iterator(); + Assert.assertTrue("Elements found", it.hasNext()); + int nFound=0; + while (it.hasNext()){ + final Object obj=it.next(); + if (obj instanceof Element){ + nFound++; + Element el=(Element)obj; + LOGGER.info("LOCATED-> "+el.getName()+" level "+el.getText()); + } + } + Assert.assertEquals(maxDepth,nFound); + } + + + @Test + public void containsWrappersTest(){ + LOGGER.info("STARTING-> containsWrapperTest"); + + Element el=ElementUtils.contains(this.root, root); + Assert.assertNotNull(el); + + el=ElementUtils.contains(this.root, new Element(NAME)); + Assert.assertNull(el); + + el=ElementUtils.contains(this.root, NAME); + Assert.assertNotNull(el); + + el=ElementUtils.contains(this.root, "NOTFOUND"); + Assert.assertNull(el); + + el=ElementUtils.contains(this.root, NAME, "3"); + Assert.assertNotNull(el); + + el=ElementUtils.contains(this.root, NAME, "NOTFOUND"); + Assert.assertNull(el); + } + + @Test + public void removeTest(){ + LOGGER.info("STARTING-> removeTest"); + + // contains + Element el=ElementUtils.contains(this.root, NAME, "4"); + Assert.assertNotNull(el); + // remove + Assert.assertTrue(ElementUtils.remove(this.root, el)); + // do not contains + el=ElementUtils.contains(this.root, el); + Assert.assertNull(el); + +// XMLOutputter o=new XMLOutputter(); +// try { +// o.output(root, System.out); +// } catch (IOException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } + + Assert.assertTrue(ElementUtils.remove(this.root, root)); + + } +}