VirtualTable support - fix GSVirtualTableEncoder & add encoder tests
This commit is contained in:
parent
944e9d8325
commit
2a5fbcbf37
@ -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
|
||||
*
|
||||
|
||||
@ -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));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user