2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
7 * Jalview is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, either version 3
10 * of the License, or (at your option) any later version.
12 * Jalview is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty
14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
19 * The Jalview Authors are detailed in the 'AUTHORS' file.
21 package jalview.httpserver;
23 import java.io.IOException;
24 import java.net.BindException;
25 import java.util.Collections;
27 import javax.servlet.ServletException;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
31 import org.eclipse.jetty.server.Request;
32 import org.eclipse.jetty.server.handler.AbstractHandler;
39 public abstract class AbstractRequestHandler extends AbstractHandler
43 * The relative path (below context root) of this handler (without /
49 * The full URI on which this handler listens
54 * Handle an incoming Http request.
57 public void handle(String target, Request baseRequest,
58 HttpServletRequest request, HttpServletResponse response)
59 throws IOException, ServletException
63 // dumpRequest(request); // debug
64 processRequest(request, response);
68 * Set server error status on response
70 System.err.println("Exception handling request "
71 + request.getRequestURI() + " : " + t.getMessage());
72 if (response.isCommitted())
75 * Can't write an HTTP header once any response content has been written
78 "Unable to return HTTP 500 as response already committed");
82 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
86 response.getWriter().flush();
87 baseRequest.setHandled(true);
92 * Subclasses should override this method to perform request processing
98 protected abstract void processRequest(HttpServletRequest request,
99 HttpServletResponse response) throws IOException;
102 * For debug - writes HTTP request details to stdout
106 protected void dumpRequest(HttpServletRequest request)
108 System.out.println(request.getMethod());
109 System.out.println(request.getRequestURL());
110 for (String hdr : Collections.list(request.getHeaderNames()))
112 for (String val : Collections.list(request.getHeaders(hdr)))
114 System.out.println(hdr + ": " + val);
117 for (String param : Collections.list(request.getParameterNames()))
119 for (String val : request.getParameterValues(param))
121 System.out.println(param + "=" + val);
127 * Returns a display name for the handler
131 public abstract String getName();
134 * Deregister this listener and close it down
138 public void shutdown()
142 HttpServer.getInstance().removeHandler(this);
144 } catch (Exception e)
147 "Error stopping " + getName() + ": " + e.getMessage());
152 * Returns the URI on which we are listening
156 public String getUri()
162 * Set the URI to this handler
166 protected void setUri(String u)
172 * Sets the relative path to this handler - do this before registering the
177 protected void setPath(String p)
183 * Returns the relative path to this handler below the context root (without /
188 public String getPath()
194 * Registers the handler with the HttpServer and reports its URI on stdout
196 * @throws BindException
197 * if no port could be allocated
198 * @throws IllegalStateException
199 * if this method is called before {@link #setPath}
201 protected void registerHandler() throws BindException
203 HttpServer.getInstance().registerHandler(this);