JAL-1725 first version of Jetty server / chimera selection listener
[jalview.git] / src / jalview / httpserver / AbstractRequestHandler.java
1 package jalview.httpserver;
2
3 import java.io.IOException;
4 import java.util.Collections;
5
6 import javax.servlet.ServletException;
7 import javax.servlet.http.HttpServletRequest;
8 import javax.servlet.http.HttpServletResponse;
9
10 import org.eclipse.jetty.server.Request;
11 import org.eclipse.jetty.server.handler.AbstractHandler;
12
13 /**
14  * 
15  * @author gmcarstairs
16  *
17  */
18 public abstract class AbstractRequestHandler extends AbstractHandler
19 {
20   /**
21    * Handle an incoming Http request.
22    */
23   @Override
24   public void handle(String target, Request baseRequest,
25           HttpServletRequest request, HttpServletResponse response)
26           throws IOException, ServletException
27   {
28     try
29     {
30       // dumpRequest(request); // debug
31       processRequest(request, response);
32     } catch (Throwable t)
33     {
34       /*
35        * Set server error status on response
36        */
37       System.err.println("Exception handling request "
38               + request.getRequestURI() + " : " + t.getMessage());
39       if (response.isCommitted())
40       {
41         /*
42          * Can't write an HTTP header once any response content has been written
43          */
44         System.err
45                 .println("Unable to return HTTP 500 as response already committed");
46       }
47       else
48       {
49         response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
50       }
51     } finally
52     {
53       response.getWriter().flush();
54       baseRequest.setHandled(true);
55     }
56   }
57
58   /**
59    * Subclasses should override this method to perform request processing
60    * 
61    * @param request
62    * @param response
63    */
64   protected abstract void processRequest(HttpServletRequest request,
65           HttpServletResponse response);
66
67   /**
68    * For debug - writes HTTP request details to stdout
69    * 
70    * @param request
71    */
72   protected void dumpRequest(HttpServletRequest request)
73   {
74     System.out.println(request.getMethod());
75     for (String hdr : Collections.list(request.getHeaderNames()))
76     {
77       for (String val : Collections.list(request.getHeaders(hdr)))
78       {
79         System.out.println(hdr + ": " + val);
80       }
81     }
82     for (String param : Collections.list(request.getParameterNames()))
83     {
84       for (String val : request.getParameterValues(param))
85       {
86         System.out.println(param + "=" + val);
87       }
88     }
89   }
90 }