blob: 39646a37377d06f7180bacf420a32ecb18de43cd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. 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. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.roller.weblogger.webservices.opensearch;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.URLStrategy;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
import org.apache.roller.weblogger.pojos.Weblog;
import org.apache.roller.weblogger.util.Utilities;
/**
* Return OpenSearch descriptor that describes Roller's search facilities.
* For more informaton see the
* <a href="http://cwiki.apache.org/confluence/display/ROLLER/Proposal+OpenSearch">OpenSearch proposal</a>.
* @author Dave Johnson (<a href="mailto:davidm.johnson@sun.com">davidm.johnson@sun.com</a>)
*/
public class OpenSearchServlet extends HttpServlet {
@Override
public void doGet(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String[] pathInfo = new String[0];
String handle = null;
// Will return descriptor for searching specified blog
if (request.getPathInfo() != null) {
pathInfo = Utilities.stringToStringArray(request.getPathInfo(), "/");
}
if (pathInfo.length == 0) {
// URL format: [context]/roller-services/opensearch
handle = WebloggerRuntimeConfig.getProperty("site.frontpage.weblog.handle");
} else if (pathInfo.length == 1) {
// URL format: [context]/roller-services/opensearch/[weblog-handle]
handle = pathInfo[0];
} else {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Malformed URL");
return;
}
String shortName = null;
String description = null;
String contact = null;
String searchFeed = null;
String searchPage = null;
URLStrategy strat = WebloggerFactory.getWeblogger().getUrlStrategy();
Weblog weblog = null;
try {
weblog = WebloggerFactory.getWeblogger().getWeblogManager().getWeblogByHandle(handle);
} catch (WebloggerException ex) {
throw new ServletException("ERROR: fetching specified weblog");
}
searchPage = StringEscapeUtils.escapeXml(
strat.getWeblogSearchPageURLTemplate(weblog));
searchFeed = StringEscapeUtils.escapeXml(
strat.getWeblogSearchFeedURLTemplate(weblog));
boolean siteWide = WebloggerRuntimeConfig.isSiteWideWeblog(handle);
if (siteWide) {
shortName = "[Search Descriptor] " + StringEscapeUtils.escapeXml(
WebloggerRuntimeConfig.getProperty("site.shortName"));
description = StringEscapeUtils.escapeXml(
WebloggerRuntimeConfig.getProperty("site.description"));
contact = StringEscapeUtils.escapeXml(
WebloggerRuntimeConfig.getProperty("site.adminemail"));
} else {
shortName = StringEscapeUtils.escapeXml(weblog.getName());
description = StringEscapeUtils.escapeXml(weblog.getTagline());
contact = StringEscapeUtils.escapeXml(weblog.getEmailAddress());
}
response.setContentType("application/opensearchdescription+xml");
PrintWriter pw = new PrintWriter(response.getWriter());
pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
pw.println("<OpenSearchDescription xmlns=\"http://a9.com/-/spec/opensearch/1.1/\">");
pw.println(" <ShortName>" + shortName + "</ShortName>");
pw.println(" <Description>" + description + "</Description>");
pw.println(" <Contact>" + contact + "</Contact>");
pw.println(" <Url type=\"application/atom+xml\" ");
pw.println(" template=\"" + searchFeed + "\"/>");
pw.println(" <Url type=\"text/html\" ");
pw.println(" template=\"" + searchPage + "\"/>");
pw.println("</OpenSearchDescription>");
pw.flush();
pw.close();
}
}