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 --- .../egiz/bku/online/webapp/WebRequestHandler.java | 137 +++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/WebRequestHandler.java (limited to 'BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/WebRequestHandler.java') diff --git a/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/WebRequestHandler.java b/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/WebRequestHandler.java new file mode 100644 index 00000000..08b50699 --- /dev/null +++ b/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/WebRequestHandler.java @@ -0,0 +1,137 @@ +/* +* Copyright 2009 Federal Chancellery Austria and +* Graz University of Technology +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package at.gv.egiz.bku.online.webapp; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.LinkedHashMap; +import java.util.Locale; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.gv.egiz.bku.binding.BindingProcessorManager; +import at.gv.egiz.bku.binding.HTTPBindingProcessor; +import at.gv.egiz.bku.binding.HttpUtil; +import at.gv.egiz.bku.binding.Id; +import at.gv.egiz.bku.binding.InputDecoderFactory; +import at.gv.egiz.org.apache.tomcat.util.http.AcceptLanguage; + +public class WebRequestHandler extends HttpServlet { + + private static final long serialVersionUID = 1L; + + private final Logger log = LoggerFactory.getLogger(WebRequestHandler.class); + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, + java.io.IOException { + + 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 = (Id) req.getAttribute("id"); + if (id == null) { + String msg = "No request id! Configuration error: ServletFilter missing?"; + log.error(msg); + resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, msg); + return; + } + + // if binding processor with same id is present: remove + bindingProcessorManager.removeBindingProcessor(id); + + Locale locale = AcceptLanguage.getLocale(req.getHeader("Accept-Language")); + if (log.isInfoEnabled()) { + log.info("Recieved request (Accept-Language locale: {}).", locale); + } + + // create new binding processor + String protocol = getServletConfig().getInitParameter("protocol"); + if (protocol == null || protocol.isEmpty()) { + protocol = req.getScheme(); + } + HTTPBindingProcessor bindingProcessor = (HTTPBindingProcessor) bindingProcessorManager + .createBindingProcessor(protocol, locale); + + // set headers + LinkedHashMap headerMap = new LinkedHashMap(); + if (req.getHeaderNames() != null) { + for (Enumeration headerName = req.getHeaderNames(); headerName + .hasMoreElements();) { + String name = (String) headerName.nextElement(); + // Account for multiple headers with the same field-name, but + // they are very rare, so we are not using a StringBuffer. + Enumeration headers = req.getHeaders(name); + String value = null; + while (headers.hasMoreElements()) { + value = (value == null) + ? (String) headers.nextElement() + : value + ", " + headers.nextElement(); + } + headerMap.put(name, value); + } + } + bindingProcessor.setHTTPHeaders(headerMap); + + // set request stream + InputStream inputStream; + if (req.getMethod().equals("POST")) { + inputStream = req.getInputStream(); + } else { + headerMap.put(HttpUtil.HTTP_HEADER_CONTENT_TYPE, InputDecoderFactory.URL_ENCODED); + String queryString = req.getQueryString(); + if (queryString != null) { + inputStream = new ByteArrayInputStream(queryString.getBytes("UTF-8")); + } else { + inputStream = new ByteArrayInputStream(new byte[] {}); + } + } + bindingProcessor.consumeRequestStream(req.getRequestURL().toString(), inputStream); + inputStream.close(); + + // process + bindingProcessorManager.process(id, bindingProcessor); + + log.debug("Sending redirect to user interface."); + // TODO: appending the jsessionid here breaks the separation of request + // handling and request state tracking done in the servlet filter, but + // the servlet filter does not allow us to modify the redirect + resp.sendRedirect("ui;jsessionid=" + id.toString()); + + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, java.io.IOException { + doPost(req, resp); + } + +} -- cgit v1.2.3