/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.geoserver.kml;
import java.util.logging.Level;
import org.geoserver.catalog.FeatureTypeInfo;
import org.geoserver.data.test.MockData;
import org.geotools.util.logging.Logging;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class GeoSearchKMLTest extends RegionatingTestSupport {
public void testOutput() throws Exception {
final String path =
"wms?request=getmap&service=wms&version=1.1.1" +
"&format=" + KMLMapOutputFormat.MIME_TYPE +
"&layers=" + MockData.BASIC_POLYGONS.getPrefix() + ":" + MockData.BASIC_POLYGONS.getLocalPart() +
"&styles=" + MockData.BASIC_POLYGONS.getLocalPart() +
"&height=1024&width=1024&bbox=-180,-90,0,90&srs=EPSG:4326" +
"&featureid=BasicPolygons.1107531493643";
Document document = getAsDOM(path);
assertEquals("kml", document.getDocumentElement().getTagName());;
}
/**
* Test that requests regionated by data actually return stuff.
*/
public void testDataRegionator() throws Exception{
final String path =
"wms?request=getmap&service=wms&version=1.1.1" +
"&format=" + KMLMapOutputFormat.MIME_TYPE +
"&layers=" + MockData.DIVIDED_ROUTES.getPrefix() + ":" + MockData.DIVIDED_ROUTES.getLocalPart() +
"&styles=" + MockData.DIVIDED_ROUTES.getLocalPart() +
"&height=1024&width=1024&srs=EPSG:4326" +
"&format_options=regionateBy:external-sorting;regionateAttr:NUM_LANES";
Document document = getAsDOM(path + "&bbox=-180,-90,0,90");
assertEquals("kml", document.getDocumentElement().getTagName());
int westCount = document.getDocumentElement().getElementsByTagName("Placemark").getLength();
assertStatusCodeForGet(204, path + "&bbox=0,-90,180,90");
assertEquals(1, westCount);
}
/**
* Test that requests regionated by geometry actually return stuff.
*/
public void testGeometryRegionator() throws Exception{
final String path =
"wms?request=getmap&service=wms&version=1.1.1" +
"&format=" + KMLMapOutputFormat.MIME_TYPE +
"&layers=" + MockData.DIVIDED_ROUTES.getPrefix() + ":" + MockData.DIVIDED_ROUTES.getLocalPart() +
"&styles=" + MockData.DIVIDED_ROUTES.getLocalPart() +
"&height=1024&width=1024&srs=EPSG:4326" +
"&format_options=regionateBy:geometry;regionateAttr:the_geom";
Document document = getAsDOM(path + "&bbox=-180,-90,0,90");
assertEquals("kml", document.getDocumentElement().getTagName());
assertEquals(1, document.getDocumentElement().getElementsByTagName("Placemark").getLength());
assertStatusCodeForGet(204, path + "&bbox=0,-90,180,90");
}
/**
* Test that requests regionated by random criteria actually return stuff.
*/
public void testRandomRegionator() throws Exception{
final String path =
"wms?request=getmap&service=wms&version=1.1.1" +
"&format=" + KMLMapOutputFormat.MIME_TYPE +
"&layers=" + MockData.DIVIDED_ROUTES.getPrefix() + ":" + MockData.DIVIDED_ROUTES.getLocalPart() +
"&styles=" + MockData.DIVIDED_ROUTES.getLocalPart() +
"&height=1024&width=1024&srs=EPSG:4326" +
"&format_options=regionateBy:random";
Document document = getAsDOM(path + "&bbox=-180,-90,0,90");
assertEquals("kml", document.getDocumentElement().getTagName());
assertEquals(1, document.getDocumentElement().getElementsByTagName("Placemark").getLength());
assertStatusCodeForGet(204, path + "&bbox=0,-90,180,90");
}
/**
* Test that when a bogus regionating strategy is requested things still work.
* TODO: Evaluate whether an error message should be returned instead.
*/
public void testBogusRegionator() throws Exception {
Logging.getLogger("org.geoserver.ows").setLevel(Level.OFF);
final String path =
"wms?request=getmap&service=wms&version=1.1.1" +
"&format=" + KMLMapOutputFormat.MIME_TYPE +
"&layers=" + MockData.DIVIDED_ROUTES.getPrefix() + ":" + MockData.DIVIDED_ROUTES.getLocalPart() +
"&styles=" + MockData.DIVIDED_ROUTES.getLocalPart() +
"&height=1024&width=1024&srs=EPSG:4326" +
"&format_options=regionateBy:bogus";
Document document = getAsDOM(path + "&bbox=0,-90,180,90", true);
assertEquals("ServiceExceptionReport", document.getDocumentElement().getTagName());
}
/**
* Test whether geometries that cross tiles get put into both of them.
*/
public void testBigGeometries() throws Exception {
final String path =
"wms?request=getmap&service=wms&version=1.1.1" +
"&format=" + KMLMapOutputFormat.MIME_TYPE +
"&layers=" + CENTERED_POLY.getPrefix() + ":" + CENTERED_POLY.getLocalPart() +
"&styles=" +
"&height=1024&width=1024&srs=EPSG:4326" +
"&format_options=regionateBy:external-sorting;regionateattr:foo";
assertStatusCodeForGet(204, path + "&bbox=-180,-90,0,90");
Document document = getAsDOM(path + "&bbox=0,-90,180,90");
assertEquals("kml", document.getDocumentElement().getTagName());
assertEquals(1, document.getDocumentElement().getElementsByTagName("Placemark").getLength());
}
/**
* Test whether specifying different regionating strategies changes the results.
*/
public void testStrategyChangesStuff() throws Exception {
final String path =
"wms?request=getmap&service=wms&version=1.1.1" +
"&format=" + KMLMapOutputFormat.MIME_TYPE +
"&layers=" + TILE_TESTS.getPrefix() + ":" + TILE_TESTS.getLocalPart() +
"&bbox=-180,-90,0,90&styles=" +
"&height=1024&width=1024&srs=EPSG:4326";
FeatureTypeInfo fti = getFeatureTypeInfo(TILE_TESTS);
fti.getMetadata().put("kml.regionateFeatureLimit", 2);
getCatalog().save(fti);
Document geo = getAsDOM(path + "&format_options=regionateBy:geometry;regionateattr:location");
assertEquals("kml", geo.getDocumentElement().getTagName());
NodeList geoPlacemarks = geo.getDocumentElement().getElementsByTagName("Placemark");
assertEquals(2, geoPlacemarks.getLength());
Document data = getAsDOM(path + "&format_options=regionateBy:external-sorting;regionateAttr:z");
assertEquals("kml", data.getDocumentElement().getTagName());
NodeList dataPlacemarks = data.getDocumentElement().getElementsByTagName("Placemark");
assertEquals(2, dataPlacemarks.getLength());
for (int i = 0; i < geoPlacemarks.getLength(); i++){
String geoName = ((Element)geoPlacemarks.item(i)).getAttribute("id");
String dataName = ((Element)dataPlacemarks.item(i)).getAttribute("id");
assertTrue(geoName + " and " + dataName + " should not be the same!",
!geoName.equals(dataName)
);
}
}
/**
* Test whether specifying different regionating strategies changes the results.
*/
public void testDuplicateAttribute() throws Exception {
final String path =
"wms?request=getmap&service=wms&version=1.1.1" +
"&format=" + KMLMapOutputFormat.MIME_TYPE +
"&layers=" + TILE_TESTS.getPrefix() + ":" + TILE_TESTS.getLocalPart() +
"&bbox=-180,-90,0,90&styles=" +
"&height=1024&width=1024&srs=EPSG:4326";
FeatureTypeInfo fti = getFeatureTypeInfo(TILE_TESTS);
fti.getMetadata().put("kml.regionateFeatureLimit", 2);
Document geo = getAsDOM(path + "&format_options=regionateBy:best_guess;regionateattr:the_geom");
assertEquals("kml", geo.getDocumentElement().getTagName());
}
}