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.feature.ReprojectingFeatureCollection;
008: import org.geoserver.wms.util.WMSRequests;
009: import org.geotools.data.DefaultQuery;
010: import org.geotools.data.FeatureSource;
011: import org.geotools.factory.CommonFactoryFinder;
012: import org.geotools.factory.GeoTools;
013: import org.geotools.feature.Feature;
014: import org.geotools.feature.FeatureCollection;
015: import org.geotools.feature.FeatureIterator;
016: import org.geotools.feature.GeometryAttributeType;
017: import org.geotools.geometry.jts.ReferencedEnvelope;
018: import org.geotools.map.MapLayer;
019: import org.geotools.referencing.CRS;
020: import org.geotools.xml.transform.Translator;
021: import org.opengis.filter.Filter;
022: import org.opengis.filter.FilterFactory;
023: import org.opengis.referencing.crs.CoordinateReferenceSystem;
024: import org.vfny.geoserver.util.Requests;
025: import org.vfny.geoserver.wms.WMSMapContext;
026: import org.vfny.geoserver.wms.responses.featureInfo.FeatureTemplate;
027: import org.xml.sax.ContentHandler;
028: import org.xml.sax.helpers.AttributesImpl;
029: import java.io.IOException;
030: import java.util.Iterator;
031: import java.util.List;
032: import java.util.logging.Level;
033:
034: /**
035: * Encodes an RSS feed tagged with geo information.
036: *
037: * @author Justin Deoliveira, The Open Planning Project, jdeolive@openplans.org
038: *
039: */
040: public class RSSGeoRSSTransformer extends GeoRSSTransformerBase {
041: FeatureTemplate template = new FeatureTemplate();
042:
043: public Translator createTranslator(ContentHandler handler) {
044: return new RSSGeoRSSTranslator(handler);
045: }
046:
047: class RSSGeoRSSTranslator extends GeoRSSTranslatorSupport {
048: public RSSGeoRSSTranslator(ContentHandler contentHandler) {
049: super (contentHandler, null, null);
050: }
051:
052: public void encode(Object o) throws IllegalArgumentException {
053: WMSMapContext map = (WMSMapContext) o;
054:
055: AttributesImpl atts = new AttributesImpl();
056: atts.addAttribute(null, "version", "version", null, "2.0");
057:
058: start("rss", atts);
059: start("channel");
060:
061: StringBuffer title = new StringBuffer();
062:
063: for (int i = 0; i < map.getLayerCount(); i++) {
064: MapLayer layer = map.getLayer(i);
065: title.append(layer.getTitle()).append(",");
066: }
067: title.setLength(title.length() - 1);
068:
069: element("title", title.toString());
070:
071: start("link");
072:
073: cdata(WMSRequests.getGetMapUrl(map.getRequest(), null,
074: null, null));
075: end("link");
076:
077: //element( "description", "description" );
078:
079: //items
080: try {
081: encodeItems(map);
082: } catch (IOException e) {
083: throw new RuntimeException(e);
084: }
085:
086: end("channel");
087: end("rss");
088: }
089:
090: void encodeItems(WMSMapContext map) throws IOException {
091: List featureCollections = loadFeatureCollections(map);
092: for (Iterator f = featureCollections.iterator(); f
093: .hasNext();) {
094: FeatureCollection features = (FeatureCollection) f
095: .next();
096: FeatureIterator iterator = null;
097:
098: try {
099: iterator = features.features();
100:
101: while (iterator.hasNext()) {
102: Feature feature = iterator.next();
103: try {
104: encodeItem(feature, map);
105: } catch (Exception e) {
106: LOGGER
107: .warning("Encoding failed for feature: "
108: + feature.getID());
109: LOGGER.log(Level.FINE, "", e);
110: }
111:
112: }
113: } finally {
114: if (iterator != null) {
115: features.close(iterator);
116: }
117: }
118:
119: }
120: }
121:
122: void encodeItem(Feature feature, WMSMapContext map)
123: throws IOException {
124: start("item");
125:
126: try {
127: element("title", template.title(feature));
128: } catch (Exception e) {
129: String msg = "Error occured executing title template for: "
130: + feature.getID();
131: LOGGER.log(Level.WARNING, msg, e);
132: }
133:
134: //create the link as getFeature request with fid filter
135: //TODO: throw this into a utility class
136: //TODO: use an html based output format
137: String link = Requests.getBaseUrl(map.getRequest()
138: .getHttpServletRequest(), map.getRequest()
139: .getGeoServer());
140: link += ("wfs?request=getfeature&service=wfs&version=1.0.0&featureid=" + feature
141: .getID());
142:
143: start("link");
144: cdata(link);
145: end("link");
146:
147: //element( "description", template.execute(feature));
148: try {
149: String description = template.description(feature);
150: start("description");
151: cdata(description);
152: end("description");
153: } catch (Exception e) {
154: String msg = "Error occured executing description template for: "
155: + feature.getID();
156: LOGGER.log(Level.WARNING, msg, e);
157: }
158:
159: encodeGeometry(feature);
160:
161: end("item");
162: }
163: }
164: }
|