Java tutorial
/* * CDDL HEADER START * * The contents of this file are subject to the terms of the Common Development and Distribution * License, Version 1.0 only (the "License"). You may not use this file except in compliance with * the License. * * You can obtain a copy of the license at license/ESCIDOC.LICENSE or * http://www.escidoc.org/license. See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each file and include the License * file at license/ESCIDOC.LICENSE. If applicable, add the following below this CDDL HEADER, with * the fields enclosed by brackets "[]" replaced with your own identifying information: Portions * Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2006-2012 Fachinformationszentrum Karlsruhe Gesellschaft fr * wissenschaftlich-technische Information mbH and Max-Planck- Gesellschaft zur Frderung der * Wissenschaft e.V. All rights reserved. Use is subject to license terms. */ package de.mpg.mpdl.inge.syndication.presentation; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.io.Writer; import java.net.URISyntaxException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.sun.syndication.io.FeedException; import de.mpg.mpdl.inge.syndication.Syndication; import de.mpg.mpdl.inge.syndication.SyndicationException; import de.mpg.mpdl.inge.syndication.Utils; import de.mpg.mpdl.inge.syndication.feed.Feed; import de.mpg.mpdl.inge.util.PropertyReader; /** * The servlet takes URL, calls eSciDoc syndication manager and returns generated RSS/ATOM feed to * the client. * * @author Vlad Makarenko (initial creation) * @author $Author$ (last modification) $Revision$ $LastChangedDate$ */ public class RestServlet extends HttpServlet { /** Serial identifier. */ private static final long serialVersionUID = 1L; /** Logging instance. */ private static final Logger logger = Logger.getLogger(RestServlet.class); /* Syndication Manager Instance */ Syndication synd; public RestServlet() throws IOException, SyndicationException { synd = new Syndication(); } /** * {@inheritDoc} */ @Override protected final void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } /** * {@inheritDoc} */ @Override protected final void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { String url = null; try { url = PropertyReader.getProperty("escidoc.syndication.service.url") + req.getServletPath() + req.getPathInfo(); } catch (Exception e) { handleException(e, resp); } String q = req.getQueryString(); if (Utils.checkVal(q)) { url += "?" + q; } Feed feed = synd.getFeeds().matchFeedByUri(url); // set correct mime-type resp.setContentType("application/" + (url.contains("rss_") ? "rss" : "atom") + "+xml; charset=utf-8"); // cache handling String ttl = feed.getCachingTtl(); if (Utils.checkVal(ttl)) { long ttlLong = Long.parseLong(ttl) * 1000L; resp.setHeader("control-cache", "max-age=" + ttl + ", must-revalidate"); DateFormat df = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z"); df.setTimeZone(TimeZone.getTimeZone("GMT")); resp.setHeader("Expires", df.format(new Date(System.currentTimeMillis() + ttlLong))); } try { synd.getFeed(url, resp.getWriter()); } catch (SyndicationException e) { handleException(e, resp); } catch (URISyntaxException e) { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Wrong URI syntax: " + url); return; } catch (FeedException e) { handleException(e, resp); } } /** * Take care on an incoming exception. * * @param e exception * @param resp response stream * @throws IOException * @throws Exception if the handling went wrong on any reason */ private void handleException(final Exception e, final HttpServletResponse resp) throws IOException { logger.error(e.getMessage(), e); PrintWriter pw; pw = resp.getWriter(); pw.print("Error: "); e.printStackTrace(pw); pw.close(); } }