From 1c33a3a5254c39d6d45c94d919c730641b7664a2 Mon Sep 17 00:00:00 2001
From: HongKee Moon <hkmoon@me.com>
Date: Fri, 22 Apr 2016 17:35:43 +0200
Subject: [PATCH] Add .bdv / .xml file handlers

---
 pom.xml                                       |  8 +-
 src/main/java/bdv/server/BigDataServer.java   |  8 +-
 src/main/java/bdv/server/CellHandler.java     | 64 ++++++++++++++-
 src/main/java/bdv/server/Constants.java       |  2 +
 .../bdv/server/DataSetContextHandler.java     | 78 +++++++++++++++++++
 .../java/bdv/server/IndexPageHandler.java     |  7 ++
 6 files changed, 163 insertions(+), 4 deletions(-)
 create mode 100644 src/main/java/bdv/server/DataSetContextHandler.java

diff --git a/pom.xml b/pom.xml
index 6bd7bd7..a46ee15 100644
--- a/pom.xml
+++ b/pom.xml
@@ -48,8 +48,12 @@
 			<groupId>org.eclipse.jetty</groupId>
 			<artifactId>jetty-security</artifactId>
 		</dependency>
-		<dependency>
-			<groupId>org.antlr</groupId>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+        </dependency>
+        <dependency>
+        <groupId>org.antlr</groupId>
 			<artifactId>stringtemplate</artifactId>
 			<version>3.2.1</version>
 		</dependency>
diff --git a/src/main/java/bdv/server/BigDataServer.java b/src/main/java/bdv/server/BigDataServer.java
index c76e5a6..786150b 100644
--- a/src/main/java/bdv/server/BigDataServer.java
+++ b/src/main/java/bdv/server/BigDataServer.java
@@ -135,7 +135,13 @@ public class BigDataServer
 		final HandlerCollection handlers = new HandlerCollection();
 
 		final ContextHandlerCollection datasetHandlers = createHandlers( baseURL, params.getDatasets(), thumbnailsDirectoryName );
+
+		final DataSetContextHandler dataSetContextHandler = new DataSetContextHandler( datasetHandlers );
+
 		handlers.addHandler( datasetHandlers );
+
+		handlers.addHandler( dataSetContextHandler );
+
 		handlers.addHandler( new JsonDatasetListHandler( server, datasetHandlers ) );
 
 		Handler handler = handlers;
