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 index ddaaa58..f844734 100644 --- a/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableEncoder.java +++ b/src/main/java/it/geosolutions/geoserver/rest/encoder/metadata/GSVirtualTableEncoder.java @@ -31,7 +31,11 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder; /** * GSVirtualTableEncoder - Encodes a metadata VirtualTable for a GeoServer - * featureType, as follows: + * 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}): * *
* {
@@ -42,16 +46,16 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
*
* // Set-up 2 virtual table parameters
* final GSVirtualTableParamEncoder vtParam1 = new GSVirtualTableParamEncoder();
- * vtParam1.setup("fieldname1", "default_value1", "^[\\w\\d\\s]+$");
+ * vtParam1.setup("high", "100000000", "^[\\d]+$");
* final GSVirtualTableParamEncoder vtParam2 = new GSVirtualTableParamEncoder();
- * vtParam2.setup("fieldname2", "default_value2", "^[\\w\\d\\s]+$");
+ * vtParam2.setup("low", "0", "^[\\d]+$");
*
* // sql
- * String sql = "select the_geom, id, field1, field2 from mytable where field1 = '%fieldname1%' and field2 = '%fieldname2%'";
+ * 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("mysqlview", sql, Arrays.asList("id"), Arrays.asList(vtGeom),
+ * vte.setup("popstates", sql, null, Arrays.asList(vtGeom),
* Arrays.asList(vtParam1, vtParam2));
* }
*
@@ -61,23 +65,22 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
*
* {@code
*
- * mysqlview
- * select the_geom, id, field1, field2 from mytable where field1 = '%fieldname1%' and field2 = '%fieldname2%'
- * id
+ * popstates
+ * select gid, state_name, the_geom from pgstates where persons between %low% and %high%
*
* the_geom
* MultiPolygon
* 4326
*
*
- * fieldname1
- * default_value1
- * ^[\w\d\s]+$
+ * high
+ * 100000000
+ * ^[\d]+$
*
*
- * fieldname2
- * default_value2
- * ^[\w\d\s]+$
+ * low
+ * 0
+ * ^[\d]+$
*
*
* }
@@ -107,8 +110,7 @@ public class GSVirtualTableEncoder extends PropertyXMLEncoder {
* 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 name)
+ * @param name (must be the same as the featureType nativeName)
* @param sql
* @param keyColumns
* @param geomEncList
@@ -119,6 +121,9 @@ public class GSVirtualTableEncoder extends PropertyXMLEncoder {
List paramEncList) {
this.getRoot().removeContent();
+ this.keyColumns = null;
+ this.geomEncList = null;
+ this.paramEncList = null;
this.name = name;
this.sql = sql;
@@ -171,6 +176,16 @@ public class GSVirtualTableEncoder extends PropertyXMLEncoder {
return this.sql;
}
+ /**
+ * Get the list of key columns
+ *
+ * @return
+ */
+ public List getKeyColumnList(){
+ return this.keyColumns;
+ }
+
+
/**
* get the list of GSVirtualTableGeomEncoder
*
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 4703fb1..4750863 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
@@ -28,6 +28,9 @@ 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.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;
@@ -35,6 +38,7 @@ 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;
@@ -48,6 +52,8 @@ import org.springframework.core.io.ClassPathResource;
*
* @author ETj (etj at geo-solutions.it)
* @author Carlo Cancellieri - carlo.cancellieri@geo-solutions.it
+ * @author Emmanuel Blondel - emmanuel.blondel1@gmail.com |
+ * emmanuel.blondel@fao.org
*/
public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
protected final static Logger LOGGER = LoggerFactory.getLogger(GSFeatureEncoderTest.class);
@@ -228,4 +234,63 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
LOGGER.info("REMOVED");
}
+
+ @Test
+ public void testSQLViewIntegration(){
+
+ if (!enabled())
+ return;
+ deleteAll();
+ GeoServerRESTPublisher publisher = new GeoServerRESTPublisher(RESTURL, RESTUSER, RESTPW);
+
+ String storeName = "statesdb"; //name of the datastore setup for tests
+ String layerName = "my_sqlviewlayer";
+ String nativeName = "popstates";
+
+ GSFeatureTypeEncoder fte = new GSFeatureTypeEncoder();
+ fte.setName(layerName);
+ fte.setNativeName(nativeName);
+ fte.setTitle("title");
+
+ fte.addKeyword("keyword1");
+ fte.addKeyword("keyword2");
+ fte.setNativeCRS("EPSG:4326");
+ fte.setDescription("desc");
+ fte.setEnabled(true);
+
+ //virtual table
+ //-------------
+ // 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(nativeName, sql, null, Arrays.asList(vtGeom), Arrays.asList(vtParam1, vtParam2));
+ fte.setMetadataVirtualTable(vte);
+
+ //Layer encoder
+ //-------------
+ GSLayerEncoder layerEncoder = new GSLayerEncoder();
+ layerEncoder.setEnabled(true);
+ layerEncoder.setQueryable(true);
+ layerEncoder.setDefaultStyle("polygon");
+
+ // test insert
+ //------------
+ publisher.createWorkspace(DEFAULT_WS);
+ boolean published = publisher.publishDBLayer(DEFAULT_WS, storeName, fte, layerEncoder);
+ assertTrue("Successfull publication", published);
+ assertTrue(existsLayer(layerName));
+
+ }
}
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
new file mode 100644
index 0000000..7bbb992
--- /dev/null
+++ b/src/test/java/it/geosolutions/geoserver/rest/encoder/feature/GSVirtualTableEncoderTest.java
@@ -0,0 +1,79 @@
+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 java.util.Arrays;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+/**
+ *
+ * @author eblondel
+ *
+ */
+public class GSVirtualTableEncoderTest {
+
+ @Test
+ public void virtualTableTest(){
+
+ // 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("fieldname1", "default_value1", "^[\\w\\d\\s]+$");
+ final GSVirtualTableParamEncoder vtParam2 = new GSVirtualTableParamEncoder();
+ vtParam2.setup("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));
+
+ Assert.assertTrue(vtGeom.delVirtualTableGeometryMember(VirtualTableGeometry.srid));
+ Assert.assertTrue(vtParam1.delVirtualTableParamMember(VirtualTableParameter.regexpValidator));
+ }
+
+
+}