/*
* Carrot2 project.
*
* Copyright (C) 2002-2016, Dawid Weiss, Stanisław Osiński.
* All rights reserved.
*
* Refer to the full license file "carrot2.LICENSE"
* in the root folder of the repository checkout or at:
* http://www.carrot2.org/carrot2.LICENSE
*/
package org.carrot2.workbench.vis.http;
import java.io.IOException;
import java.io.Writer;
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.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.RuntimeInstance;
import org.carrot2.workbench.core.helpers.Utils;
import org.carrot2.workbench.velocity.VelocityInitializer;
/**
* Processes velocity resource matching the URI path and returns it as a resource.
*/
@SuppressWarnings("serial")
public final class VelocityServlet extends HttpServlet
{
/** Default served content. */
private static final String DEFAULT_CONTENT_TYPE = "text/plain; charset=UTF-8";
/**
* Velocity instance for processing templates.
*/
private RuntimeInstance velocity;
/** Templates folder inside the bundle. */
private String templatesPrefix;
/**
* Content type of the served content.
*/
private String contentType = DEFAULT_CONTENT_TYPE;
/*
*
*/
@Override
public void init() throws ServletException
{
super.init();
if (getInitParameter("content-type") != null)
{
this.contentType = getInitParameter("content-type");
}
if (getInitParameter("templates-prefix") != null)
{
this.templatesPrefix = getInitParameter("templates-prefix");
}
else
{
templatesPrefix = "";
}
if (StringUtils.isEmpty(getInitParameter("bundleID")))
{
throw new ServletException("Init attribute required: bundleID");
}
velocity = VelocityInitializer.createInstance(
getInitParameter("bundleID"), templatesPrefix);
}
/*
*
*/
@Override
public void destroy()
{
super.destroy();
velocity = null;
}
/**
* Serve the content.
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
final String templatePath = req.getRequestURI();
try
{
final Template t = velocity.getTemplate(templatePath);
final VelocityContext context = new VelocityContext();
context.put("request", req);
HttpServletUtils.sendNoCache(resp);
resp.setContentType(contentType);
final Writer w = resp.getWriter();
t.merge(context, w);
w.close();
}
catch (ResourceNotFoundException e)
{
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
}
catch (Exception e)
{
Utils.logError("Template parsing failed: " + templatePath, e, false);
}
}
}