From 5e10b6b575993c78ac22191849c464b618c4fa8a Mon Sep 17 00:00:00 2001 From: mcentner Date: Wed, 14 Jul 2010 15:22:56 +0000 Subject: MOCCA Online HTTP binding refactored. git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@762 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../gv/egiz/bku/online/webapp/ResultServlet.java | 144 +++++++++------------ 1 file changed, 64 insertions(+), 80 deletions(-) (limited to 'BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/ResultServlet.java') diff --git a/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/ResultServlet.java b/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/ResultServlet.java index 5fd01775..cdc5a3ef 100644 --- a/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/ResultServlet.java +++ b/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/ResultServlet.java @@ -17,63 +17,56 @@ package at.gv.egiz.bku.online.webapp; import java.io.IOException; -import java.util.Iterator; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Map; +import java.util.Map.Entry; -import javax.servlet.ServletConfig; import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.slf4j.MDC; import at.gv.egiz.bku.binding.BindingProcessor; +import at.gv.egiz.bku.binding.BindingProcessorManager; import at.gv.egiz.bku.binding.HTTPBindingProcessor; import at.gv.egiz.bku.binding.Id; -import at.gv.egiz.bku.binding.IdFactory; import at.gv.egiz.bku.utils.NullOutputStream; /** * Delivers the result to the browser * */ -public class ResultServlet extends SpringBKUServlet { +public class ResultServlet extends HttpServlet { private static final long serialVersionUID = 1L; private final Logger log = LoggerFactory.getLogger(ResultServlet.class); - private String encoding = "UTF-8"; - private String expiredPage = "./expiredError.jsp"; - - public ResultServlet() { - } - - private void myInit() { - String enc = getServletContext().getInitParameter("responseEncoding"); - if (enc != null) { - log.trace("Init default encoding to: {}.", enc); - encoding = enc; - } - String expP = getServletConfig().getInitParameter("expiredPage"); - if (expP != null) { - log.trace("Init expired page to: {}.", expP); - expiredPage = expP; - } - } + private String responseEncoding = "UTF-8"; + + private String expiredPageUrl = "expired.jsp"; @Override public void init() throws ServletException { - super.init(); - myInit(); - } - - @Override - public void init(ServletConfig config) throws ServletException { - super.init(config); - myInit(); + String encoding = getServletConfig().getInitParameter("responseEncoding"); + if (encoding != null) { + log.info("Init default responseEncoding to: {}.", encoding); + responseEncoding = encoding; + } + String url = getServletConfig().getInitParameter("expiredPageUrl"); + if (url != null) { + try { + expiredPageUrl = new URL(url).toString(); + log.info("Init expiredPageUrl to: {}.", expiredPageUrl); + } catch (MalformedURLException e) { + log.error("Failed to set expiredUrlPage {}.", url, e); + } + } } protected void doPost(HttpServletRequest req, HttpServletResponse resp) @@ -84,64 +77,55 @@ public class ResultServlet extends SpringBKUServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { - HttpSession session = req.getSession(false); - if (session == null) { - resp.sendRedirect(expiredPage); + BindingProcessorManager bindingProcessorManager = (BindingProcessorManager) getServletContext() + .getAttribute("bindingProcessorManager"); + if (bindingProcessorManager == null) { + String msg = "Configuration error: BindingProcessorManager missing!"; + log.error(msg); + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg); return; } - Id id = IdFactory.getInstance().createId(session.getId()); - - HTTPBindingProcessor bp; - BindingProcessor bindingProcessor = getBindingProcessorManager().getBindingProcessor(id); - if (bindingProcessor instanceof HTTPBindingProcessor) { - bp = (HTTPBindingProcessor) bindingProcessor; - } else { - session.invalidate(); - resp.sendRedirect(expiredPage); + Id id = (Id) req.getAttribute("id"); + BindingProcessor bindingProcessor = null; + if (id == null + || !((bindingProcessor = bindingProcessorManager + .getBindingProcessor(id)) instanceof HTTPBindingProcessor)) { + resp.sendRedirect(expiredPageUrl); return; } - MDC.put("id", id.toString()); + + HTTPBindingProcessor bp = (HTTPBindingProcessor) bindingProcessor; try { - String redirectUrl = (String) session - .getAttribute(AbstractWebRequestHandler.REDIRECT_URL_SESSION_ATTRIBUTE); - if (redirectUrl == null) { - redirectUrl = bp.getRedirectURL(); - } - if (redirectUrl != null) { - try { - bp.writeResultTo(new NullOutputStream(), encoding); - getBindingProcessorManager().removeBindingProcessor(bp.getId()); - } finally { - log.info("Sending deferred redirect, RedirectURL={}.", redirectUrl); - resp.sendRedirect(redirectUrl); - session.invalidate(); + OutputStream outputStream; + String redirectUrl = bp.getRedirectURL(); + if (redirectUrl != null && !redirectUrl.trim().isEmpty()) { + log.info("Sending (deferred) redirect to {}.", redirectUrl); + resp.sendRedirect(redirectUrl); + // TODO Couldn't we simply discard the output? + outputStream = new NullOutputStream(); + } else { + log.debug("Setting HTTP status code {}.", bp.getResponseCode()); + resp.setStatus(bp.getResponseCode()); + resp.setHeader("Cache-Control", "no-store"); // HTTP 1.1 + resp.setHeader("Pragma", "no-cache"); // HTTP 1.0 + resp.setDateHeader("Expires", 0); + Map responseHeaders = bp.getResponseHeaders(); + for (Entry header : responseHeaders.entrySet()) { + String key = header.getKey(); + String value = header.getValue(); + log.debug("Setting response header {}: {}.", key, value); + resp.setHeader(key, value); } - return; - } - - log.trace("Setting response code: {}.", bp.getResponseCode()); - resp.setStatus(bp.getResponseCode()); - resp.setHeader("Cache-Control", "no-store"); // HTTP 1.1 - resp.setHeader("Pragma", "no-cache"); // HTTP 1.0 - resp.setDateHeader("Expires", 0); - for (Iterator it = bp.getResponseHeaders().keySet().iterator(); it - .hasNext();) { - String header = it.next(); - log.trace("Setting response header {}: {}.", header, bp.getResponseHeaders().get(header)); - resp.setHeader(header, bp.getResponseHeaders().get(header)); + resp.setContentType(bp.getResultContentType()); + log.info("Sending result."); + outputStream = resp.getOutputStream(); } - resp.setContentType(bp.getResultContentType()); - resp.setCharacterEncoding(encoding); - log.info("Sending result."); - bp.writeResultTo(resp.getOutputStream(), encoding); - resp.getOutputStream().flush(); - session.invalidate(); - getBindingProcessorManager().removeBindingProcessor(bp.getId()); - + bp.writeResultTo(outputStream, responseEncoding); + outputStream.flush(); } finally { - MDC.remove("id"); + bindingProcessorManager.removeBindingProcessor(id); } } } -- cgit v1.2.3