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);
70 * Set server error status on response
72 Console.error("Exception handling request " + request.getRequestURI(),
74 if (response.isCommitted())
77 * Can't write an HTTP header once any response content has been written
80 "Unable to return HTTP 500 as response already committed");
84 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
88 response.getWriter().flush();
89 baseRequest.setHandled(true);
94 * Subclasses should override this method to perform request processing
100 protected abstract void processRequest(HttpServletRequest request,
101 HttpServletResponse response) throws IOException;
104 * For debug - writes HTTP request details to stdout
108 protected void dumpRequest(HttpServletRequest request)
110 System.out.println(request.getMethod());
111 System.out.println(request.getRequestURL());
112 for (String hdr : Collections.list(request.getHeaderNames()))
114 for (String val : Collections.list(request.getHeaders(hdr)))
116 System.out.println(hdr + ": " + val);
119 for (String param : Collections.list(request.getParameterNames()))
121 for (String val : request.getParameterValues(param))
123 System.out.println(param + "=" + val);
129 * Returns a display name for the handler
133 public abstract String getName();
136 * Deregister this listener and close it down
140 public void shutdown()
144 HttpServer.getInstance().removeHandler(this);
146 } catch (Exception e)
149 "Error stopping " + getName() + ": " + e.getMessage());
154 * Returns the URI on which we are listening
158 public String getUri()
164 * Set the URI to this handler
168 protected void setUri(String u)
174 * Sets the relative path to this handler - do this before registering the
179 protected void setPath(String p)
185 * Returns the relative path to this handler below the context root (without /
190 public String getPath()
196 * Registers the handler with the HttpServer and reports its URI on stdout
198 * @throws BindException
199 * if no port could be allocated
200 * @throws IllegalStateException
201 * if this method is called before {@link #setPath}
203 protected void registerHandler() throws BindException
205 HttpServer.getInstance().registerHandler(this);