Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / httpserver / AbstractRequestHandler.java
index 45064e7..a6e96cb 100644 (file)
@@ -1,6 +1,27 @@
+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * 
+ * This file is part of Jalview.
+ * 
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License 
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *  
+ * Jalview is distributed in the hope that it will be useful, but 
+ * WITHOUT ANY WARRANTY; without even the implied warranty 
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
+ * PURPOSE.  See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
 package jalview.httpserver;
 
 import java.io.IOException;
+import java.net.BindException;
 import java.util.Collections;
 
 import javax.servlet.ServletException;
@@ -17,6 +38,18 @@ import org.eclipse.jetty.server.handler.AbstractHandler;
  */
 public abstract class AbstractRequestHandler extends AbstractHandler
 {
+
+  /*
+   * The relative path (below context root) of this handler (without /
+   * separators)
+   */
+  private String path;
+
+  /*
+   * The full URI on which this handler listens
+   */
+  private String uri;
+
   /**
    * Handle an incoming Http request.
    */
@@ -34,15 +67,15 @@ public abstract class AbstractRequestHandler extends AbstractHandler
       /*
        * Set server error status on response
        */
-      System.err.println("Exception handling request "
+      jalview.bin.Console.errPrintln("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");
+        jalview.bin.Console.errPrintln(
+                "Unable to return HTTP 500 as response already committed");
       }
       else
       {
@@ -60,9 +93,10 @@ public abstract class AbstractRequestHandler extends AbstractHandler
    * 
    * @param request
    * @param response
+   * @throws IOException
    */
   protected abstract void processRequest(HttpServletRequest request,
-          HttpServletResponse response);
+          HttpServletResponse response) throws IOException;
 
   /**
    * For debug - writes HTTP request details to stdout
@@ -71,21 +105,101 @@ public abstract class AbstractRequestHandler extends AbstractHandler
    */
   protected void dumpRequest(HttpServletRequest request)
   {
-    System.out.println(request.getMethod());
-    System.out.println(request.getRequestURL());
+    jalview.bin.Console.outPrintln(request.getMethod());
+    jalview.bin.Console.outPrintln(request.getRequestURL());
     for (String hdr : Collections.list(request.getHeaderNames()))
     {
       for (String val : Collections.list(request.getHeaders(hdr)))
       {
-        System.out.println(hdr + ": " + val);
+        jalview.bin.Console.outPrintln(hdr + ": " + val);
       }
     }
     for (String param : Collections.list(request.getParameterNames()))
     {
       for (String val : request.getParameterValues(param))
       {
-        System.out.println(param + "=" + val);
+        jalview.bin.Console.outPrintln(param + "=" + val);
       }
     }
   }
+
+  /**
+   * Returns a display name for the handler
+   * 
+   * @return
+   */
+  public abstract String getName();
+
+  /**
+   * Deregister this listener and close it down
+   * 
+   * @throws Exception
+   */
+  public void shutdown()
+  {
+    try
+    {
+      HttpServer.getInstance().removeHandler(this);
+      stop();
+    } catch (Exception e)
+    {
+      jalview.bin.Console.errPrintln(
+              "Error stopping " + getName() + ": " + e.getMessage());
+    }
+  }
+
+  /**
+   * Returns the URI on which we are listening
+   * 
+   * @return
+   */
+  public String getUri()
+  {
+    return this.uri;
+  }
+
+  /**
+   * Set the URI to this handler
+   * 
+   * @param u
+   */
+  protected void setUri(String u)
+  {
+    this.uri = u;
+  }
+
+  /**
+   * Sets the relative path to this handler - do this before registering the
+   * handler.
+   * 
+   * @param p
+   */
+  protected void setPath(String p)
+  {
+    this.path = p;
+  }
+
+  /**
+   * Returns the relative path to this handler below the context root (without /
+   * separators)
+   * 
+   * @return
+   */
+  public String getPath()
+  {
+    return this.path;
+  }
+
+  /**
+   * Registers the handler with the HttpServer and reports its URI on stdout
+   * 
+   * @throws BindException
+   *           if no port could be allocated
+   * @throws IllegalStateException
+   *           if this method is called before {@link #setPath}
+   */
+  protected void registerHandler() throws BindException
+  {
+    HttpServer.getInstance().registerHandler(this);
+  }
 }