/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.solr.response; import java.io.IOException; import java.io.Writer; import org.apache.commons.lang.StringEscapeUtils; import org.apache.solr.common.SolrDocument; import org.apache.solr.request.SolrQueryRequest; /** * Implementation of a writer that outputs GeoRSS. */ public class GeoRssSpatialWriter extends BaseResponseWriter implements QueryResponseWriter { // content type and encoding private static String CONTENT_TYPE_GEORSS_UTF8 = "text/xml; charset=UTF-8"; /* * (non-Javadoc) * * @see * org.apache.solr.response.QueryResponseWriter#getContentType(org.apache. * solr.request.SolrQueryRequest, org.apache.solr.response.SolrQueryResponse) */ @Override public String getContentType(SolrQueryRequest request, SolrQueryResponse response) { return CONTENT_TYPE_GEORSS_UTF8; } /* * (non-Javadoc) * * @see org.apache.solr.response.QueryResponseWriter#write(java.io.Writer, * org.apache.solr.request.SolrQueryRequest, * org.apache.solr.response.SolrQueryResponse) */ @Override public void write(Writer writer, SolrQueryRequest request, SolrQueryResponse response) throws IOException { this.write(new GeoRssSingleResponseWriter(writer), request, response); } class GeoRssSingleResponseWriter extends BaseResponseWriter.SingleResponseWriter { private Writer writer; public GeoRssSingleResponseWriter(Writer writer) { this.writer = writer; } /* * (non-Javadoc) * * @seeorg.apache.solr.response.BaseResponseWriter.SingleResponseWriter# * isStreamingDocs() */ @Override public boolean isStreamingDocs() { return true; } /* * (non-Javadoc) * * @see * org.apache.solr.response.BaseResponseWriter.SingleResponseWriter#writeDoc * (org.apache.solr.common.SolrDocument) */ @Override public void writeDoc(SolrDocument solrDocument) throws IOException { StringBuilder geoRssBody = new StringBuilder(); geoRssBody.append(createElement("item", 2, false, true)); String title = getTitle(solrDocument); if (title != null) { geoRssBody.append(createElement("title", 3, false, false)); geoRssBody.append(title); geoRssBody.append(createElement("title", 0, true, true)); } String description = getDescription(solrDocument); if (description != null) { geoRssBody.append(createElement("description", 3, false, false)); geoRssBody.append(description); geoRssBody.append(createElement("description", 0, true, true)); } String link = getLink(solrDocument); if (link != null) { geoRssBody.append(createElement("link", 3, false, false)); geoRssBody.append(link); geoRssBody.append(createElement("link", 0, true, true)); } String lat = getLatitude(solrDocument); if (lat != null) { geoRssBody.append(createElement("geo:lat", 3, false, false)); geoRssBody.append(lat); geoRssBody.append(createElement("geo:lat", 0, true, true)); } String lon = getLongitude(solrDocument); if (lon != null) { geoRssBody.append(createElement("geo:long", 3, false, false)); geoRssBody.append(lon); geoRssBody.append(createElement("geo:long", 0, true, true)); } geoRssBody.append(createElement("item", 2, true, true)); this.writer.write(geoRssBody.toString()); } /* * (non-Javadoc) * * @see * org.apache.solr.response.BaseResponseWriter.SingleResponseWriter#end() */ @Override public void end() throws IOException { StringBuilder geoRssFooter = new StringBuilder(); geoRssFooter.append(createElement("channel", 1, true, true)); geoRssFooter.append(createElement("rss", 0, true, false)); this.writer.write(geoRssFooter.toString()); } /* * (non-Javadoc) * * @see * org.apache.solr.response.BaseResponseWriter.SingleResponseWriter#start() */ @Override public void start() throws IOException { StringBuilder geoRssHeader = new StringBuilder(); geoRssHeader.append("<?xml version='1.0'?>\n"); geoRssHeader.append(createElement("rss", 0, false, true, "version='2.0'", "xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'")); geoRssHeader.append(createElement("channel", 1, false, true)); geoRssHeader.append(createElement("title", 2, false, false)); geoRssHeader.append("Solr Search Results"); geoRssHeader.append(createElement("title", 0, true, true)); geoRssHeader.append(createElement("description", 2, false, false)); geoRssHeader.append("GeoRSS Formatted Search Results"); geoRssHeader.append(createElement("description", 0, true, true)); this.writer.write(geoRssHeader.toString()); } private String createElement(String tagName, int tabIndents, boolean isEnd, boolean newLine, String... attributes) { StringBuilder element = new StringBuilder(); for (int i = 0; i < tabIndents; i++) { element.append("\t"); } element.append("<"); if (!isEnd) { element.append(tagName + " "); for (String attr : attributes) { element.append(attr + " "); } element.deleteCharAt(element.length() - 1); } else element.append("/" + tagName); element.append(">"); if (newLine) element.append("\n"); return element.toString(); } private String getDescription(SolrDocument doc) { String description = (String) doc.getFirstValue("features"); return description != null ? StringEscapeUtils.escapeXml(description) : description; } private String getLatitude(SolrDocument doc) { String location = (String) doc.getFirstValue("location"); if(location == null) return ""; String[] loc = location.split(","); return loc[0] != null ? StringEscapeUtils.escapeXml(loc[0]) : loc[0]; } private String getLink(SolrDocument doc) { String link = (String) doc.getFirstValue("link"); return link != null ? StringEscapeUtils.escapeXml(link) : link; } private String getLongitude(SolrDocument doc) { String location = (String) doc.getFirstValue("location"); if(location == null) return ""; String[] loc = location.split(","); return loc[1] != null ? StringEscapeUtils.escapeXml(loc[1]) : loc[1]; } private String getTitle(SolrDocument doc) { String title = (String) doc.getFirstValue("name"); return title != null ? StringEscapeUtils.escapeXml(title) : title; } } }