From 77ae51328034dfcd7457aa8fa3e4ae492b337efb Mon Sep 17 00:00:00 2001
From: HongKee Moon <hkmoon@me.com>
Date: Tue, 20 Jan 2015 13:38:39 +0100
Subject: [PATCH] Add json format of dataset lists for BigDataBrowserPlugin

---
 src/main/java/bdv/server/BigDataServer.java |  1 +
 src/main/java/bdv/server/CellHandler.java   | 17 ++++
 src/main/java/bdv/server/JsonHandler.java   | 99 +++++++++++++++++++++
 3 files changed, 117 insertions(+)
 create mode 100644 src/main/java/bdv/server/JsonHandler.java

diff --git a/src/main/java/bdv/server/BigDataServer.java b/src/main/java/bdv/server/BigDataServer.java
index 071b8d0..67d05bd 100644
--- a/src/main/java/bdv/server/BigDataServer.java
+++ b/src/main/java/bdv/server/BigDataServer.java
@@ -65,6 +65,7 @@ public class BigDataServer
 		handlers.addHandler( datasetHandlers );
 		handlers.addHandler( new ManagerHandler( baseURL, server, connectorStats, statHandler, datasetHandlers ) );
 		handlers.addHandler( new RequestLogHandler() );
+		handlers.addHandler( new JsonHandler( server, datasetHandlers ) );
 
 		statHandler.setHandler( handlers );
 
diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java
index ee85085..ec16af1 100644
--- a/src/main/java/bdv/server/CellHandler.java
+++ b/src/main/java/bdv/server/CellHandler.java
@@ -20,6 +20,7 @@ import org.eclipse.jetty.server.handler.ContextHandler;
 import org.jdom2.Document;
 import org.jdom2.output.Format;
 import org.jdom2.output.XMLOutputter;
+import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -151,6 +152,7 @@ public class CellHandler extends ContextHandler
 		}
 
 		response.setContentType( "application/xml" );
+		response.setCharacterEncoding( "UTF-8" );
 		response.setStatus( HttpServletResponse.SC_OK );
 		baseRequest.setHandled( true );
 
@@ -163,4 +165,19 @@ public class CellHandler extends ContextHandler
 	{
 		return xmlFile;
 	}
+
+	public String getDataSetURL()
+	{
+		return dataSetURL;
+	}
+
+	public String getThumbnailUrl()
+	{
+		throw new NotImplementedException();
+	}
+
+	public String getDescription()
+	{
+		throw new NotImplementedException();
+	}
 }
diff --git a/src/main/java/bdv/server/JsonHandler.java b/src/main/java/bdv/server/JsonHandler.java
new file mode 100644
index 0000000..d1758ca
--- /dev/null
+++ b/src/main/java/bdv/server/JsonHandler.java
@@ -0,0 +1,99 @@
+package bdv.server;
+
+import com.google.gson.stream.JsonWriter;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.Request;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.ContextHandler;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.util.log.Log;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.net.URISyntaxException;
+
+/**
+ * Created by moon on 1/19/15.
+ */
+public class JsonHandler extends ContextHandler
+{
+	private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger( JsonHandler.class );
+
+	private final Server server;
+
+	private final ContextHandlerCollection handlers;
+
+	public JsonHandler( final Server server, ContextHandlerCollection handlers ) throws IOException, URISyntaxException
+	{
+		this.server = server;
+		this.handlers = handlers;
+		setContextPath( "/json" );
+	}
+
+	@Override
+	public void doHandle( final String target, final Request baseRequest, final HttpServletRequest request, final HttpServletResponse response ) throws IOException, ServletException
+	{
+		list( baseRequest, response );
+	}
+
+	private void list( 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();
+		getJsonDatasetList( ow );
+		ow.close();
+	}
+
+	private void getJsonDatasetList( PrintWriter out ) throws IOException
+	{
+		JsonWriter writer = new JsonWriter( out );
+
+		writer.setIndent( "\t" );
+
+		writer.beginObject();
+
+		getContexts( writer );
+
+		writer.endObject(); // }
+
+		writer.flush();
+
+		writer.close();
+	}
+
+	private String getContexts( JsonWriter writer ) throws IOException
+	{
+		StringBuilder sb = new StringBuilder();
+		for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
+		{
+			CellHandler contextHandler = null;
+			if ( handler instanceof CellHandler )
+			{
+				contextHandler = ( CellHandler ) handler;
+
+				final String datasetName = contextHandler.getContextPath().replaceFirst( "/", "" );
+
+				writer.name( datasetName ).beginObject();
+
+				writer.name( "id" ).value( datasetName );
+
+				//writer.name( "desc" ).value( contextHandler.getDescription() );
+				writer.name( "description" ).value( "NotImplemented" );
+
+				//writer.name( "thumbnailUrl" ).value( contextHandler.getThumbnailUrl() );
+				writer.name( "thumbnailUrl" ).value( "http://fiji.sc/_images/a/ae/Fiji-icon.png" );
+
+				writer.name( "datasetUrl" ).value( contextHandler.getDataSetURL() );
+
+				writer.endObject();
+			}
+		}
+		return sb.toString();
+	}
+}
-- 
GitLab