summaryrefslogtreecommitdiff
path: root/BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/WebRequestHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/WebRequestHandler.java')
-rw-r--r--BKUOnline/src/main/java/at/gv/egiz/bku/online/webapp/WebRequestHandler.java137
1 files changed, 137 insertions, 0 deletions
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<String, String> headerMap = new LinkedHashMap<String, String>();
+ 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);
+ }
+
+}