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
|
* 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>
|
* <pre>
|
||||||
* {
|
* {
|
||||||
@ -42,16 +46,16 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
|
|||||||
*
|
*
|
||||||
* // Set-up 2 virtual table parameters
|
* // Set-up 2 virtual table parameters
|
||||||
* final GSVirtualTableParamEncoder vtParam1 = new GSVirtualTableParamEncoder();
|
* final GSVirtualTableParamEncoder vtParam1 = new GSVirtualTableParamEncoder();
|
||||||
* vtParam1.setup("fieldname1", "default_value1", "^[\\w\\d\\s]+$");
|
* vtParam1.setup("high", "100000000", "^[\\d]+$");
|
||||||
* final GSVirtualTableParamEncoder vtParam2 = new GSVirtualTableParamEncoder();
|
* final GSVirtualTableParamEncoder vtParam2 = new GSVirtualTableParamEncoder();
|
||||||
* vtParam2.setup("fieldname2", "default_value2", "^[\\w\\d\\s]+$");
|
* vtParam2.setup("low", "0", "^[\\d]+$");
|
||||||
*
|
*
|
||||||
* // sql
|
* // 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
|
* // Set-up the virtual table
|
||||||
* final GSVirtualTableEncoder vte = new GSVirtualTableEncoder();
|
* 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));
|
* Arrays.asList(vtParam1, vtParam2));
|
||||||
* }
|
* }
|
||||||
* </pre>
|
* </pre>
|
||||||
@ -61,23 +65,22 @@ import it.geosolutions.geoserver.rest.encoder.utils.PropertyXMLEncoder;
|
|||||||
* <pre>
|
* <pre>
|
||||||
* {@code
|
* {@code
|
||||||
* <virtualTable>
|
* <virtualTable>
|
||||||
* <name>mysqlview</name>
|
* <name>popstates</name>
|
||||||
* <sql>select the_geom, id, field1, field2 from mytable where field1 = '%fieldname1%' and field2 = '%fieldname2%'</sql>
|
* <sql>select gid, state_name, the_geom from pgstates where persons between %low% and %high%</sql>
|
||||||
* <keyColumn>id</keyColumn>
|
|
||||||
* <geometry>
|
* <geometry>
|
||||||
* <name>the_geom</name>
|
* <name>the_geom</name>
|
||||||
* <type>MultiPolygon</type>
|
* <type>MultiPolygon</type>
|
||||||
* <srid>4326</srid>
|
* <srid>4326</srid>
|
||||||
* </geometry>
|
* </geometry>
|
||||||
* <parameter>
|
* <parameter>
|
||||||
* <name>fieldname1</name>
|
* <name>high</name>
|
||||||
* <defaultValue>default_value1</defaultValue>
|
* <defaultValue>100000000</defaultValue>
|
||||||
* <regexpValidator>^[\w\d\s]+$</regexpValidator>
|
* <regexpValidator>^[\d]+$</regexpValidator>
|
||||||
* </parameter>
|
* </parameter>
|
||||||
* <parameter>
|
* <parameter>
|
||||||
* <name>fieldname2</name>
|
* <name>low</name>
|
||||||
* <defaultValue>default_value2</defaultValue>
|
* <defaultValue>0</defaultValue>
|
||||||
* <regexpValidator>^[\w\d\s]+$</regexpValidator>
|
* <regexpValidator>^[\d]+$</regexpValidator>
|
||||||
* </parameter>
|
* </parameter>
|
||||||
* </virtualTable>
|
* </virtualTable>
|
||||||
* }
|
* }
|
||||||
@ -107,8 +110,7 @@ public class GSVirtualTableEncoder extends PropertyXMLEncoder {
|
|||||||
* is aimed to ensure that the order of metadata elements is well
|
* is aimed to ensure that the order of metadata elements is well
|
||||||
* maintained, and avoid errors at publication time in Geoserver.
|
* maintained, and avoid errors at publication time in Geoserver.
|
||||||
*
|
*
|
||||||
* @param name
|
* @param name (must be the same as the featureType nativeName)
|
||||||
* (must be the same as the featureType name)
|
|
||||||
* @param sql
|
* @param sql
|
||||||
* @param keyColumns
|
* @param keyColumns
|
||||||
* @param geomEncList
|
* @param geomEncList
|
||||||
@ -119,6 +121,9 @@ public class GSVirtualTableEncoder extends PropertyXMLEncoder {
|
|||||||
List<GSVirtualTableParamEncoder> paramEncList) {
|
List<GSVirtualTableParamEncoder> paramEncList) {
|
||||||
|
|
||||||
this.getRoot().removeContent();
|
this.getRoot().removeContent();
|
||||||
|
this.keyColumns = null;
|
||||||
|
this.geomEncList = null;
|
||||||
|
this.paramEncList = null;
|
||||||
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.sql = sql;
|
this.sql = sql;
|
||||||
@ -171,6 +176,16 @@ public class GSVirtualTableEncoder extends PropertyXMLEncoder {
|
|||||||
return this.sql;
|
return this.sql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the list of key columns
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public List<String> getKeyColumnList(){
|
||||||
|
return this.keyColumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the list of GSVirtualTableGeomEncoder
|
* 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.Presentation;
|
||||||
import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.PresentationDiscrete;
|
import it.geosolutions.geoserver.rest.encoder.metadata.GSDimensionInfoEncoder.PresentationDiscrete;
|
||||||
import it.geosolutions.geoserver.rest.encoder.metadata.GSFeatureDimensionInfoEncoder;
|
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.metadatalink.GSMetadataLinkInfoEncoder;
|
||||||
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
|
import it.geosolutions.geoserver.rest.encoder.utils.ElementUtils;
|
||||||
import it.geosolutions.geoserver.rest.publisher.GeoserverRESTPublisherTest;
|
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.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.jdom.Element;
|
import org.jdom.Element;
|
||||||
@ -48,6 +52,8 @@ import org.springframework.core.io.ClassPathResource;
|
|||||||
*
|
*
|
||||||
* @author ETj (etj at geo-solutions.it)
|
* @author ETj (etj at geo-solutions.it)
|
||||||
* @author Carlo Cancellieri - carlo.cancellieri@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 {
|
public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
|
||||||
protected final static Logger LOGGER = LoggerFactory.getLogger(GSFeatureEncoderTest.class);
|
protected final static Logger LOGGER = LoggerFactory.getLogger(GSFeatureEncoderTest.class);
|
||||||
@ -228,4 +234,63 @@ public class GSFeatureEncoderTest extends GeoserverRESTPublisherTest {
|
|||||||
LOGGER.info("REMOVED");
|
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