001: /* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
002: * This code is licensed under the GPL 2.0 license, availible at the root
003: * application directory.
004: */
005: package org.vfny.geoserver.wms.responses.map.georss;
006:
007: import org.geoserver.data.test.MockData;
008: import org.geoserver.wms.WMSTestSupport;
009: import org.geotools.data.DefaultQuery;
010: import org.geotools.data.Query;
011: import org.geotools.factory.CommonFactoryFinder;
012: import org.geotools.factory.GeoTools;
013: import org.geotools.map.MapLayer;
014: import org.opengis.filter.Filter;
015: import org.opengis.filter.FilterFactory;
016: import org.vfny.geoserver.wms.WMSMapContext;
017: import org.vfny.geoserver.wms.responses.map.georss.GeoRSSTransformerBase.GeometryEncoding;
018: import org.w3c.dom.Document;
019: import org.w3c.dom.Element;
020: import org.w3c.dom.NodeList;
021: import org.xml.sax.SAXException;
022:
023: import java.io.ByteArrayInputStream;
024: import java.io.ByteArrayOutputStream;
025: import java.io.IOException;
026:
027: import javax.xml.parsers.DocumentBuilder;
028: import javax.xml.parsers.DocumentBuilderFactory;
029: import javax.xml.parsers.FactoryConfigurationError;
030: import javax.xml.parsers.ParserConfigurationException;
031: import javax.xml.transform.TransformerException;
032:
033: public class RSSGeoRSSTransformerTest extends WMSTestSupport {
034: FilterFactory ff = CommonFactoryFinder.getFilterFactory(GeoTools
035: .getDefaultHints());
036:
037: protected void setUp() throws Exception {
038: super .setUp();
039:
040: }
041:
042: public void testLatLong() throws Exception {
043: WMSMapContext map = new WMSMapContext(
044: createGetMapRequest(MockData.BASIC_POLYGONS));
045: map.addLayer(createMapLayer(MockData.BASIC_POLYGONS));
046:
047: Document document = getRSSResponse(map,
048: AtomGeoRSSTransformer.GeometryEncoding.LATLONG);
049:
050: Element element = document.getDocumentElement();
051: assertEquals("rss", element.getNodeName());
052:
053: NodeList items = element.getElementsByTagName("item");
054:
055: int n = getFeatureSource(MockData.BASIC_POLYGONS).getCount(
056: Query.ALL);
057:
058: assertEquals(n, items.getLength());
059:
060: for (int i = 0; i < items.getLength(); i++) {
061: Element item = (Element) items.item(i);
062: assertEquals(1, item.getElementsByTagName("geo:lat")
063: .getLength());
064: assertEquals(1, item.getElementsByTagName("geo:long")
065: .getLength());
066: }
067: }
068:
069: public void testFilter() throws Exception {
070: // Set up a map context with a filtered layer
071: WMSMapContext map = new WMSMapContext(
072: createGetMapRequest(MockData.BUILDINGS));
073: MapLayer layer = createMapLayer(MockData.BUILDINGS);
074: Filter f = ff.equals(ff.property("ADDRESS"), ff
075: .literal("215 Main Street"));
076: layer.setQuery(new DefaultQuery(MockData.BUILDINGS
077: .getLocalPart(), f));
078: map.addLayer(layer);
079:
080: Document document = getRSSResponse(map,
081: AtomGeoRSSTransformer.GeometryEncoding.LATLONG);
082: NodeList items = document.getDocumentElement()
083: .getElementsByTagName("item");
084: assertEquals(1, items.getLength());
085: }
086:
087: public void testReproject() throws Exception {
088: // Set up a map context with a projected layer
089: WMSMapContext map = new WMSMapContext(
090: createGetMapRequest(MockData.LINES));
091: map.addLayer(createMapLayer(MockData.LINES));
092:
093: Document document = getRSSResponse(map,
094: AtomGeoRSSTransformer.GeometryEncoding.LATLONG);
095: NodeList items = document.getDocumentElement()
096: .getElementsByTagName("item");
097:
098: // check all items are there
099: assertEquals(1, items.getLength());
100:
101: // check coordinates are in wgs84, originals aren't
102: for (int i = 0; i < items.getLength(); i++) {
103: Element item = (Element) items.item(i);
104: double lat = Double
105: .parseDouble(getOrdinate(item, "geo:lat"));
106: double lon = Double.parseDouble(getOrdinate(item,
107: "geo:long"));
108: assertTrue(lat >= -90 && lat <= 90);
109: assertTrue(lon >= -180 && lon <= 180);
110: }
111: }
112:
113: String getOrdinate(Element item, String ordinate) {
114: return item.getElementsByTagName(ordinate).item(0)
115: .getChildNodes().item(0).getNodeValue();
116: }
117:
118: /**
119: * Returns a DOM given a map context and a geometry encoder
120: */
121: Document getRSSResponse(WMSMapContext map, GeometryEncoding encoding)
122: throws TransformerException, ParserConfigurationException,
123: FactoryConfigurationError, SAXException, IOException {
124: RSSGeoRSSTransformer tx = new RSSGeoRSSTransformer();
125: tx.setGeometryEncoding(encoding);
126: tx.setIndentation(2);
127:
128: ByteArrayOutputStream output = new ByteArrayOutputStream();
129: tx.transform(map, output);
130:
131: DocumentBuilder docBuilder = DocumentBuilderFactory
132: .newInstance().newDocumentBuilder();
133: Document document = docBuilder.parse(new ByteArrayInputStream(
134: output.toByteArray()));
135: return document;
136: }
137: }
|