package org.geoserver.sfs; import java.io.IOException; import java.io.StringWriter; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.geoserver.data.test.MockData; import org.geoserver.test.GeoServerTestSupport; import org.geotools.geojson.GeoJSON; import org.restlet.data.MediaType; import com.mockrunner.mock.web.MockHttpServletResponse; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; public class GetFeatureTest extends GeoServerTestSupport { @Override protected void populateDataDirectory(MockData dataDirectory) throws Exception { super.populateDataDirectory(dataDirectory); dataDirectory.addWcs11Coverages(); } protected String root() { return "rest/sfs/"; } public void testGetMissingLayer() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/abc:notThere"); assertEquals(404, response.getStatusCode()); assertEquals(MediaType.TEXT_PLAIN.getName(), response.getContentType()); assertEquals("No such layer: abc:notThere", response.getOutputStreamContent()); } public void testGetCoverage() throws Exception { final String tasmania = getLayerId(MockData.TASMANIA_BM); MockHttpServletResponse response = getAsServletResponse(root() + "data/" + tasmania); assertEquals(404, response.getStatusCode()); assertEquals(MediaType.TEXT_PLAIN.getName(), response.getContentType()); assertEquals("No such layer: " + tasmania, response.getOutputStreamContent()); } public void testGetAll() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/sf:PrimitiveGeoFeature"); assertEquals(200, response.getStatusCode()); assertEquals(MediaType.APPLICATION_JSON.getName(), response.getContentType()); JSONObject features = (JSONObject) json(response); // print(features); assertEquals("FeatureCollection", features.getString("type")); assertEquals(5 , features.getJSONArray("features").size()); } public void testGetAllCount() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/sf:PrimitiveGeoFeature?mode=count"); assertEquals(200, response.getStatusCode()); assertTrue(response.getContentType().startsWith(MediaType.TEXT_PLAIN.getName())); assertEquals("5", response.getOutputStreamContent()); } public void testGetAllBounds() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/sf:PrimitiveGeoFeature?mode=bounds"); assertEquals(200, response.getStatusCode()); assertTrue(response.getContentType().startsWith(MediaType.APPLICATION_JSON.getName())); JSONArray bbox = (JSONArray) json(response); // print(bbox); final double EPS = 0.0001; assertEquals(34.94, bbox.getDouble(0), EPS); assertEquals(-10.52, bbox.getDouble(1), EPS); assertEquals(59.41276, bbox.getDouble(2), EPS); assertEquals(30.899, bbox.getDouble(3), EPS); } public void testEqualityFilter() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?queryable=FID&FID__eq=113"); assertEquals(200, response.getStatusCode()); assertEquals(MediaType.APPLICATION_JSON.getName(), response.getContentType()); JSONObject collection = (JSONObject) json(response); testFirstBuilding(collection); } public void testRestrictAttributes() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?queryable=FID&FID__eq=113&attrs=FID"); assertEquals(200, response.getStatusCode()); assertEquals(MediaType.APPLICATION_JSON.getName(), response.getContentType()); JSONObject collection = (JSONObject) json(response); // print(collection); assertEquals("FeatureCollection", collection.getString("type")); final JSONArray features = collection.getJSONArray("features"); assertEquals(1 , features.size()); JSONObject feature = (JSONObject) features.get(0); assertEquals("Feature", feature.getString("type")); assertTrue(feature.has("geometry")); final JSONObject properties = feature.getJSONObject("properties"); assertEquals("113", properties.getString("FID")); assertFalse(properties.has("ADDRESS")); } public void testNoGeometry() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?queryable=FID&FID__eq=113&no_geom=true"); assertEquals(200, response.getStatusCode()); assertEquals(MediaType.APPLICATION_JSON.getName(), response.getContentType()); JSONObject collection = (JSONObject) json(response); // print(collection); assertEquals("FeatureCollection", collection.getString("type")); final JSONArray features = collection.getJSONArray("features"); assertEquals(1 , features.size()); JSONObject feature = (JSONObject) features.get(0); assertEquals("Feature", feature.getString("type")); assertFalse(feature.has("geometry")); final JSONObject properties = feature.getJSONObject("properties"); assertEquals("113", properties.getString("FID")); assertEquals("123 Main Street", properties.getString("ADDRESS")); } public void testILikeFilter() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?queryable=ADDRESS&ADDRESS__ilike=123%20m%25"); assertEquals(200, response.getStatusCode()); assertEquals(MediaType.APPLICATION_JSON.getName(), response.getContentType()); JSONObject collection = (JSONObject) json(response); // print(collection); testFirstBuilding(collection); } private void testFirstBuilding(JSONObject collection) { assertEquals("FeatureCollection", collection.getString("type")); final JSONArray features = collection.getJSONArray("features"); assertEquals(1 , features.size()); JSONObject feature = (JSONObject) features.get(0); assertEquals("Feature", feature.getString("type")); assertEquals("113", feature.getJSONObject("properties").getString("FID")); } public void testLimit() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?limit=1"); assertEquals(200, response.getStatusCode()); assertEquals(MediaType.APPLICATION_JSON.getName(), response.getContentType()); JSONObject collection = (JSONObject) json(response); testFirstBuilding(collection); } public void testLimitOffset() throws Exception { // property data store does not support offset MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?limit=1&offset=2"); assertEquals(500, response.getStatusCode()); assertEquals(MediaType.TEXT_PLAIN.getName(), response.getContentType()); } public void testSort() throws Exception { // property data store does not support sorting MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?order_by=ADDRESS"); assertEquals(500, response.getStatusCode()); assertEquals(MediaType.TEXT_PLAIN.getName(), response.getContentType()); } public void testPointFilter() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?lon=0.0008&lat=0.0005&tolerance=0.0001"); assertEquals(200, response.getStatusCode()); assertEquals(MediaType.APPLICATION_JSON.getName(), response.getContentType()); JSONObject collection = (JSONObject) json(response); testFirstBuilding(collection); } public void testPointFilterLarge() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?lon=0.0008&lat=0.0005&tolerance=0.01"); assertEquals(200, response.getStatusCode()); assertEquals(MediaType.APPLICATION_JSON.getName(), response.getContentType()); JSONObject collection = (JSONObject) json(response); // print(collection); testAllBuildings(collection); } private void testAllBuildings(JSONObject collection) { assertEquals("FeatureCollection", collection.getString("type")); final JSONArray features = collection.getJSONArray("features"); assertEquals(2 , features.size()); JSONObject feature = (JSONObject) features.get(0); assertEquals("Feature", feature.getString("type")); assertEquals("113", feature.getJSONObject("properties").getString("FID")); feature = (JSONObject) features.get(1); assertEquals("Feature", feature.getString("type")); assertEquals("114", feature.getJSONObject("properties").getString("FID")); } public void testBBoxFilter() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?bbox=0.0008,0.0005,0.00012,0.0007"); JSONObject collection = (JSONObject) json(response); testFirstBuilding(collection); } public void testBBoxFilterTolerance() throws Exception { MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?bbox=0.0008,0.0005,0.00012,0.0007&tolerance=0.01"); JSONObject collection = (JSONObject) json(response); testAllBuildings(collection); } public void testGeometryFilter() throws Exception { String jsonGeometry = buildJSONLineString(); MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?geometry=" + jsonGeometry); JSONObject collection = (JSONObject) json(response); testFirstBuilding(collection); } public void testGeometryFilterTolerance() throws Exception { String jsonGeometry = buildJSONLineString(); MockHttpServletResponse response = getAsServletResponse(root() + "data/cite:Buildings?geometry=" + jsonGeometry + "&tolerance=0.01"); JSONObject collection = (JSONObject) json(response); testAllBuildings(collection); } private String buildJSONLineString() throws ParseException, IOException { WKTReader reader = new WKTReader(); Geometry g = reader.read("LINESTRING(0.0008 0.0005,0.00012 0.0007)"); final StringWriter sw = new StringWriter(); GeoJSON.write(g, sw); String jsonGeometry = sw.getBuffer().toString(); return jsonGeometry; } }