blob: e9ad6192407c78e88761a5344268b164d430ad5b [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.tagdata;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.URLStrategy;
import org.apache.roller.weblogger.business.WeblogEntryManager;
import org.apache.roller.weblogger.business.Weblogger;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.business.WeblogManager;
import org.apache.roller.weblogger.config.WebloggerConfig;
import org.apache.roller.weblogger.config.WebloggerRuntimeConfig;
import org.apache.roller.weblogger.pojos.TagStat;
import org.apache.roller.weblogger.pojos.Weblog;
import org.apache.roller.weblogger.util.Utilities;
/**
* Return tag statistics in JSON or Atom Category format.
* These URLs are supported:
* <ul>
* <li>/roller-services/tagdata - get tag data for entire site</li>
* <li>/roller-services/tagdata/weblogs/[handle] - get tag data for specific weblog</li>
* </ul>
* See the <a href="http://cwiki.apache.org/confluence/display/ROLLER/Proposal+Tag+Data+API">
* Tag Data API</a> proposal for details.
*
* @author Elias Torres (<a href="mailto:eliast@us.ibm.com">eliast@us.ibm.com</a>)
* @author Dave Johnson (<a href="mailto:davidm.johnson@sun.com">davidm.johnson@sun.com</a>)
*/
public class TagDataServlet extends HttpServlet {
private static final int MAX = WebloggerConfig.getIntProperty("services.tagdata.max", 30);
protected void doPost(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void doGet(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String[] pathInfo = new String[0];
boolean siteWide;
String handle;
String prefix;
String format = "json";
int page = 0;
// TODO: last modified or ETag support, caching, etc.
if (request.getPathInfo() != null) {
pathInfo = Utilities.stringToStringArray(request.getPathInfo(),"/");
}
if (pathInfo.length == 0) {
siteWide = true;
// we'll use the front-page weblog to form URLs
handle = WebloggerRuntimeConfig.getProperty("site.frontpage.weblog.handle");
} else if (pathInfo.length == 2 && "weblog".equals(pathInfo[0])) {
siteWide = false;
handle = pathInfo[1];
} else {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Malformed URL");
return;
}
prefix = request.getParameter("prefix");
if (request.getParameter("format") != null) {
format = request.getParameter("format");
}
try {
page = Integer.parseInt(request.getParameter("page"));
} catch (Exception ignored) {}
Weblogger roller = WebloggerFactory.getWeblogger();
List<TagStat> tags;
Weblog weblog;
try {
WeblogManager wmgr = roller.getWeblogManager();
WeblogEntryManager emgr = roller.getWeblogEntryManager();
weblog = wmgr.getWeblogByHandle(handle);
// get tags, if site-wide then don't specify weblog
tags = emgr.getTags(siteWide ? null : weblog, null, prefix, page * MAX, MAX + 1);
} catch (WebloggerException we) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "ERROR fetching tags");
return;
}
if ("json".equals(format)) {
response.setContentType("application/json; charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println("{ \"prefix\": \"" + (prefix == null ? "" : prefix) + "\",");
pw.println(" \"weblog\": \"" + (!siteWide ? handle : "") + "\",");
pw.println(" \"tagcounts\": [" );
int count = 0;
for (Iterator it = tags.iterator(); it.hasNext();) {
TagStat stat = (TagStat) it.next();
pw.print(" { \"tag\" : \"");
pw.print(stat.getName());
pw.print("\", ");
pw.print("\"count\" : ");
pw.print(stat.getCount());
pw.print(" }");
if (it.hasNext()) {
pw.println(", ");
}
if (count++ > MAX) {
break;
}
}
pw.println("\n ]\n}");
response.flushBuffer();
} else if ("xml".equals(format)) {
URLStrategy urlstrat = roller.getUrlStrategy();
response.setContentType("application/tagdata+xml; charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
pw.println("<categories fixed=\"no\" ");
pw.println(" xmlns=\"http://www.w3.org/2007/app\"");
pw.println(" xmlns:atom=\"http://www.w3.org/2005/Atom\"");
pw.println(" xmlns:tagdata=\"http://roller.apache.org/ns/tagdata\">");
int count = 0;
for (TagStat stat : tags) {
String term = stat.getName();
// gWCURL fields: weblog, locale, category, dateString, tags, pageNum, absolute
String viewURI = urlstrat.getWeblogCollectionURL(weblog,
null, null, null,
Collections.singletonList(stat.getName()),
0, true);
int frequency = stat.getCount();
pw.print("<atom:category term=\"" + term + "\" tagdata:frequency=\"" + frequency + "\" ");
pw.println("tagdata:href=\"" + viewURI + "\" />");
if (count++ > MAX) {
break;
}
}
if (tags.size() > MAX) {
// get next URI, if site-wide then don't specify weblog
String nextURI = urlstrat.getWeblogTagsJsonURL(weblog, true, page + 1);
pw.println("<atom:link rel=\"next\" href=\"" + nextURI + "\" />");
}
if (page > 0) {
// get prev URI, if site-wide then don't specify weblog
String prevURI = urlstrat.getWeblogTagsJsonURL(weblog, true, page - 1);
pw.println("<atom:link rel=\"previous\" href=\"" + prevURI + "\" />");
}
pw.println("</categories>");
response.flushBuffer();
} else {
response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Malformed URL");
}
}
}