From 94cacbfa19aa1d7d8bc98be67519929c57aea875 Mon Sep 17 00:00:00 2001
From: Tobias Pietzsch <tobias.pietzsch@gmail.com>
Date: Fri, 13 Feb 2015 00:50:42 +0100
Subject: [PATCH] * create thumbnails in a temporary directory, not next to the
dataset. * disable ManagerHandler by default, enable by "-m" command line
option. * do not use StatisticsHandler if ManagerHandler is off. * clean up
ManagerHandler, fix deploy and undeploy dataset context paths. *
ManagerHandler obtains manager.ts template from resource (should work from
inside jar). * only deploy new dataset if context does not exist yet.
---
src/main/java/bdv/server/BigDataServer.java | 99 +++++++++++++----
src/main/java/bdv/server/CellHandler.java | 39 ++++---
src/main/java/bdv/server/ManagerHandler.java | 107 +++++++++++--------
3 files changed, 168 insertions(+), 77 deletions(-)
diff --git a/src/main/java/bdv/server/BigDataServer.java b/src/main/java/bdv/server/BigDataServer.java
index df2d33e..626d131 100644
--- a/src/main/java/bdv/server/BigDataServer.java
+++ b/src/main/java/bdv/server/BigDataServer.java
@@ -6,11 +6,11 @@ import org.apache.commons.cli.*;
import org.apache.commons.lang.StringUtils;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.ConnectorStatistics;
+import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
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;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
@@ -61,7 +61,8 @@ public class BigDataServer
{
hostname = "localhost";
}
- return new Parameters( port, hostname, new HashMap< String, String >() );
+ final boolean enableManagerContext = false;
+ return new Parameters( port, hostname, new HashMap< String, String >(), enableManagerContext );
}
public static void main( final String[] args ) throws Exception
@@ -72,6 +73,8 @@ public class BigDataServer
if ( params == null )
return;
+ final String thumbnailsDirectoryName = getThumbnailDirectoryPath( params );
+
// Threadpool for multiple connections
final Server server = new Server( new QueuedThreadPool( 1000, 10 ) );
@@ -81,29 +84,32 @@ public class BigDataServer
connector.setPort( params.getPort() );
LOG.info( "Set connectors: " + connector );
server.setConnectors( new Connector[] { connector } );
-
- // Add Statistics bean to the connector
- final ConnectorStatistics connectorStats = new ConnectorStatistics();
- connector.addBean( connectorStats );
-
final String baseURL = "http://" + server.getURI().getHost() + ":" + params.getPort();
- LOG.info( "Server Base URL: " + baseURL );
// Handler initialization
- final StatisticsHandler statHandler = new StatisticsHandler();
-
final HandlerCollection handlers = new HandlerCollection();
- final ContextHandlerCollection datasetHandlers = createHandlers( baseURL, params.getDatasets() );
+ final ContextHandlerCollection datasetHandlers = createHandlers( baseURL, params.getDatasets(), thumbnailsDirectoryName );
handlers.addHandler( datasetHandlers );
- handlers.addHandler( new ManagerHandler( baseURL, server, connectorStats, statHandler, datasetHandlers ) );
- handlers.addHandler( new RequestLogHandler() );
handlers.addHandler( new JsonDatasetListHandler( server, datasetHandlers ) );
- statHandler.setHandler( handlers );
+ Handler handler = handlers;
+ if ( params.enableManagerContext() )
+ {
+ // Add Statistics bean to the connector
+ final ConnectorStatistics connectorStats = new ConnectorStatistics();
+ connector.addBean( connectorStats );
+
+ // create StatisticsHandler wrapper and ManagerHandler
+ final StatisticsHandler statHandler = new StatisticsHandler();
+ handlers.addHandler( new ManagerHandler( baseURL, server, connectorStats, statHandler, datasetHandlers, thumbnailsDirectoryName ) );
+ statHandler.setHandler( handlers );
+ handler = statHandler;
+ }
- LOG.info( "Set handler: " + statHandler );
- server.setHandler( statHandler );
+ LOG.info( "Set handler: " + handler );
+ server.setHandler( handler );
+ LOG.info( "Server Base URL: " + baseURL );
LOG.info( "BigDataServer starting" );
server.start();
server.join();
@@ -123,11 +129,14 @@ public class BigDataServer
*/
private final Map< String, String > datasetNameToXml;
- Parameters( final int port, final String hostname, final Map< String, String > datasetNameToXml )
+ private final boolean enableManagerContext;
+
+ Parameters( final int port, final String hostname, final Map< String, String > datasetNameToXml, final boolean enableManagerContext )
{
this.port = port;
this.hostname = hostname;
this.datasetNameToXml = datasetNameToXml;
+ this.enableManagerContext = enableManagerContext;
}
public int getPort()
@@ -140,6 +149,11 @@ public class BigDataServer
return hostname;
}
+ public String getThumbnailDirectory()
+ {
+ return null;
+ }
+
/**
* Get datasets.
*
@@ -149,6 +163,11 @@ public class BigDataServer
{
return datasetNameToXml;
}
+
+ public boolean enableManagerContext()
+ {
+ return enableManagerContext;
+ }
}
@SuppressWarnings( "static-access" )
@@ -182,6 +201,10 @@ public class BigDataServer
.withArgName( "FILE" )
.create( "d" ) );
+ options.addOption( OptionBuilder
+ .withDescription( "enable statistics and manager context. EXPERIMENTAL!" )
+ .create( "m" ) );
+
try
{
final CommandLineParser parser = new BasicParser();
@@ -197,6 +220,10 @@ public class BigDataServer
final HashMap< String, String > datasets = new HashMap< String, String >( defaultParameters.getDatasets() );
+ boolean enableManagerContext = false;
+ if ( cmd.hasOption( "m" ) )
+ enableManagerContext = true;
+
if ( cmd.hasOption( "d" ) )
{
// process the file given with "-d"
@@ -243,7 +270,7 @@ public class BigDataServer
if ( datasets.isEmpty() )
throw new IllegalArgumentException( "Dataset list is empty." );
- return new Parameters( port, serverName, datasets );
+ return new Parameters( port, serverName, datasets, enableManagerContext );
}
catch ( final ParseException | IllegalArgumentException e )
{
@@ -267,7 +294,39 @@ public class BigDataServer
LOG.info( "Dataset added: {" + name + ", " + xmlpath + "}" );
}
- private static ContextHandlerCollection createHandlers( final String baseURL, final Map< String, String > dataSet ) throws SpimDataException, IOException
+ private static String getThumbnailDirectoryPath( final Parameters params ) throws IOException
+ {
+ final String thumbnailDirectoryName = params.getThumbnailDirectory();
+ if ( thumbnailDirectoryName != null )
+ {
+ Path thumbnails = Paths.get( thumbnailDirectoryName );
+ if ( ! Files.exists( thumbnails ) )
+ {
+ try
+ {
+ thumbnails = Files.createDirectories( thumbnails );
+ return thumbnails.toFile().getAbsolutePath();
+ }
+ catch ( final IOException e )
+ {
+ LOG.warn( e.getMessage() );
+ LOG.warn( "Could not create thumbnails directory \"" + thumbnailDirectoryName + "\".\n Trying to create temporary directory." );
+ }
+ }
+ else
+ {
+ if ( ! Files.isDirectory( thumbnails ) )
+ LOG.warn( "Thumbnails directory \"" + thumbnailDirectoryName + "\" is not a directory.\n Trying to create temporary directory." );
+ else
+ return thumbnails.toFile().getAbsolutePath();
+ }
+ }
+ final Path thumbnails = Files.createTempDirectory( "thumbnails" );
+ thumbnails.toFile().deleteOnExit();
+ return thumbnails.toFile().getAbsolutePath();
+ }
+
+ private static ContextHandlerCollection createHandlers( final String baseURL, final Map< String, String > dataSet, final String thumbnailsDirectoryName ) throws SpimDataException, IOException
{
final ContextHandlerCollection handlers = new ContextHandlerCollection();
@@ -276,7 +335,7 @@ public class BigDataServer
final String name = entry.getKey();
final String xmlpath = entry.getValue();
final String context = "/" + name;
- final CellHandler ctx = new CellHandler( baseURL + context + "/", xmlpath );
+ final CellHandler ctx = new CellHandler( baseURL + context + "/", xmlpath, name, 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 c33c810..6125bc9 100644
--- a/src/main/java/bdv/server/CellHandler.java
+++ b/src/main/java/bdv/server/CellHandler.java
@@ -78,7 +78,12 @@ public class CellHandler extends ContextHandler
*/
private final String settingsXmlString;
- public CellHandler( final String baseUrl, final String xmlFilename ) throws SpimDataException, IOException
+ /**
+ * Full path to thumbnail png.
+ */
+ private final String thumbnailFilename;
+
+ public CellHandler( final String baseUrl, final String xmlFilename, final String datasetName, final String thumbnailsDirectory ) throws SpimDataException, IOException
{
final XmlIoSpimDataMinimal io = new XmlIoSpimDataMinimal();
final SpimDataMinimal spimData = io.load( xmlFilename );
@@ -97,7 +102,7 @@ public class CellHandler extends ContextHandler
datasetXmlString = buildRemoteDatasetXML( io, spimData, baseUrl );
metadataJson = buildMetadataJsonString( imgLoader, seq );
settingsXmlString = buildSettingsXML( baseFilename );
- createThumbnail( spimData, baseFilename );
+ thumbnailFilename = createThumbnail( spimData, baseFilename, datasetName, thumbnailsDirectory );
}
@Override
@@ -170,9 +175,7 @@ public class CellHandler extends ContextHandler
private void provideThumbnail( final Request baseRequest, final HttpServletResponse response ) throws IOException
{
- // Just check it once
- final Path path = Paths.get( baseFilename + ".png" );
-
+ final Path path = Paths.get( thumbnailFilename );
if ( Files.exists( path ) )
{
final byte[] imageData = Files.readAllBytes(path);
@@ -270,19 +273,25 @@ public class CellHandler extends ContextHandler
/**
* Create PNG thumbnail file named "{@code <baseFilename>.png}".
*/
- private static void createThumbnail( final SpimDataMinimal spimData, final String baseFilename )
+ private static String createThumbnail( final SpimDataMinimal spimData, final String baseFilename, final String datasetName, final String thumbnailsDirectory )
{
- final File thumbnailFile = new File( baseFilename + ".png" );
- final BufferedImage bi = ThumbnailGenerator.makeThumbnail( spimData, baseFilename, Constants.THUMBNAIL_WIDTH, Constants.THUMBNAIL_HEIGHT );
- try
- {
- ImageIO.write( bi, "png", thumbnailFile );
- }
- catch ( final IOException e )
+ final String thumbnailFileName = thumbnailsDirectory + "/" + datasetName + ".png";
+ final File thumbnailFile = new File( thumbnailFileName );
+ if ( !thumbnailFile.isFile() ) // do not recreate thumbnail if it
+ // already exists
{
- LOG.warn( "Could not create thumbnail png for dataset \"" + baseFilename + "\"" );
- LOG.warn( e.getMessage() );
+ final BufferedImage bi = ThumbnailGenerator.makeThumbnail( spimData, baseFilename, Constants.THUMBNAIL_WIDTH, Constants.THUMBNAIL_HEIGHT );
+ try
+ {
+ ImageIO.write( bi, "png", thumbnailFile );
+ }
+ catch ( final IOException e )
+ {
+ LOG.warn( "Could not create thumbnail png for dataset \"" + baseFilename + "\"" );
+ LOG.warn( e.getMessage() );
+ }
}
+ return thumbnailFileName;
}
/**
diff --git a/src/main/java/bdv/server/ManagerHandler.java b/src/main/java/bdv/server/ManagerHandler.java
index ef23e50..f5e959a 100644
--- a/src/main/java/bdv/server/ManagerHandler.java
+++ b/src/main/java/bdv/server/ManagerHandler.java
@@ -23,6 +23,10 @@ import java.io.PrintWriter;
import java.net.URISyntaxException;
import java.text.DecimalFormat;
+/**
+ * @author HongKee Moon <moon@mpi-cbg.de>
+ * @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
+ */
public class ManagerHandler extends ContextHandler
{
private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger( ManagerHandler.class );
@@ -43,13 +47,23 @@ public class ManagerHandler extends ContextHandler
private long sizeDataSets = 0;
- public ManagerHandler( final String baseURL, final Server server, final ConnectorStatistics connectorStats, final StatisticsHandler statHandler, final ContextHandlerCollection handlers ) throws IOException, URISyntaxException
+ private final String thumbnailsDirectoryName;
+
+ public ManagerHandler(
+ final String baseURL,
+ final Server server,
+ final ConnectorStatistics connectorStats,
+ final StatisticsHandler statHandler,
+ final ContextHandlerCollection handlers,
+ final String thumbnailsDirectoryName )
+ throws IOException, URISyntaxException
{
this.baseURL = baseURL;
this.server = server;
this.handlers = handlers;
this.statHandler = statHandler;
this.connectorStats = connectorStats;
+ this.thumbnailsDirectoryName = thumbnailsDirectoryName;
setContextPath( "/" + Constants.MANAGER_CONTEXT_NAME );
}
@@ -77,7 +91,6 @@ public class ManagerHandler extends ContextHandler
{
return;
}
-
}
public String getByteSizeString( final long size )
@@ -103,11 +116,8 @@ public class ManagerHandler extends ContextHandler
private String getHtml()
{
- // manager.st should be under {WorkingFolder}/templates/
- final StringTemplateGroup templates =
- new StringTemplateGroup( "manager", "templates" );
-
- final StringTemplate t = templates.getInstanceOf( "manager" );
+ final StringTemplateGroup templates = new StringTemplateGroup( "manager" );
+ final StringTemplate t = templates.getInstanceOf( "templates/manager" );
t.setAttribute( "bytesSent", getByteSizeString( statHandler.getResponsesBytesTotal() ) );
t.setAttribute( "msgPerSec", connectorStats.getMessagesOutPerSecond() );
@@ -136,16 +146,12 @@ public class ManagerHandler extends ContextHandler
final StringBuilder sb = new StringBuilder();
for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
{
- CellHandler contextHandler = null;
- if ( handler instanceof CellHandler )
- {
- sb.append( "<tr>\n<th>" );
- contextHandler = ( CellHandler ) handler;
- sb.append( contextHandler.getContextPath() + "</th>\n<td>" );
- sb.append( contextHandler.getXmlFile() + "</td>\n</tr>\n" );
- noDataSets++;
- sizeDataSets += new File( contextHandler.getXmlFile().replace( ".xml", ".h5" ) ).length();
- }
+ sb.append( "<tr>\n<th>" );
+ final CellHandler contextHandler = ( CellHandler ) handler;
+ sb.append( contextHandler.getContextPath() + "</th>\n<td>" );
+ sb.append( contextHandler.getXmlFile() + "</td>\n</tr>\n" );
+ noDataSets++;
+ sizeDataSets += new File( contextHandler.getXmlFile().replace( ".xml", ".h5" ) ).length();
}
contexts = sb.toString();
}
@@ -154,25 +160,45 @@ public class ManagerHandler extends ContextHandler
private void deploy( final String datasetName, final String fileLocation, final Request baseRequest, final HttpServletResponse response ) throws IOException
{
LOG.info( "Add new context: " + datasetName );
- CellHandler ctx = null;
- try
+ final String context = "/" + datasetName;
+
+ boolean alreadyExists = false;
+ for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
{
- ctx = new CellHandler( baseURL + datasetName + "/", fileLocation );
+ final CellHandler contextHandler = ( CellHandler ) handler;
+ if ( context.equals( contextHandler.getContextPath() ) )
+ {
+ LOG.info( "Context " + datasetName + " already exists.");
+ alreadyExists = true;
+ break;
+ }
}
- catch ( final SpimDataException e )
+
+ if ( ! alreadyExists )
{
- LOG.warn( "Failed to create a CellHandler", e );
- e.printStackTrace();
+ CellHandler ctx = null;
+ try
+ {
+ ctx = new CellHandler( baseURL + context + "/", fileLocation, datasetName, thumbnailsDirectoryName );
+ }
+ catch ( final SpimDataException e )
+ {
+ LOG.warn( "Failed to create a CellHandler", e );
+ e.printStackTrace();
+ }
+ ctx.setContextPath( context );
+ handlers.addHandler( ctx );
}
- ctx.setContextPath( "/" + datasetName );
- handlers.addHandler( ctx );
response.setContentType( "text/html" );
response.setStatus( HttpServletResponse.SC_OK );
baseRequest.setHandled( true );
final PrintWriter ow = response.getWriter();
- ow.write( datasetName + " registered." );
+ if ( alreadyExists )
+ ow.write( datasetName + " already exists. Not registered." );
+ else
+ ow.write( datasetName + " registered." );
ow.close();
}
@@ -181,27 +207,24 @@ public class ManagerHandler extends ContextHandler
LOG.info( "Remove the context: " + datasetName );
boolean ret = false;
+ final String context = "/" + datasetName;
for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
{
- CellHandler contextHandler = null;
- if ( handler instanceof CellHandler )
+ final CellHandler contextHandler = ( CellHandler ) handler;
+ if ( context.equals( contextHandler.getContextPath() ) )
{
- contextHandler = ( CellHandler ) handler;
- if ( datasetName.equals( contextHandler.getContextPath() ) )
+ try
+ {
+ contextHandler.stop();
+ }
+ catch ( final Exception e )
{
- try
- {
- contextHandler.stop();
- }
- catch ( final Exception e )
- {
- e.printStackTrace();
- }
- contextHandler.destroy();
- handlers.removeHandler( contextHandler );
- ret = true;
- break;
+ e.printStackTrace();
}
+ contextHandler.destroy();
+ handlers.removeHandler( contextHandler );
+ ret = true;
+ break;
}
}
--
GitLab