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 9332804..eb2d567 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 @@ -27,7 +27,7 @@ package it.geosolutions.geoserver.rest.encoder.feature; import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder; import it.geosolutions.geoserver.rest.encoder.metadata.GSFeatureDimensionInfoEncoder; -import it.geosolutions.geoserver.rest.encoder.metadata.GSVirtualTableEncoder; +import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.GSVirtualTableEncoder; import org.jdom.Element; @@ -112,6 +112,14 @@ public class GSFeatureTypeEncoder extends GSResourceEncoder { super.setMetadata("JDBC_VIRTUAL_TABLE", virtualtable); } + /** + * Deletes the VirtualTable metadata + * + * @return true if deleted, false otherwise + */ + public boolean delMetadataVirtualTable(){ + return super.delMetadata("JDB_VIRTUAL_TABLE"); + } /** * delete a keyword from the list diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableEncoder.java deleted file mode 100644 index f844734..0000000 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableEncoder.java +++ /dev/null @@ -1,214 +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.metadata; - -import java.util.ArrayList; -import java.util.List; - -import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; - -/** - * GSVirtualTableEncoder - Encodes a metadata VirtualTable for a GeoServer - * featureType. - * - * Example (based on the example provided in the Geoserver documentation - see - * {@link http://docs.geoserver.org/latest/en/user/data/database/sqlview.html# - * parameterizing-sql-views}): - * - *
- * {
- * 	@code
- * 	// Set-up the vtGeom
- * 	final GSVirtualTableGeomEncoder vtGeom = new GSVirtualTableGeomEncoder();
- * 	vtGeom.setup("the_geom", "MultiPolygon", "4326");
- * 
- * 	// Set-up 2 virtual table parameters
- * 	final GSVirtualTableParamEncoder vtParam1 = new GSVirtualTableParamEncoder();
- * 	vtParam1.setup("high", "100000000", "^[\\d]+$");
- * 	final GSVirtualTableParamEncoder vtParam2 = new GSVirtualTableParamEncoder();
- * 	vtParam2.setup("low", "0", "^[\\d]+$");
- * 
- * 	// sql
- * 	String sql = "select gid, state_name, the_geom from pgstates where persons between %low% and %high%";
- * 
- * 	// Set-up the virtual table
- * 	final GSVirtualTableEncoder vte = new GSVirtualTableEncoder();
- * 	vte.setup("popstates", sql, null, Arrays.asList(vtGeom),
- * 			Arrays.asList(vtParam1, vtParam2));
- * }
- * 
- * - * For this example, the XML output is: - * - *
- * {@code
- * 
- * 	popstates
- * 	select gid, state_name, the_geom from pgstates where persons between %low% and %high%
- * 	
- * 		the_geom
- * 		MultiPolygon
- * 		4326
- * 	
- * 	
- * 		high
- * 		100000000
- * 		^[\d]+$
- * 	
- * 	
- * 		low
- * 		0
- * 		^[\d]+$
- * 	
- * 
- * }
- * 
- * - * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | - * emmanuel.blondel@fao.org - * - */ -public class GSVirtualTableEncoder extends PropertyXMLEncoder { - - private String name; - private String sql; - private List keyColumns; - private List geomEncList; - private List paramEncList; - - /** - * Constructs a GSVirtualTableEncoder - */ - public GSVirtualTableEncoder() { - super("virtualTable"); - } - - /** - * Set-up quickly a GSVirtualTableEncoder. This unique entry point to set-up - * is aimed to ensure that the order of metadata elements is well - * maintained, and avoid errors at publication time in Geoserver. - * - * @param name (must be the same as the featureType nativeName) - * @param sql - * @param keyColumns - * @param geomEncList - * @param paramEncList - */ - public void setup(String name, String sql, List keyColumns, - List geomEncList, - List paramEncList) { - - this.getRoot().removeContent(); - this.keyColumns = null; - this.geomEncList = null; - this.paramEncList = null; - - this.name = name; - this.sql = sql; - set("name", this.name); - set("sql", this.sql); - - if (keyColumns != null) { - this.keyColumns = new ArrayList(); - this.keyColumns.addAll(keyColumns); - for (String pk : this.keyColumns) { - add("keyColumn", pk); - } - - } - - if (geomEncList != null) { - this.geomEncList = new ArrayList(); - this.geomEncList.addAll(geomEncList); - for (GSVirtualTableGeomEncoder geomEnc : this.geomEncList) { - addContent(geomEnc.getRoot()); - } - } - - if (paramEncList != null) { - this.paramEncList = new ArrayList(); - this.paramEncList.addAll(paramEncList); - for (GSVirtualTableParamEncoder paramEnc : this.paramEncList) { - addContent(paramEnc.getRoot()); - } - ; - } - - } - - /** - * get Name - * - * @return the name of the virtual table - */ - public String getName() { - return this.name; - } - - /** - * get SQL query - * - * @return the sql query of the virtual table - */ - public String getSql() { - return this.sql; - } - - /** - * Get the list of key columns - * - * @return - */ - public List getKeyColumnList(){ - return this.keyColumns; - } - - - /** - * get the list of GSVirtualTableGeomEncoder - * - * @return - */ - public List getVirtualTableGeomEncoderList() { - return this.geomEncList; - } - - /** - * get the list of VirtualTableParamEncoder - * - * @return - */ - public List getVirtualTableParamEncoderList() { - return this.paramEncList; - } - - // TODO (eventually) utils method to check consistency between SQL view - // params provided by the sql string - // and the virtual table parameters set up in parallel - public boolean checkVirtualTableParams() { - return false; - } - -} diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/GSVirtualTableEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/GSVirtualTableEncoder.java new file mode 100644 index 0000000..aea2464 --- /dev/null +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/GSVirtualTableEncoder.java @@ -0,0 +1,339 @@ +/* + * 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.virtualtable; + +import java.util.List; + +import org.jdom.Element; +import org.jdom.filter.Filter; + +import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; +import it.geosolutions.geoserver.rest.encoder.utils.XmlElement; + +/** + * GSVirtualTableEncoder - Encodes a metadata VirtualTable for a GeoServer + * featureType. + * + * Example (based on the example provided in the Geoserver documentation - see + * {@link http://docs.geoserver.org/latest/en/user/data/database/sqlview.html# + * parameterizing-sql-views}): + * + *
+ * {
+ * 	@code
+ * 	// Set-up the vtGeom
+ * 	final VTGeometryEncoder vtGeom = new VTGeometryEncoder();
+ * 	vtGeom.setup("the_geom", "MultiPolygon", "4326");
+ * 
+ * 	// Set-up 2 virtual table parameters
+ * 	final VTParameterEncoder vtParam1 = new VTParameterEncoder();
+ * 	vtParam1.setup("high", "100000000", "^[\\d]+$");
+ * 	final VTParameterEncoder vtParam2 = new VTParameterEncoder();
+ * 	vtParam2.setup("low", "0", "^[\\d]+$");
+ * 
+ * 	// sql
+ * 	String sql = "select gid, state_name, the_geom from pgstates where persons between %low% and %high%";
+ * 
+ * 	// Set-up the virtual table
+ * 	final GSVirtualTableEncoder vte = new GSVirtualTableEncoder();
+ * 	vte.setName("popstates");
+ * 	vte.setSql("select gid, state_name, the_geom from pgstates where persons between %low% and %high%");
+ *  vte.addKeyColumn("gid");
+ *  vte.addVirtualTableGeometry(vtGeom);
+ *  vte.addVirtualTableParameter(vtParam1);
+ *  vte.addVirtualTableParameter(vtParam2);
+ * }
+ * 
+ * + * For this example, the XML output is: + * + *
+ * {@code
+ * 
+ * 	popstates
+ * 	select gid, state_name, the_geom from pgstates where persons between %low% and %high%
+ * 	
+ * 		the_geom
+ * 		MultiPolygon
+ * 		4326
+ * 	
+ *  gid
+ * 	
+ * 		high
+ * 		100000000
+ * 		^[\d]+$
+ * 	
+ * 	
+ * 		low
+ * 		0
+ * 		^[\d]+$
+ * 	
+ * 
+ * }
+ * 
+ * + * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com | + * emmanuel.blondel@fao.org + * + */ +public class GSVirtualTableEncoder extends XmlElement { + + public final static String NAME = "name"; + public final static String SQL = "sql"; + public final static String KEYCOLUMN = "keyColumn"; + + /** + * Constructs a GSVirtualTableEncoder + */ + public GSVirtualTableEncoder() { + super("virtualTable"); + } + + /** + * Constructs directly a GSVirtualTableEncoder + * + * @param name + * @param sql + * @param keyColumns + * @param geomEncList + * @param paramEncList + */ + public GSVirtualTableEncoder(String name, String sql, List keyColumns, + List geomEncList, + List paramEncList){ + super("virtualTable"); + this.setup(name, sql, keyColumns, geomEncList, paramEncList); + } + + /** + * Set-up quickly a GSVirtualTableEncoder + * + * @param name (must be the same as the featureType nativeName) + * @param sql + * @param keyColumns + * @param geomEncList + * @param paramEncList + */ + protected void setup(String name, String sql, List keyColumns, + List geomEncList, + List paramEncList) { + + setName(name); + setSql(sql); + + if (keyColumns != null) { + for (String pk : keyColumns) { + addKeyColumn(pk); + } + } + + if (geomEncList != null) { + for (VTGeometryEncoder geomEnc : geomEncList) { + addVirtualTableGeometry(geomEnc); + } + } + + if (paramEncList != null) { + for(VTParameterEncoder paramEnc : paramEncList){ + addVirtualTableParameter(paramEnc); + } + } + } + + /** + * Add the 'name' node with a text value from 'name' + * + * @note REQUIRED to configure a virtual table + */ + protected 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 virtual table + */ + public void setName(final String name) { + set(NAME, name); + } + + /** + * Get the name of the virtual table + * + * @return + */ + public String getName() { + final Element nameNode = ElementUtils.contains(getRoot(), NAME, 1); + if (nameNode != null) + return nameNode.getText(); + else + return null; + } + + /** + * Add the 'sql' node with a text value from 'sql' + * + * @note REQUIRED to configure a virtual table + */ + protected void addSql(final String sql){ + add(SQL, sql); + } + + /** + * Set or modify the 'sql' node with a text value from 'sql' + * + * @note REQUIRED to configure a virtual table + */ + public void setSql(final String sql) { + set(SQL, sql); + } + + /** + * Get the sql query + * + * @return + */ + public String getSql() { + final Element sqlNode = ElementUtils.contains(getRoot(), SQL, 1); + if (sqlNode != null) + return sqlNode.getText(); + else + return null; + } + + /** + * Adds a keyColumn + * + * @param keycolumn + */ + public void addKeyColumn(String keycolumn){ + final Element el = new Element(KEYCOLUMN); + el.setText(keycolumn); + this.getRoot().addContent(el); + } + + /** + * Deletes a keyColumn + * + * @param keycolumn + * @return true if the keycolumn was removed + */ + public boolean delKeyColumn(final String keycolumn){ + final Element el = new Element(KEYCOLUMN); + el.setText(keycolumn); + return (this.getRoot().removeContent(new Filter() { + private static final long serialVersionUID = 1L; + + public boolean matches(Object obj) { + if (((Element) obj).getText().equals(keycolumn)) { + return true; + } + return false; + } + })).size() == 0 ? false : true; + } + + /** + * Adds a geometry to the VirtualTable + * + * @param geomEnc + */ + public void addVirtualTableGeometry(VTGeometryEncoder geomEnc){ + this.getRoot().addContent(geomEnc.getRoot()); + } + + /** + * Adds quickly a geometry to the virtual table + * + * @param name + * @param geometryType + * @param srid + */ + public void addVirtualTableGeometry(String name, String geometryType, String srid){ + final VTGeometryEncoder gEnc = new VTGeometryEncoder(); + gEnc.setup(name, geometryType, srid); + this.getRoot().addContent(gEnc.getRoot()); + } + + /** + * Deletes a geometry from the VirtualTable + * + * @param name + * @return true if the geometry was removed, otherwise false + */ + public boolean delVirtualTableGeometry(String name){ + return (this.getRoot() + .removeContent(VTGeometryEncoder + .getFilterByName(name))).size() == 0 ? false + : true; + } + + /** + * Adds a parameter to the VirtualTable + * + * @param paramEnc + */ + public void addVirtualTableParameter(VTParameterEncoder paramEnc){ + this.getRoot().addContent(paramEnc.getRoot()); + } + + /** + * Adds quickly a parameter to the VirtualTable + * + * @param name + * @param defaultValue + * @param regexpValidator + */ + public void addVirtualTableParameter(String name, String defaultValue, String regexpValidator){ + final VTParameterEncoder pEnc = new VTParameterEncoder(); + pEnc.setup(name, defaultValue, regexpValidator); + this.getRoot().addContent(pEnc.getRoot()); + } + + /** + * Deletes a parameter from the VirtualTable + * + * @param name + * @return + */ + public boolean delVirtualTableParameter(String name){ + return (this.getRoot() + .removeContent(VTParameterEncoder + .getFilterByName(name))).size() == 0 ? false + : true; + } + + + /* + * a method to check either the virtual parameters as specified in the sql + * query map those encoded in VTParameterEncoder, i.e. check the number and + * names of parameters. + */ + public boolean validate() throws IllegalStateException{ + throw new UnsupportedOperationException("not yet implemented"); + } + +} diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/VirtualTableGeometry.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTGeometry.java similarity index 93% rename from src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/VirtualTableGeometry.java rename to src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTGeometry.java index 0b19462..602d352 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/VirtualTableGeometry.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTGeometry.java @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package it.geosolutions.geoserver.rest.encoder.metadata; +package it.geosolutions.geoserver.rest.encoder.metadata.virtualtable; /** * Enumeration of Virtual Table geometry members @@ -31,6 +31,6 @@ package it.geosolutions.geoserver.rest.encoder.metadata; * emmanuel.blondel@fao.org * */ -public enum VirtualTableGeometry { +public enum VTGeometry { name, type, srid } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableGeomEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTGeometryEncoder.java similarity index 56% rename from src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableGeomEncoder.java rename to src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTGeometryEncoder.java index d7c0a25..f5adb7e 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableGeomEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTGeometryEncoder.java @@ -22,15 +22,16 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package it.geosolutions.geoserver.rest.encoder.metadata; +package it.geosolutions.geoserver.rest.encoder.metadata.virtualtable; import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; -import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; +import it.geosolutions.geoserver.rest.encoder.utils.XmlElement; import java.util.Map; import java.util.Map.Entry; import org.jdom.Element; +import org.jdom.filter.Filter; /** * GSVirtualTableGeomEncoder - Encodes a metadata VirtualTable geometry for a @@ -40,7 +41,9 @@ import org.jdom.Element; * { * @code * final GSVirtualTableGeomEncoder vtGeom = new GSVirtualTableGeomEncoder(); - * vtGeom.setup("the_geom", "MultiPolygon", "4326"); + * vtGeom.setVirtualTableGeometryMember(VTGeometry.name, "the_geom"); + * vtGeom.setVirtualTableGeometryMember(VTGeometry.type, "MultiPolygon"); + * vtGeom.setVirtualTableGeometryMember(VTGeometry.srid, "4326"); * } * * @@ -60,16 +63,62 @@ import org.jdom.Element; * emmanuel.blondel@fao.org * */ -public class GSVirtualTableGeomEncoder extends PropertyXMLEncoder { +public class VTGeometryEncoder extends XmlElement { + /** + * A class to filter the VirtualTable geometries by name + * + */ + public static class filterByName implements Filter { + + final private String key; + + public filterByName(String name) { + this.key = name; + } + + private static final long serialVersionUID = 1L; + + public boolean matches(Object obj) { + Element el = ((Element) obj) + .getChild(VTGeometry.name.toString()); + if (el != null && el.getTextTrim().equals(key)) { + return true; + } + return false; + } + } + + /** + * Get a Filter using the VTGeometry name + * + * @param name + * @return the filter + */ + public static Filter getFilterByName(String name) { + return new filterByName(name); + } + /** * Constructs a GSVirtualTableGeomEncoder * */ - public GSVirtualTableGeomEncoder() { + public VTGeometryEncoder() { super("geometry"); } + /** + * Constructs quickly a VTGeometryEncoder + * + * @param name + * @param geometryType + * @param srid + */ + public VTGeometryEncoder(String name, String geometryType, String srid) { + super("geometry"); + this.setup(name, geometryType, srid); + } + /** * Set-up quickly a GSVirtualTableGeomEncoder * @@ -77,10 +126,10 @@ public class GSVirtualTableGeomEncoder extends PropertyXMLEncoder { * @param geometryType * @param srid */ - public void setup(String name, String geometryType, String srid) { - set(VirtualTableGeometry.name.name(), name); - set(VirtualTableGeometry.type.name(), geometryType); - set(VirtualTableGeometry.srid.name(), srid); + protected void setup(String name, String geometryType, String srid) { + set(VTGeometry.name.name(), name); + set(VTGeometry.type.name(), geometryType); + set(VTGeometry.srid.name(), srid); } /** @@ -88,8 +137,8 @@ public class GSVirtualTableGeomEncoder extends PropertyXMLEncoder { * * @param vtGeometryMembers */ - public void setup(Map vtGeometryMembers) { - for (Entry vtGeomMember : vtGeometryMembers + public void setup(Map vtGeometryMembers) { + for (Entry vtGeomMember : vtGeometryMembers .entrySet()) { set(vtGeomMember.getKey().toString(), vtGeomMember.getValue()); } @@ -101,7 +150,7 @@ public class GSVirtualTableGeomEncoder extends PropertyXMLEncoder { * @param type * @param value */ - public void setVirtualTableGeometryMember(VirtualTableGeometry type, + public void setVirtualTableGeometryMember(VTGeometry type, String value) { set(type.toString(), value); } @@ -112,8 +161,8 @@ public class GSVirtualTableGeomEncoder extends PropertyXMLEncoder { * @param type * @return */ - public boolean delVirtualTableGeometryMember(VirtualTableGeometry type) { - return ElementUtils.remove(this.getRoot(), get(type.toString())); + public boolean delVirtualTableGeometryMember(VTGeometry type) { + return ElementUtils.remove(this.getRoot(), this.getRoot().getChild(type.toString())); } /** @@ -122,8 +171,8 @@ public class GSVirtualTableGeomEncoder extends PropertyXMLEncoder { * @param type * @return */ - public String getVirtualTableGeometryMember(VirtualTableGeometry type) { - Element el = get(type.toString()); + public String getVirtualTableGeometryMember(VTGeometry type) { + Element el = this.getRoot().getChild(type.toString()); if (el != null) return el.getTextTrim(); else diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/VirtualTableParameter.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTParameter.java similarity index 93% rename from src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/VirtualTableParameter.java rename to src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTParameter.java index 2adac0b..a454c67 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/VirtualTableParameter.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTParameter.java @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package it.geosolutions.geoserver.rest.encoder.metadata; +package it.geosolutions.geoserver.rest.encoder.metadata.virtualtable; /** * Enumeration of SQL View featureType virtual table parameter members @@ -31,7 +31,7 @@ package it.geosolutions.geoserver.rest.encoder.metadata; * emmanuel.blondel@fao.org * */ -public enum VirtualTableParameter { +public enum VTParameter { name, defaultValue, regexpValidator } diff --git a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableParamEncoder.java b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTParameterEncoder.java similarity index 54% rename from src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableParamEncoder.java rename to src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTParameterEncoder.java index 9faae16..54d208e 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableParamEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/virtualtable/VTParameterEncoder.java @@ -22,32 +22,36 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package it.geosolutions.geoserver.rest.encoder.metadata; +package it.geosolutions.geoserver.rest.encoder.metadata.virtualtable; import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils; -import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; +import it.geosolutions.geoserver.rest.encoder.utils.XmlElement; import java.util.Map; import java.util.Map.Entry; import org.jdom.Element; +import org.jdom.filter.Filter; /** * GSVirtualTableParamEncoder - Encodes a metadata VirtualTable parameter for a * GeoServer featureType, as follows: * *
- * {
- * 	@code
- * 	final GSVirtualTableParamEncoder vtParam = new GSVirtualTableParamEncoder();
- * 	vtParam.setup("fieldname", "default_value", "^[\\w\\d\\s]+$");
+ * { @code
+ * 	final VTParameterEncoder vtParam = new VTParameterEncoder();
+ * 	vtParam.setVirtualTableParamMember(VTParameter.name, "fieldname");
+ * 	vtParam.setVirtualTableParamMember(VTParameter.defaultValue,
+ * 			"default_value");
+ * 	vtParam.setVirtualTableParamMember(VTParameter.regexpValidator,
+ * 			"^[\\w\\d\\s]+$");
  * }
  * 
* * For this example, the XML output is: * *
- * {@code
+ * { @code
  * 
  * 	fieldname
  * 	default_value
@@ -60,15 +64,61 @@ import org.jdom.Element;
  *         emmanuel.blondel@fao.org
  * 
  */
-public class GSVirtualTableParamEncoder extends PropertyXMLEncoder {
+public class VTParameterEncoder extends XmlElement {
 
+	/** 
+	 * A class to filter the VirtualTable parameters by name
+	 *
+	 */
+	public static class filterByName implements Filter {
+
+		final private String key;
+
+		public filterByName(String name) {
+			this.key = name;
+		}
+
+		private static final long serialVersionUID = 1L;
+
+		public boolean matches(Object obj) {
+			Element el = ((Element) obj)
+					.getChild(VTParameter.name.toString());
+			if (el != null && el.getTextTrim().equals(key)) {
+				return true;
+			}
+			return false;
+		}
+	}
+
+	/** 
+	 * Get a Filter using the VTParameter name
+	 * 
+	 * @param name
+	 * @return the filter
+	 */
+	public static Filter getFilterByName(String name) {
+		return new filterByName(name);
+	}
+	
 	/**
 	 * Constructs a GSVirtualTableParamEncoder
 	 */
-	public GSVirtualTableParamEncoder() {
+	public VTParameterEncoder() {
 		super("parameter");
 	}
 
+	/**
+	 * Constructs quickly a VTParameterEncoder
+	 * 
+	 * @param name
+	 * @param defaultValue
+	 * @param regexpValidator
+	 */
+	public VTParameterEncoder(String name, String defaultValue, String regexpValidator){
+		super("parameter");
+		this.setup(name, defaultValue, regexpValidator);
+	}
+	
 	/**
 	 * Set-up quickly a VirtualTable parameter
 	 * 
@@ -76,10 +126,10 @@ public class GSVirtualTableParamEncoder extends PropertyXMLEncoder {
 	 * @param defaultValue
 	 * @param regexpValidator
 	 */
-	public void setup(String name, String defaultValue, String regexpValidator) {
-		set(VirtualTableParameter.name.name(), name);
-		set(VirtualTableParameter.defaultValue.name(), defaultValue);
-		set(VirtualTableParameter.regexpValidator.name(), regexpValidator);
+	protected void setup(String name, String defaultValue, String regexpValidator) {
+		set(VTParameter.name.name(), name);
+		set(VTParameter.defaultValue.name(), defaultValue);
+		set(VTParameter.regexpValidator.name(), regexpValidator);
 	}
 
 	/**
@@ -87,8 +137,8 @@ public class GSVirtualTableParamEncoder extends PropertyXMLEncoder {
 	 * 
 	 * @param vtParamMembers
 	 */
-	public void setup(Map vtParamMembers) {
-		for (Entry vtParamMember : vtParamMembers
+	public void setup(Map vtParamMembers) {
+		for (Entry vtParamMember : vtParamMembers
 				.entrySet()) {
 			set(vtParamMember.getKey().toString(), vtParamMember.getValue());
 		}
@@ -100,7 +150,7 @@ public class GSVirtualTableParamEncoder extends PropertyXMLEncoder {
 	 * @param type
 	 * @param value
 	 */
-	public void setVirtualTableParamMember(VirtualTableParameter type,
+	public void setVirtualTableParamMember(VTParameter type,
 			String value) {
 		set(type.toString(), value);
 	}
@@ -111,8 +161,8 @@ public class GSVirtualTableParamEncoder extends PropertyXMLEncoder {
 	 * @param type
 	 * @return
 	 */
-	public boolean delVirtualTableParamMember(VirtualTableParameter type) {
-		return ElementUtils.remove(this.getRoot(), get(type.toString()));
+	public boolean delVirtualTableParamMember(VTParameter type) {
+		return ElementUtils.remove(this.getRoot(), this.getRoot().getChild(type.toString()));
 	}
 
 	/**
@@ -121,8 +171,8 @@ public class GSVirtualTableParamEncoder extends PropertyXMLEncoder {
 	 * @param type
 	 * @return
 	 */
-	public String getVirtualTableParamMember(VirtualTableParameter type) {
-		Element el = get(type.toString());
+	public String getVirtualTableParamMember(VTParameter type) {
+		Element el = getRoot().getChild(type.toString());
 		if (el != null)
 			return el.getTextTrim();
 		else
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 4750863..b448ce6 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
@@ -27,10 +27,10 @@ import it.geosolutions.geoserver.rest.encoder.GSResourceEncoder;
 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.virtualtable.GSVirtualTableEncoder;
+import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.VTGeometryEncoder;
+import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.VTParameterEncoder;
 import it.geosolutions.geoserver.rest.encoder.metadata.GSFeatureDimensionInfoEncoder;
-import it.geosolutions.geoserver.rest.encoder.metadata.GSVirtualTableEncoder;
-import it.geosolutions.geoserver.rest.encoder.metadata.GSVirtualTableGeomEncoder;
-import it.geosolutions.geoserver.rest.encoder.metadata.GSVirtualTableParamEncoder;
 import it.geosolutions.geoserver.rest.encoder.metadatalink.GSMetadataLinkInfoEncoder;
 import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
 import it.geosolutions.geoserver.rest.publisher.GeoserverRESTPublisherTest;
@@ -38,7 +38,6 @@ import it.geosolutions.geoserver.rest.publisher.GeoserverRESTPublisherTest;
 import java.io.File;
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.util.Arrays;
 import java.util.List;
 
 import org.jdom.Element;
@@ -149,7 +148,7 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
         
         GSFeatureDimensionInfoEncoder dim2 = new GSFeatureDimensionInfoEncoder("ELE");
         
-        encoder.addMetadata("elevation", dim2);
+        encoder.addMetadataDimension("elevation", dim2);
         dim2.setPresentation(PresentationDiscrete.DISCRETE_INTERVAL, BigDecimal.valueOf(10));
         Element el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.PRESENTATION);
         Assert.assertNotNull(el);
@@ -163,7 +162,7 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
 
         dim2.setPresentation(Presentation.CONTINUOUS_INTERVAL);
         
-        encoder.setMetadata("time", new GSFeatureDimensionInfoEncoder("time"));
+        encoder.setMetadataDimension("time", new GSFeatureDimensionInfoEncoder("time"));
         el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.PRESENTATION);
         Assert.assertNotNull(el);
         el = ElementUtils.contains(encoder.getRoot(), GSDimensionInfoEncoder.RESOLUTION);
@@ -214,7 +213,7 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
         // LOGGER.info(encoder.toString());
 
         final String metadata = "elevation";
-        encoder.setMetadata(metadata, elevationDimension);
+        encoder.setMetadataDimension(metadata, elevationDimension);
 
         elevationDimension.setPresentation(PresentationDiscrete.DISCRETE_INTERVAL,
                 BigDecimal.valueOf(10));
@@ -261,22 +260,31 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
         //virtual table
         //-------------
         // Set-up the vtGeom
-        final GSVirtualTableGeomEncoder vtGeom = new GSVirtualTableGeomEncoder();
-        vtGeom.setup("the_geom", "MultiPolygon", "4326");
+        final VTGeometryEncoder vtGeom = new VTGeometryEncoder("the_geom", "Point", "4326");
          
         // Set-up 2 virtual table parameters
-        final GSVirtualTableParamEncoder vtParam1 = new GSVirtualTableParamEncoder();
-        vtParam1.setup("high", "100000000", "^[\\d]+$");
-        final GSVirtualTableParamEncoder vtParam2 = new GSVirtualTableParamEncoder();
-        vtParam2.setup("low", "0", "^[\\d]+$");
+        final VTParameterEncoder vtParam1 = new VTParameterEncoder("high", "100000000", "^[\\d]+$");
+        final VTParameterEncoder vtParam2 = new VTParameterEncoder("low", "0", "^[\\d]+$");
          
         // sql
-        String sql = "select gid, state_name, the_geom from pgstates where persons between %low% and %high%";
+        String sql = "select gid, state_name, the_geom from pgstates where persons between %low% and %high% and state_abbr = '%state%'";
         
         //set-up the virtual table
         final GSVirtualTableEncoder vte = new GSVirtualTableEncoder();
-        vte.setup(nativeName, sql, null, Arrays.asList(vtGeom), Arrays.asList(vtParam1, vtParam2));
-        fte.setMetadataVirtualTable(vte);
+        vte.setName(nativeName);
+        vte.setSql(sql);
+        vte.addVirtualTableGeometry(vtGeom);
+        vte.addVirtualTableParameter(vtParam1);
+        vte.addVirtualTableParameter(vtParam2);
+        fte.setMetadataVirtualTable(vte); //Set the virtual table 
+        
+        //modif the vte
+        vte.delVirtualTableGeometry("the_geom");
+        vte.addVirtualTableGeometry("the_geom", "MultiPolygon", "4326");
+        
+        final VTParameterEncoder vtParam3 = new VTParameterEncoder("state", "FL", "^[\\w\\d\\s]+$");
+        vte.addVirtualTableParameter(vtParam3);
+        vte.addKeyColumn("gid");
         
         //Layer encoder
         //-------------
diff --git a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSVirtualTableEncoderTest.java b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSVirtualTableEncoderTest.java
index 7bbb992..c149e81 100644
--- a/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSVirtualTableEncoderTest.java
+++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSVirtualTableEncoderTest.java
@@ -1,79 +1,99 @@
 package it.geosolutions.geoserver.rest.encoder.feature;
 
-import it.geosolutions.geoserver.rest.encoder.metadata.GSVirtualTableEncoder;
-import it.geosolutions.geoserver.rest.encoder.metadata.GSVirtualTableGeomEncoder;
-import it.geosolutions.geoserver.rest.encoder.metadata.GSVirtualTableParamEncoder;
-import it.geosolutions.geoserver.rest.encoder.metadata.VirtualTableGeometry;
-import it.geosolutions.geoserver.rest.encoder.metadata.VirtualTableParameter;
+import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.GSVirtualTableEncoder;
+import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.VTGeometryEncoder;
+import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.VTParameterEncoder;
+import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.VTGeometry;
+import it.geosolutions.geoserver.rest.encoder.metadata.virtualtable.VTParameter;
+import it.geosolutions.geoserver.rest.encoder.utils.XmlElement;
 
 import java.util.Arrays;
 
 import junit.framework.Assert;
 
+import org.jdom.Element;
 import org.junit.Test;
 
 /**
  * 
  * @author eblondel
- *
+ * 
  */
 public class GSVirtualTableEncoderTest {
-	
+
 	@Test
-	public void virtualTableTest(){
-		
+	public void virtualTableTest() {
+
 		// Set-up the vtGeom
-		final GSVirtualTableGeomEncoder vtGeom = new GSVirtualTableGeomEncoder();
-		vtGeom.setup("the_geom", "MultiPolygon", "4326");
+		final VTGeometryEncoder vtGeom = new VTGeometryEncoder("the_geom",
+				"MultiPolygon", "4326");
 
 		// Set-up 2 virtual table parameters
-		final GSVirtualTableParamEncoder vtParam1 = new GSVirtualTableParamEncoder();
-		vtParam1.setup("fieldname1", "default_value1", "^[\\w\\d\\s]+$");
-		final GSVirtualTableParamEncoder vtParam2 = new GSVirtualTableParamEncoder();
-		vtParam2.setup("fieldname2", "default_value2", "^[\\w\\d\\s]+$");
+		final VTParameterEncoder vtParam1 = new VTParameterEncoder(
+				"fieldname1", "default_value1", "^[\\w\\d\\s]+$");
+		final VTParameterEncoder vtParam2 = new VTParameterEncoder(
+				"fieldname2", "default_value2", "^[\\w\\d\\s]+$");
 
 		// sql
 		String sql = "select the_geom, id, field1, field2 from mytable where field1 = '%fieldname1%' and field2 = '%fieldname2%'";
 
 		// Set-up the virtual table
 		final GSVirtualTableEncoder vte = new GSVirtualTableEncoder();
-		vte.setup("mysqlview", sql, Arrays.asList("id"), Arrays.asList(vtGeom), Arrays.asList(vtParam1, vtParam2));
-		
-		//TESTS
-		
-		Assert.assertEquals("mysqlview", vte.getName());
-		Assert.assertEquals(sql, vte.getSql());
-		Assert.assertEquals("id", vte.getKeyColumnList().get(0));
-		
-		final GSVirtualTableGeomEncoder ge = vte.getVirtualTableGeomEncoderList().get(0);
-		Assert.assertEquals("the_geom", ge.getVirtualTableGeometryMember(VirtualTableGeometry.name));
-		Assert.assertEquals("MultiPolygon", ge.getVirtualTableGeometryMember(VirtualTableGeometry.type));
-		Assert.assertEquals("4326", ge.getVirtualTableGeometryMember(VirtualTableGeometry.srid));
-		
-		final GSVirtualTableParamEncoder p1 = vte.getVirtualTableParamEncoderList().get(0);
-		final GSVirtualTableParamEncoder p2 = vte.getVirtualTableParamEncoderList().get(1);
-		Assert.assertEquals("fieldname1", p1.getVirtualTableParamMember(VirtualTableParameter.name));
-		Assert.assertEquals("default_value1", p1.getVirtualTableParamMember(VirtualTableParameter.defaultValue));
-		Assert.assertEquals("^[\\w\\d\\s]+$", p1.getVirtualTableParamMember(VirtualTableParameter.regexpValidator));
-		Assert.assertEquals("fieldname2", p2.getVirtualTableParamMember(VirtualTableParameter.name));
-		Assert.assertEquals("default_value2", p2.getVirtualTableParamMember(VirtualTableParameter.defaultValue));
-		Assert.assertEquals("^[\\w\\d\\s]+$", p2.getVirtualTableParamMember(VirtualTableParameter.regexpValidator));
-		
-		ge.setVirtualTableGeometryMember(VirtualTableGeometry.type, "Point");
-		p1.setVirtualTableParamMember(VirtualTableParameter.name, "newfieldname");
-		vte.setup("mysqlview", sql, null, Arrays.asList(ge), Arrays.asList(p1,p2));
-		
-		Assert.assertEquals("mysqlview", vte.getName());
-		Assert.assertEquals(sql, vte.getSql());
-		Assert.assertNull(vte.getKeyColumnList());
-		Assert.assertEquals("Point", vte.getVirtualTableGeomEncoderList().get(0)
-											.getVirtualTableGeometryMember(VirtualTableGeometry.type));
-		Assert.assertEquals("newfieldname", vte.getVirtualTableParamEncoderList().get(0)
-											.getVirtualTableParamMember(VirtualTableParameter.name));
+		vte.setName("mysqlview");
+		vte.setSql(sql);
+		vte.addKeyColumn("id");
+		vte.addVirtualTableGeometry(vtGeom);
+		vte.addVirtualTableParameter(vtParam1);
+		vte.addVirtualTableParameter(vtParam2);
 
-		Assert.assertTrue(vtGeom.delVirtualTableGeometryMember(VirtualTableGeometry.srid));
-		Assert.assertTrue(vtParam1.delVirtualTableParamMember(VirtualTableParameter.regexpValidator));
+		// TESTS
+
+		Assert.assertEquals("mysqlview", vte.getName());
+		Assert.assertEquals(sql, vte.getSql());
+		Assert.assertEquals("id", vte.getRoot().getChildText("keyColumn"));
+
+		final Element ge = (Element) vte.getRoot().getChild("geometry");
+		Assert.assertEquals("the_geom",
+				ge.getChildText(VTGeometry.name.toString()));
+		Assert.assertEquals("MultiPolygon",
+				ge.getChildText(VTGeometry.type.toString()));
+		Assert.assertEquals("4326", ge.getChildText(VTGeometry.srid.toString()));
+
+		final Element p1 = (Element) vte.getRoot().getChildren("parameter")
+				.get(0);
+		final Element p2 = (Element) vte.getRoot().getChildren("parameter")
+				.get(1);
+		Assert.assertEquals("fieldname1",
+				p1.getChildText(VTParameter.name.toString()));
+		Assert.assertEquals("default_value1",
+				p1.getChildText(VTParameter.defaultValue.toString()));
+		Assert.assertEquals("^[\\w\\d\\s]+$",
+				p1.getChildText(VTParameter.regexpValidator.toString()));
+		Assert.assertEquals("fieldname2",
+				p2.getChildText(VTParameter.name.toString()));
+		Assert.assertEquals("default_value2",
+				p2.getChildText(VTParameter.defaultValue.toString()));
+		Assert.assertEquals("^[\\w\\d\\s]+$",
+				p2.getChildText(VTParameter.regexpValidator.toString()));
+
+		vte.delKeyColumn("id");
+		Assert.assertNull(vte.getRoot().getChildText("keyColumn"));
+		Assert.assertEquals("mysqlview", vte.getName());
+		Assert.assertEquals(sql, vte.getSql());
+
+		vtGeom.setVirtualTableGeometryMember(VTGeometry.type, "Point");
+		vtParam1.setVirtualTableParamMember(VTParameter.name, "newfieldname");
+
+		Assert.assertEquals("Point",
+				((Element) vte.getRoot().getChildren("geometry").get(0))
+						.getChildText(VTGeometry.type.toString()));
+		Assert.assertEquals("newfieldname", ((Element) vte.getRoot()
+				.getChildren("parameter").get(0)).getChildText(VTParameter.name
+				.toString()));
+
+		Assert.assertTrue(vtGeom.delVirtualTableGeometryMember(VTGeometry.srid));
+		Assert.assertTrue(vtParam1
+				.delVirtualTableParamMember(VTParameter.regexpValidator));
 	}
-	
 
 }