package edu.kit.aifb.cumulus.webapp;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.LoggerFactory;
import edu.kit.aifb.cumulus.log.Log;
import edu.kit.aifb.cumulus.log.MessageCatalog;
import edu.kit.aifb.cumulus.webapp.HttpProtocol.MimeTypes;
/**
* Supertype layer for all CumulusRDF servlets.
*
* @author Andreas Harth
* @author Andreas Wagner
* @author Andrea Gazzarini
* @since 1.0
*/
public abstract class AbstractCumulusServlet extends HttpServlet {
private static final long serialVersionUID = 8288745695008790134L;
protected final Log _log = new Log(LoggerFactory.getLogger(getClass()));
private static final String PARAMS_MISSING_HTML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" "
+ "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"> <html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\"> "
+ "<head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /> <title>CumulusRDF - Paramters Missing</title> "
+ "</head><body><h1>CumulusRDF - Paramters Missing</h1>";
@Override
public void doDelete(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
@Override
public void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
@Override
public void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
@Override
public void doPut(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
/**
* Forwards to a given target resource.
*
* @param request the HTTP request.
* @param response the HTTP response.
* @param targetResource the target resource.
* @throws ServletException in case of Servlet I/O failure.
* @throws IOException in case of I/O failure.
*/
protected void forwardTo(
final HttpServletRequest request,
final HttpServletResponse response,
final String targetResource) throws ServletException, IOException {
RequestDispatcher dispatcher = request.getRequestDispatcher(targetResource);
dispatcher.forward(request, response);
}
/**
* Redirects to a given target resource.
*
* @param request the HTTP request.
* @param response the HTTP response.
* @param targetResource the target resource.
* @throws IOException in case of I/O failure.
*/
protected void redirectTo(
final HttpServletRequest request,
final HttpServletResponse response,
final String targetResource) throws IOException {
response.sendRedirect(targetResource);
}
private String getParametersMissingHTML(final String... params) {
final StringBuilder html = new StringBuilder(PARAMS_MISSING_HTML);
if ((params == null) || (params.length == 0)) {
return html.append("<p>No parameters provided.</p></body></html>").toString();
}
for (final String param : params) {
html.append("<p>No parameter " + param + " provided.</p>");
}
return html.append("</body></html>").toString();
}
/**
* Sends back an error status / message.
*
* @param req the Http request.
* @param resp the Http response.
* @param statusCode the Htttp status code.
* @param msg an explanation message.
* @param cause one or more exception causes.
*/
protected void sendError(
final HttpServletRequest req,
final HttpServletResponse resp,
final int statusCode,
final String msg,
final Throwable... cause) {
resp.setStatus(statusCode);
req.setAttribute("javax.servlet.error.status_code", statusCode);
req.setAttribute("javax.servlet.error.message", msg);
req.setAttribute("javax.servlet.error.request_uri", req.getRequestURI());
req.setAttribute("page", "Error");
if ((cause != null) && (cause.length > 0)) {
req.setAttribute("javax.servlet.error.exception", cause);
}
try {
forwardTo(req, resp, "/error");
} catch (ServletException e) {
_log.error(MessageCatalog._00025_CUMULUS_SYSTEM_INTERNAL_FAILURE_MSG, e);
} catch (IOException e) {
_log.error(MessageCatalog._00025_CUMULUS_SYSTEM_INTERNAL_FAILURE_MSG, e);
}
}
/**
* Returns a HTML page that includes all missing parameters.
*
* @param resp the HTTP response.
* @param params the missing parameters.
* @throws IOException in case of I/O failure.
*/
protected void sendNiceHTMLParameterMissingError(final HttpServletResponse resp, final String... params) throws IOException {
resp.setContentType(MimeTypes.TEXT_HTML);
PrintWriter writer = resp.getWriter();
writer.write(getParametersMissingHTML(params));
writer.close();
resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
}
}