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;
34 import jalview.bin.Console;
41 public abstract class AbstractRequestHandler extends AbstractHandler
45 * The relative path (below context root) of this handler (without /
51 * The full URI on which this handler listens
56 * Handle an incoming Http request.
59 public void handle(String target, Request baseRequest,
60 HttpServletRequest request, HttpServletResponse response)
61 throws IOException, ServletException
65 // dumpRequest(request); // debug
66 processRequest(request, response);
69 Console.debug("Exception.", e);
73 * Set server error status on response
75 Console.error("Exception handling request " + request.getRequestURI(),
77 if (response.isCommitted())
80 * Can't write an HTTP header once any response content has been written
83 "Unable to return HTTP 500 as response already committed");
87 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
91 response.getWriter().flush();
92 baseRequest.setHandled(true);
97 * Subclasses should override this method to perform request processing
101 * @throws IOException
103 protected abstract void processRequest(HttpServletRequest request,
104 HttpServletResponse response) throws IOException;
107 * For debug - writes HTTP request details to stdout
111 protected void dumpRequest(HttpServletRequest request)
113 System.out.println(request.getMethod());
114 System.out.println(request.getRequestURL());
115 for (String hdr : Collections.list(request.getHeaderNames()))
117 for (String val : Collections.list(request.getHeaders(hdr)))
119 System.out.println(hdr + ": " + val);
122 for (String param : Collections.list(request.getParameterNames()))
124 for (String val : request.getParameterValues(param))
126 System.out.println(param + "=" + val);
132 * Returns a display name for the handler
136 public abstract String getName();
139 * Deregister this listener and close it down
143 public void shutdown()
147 HttpServer.getInstance().removeHandler(this);
149 } catch (Exception e)
152 "Error stopping " + getName() + ": " + e.getMessage());
157 * Returns the URI on which we are listening
161 public String getUri()
167 * Set the URI to this handler
171 protected void setUri(String u)
177 * Sets the relative path to this handler - do this before registering the
182 protected void setPath(String p)
188 * Returns the relative path to this handler below the context root (without /
193 public String getPath()
199 * Registers the handler with the HttpServer and reports its URI on stdout
201 * @throws BindException
202 * if no port could be allocated
203 * @throws IllegalStateException
204 * if this method is called before {@link #setPath}
206 protected void registerHandler() throws BindException
208 HttpServer.getInstance().registerHandler(this);