From 26df9dfaad0c7425357953da08e2a3661c1e0346 Mon Sep 17 00:00:00 2001
From: HongKee Moon <hkmoon@me.com>
Date: Wed, 7 Jan 2015 14:51:34 +0100
Subject: [PATCH] Add context based handler for handling multiple datasets

Dataset can be created/removed during runtime.
---
 src/main/java/bdv/server/BigDataServer.java  | 28 ++++++++++--
 src/main/java/bdv/server/CellHandler.java    | 14 +++---
 src/main/java/bdv/server/DataSetHandler.java | 46 --------------------
 3 files changed, 33 insertions(+), 55 deletions(-)
 delete mode 100644 src/main/java/bdv/server/DataSetHandler.java

diff --git a/src/main/java/bdv/server/BigDataServer.java b/src/main/java/bdv/server/BigDataServer.java
index d9faf64..a2329df 100644
--- a/src/main/java/bdv/server/BigDataServer.java
+++ b/src/main/java/bdv/server/BigDataServer.java
@@ -1,12 +1,16 @@
 package bdv.server;
 
+import mpicbg.spim.data.SpimDataException;
 import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.util.log.Log;
 
 import java.util.HashMap;
 
 public class BigDataServer
 {
 	static HashMap< String, String > dataSet = new HashMap<>();
+	private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger( BigDataServer.class );
 
 	public static void main( final String[] args ) throws Exception
 	{
@@ -18,12 +22,30 @@ public class BigDataServer
 		System.setProperty( "org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog" );
 		final Server server = new Server( port );
 
-		String baseURL = "http://" + server.getURI().getHost() + ":" + port + "/";
+		String baseURL = "http://" + server.getURI().getHost() + ":" + port;
 
-//		System.out.println(baseURL);
+		HandlerCollection handlers = createHandlers( baseURL, dataSet );
+		handlers.addHandler( new ManagerHandler( baseURL, server, handlers ) );
 
-		server.setHandler( new DataSetHandler( baseURL, dataSet ) );
+		LOG.info( "Set handler: " + handlers );
+		server.setHandler( handlers );
+		LOG.info( "BigDataServer starting" );
 		server.start();
 		server.join();
 	}
+
+	static private HandlerCollection createHandlers( String baseURL, HashMap< String, String > dataSet ) throws SpimDataException
+	{
+		HandlerCollection handlers = new HandlerCollection( true );
+
+		for ( String key : dataSet.keySet() )
+		{
+			String context = "/" + key;
+			CellHandler ctx = new CellHandler( baseURL + context + "/", dataSet.get( key ) );
+			ctx.setContextPath( context );
+			handlers.addHandler( ctx );
+		}
+
+		return handlers;
+	}
 }
diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java
index db215cc..42fefe1 100644
--- a/src/main/java/bdv/server/CellHandler.java
+++ b/src/main/java/bdv/server/CellHandler.java
@@ -15,7 +15,7 @@ import mpicbg.spim.data.SpimDataException;
 import net.imglib2.img.basictypeaccess.volatiles.array.VolatileShortArray;
 import net.imglib2.realtransform.AffineTransform3D;
 import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
+import org.eclipse.jetty.server.handler.ContextHandler;
 import org.jdom2.Document;
 import org.jdom2.Element;
 import org.jdom2.input.SAXBuilder;
@@ -28,7 +28,7 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.io.PrintWriter;
 
-public class CellHandler extends AbstractHandler
+public class CellHandler extends ContextHandler
 {
 	private final VolatileGlobalCellCache< VolatileShortArray > cache;
 
@@ -62,11 +62,16 @@ public class CellHandler extends AbstractHandler
 	}
 
 	@Override
-	public void handle( final String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response ) throws IOException, ServletException
+	public void doHandle( final String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response ) throws IOException, ServletException
 	{
 		final String cellString = request.getParameter( "p" );
+
 		if ( cellString == null )
+		{
+			provideXML( baseRequest, response );
 			return;
+		}
+
 		final String[] parts = cellString.split( "/" );
 		if ( parts[ 0 ].equals( "cell" ) )
 		{
@@ -140,9 +145,6 @@ public class CellHandler extends AbstractHandler
 		baseUrl.setText( dataSetURL );
 		ImageLoader.setContent( baseUrl );
 
-//		System.out.println(ImageLoader.getAttribute( "format" ));
-//		System.out.println(ImageLoader.getValue());
-
 		response.setContentType( "application/xml" );
 		response.setStatus( HttpServletResponse.SC_OK );
 		baseRequest.setHandled( true );
diff --git a/src/main/java/bdv/server/DataSetHandler.java b/src/main/java/bdv/server/DataSetHandler.java
deleted file mode 100644
index 8e66076..0000000
--- a/src/main/java/bdv/server/DataSetHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package bdv.server;
-
-import mpicbg.spim.data.SpimDataException;
-import org.eclipse.jetty.server.Request;
-import org.eclipse.jetty.server.handler.AbstractHandler;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.util.HashMap;
-
-public class DataSetHandler extends AbstractHandler
-{
-	final private HashMap< String, CellHandler > cellHandlers;
-
-	public DataSetHandler( String baseURL, HashMap< String, String > ds ) throws SpimDataException, MalformedURLException
-	{
-		cellHandlers = new HashMap<>();
-
-		for ( String dataSet : ds.keySet() )
-		{
-			cellHandlers.put( dataSet, new CellHandler( baseURL + dataSet + "/", ds.get( dataSet ) ) );
-		}
-	}
-
-	@Override
-	public void handle( final String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response ) throws IOException, ServletException
-	{
-		String dsName = target.replace( "/", "" );
-
-		if ( cellHandlers.containsKey( dsName ) )
-		{
-			if ( request.getParameter( "p" ) != null )
-				cellHandlers.get( dsName ).handle( target, baseRequest, request, response );
-			else
-				// Provide XML file
-				cellHandlers.get( dsName ).provideXML( baseRequest, response );
-		}
-		else
-		{
-			return;
-		}
-	}
-}
-- 
GitLab