JAL-1725 first version of Jetty server / chimera selection listener
[jalview.git] / src / jalview / httpserver / AbstractRequestHandler.java
diff --git a/src/jalview/httpserver/AbstractRequestHandler.java b/src/jalview/httpserver/AbstractRequestHandler.java
new file mode 100644 (file)
index 0000000..f48ba49
--- /dev/null
@@ -0,0 +1,90 @@
+package jalview.httpserver;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.AbstractHandler;
+
+/**
+ * 
+ * @author gmcarstairs
+ *
+ */
+public abstract class AbstractRequestHandler extends AbstractHandler
+{
+  /**
+   * Handle an incoming Http request.
+   */
+  @Override
+  public void handle(String target, Request baseRequest,
+          HttpServletRequest request, HttpServletResponse response)
+          throws IOException, ServletException
+  {
+    try
+    {
+      // dumpRequest(request); // debug
+      processRequest(request, response);
+    } catch (Throwable t)
+    {
+      /*
+       * Set server error status on response
+       */
+      System.err.println("Exception handling request "
+              + request.getRequestURI() + " : " + t.getMessage());
+      if (response.isCommitted())
+      {
+        /*
+         * Can't write an HTTP header once any response content has been written
+         */
+        System.err
+                .println("Unable to return HTTP 500 as response already committed");
+      }
+      else
+      {
+        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+      }
+    } finally
+    {
+      response.getWriter().flush();
+      baseRequest.setHandled(true);
+    }
+  }
+
+  /**
+   * Subclasses should override this method to perform request processing
+   * 
+   * @param request
+   * @param response
+   */
+  protected abstract void processRequest(HttpServletRequest request,
+          HttpServletResponse response);
+
+  /**
+   * For debug - writes HTTP request details to stdout
+   * 
+   * @param request
+   */
+  protected void dumpRequest(HttpServletRequest request)
+  {
+    System.out.println(request.getMethod());
+    for (String hdr : Collections.list(request.getHeaderNames()))
+    {
+      for (String val : Collections.list(request.getHeaders(hdr)))
+      {
+        System.out.println(hdr + ": " + val);
+      }
+    }
+    for (String param : Collections.list(request.getParameterNames()))
+    {
+      for (String val : request.getParameterValues(param))
+      {
+        System.out.println(param + "=" + val);
+      }
+    }
+  }
+}