207N/A/**
207N/A * $Id$
207N/A *
207N/A * Copyright (c) 2011-2012 Jens Elkner.
207N/A * All Rights Reserved.
207N/A *
207N/A * This software is the proprietary information of Jens Elkner.
207N/A * Use is subject to license terms.
207N/A */
207N/Apackage org.opensolaris.opengrok.web;
207N/A
207N/Aimport java.io.IOException;
207N/Aimport java.io.PrintWriter;
207N/Aimport java.util.ArrayList;
207N/Aimport java.util.logging.Level;
207N/Aimport java.util.logging.Logger;
207N/A
207N/Aimport javax.servlet.http.HttpServlet;
207N/Aimport javax.servlet.http.HttpServletRequest;
207N/Aimport javax.servlet.http.HttpServletResponse;
1051N/A
207N/Aimport org.opensolaris.opengrok.history.Annotation;
1051N/A
207N/A/**
207N/A * @author Jens Elkner
207N/A * @version $Revision$
207N/A */
207N/A/* Apache 6.x doesn't support it:
207N/A@WebServlet(name="Annotation Servlet",
207N/A description="Provides annotations for a source file in compact JSON format",
207N/A value= "/json/annotate/*")
207N/A*/
207N/Apublic class AnnotationServlet extends HttpServlet {
282N/A private static final long serialVersionUID = -7799365322134860997L;
207N/A private static final Logger logger =
261N/A Logger.getLogger(AnnotationServlet.class.getName());
320N/A
312N/A static void sendProlog(PrintWriter out) {
1327N/A out.write("{\"data\":");
1318N/A }
1318N/A
207N/A static void sendEpilog(PrintWriter out, boolean noDataSent, String[] errors)
207N/A throws IOException
1127N/A {
1327N/A if (noDataSent) {
1327N/A out.write("''");
1327N/A }
1318N/A if (errors != null && errors.length != 0) {
1327N/A out.write(',');
1327N/A Util.writeJsonArray(out, "errors", errors);
1127N/A }
1127N/A out.write('}');
1127N/A }
1127N/A
207N/A private static void writeAnnos(PrintWriter out, Annotation a, PageConfig cfg) {
207N/A String tmp = cfg.getConfig().getUserPage();
207N/A out.write('{');
928N/A
928N/A if (tmp != null && tmp.length() > 0) {
928N/A out.write("\"userPage\":{\"link\":");
207N/A out.write(Util.jsStringLiteral(tmp));
656N/A tmp = cfg.getConfig().getUserPageSuffix();
1127N/A if (tmp != null && tmp.length() > 0) {
207N/A out.write(",\"suffix\":");
207N/A out.write(Util.jsStringLiteral(tmp));
207N/A }
207N/A out.write("},");
678N/A }
480N/A out.write("\"a\":");
1127N/A out.write(a.toJson());
1318N/A out.write('}');
1327N/A }
207N/A
207N/A /**
207N/A * {@inheritDoc}
207N/A */
1190N/A @Override
1190N/A protected void doGet(HttpServletRequest req, HttpServletResponse resp)
207N/A throws IOException
928N/A {
207N/A PageConfig cfg = PageConfig.get(req);
207N/A long flast = cfg.getLastModified()/1000 * 1000;
207N/A long lmdate = cfg.getConfig().getLastModified();
207N/A if (lmdate > flast) {
207N/A flast = lmdate;
207N/A }
207N/A if (req.getDateHeader("If-Modified-Since") >= flast) {
207N/A resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
207N/A return;
1026N/A }
207N/A resp.setDateHeader("Last-Modified", flast);
207N/A resp.setCharacterEncoding("UTF-8");
207N/A resp.setContentType("application/json");
207N/A PrintWriter out = resp.getWriter();
253N/A ArrayList<String> errors = new ArrayList<String>();
359N/A int data = 0;
207N/A try {
359N/A sendProlog(out);
274N/A if (cfg.resourceNotAvailable()) {
1327N/A errors.add("Resource ignored");
656N/A return;
928N/A }
656N/A Annotation annotation = cfg.getAnnotation();
207N/A if (annotation == null) {
207N/A errors.add("Annotations not available");
207N/A return;
1190N/A }
207N/A writeAnnos(out, annotation, cfg);
207N/A data++;
207N/A } catch (Exception ex) {
1190N/A logger.log(Level.SEVERE, req.getRequestURI(), ex);
207N/A errors.add(ex.getLocalizedMessage());
207N/A } finally {
207N/A sendEpilog(out, data == 0, errors.toArray(new String[errors.size()]));
207N/A out.close();
207N/A }
207N/A }
207N/A
1190N/A}
207N/A