diff --git a/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java b/src/main/java/it/geosolutions/geoserver/rest/GeoServerRESTPublisher.java index 0a88c6e..c452bdc 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; @@ -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; @@ -326,7 +327,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 + ") " @@ -393,13 +394,13 @@ 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, ...) 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 +511,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); @@ -726,26 +727,44 @@ 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 * */ - protected boolean configureLayer(final GSLayerEncoder layer, final String layerName) { + 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; } - final String url = restURL + "/rest/layers/" + layerName; + 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(); 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/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..2621b02 100644 --- a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java +++ b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPostgisDatastoreTest.java @@ -110,6 +110,8 @@ public class GeoserverRESTPostgisDatastoreTest extends GeoserverRESTTest { assertTrue(publisher.createWorkspace(wsName)); + assertTrue(publisher.createWorkspace(wsName)); + // creation test boolean created = publisher.createPostGISDatastore(wsName, datastoreEncoder); diff --git a/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTPublisherTest.java index e83d082..fb1de65 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; /** @@ -46,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); @@ -84,7 +87,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()); } @@ -134,6 +151,7 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { if (publisher.removeDatastore(ns, storeName)) { LOGGER.info("Cleared stale datastore " + storeName); } + assertFalse("Cleanup failed", existsLayer(layerName)); } @@ -154,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)); @@ -174,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); } @@ -190,7 +210,7 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { } // Assume.assumeTrue(enabled); - String ns = "it.geosolutions"; + String ns = "geosolutions"; String storeName = "resttestshp"; String layerName = "cities"; @@ -320,6 +340,68 @@ public class GeoserverRESTPublisherTest extends GeoserverRESTTest { assertFalse("removed not existing datastore", ok); } + + public void testUpdateDefaultStyle() throws FileNotFoundException, IOException { + if (!enabled()) { + return; + } + + 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, DEFAULT_WS, storeName); + + // test insert + boolean published = publisher.publishShp(DEFAULT_WS, 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(DEFAULT_WS, layerName, le); + + { + RESTLayer layer = reader.getLayer(layerName); + LOGGER.info("Layer style is " + layer.getDefaultStyle()); + assertEquals(styleName2, layer.getDefaultStyle()); + } + + + // remove layer and datastore + boolean ok = publisher.unpublishFeatureType(DEFAULT_WS, storeName, layerName); + assertFalse(existsLayer(layerName)); + boolean dsRemoved = publisher.removeDatastore(DEFAULT_WS, 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/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java b/src/test/java/it/geosolutions/geoserver/rest/GeoserverRESTTest.java index 142ba6c..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; @@ -65,14 +67,15 @@ 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"); + 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 +90,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 +107,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() { @@ -201,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 ); 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)); + + } +} 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 + + + + + + + + +