From f6bed84602a8ac0807644eb457ed80c3b0bc8989 Mon Sep 17 00:00:00 2001
From: HongKee Moon <hkmoon@me.com>
Date: Tue, 13 Jan 2015 10:27:04 +0100
Subject: [PATCH] Add StatisticsHandler for /manager context

---
 src/main/java/bdv/server/BigDataServer.java  | 24 +++++++++---
 src/main/java/bdv/server/ManagerHandler.java | 41 +++++++++++++++++---
 2 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/src/main/java/bdv/server/BigDataServer.java b/src/main/java/bdv/server/BigDataServer.java
index 801f928..ae18d38 100644
--- a/src/main/java/bdv/server/BigDataServer.java
+++ b/src/main/java/bdv/server/BigDataServer.java
@@ -5,7 +5,10 @@ import java.util.HashMap;
 import mpicbg.spim.data.SpimDataException;
 
 import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
 import org.eclipse.jetty.server.handler.HandlerCollection;
+import org.eclipse.jetty.server.handler.RequestLogHandler;
+import org.eclipse.jetty.server.handler.StatisticsHandler;
 import org.eclipse.jetty.util.log.Log;
 
 public class BigDataServer
@@ -19,6 +22,7 @@ public class BigDataServer
 		final String fn = args.length > 0 ? args[ 0 ] : "/Users/moon/Projects/git-projects/BigDataViewer/data/HisYFP-SPIM.xml";
 
 		dataSet.put( "HisYFP-SPIM", fn );
+		dataSet.put( "t1-head", "/Users/moon/Projects/git-projects/BigDataViewer/data/t1-head.xml" );
 
 		final int port = args.length > 1 ? Integer.parseInt( args[ 1 ] ) : 8080;
 		System.setProperty( "org.eclipse.jetty.util.log.class", "org.eclipse.jetty.util.log.StdErrLog" );
@@ -26,19 +30,27 @@ public class BigDataServer
 
 		final String baseURL = "http://" + server.getURI().getHost() + ":" + port;
 
-		final HandlerCollection handlers = createHandlers( baseURL, dataSet );
-		handlers.addHandler( new ManagerHandler( baseURL, server, handlers ) );
+		final StatisticsHandler statHandler = new StatisticsHandler();
 
-		LOG.info( "Set handler: " + handlers );
-		server.setHandler( handlers );
+		final HandlerCollection handlers = new HandlerCollection();
+
+		final ContextHandlerCollection datasetHandlers = createHandlers( baseURL, dataSet );
+		handlers.addHandler( datasetHandlers );
+		handlers.addHandler( new ManagerHandler( baseURL, server, statHandler, datasetHandlers ) );
+		handlers.addHandler( new RequestLogHandler() );
+
+		statHandler.setHandler( handlers );
+
+		LOG.info( "Set handler: " + statHandler );
+		server.setHandler( statHandler );
 		LOG.info( "BigDataServer starting" );
 		server.start();
 		server.join();
 	}
 
-	static private HandlerCollection createHandlers( final String baseURL, final HashMap< String, String > dataSet ) throws SpimDataException
+	static private ContextHandlerCollection createHandlers( String baseURL, HashMap< String, String > dataSet ) throws SpimDataException
 	{
-		final HandlerCollection handlers = new HandlerCollection( true );
+		final ContextHandlerCollection handlers = new ContextHandlerCollection();
 
 		for ( final String key : dataSet.keySet() )
 		{
diff --git a/src/main/java/bdv/server/ManagerHandler.java b/src/main/java/bdv/server/ManagerHandler.java
index 2deff29..839065c 100644
--- a/src/main/java/bdv/server/ManagerHandler.java
+++ b/src/main/java/bdv/server/ManagerHandler.java
@@ -13,9 +13,17 @@ 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.HandlerCollection;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.server.handler.StatisticsHandler;
 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.text.DecimalFormat;
+
 public class ManagerHandler extends ContextHandler
 {
 	private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger( ManagerHandler.class );
@@ -23,14 +31,17 @@ public class ManagerHandler extends ContextHandler
 	private final String baseURL;
 
 	private final Server server;
+	
+	private final ContextHandlerCollection handlers;
+	
+	private final StatisticsHandler statHandler;
 
-	private final HandlerCollection handlers;
-
-	public ManagerHandler( final String baseURL, final Server server, final HandlerCollection handlers )
+	public ManagerHandler( String baseURL, Server server, StatisticsHandler statHandler, ContextHandlerCollection handlers )
 	{
 		this.baseURL = baseURL;
 		this.server = server;
 		this.handlers = handlers;
+		this.statHandler = statHandler;
 		setContextPath( "/manager" );
 	}
 
@@ -61,6 +72,15 @@ public class ManagerHandler extends ContextHandler
 
 	}
 
+	public String getByteSizeString( long size )
+	{
+		if ( size <= 0 )
+			return "0";
+		final String[] units = new String[] { "B", "kB", "MB", "GB", "TB" };
+		int digitGroups = ( int ) ( Math.log10( size ) / Math.log10( 1024 ) );
+		return new DecimalFormat( "#,##0.#" ).format( size / Math.pow( 1024, digitGroups ) ) + " " + units[ digitGroups ];
+	}
+
 	private void list( final Request baseRequest, final HttpServletResponse response ) throws IOException
 	{
 		response.setContentType( "text/html" );
@@ -69,16 +89,27 @@ public class ManagerHandler extends ContextHandler
 
 		final PrintWriter ow = response.getWriter();
 
+		ow.write( "<HTML>\n<HEAD><META HTTP-EQUIV=\"refresh\" CONTENT=\"5\"></HEAD>\n<BODY>" );
+
+		ow.write( "This page is refreshed in every 5 secs.<br/>\n" );
+		ow.write( "<br/>\n" );
+		ow.write( "Bytes sent total: " + getByteSizeString( statHandler.getResponsesBytesTotal() ) + "<br/>\n" );
+
+		ow.write( "<H1> Datasets: </H1>\n" );
+
 		for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
 		{
 			CellHandler contextHandler = null;
 			if ( handler instanceof CellHandler )
 			{
 				contextHandler = ( CellHandler ) handler;
-				ow.write( contextHandler.getContextPath() );
+				ow.write( contextHandler.getContextPath() + "<BR/>" );
 			}
 		}
 
+		ow.write( statHandler.toStatsHTML() );
+
+		ow.write( "</BODY>" );
 		ow.close();
 	}
 
-- 
GitLab