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));
+	}
+	
+
+}