VirtualTable support - fix GSVirtualTableEncoder & add encoder tests

This commit is contained in:
eblondel 2013-04-12 12:56:32 +02:00
parent 944e9d8325
commit 2a5fbcbf37
3 changed files with 175 additions and 16 deletions

View File

@ -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}):
*
* <pre>
* {
@ -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));
* }
* </pre>
@ -61,23 +65,22 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
* <pre>
* {@code
* <virtualTable>
* <name>mysqlview</name>
* <sql>select the_geom, id, field1, field2 from mytable where field1 = '%fieldname1%' and field2 = '%fieldname2%'</sql>
* <keyColumn>id</keyColumn>
* <name>popstates</name>
* <sql>select gid, state_name, the_geom from pgstates where persons between %low% and %high%</sql>
* <geometry>
* <name>the_geom</name>
* <type>MultiPolygon</type>
* <srid>4326</srid>
* </geometry>
* <parameter>
* <name>fieldname1</name>
* <defaultValue>default_value1</defaultValue>
* <regexpValidator>^[\w\d\s]+$</regexpValidator>
* <name>high</name>
* <defaultValue>100000000</defaultValue>
* <regexpValidator>^[\d]+$</regexpValidator>
* </parameter>
* <parameter>
* <name>fieldname2</name>
* <defaultValue>default_value2</defaultValue>
* <regexpValidator>^[\w\d\s]+$</regexpValidator>
* <name>low</name>
* <defaultValue>0</defaultValue>
* <regexpValidator>^[\d]+$</regexpValidator>
* </parameter>
* </virtualTable>
* }
@ -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<GSVirtualTableParamEncoder> 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<String> getKeyColumnList(){
return this.keyColumns;
}
/**
* get the list of GSVirtualTableGeomEncoder
*

View File

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

View File

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