/* (c) 2014 Open Source Geospatial Foundation - all rights reserved
* (c) 2001 - 2013 OpenPlans
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.wfs;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static org.custommonkey.xmlunit.XMLAssert.assertXpathEvaluatesTo;
import java.io.File;
import java.util.Map;
import net.sf.json.JSON;
import net.sf.json.JSONObject;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.CatalogBuilder;
import org.geoserver.catalog.DataStoreInfo;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.data.test.SystemTestData;
import org.geotools.data.DataStore;
import org.geotools.data.Query;
import org.geotools.data.simple.SimpleFeatureSource;
import org.geotools.data.simple.SimpleFeatureStore;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.jdbc.JDBCDataStore;
import org.geotools.jdbc.VirtualTable;
import org.geotools.jdbc.VirtualTableParameter;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeatureType;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import com.vividsolutions.jts.geom.Point;
public class SQLViewTest extends WFSTestSupport {
static final String tableTypeName = "gs:pgeo";
static final String viewTypeName = "gs:pgeo_view";
@Override
protected void setUpInternal(SystemTestData data) throws Exception {
// run all the tests against a store that can do sql views
Catalog cat = getCatalog();
DataStoreInfo ds = cat.getFactory().createDataStore();
ds.setName("sqlviews");
WorkspaceInfo ws = cat.getDefaultWorkspace();
ds.setWorkspace(ws);
ds.setEnabled(true);
Map params = ds.getConnectionParameters();
params.put("dbtype", "h2");
File dbFile = new File(getTestData().getDataDirectoryRoot().getAbsolutePath(), "data/h2test");
params.put("database", dbFile.getAbsolutePath());
cat.add(ds);
SimpleFeatureSource fsp = getFeatureSource(SystemTestData.PRIMITIVEGEOFEATURE);
DataStore store = (DataStore) ds.getDataStore(null);
SimpleFeatureTypeBuilder tb = new SimpleFeatureTypeBuilder();
tb.init(fsp.getSchema());
tb.remove("surfaceProperty"); // the store cannot create multi-geom tables it seems
tb.remove("curveProperty"); // the store cannot create multi-geom tables it seems
tb.remove("uriProperty"); // this would render the store read only
tb.setName("pgeo");
SimpleFeatureType schema = tb.buildFeatureType();
store.createSchema(schema);
SimpleFeatureStore featureStore = (SimpleFeatureStore) store.getFeatureSource("pgeo");
featureStore.addFeatures(fsp.getFeatures());
CatalogBuilder cb = new CatalogBuilder(cat);
cb.setStore(ds);
FeatureTypeInfo tft = cb.buildFeatureType(featureStore);
cat.add(tft);
// create the sql view
JDBCDataStore jds = (JDBCDataStore) ds.getDataStore(null);
VirtualTable vt = new VirtualTable("pgeo_view", "select \"name\", \"pointProperty\" from \"pgeo\" where \"booleanProperty\" = %bool% and \"name\" = '%name%'");
vt.addParameter(new VirtualTableParameter("bool", "true"));
vt.addParameter(new VirtualTableParameter("name", "name-f001"));
vt.addGeometryMetadatata("pointProperty", Point.class, 4326);
jds.addVirtualTable(vt);
FeatureTypeInfo vft = cb.buildFeatureType(jds.getFeatureSource(vt.getName()));
vft.getMetadata().put(FeatureTypeInfo.JDBC_VIRTUAL_TABLE, vt);
cat.add(vft);
}
/**
* Checks the setup did the expected job
*
*/
@Test
public void testStoreSetup() throws Exception {
FeatureTypeInfo tableTypeInfo = getCatalog().getFeatureTypeByName(tableTypeName);
assertNotNull(tableTypeInfo);
assertEquals(5, tableTypeInfo.getFeatureSource(null, null).getCount(Query.ALL));
FeatureTypeInfo viewTypeInfo = getCatalog().getFeatureTypeByName(viewTypeName);
assertNotNull(viewTypeInfo);
assertEquals(1, viewTypeInfo.getFeatureSource(null, null).getCount(Query.ALL));
}
@Test
public void testViewParamsGet() throws Exception {
Document dom = getAsDOM("wfs?service=WFS&request=GetFeature&typename=" + viewTypeName + "&version=1.1&viewparams=bool:true;name:name-f003");
// print(dom);
assertXpathEvaluatesTo("name-f003", "//gs:pgeo_view/gml:name", dom);
assertXpathEvaluatesTo("1", "count(//gs:pgeo_view)", dom);
}
@Test
public void testViewParamsJsonGet() throws Exception {
JSON json = getAsJSON("wfs?service=WFS&request=GetFeature&typename=" + viewTypeName
+ "&version=1.1&viewparams=bool:true;name:name-f003&outputFormat=application/json");
// print(json);
assertEquals(1, ((JSONObject) json).getInt("totalFeatures"));
}
@Test
public void testPostWithViewParams_v100() throws Exception {
String xml = "<wfs:GetFeature service=\"WFS\" version=\"1.0.0\" "
+ "viewParams=\"bool:true;name:name-f003\" "
+ "xmlns:cdf=\"http://www.opengis.net/cite/data\" "
+ "xmlns:wfs=\"http://www.opengis.net/wfs\" "
+ "xmlns:ogc=\"http://www.opengis.net/ogc\" > "
+ "<wfs:Query typeName=\"" + viewTypeName + "\"> "
+ "</wfs:Query></wfs:GetFeature>";
Document doc = postAsDOM("wfs", xml);
assertEquals("wfs:FeatureCollection", doc.getDocumentElement().getNodeName());
NodeList featureMembers = doc.getElementsByTagName("gml:featureMember");
assertFalse(featureMembers.getLength() == 0);
assertXpathEvaluatesTo("name-f003", "//gs:pgeo_view/gs:name", doc);
assertXpathEvaluatesTo("1", "count(//gs:pgeo_view)", doc);
}
@Test
public void testPostWithViewParams_110() throws Exception {
String xml = "<wfs:GetFeature service=\"WFS\" version=\"1.1.0\" "
+ "viewParams=\"bool:true;name:name-f003\" "
+ "xmlns:cdf=\"http://www.opengis.net/cite/data\" "
+ "xmlns:wfs=\"http://www.opengis.net/wfs\" "
+ "xmlns:ogc=\"http://www.opengis.net/ogc\" > "
+ "<wfs:Query typeName=\"" + viewTypeName + "\"> "
+ "</wfs:Query></wfs:GetFeature>";
Document doc = postAsDOM("wfs", xml);
assertEquals("wfs:FeatureCollection", doc.getDocumentElement().getNodeName());
NodeList featureCollection = doc.getElementsByTagName("wfs:FeatureCollection");
assertFalse(featureCollection.getLength() == 0);
assertXpathEvaluatesTo("name-f003", "//gs:pgeo_view/gml:name", doc);
assertXpathEvaluatesTo("1", "count(//gs:pgeo_view)", doc);
}
@Test
public void testPostWithViewParams_200() throws Exception {
String xml = "<wfs:GetFeature service=\"WFS\" version=\"2.0.0\" "
+ "xmlns:wfs=\"http://www.opengis.net/wfs/2.0\" "
+ "viewParams=\"bool:true;name:name-f003\"> "
+ "<wfs:Query typeNames=\"" + viewTypeName + "\">"
+ "</wfs:Query></wfs:GetFeature>";
Document doc = postAsDOM("wfs", xml);
assertEquals("wfs:FeatureCollection", doc.getDocumentElement().getNodeName());
NodeList features = doc.getElementsByTagName("gs:pgeo_view");
assertEquals( 1, features.getLength() );
assertEquals(features.item(0).getFirstChild().getNodeName(), "gml:name");
assertEquals(features.item(0).getFirstChild().getTextContent(), "name-f003");
}
}