@@ -705,7 +711,7 @@ public class BigDataServer
 		{
 			final String name = entry.getKey();
 			final DataSet ds = entry.getValue();
-			final String context = "/" + name;
+			final String context = "/" + Constants.DATASET_CONTEXT_NAME + "/" + name;
 			final CellHandler ctx = new CellHandler( baseURL + context + "/", ds, thumbnailsDirectoryName );
 			ctx.setContextPath( context );
 			handlers.addHandler( ctx );
diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java
index 922f503..e9024c6 100644
--- a/src/main/java/bdv/server/CellHandler.java
+++ b/src/main/java/bdv/server/CellHandler.java
@@ -18,10 +18,12 @@ import bdv.util.ThumbnailGenerator;
 
 import com.google.gson.GsonBuilder;
 
+import com.google.gson.stream.JsonWriter;
 import mpicbg.spim.data.SpimDataException;
 import net.imglib2.img.basictypeaccess.volatiles.array.VolatileShortArray;
 import net.imglib2.realtransform.AffineTransform3D;
 
+import org.eclipse.jetty.server.Handler;
 import org.eclipse.jetty.server.Request;
 import org.eclipse.jetty.server.handler.ContextHandler;
 import org.eclipse.jetty.util.log.Log;
@@ -84,6 +86,8 @@ public class CellHandler extends ContextHandler
 
 	private Hdf5ImageLoader imgLoader;
 
+	private String baseUrl;
+
 	/**
 	 * DataSet information holder
 	 */
@@ -92,7 +96,7 @@ public class CellHandler extends ContextHandler
 	public CellHandler( final String baseUrl, final DataSet dataSet, final String thumbnailsDirectory ) throws SpimDataException, IOException
 	{
 		active = true;
-
+		this.baseUrl = baseUrl;
 		this.dataSet = dataSet;
 
 		final XmlIoSpimDataMinimal io = new XmlIoSpimDataMinimal();
@@ -139,6 +143,12 @@ public class CellHandler extends ContextHandler
 			return;
 		}
 
+		if ( target.startsWith( "/json" ) )
+		{
+			provideJson( baseRequest, response );
+			return;
+		}
+
 		if ( target.equals( "/png" ) )
 		{
 			provideThumbnail( baseRequest, response );
@@ -374,4 +384,56 @@ public class CellHandler extends ContextHandler
 	{
 		return dataSet;
 	}
+
+	private void provideJson( final Request baseRequest, final HttpServletResponse response ) throws IOException
+	{
+		response.setContentType( "application/json" );
+		response.setStatus( HttpServletResponse.SC_OK );
+		baseRequest.setHandled( true );
+
+		final PrintWriter ow = response.getWriter();
+
+		final JsonWriter writer = new JsonWriter( ow );
+
+		writer.setIndent( "\t" );
+
+		writer.beginObject();
+
+		writer.name( getDataSet().getName() ).beginObject();
+
+		writer.name( "id" ).value( getDataSet().getName() );
+
+		writer.name( "category" ).value( getDataSet().getCategory() );
+
+		writer.name( "description" ).value( getDataSet().getDescription() );
+
+		writer.name( "index" ).value( getDataSet().getIndex() );
+
+		writer.name( "thumbnailUrl" ).value( getDataSet().getThumbnailUrl() );
+
+		writer.name( "datasetUrl" ).value( getDataSet().getDatasetUrl() );
+
+		writer.endObject();
+
+		writer.endObject();
+
+		writer.flush();
+
+		writer.close();
+
+		ow.close();
+	}
+
+	public void handleXml( final Request baseRequest, final HttpServletResponse response ) throws IOException
+	{
+		respondWithString( baseRequest, response, "application/xml", datasetXmlString );
+	}
+
+	public void handleBdv( final Request baseRequest, final HttpServletResponse response ) throws IOException
+	{
+		String url = baseUrl;
+		if ( url.endsWith( "/" ) )
+			url = url.substring( 0, url.lastIndexOf( "/" ) );
+		respondWithString( baseRequest, response, "application/bdv", url );
+	}
 }
diff --git a/src/main/java/bdv/server/Constants.java b/src/main/java/bdv/server/Constants.java
index 45d56dc..a0b4297 100644
--- a/src/main/java/bdv/server/Constants.java
+++ b/src/main/java/bdv/server/Constants.java
@@ -6,6 +6,8 @@ public class Constants
 
 	public static final String MANAGER_CONTEXT_NAME = "manager";
 
+	public static final String DATASET_CONTEXT_NAME = "dataset";
+
 	public static final String[] RESERVED_CONTEXT_NAMES = new String[]
 			{
 					DATASETLIST_CONTEXT_NAME,
diff --git a/src/main/java/bdv/server/DataSetContextHandler.java b/src/main/java/bdv/server/DataSetContextHandler.java
new file mode 100644
index 0000000..21c1649
--- /dev/null
+++ b/src/main/java/bdv/server/DataSetContextHandler.java
@@ -0,0 +1,78 @@
+package bdv.server;
+
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.log.Log;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+
+/**
+ * DataSet Handler handles /dataset context
+ */
+public class DataSetContextHandler extends ServletContextHandler
+{
+	private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger( DataSetContextHandler.class );
+
+	private final ContextHandlerCollection datasetHandlers;
+	private final ServletHandler servletHandler;
+
+	public DataSetContextHandler( final ContextHandlerCollection datasetHandlers )
+	{
+		this.datasetHandlers = datasetHandlers;
+		setContextPath( "/" + Constants.DATASET_CONTEXT_NAME );
+
+		servletHandler = new ServletHandler();
+		Servlet servlet = new DefaultServlet();
+		ServletHolder servletHolder = new ServletHolder( servlet );
+		servletHandler.addServletWithMapping( servletHolder, "/*.xml" );
+		servletHandler.addServletWithMapping( servletHolder, "/*.bdv" );
+
+		setHandler( _servletHandler );
+	}
+
+	@Override
+	public void doHandle( final String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response ) throws IOException, ServletException
+	{
+		String datasetName = target;
+
+		if ( datasetName.lastIndexOf( ".xml" ) != -1 )
+		{
+			datasetName = datasetName.substring( 0, datasetName.lastIndexOf( ".xml" ) );
+			findCellHandler( datasetName ).handleXml( baseRequest, response );
+		}
+		else if ( datasetName.lastIndexOf( ".bdv" ) != -1 )
+		{
+			datasetName = datasetName.substring( 0, datasetName.lastIndexOf( ".bdv" ) );
+			findCellHandler( datasetName ).handleBdv( baseRequest, response );
+		}
+		else
+			super.doHandle( Constants.DATASET_CONTEXT_NAME + "/" + target, baseRequest, request, response );
+	}
+
+	private CellHandler findCellHandler( final String datasetName )
+	{
+		CellHandler found = null;
+		for ( final Handler handler : datasetHandlers.getChildHandlersByClass( CellHandler.class ) )
+		{
+			final CellHandler contextHandler = ( CellHandler ) handler;
+			System.out.println( contextHandler );
+			if ( contextHandler.getContextPath().equals( getContextPath() + datasetName ) )
+			{
+				found = contextHandler;
+				break;
+			}
+		}
+
+		return found;
+	}
+}
diff --git a/src/main/java/bdv/server/IndexPageHandler.java b/src/main/java/bdv/server/IndexPageHandler.java
index 422e559..41330a5 100644
--- a/src/main/java/bdv/server/IndexPageHandler.java
+++ b/src/main/java/bdv/server/IndexPageHandler.java
@@ -118,6 +118,13 @@ public class IndexPageHandler extends ContextHandler
 			sb.append( "\t\tCategory: " + ds.getCategory() + "<br/>\n" );
 			sb.append( "\t\tName: " + ds.getName() + "<br/>\n" );
 			sb.append( "\t\tDescription: " + ds.getDescription() + "<br/>\n" );
+
+			String url = ds.getDatasetUrl();
+			if ( url.endsWith( "/" ) )
+				url = url.substring( 0, url.lastIndexOf( "/" ) );
+
+			sb.append( "\t\t<a href=" + url + ".xml>XML</a>&nbsp;" );
+			sb.append( "\t\t<a href=" + url + ".bdv>BDV</a><br/>\n" );
 			sb.append( "\t</td>\n" );
 			sb.append( "</tr>\n" );
 		}
-- 
GitLab