Skip to content
Snippets Groups Projects
Commit 94cacbfa authored by Tobias Pietzsch's avatar Tobias Pietzsch
Browse files

* 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.
parent f2fb6b89
No related branches found
No related tags found
No related merge requests found
...@@ -6,11 +6,11 @@ import org.apache.commons.cli.*; ...@@ -6,11 +6,11 @@ import org.apache.commons.cli.*;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.ConnectorStatistics; import org.eclipse.jetty.server.ConnectorStatistics;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.HandlerCollection; 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.server.handler.StatisticsHandler;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.util.thread.QueuedThreadPool;
...@@ -61,7 +61,8 @@ public class BigDataServer ...@@ -61,7 +61,8 @@ public class BigDataServer
{ {
hostname = "localhost"; 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 public static void main( final String[] args ) throws Exception
...@@ -72,6 +73,8 @@ public class BigDataServer ...@@ -72,6 +73,8 @@ public class BigDataServer
if ( params == null ) if ( params == null )
return; return;
final String thumbnailsDirectoryName = getThumbnailDirectoryPath( params );
// Threadpool for multiple connections // Threadpool for multiple connections
final Server server = new Server( new QueuedThreadPool( 1000, 10 ) ); final Server server = new Server( new QueuedThreadPool( 1000, 10 ) );
...@@ -81,29 +84,32 @@ public class BigDataServer ...@@ -81,29 +84,32 @@ public class BigDataServer
connector.setPort( params.getPort() ); connector.setPort( params.getPort() );
LOG.info( "Set connectors: " + connector ); LOG.info( "Set connectors: " + connector );
server.setConnectors( new Connector[] { 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(); final String baseURL = "http://" + server.getURI().getHost() + ":" + params.getPort();
LOG.info( "Server Base URL: " + baseURL );
// Handler initialization // Handler initialization
final StatisticsHandler statHandler = new StatisticsHandler();
final HandlerCollection handlers = new HandlerCollection(); 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( datasetHandlers );
handlers.addHandler( new ManagerHandler( baseURL, server, connectorStats, statHandler, datasetHandlers ) );
handlers.addHandler( new RequestLogHandler() );
handlers.addHandler( new JsonDatasetListHandler( server, datasetHandlers ) ); 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 ); LOG.info( "Set handler: " + handler );
server.setHandler( statHandler ); server.setHandler( handler );
LOG.info( "Server Base URL: " + baseURL );
LOG.info( "BigDataServer starting" ); LOG.info( "BigDataServer starting" );
server.start(); server.start();
server.join(); server.join();
...@@ -123,11 +129,14 @@ public class BigDataServer ...@@ -123,11 +129,14 @@ public class BigDataServer
*/ */
private final Map< String, String > datasetNameToXml; 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.port = port;
this.hostname = hostname; this.hostname = hostname;
this.datasetNameToXml = datasetNameToXml; this.datasetNameToXml = datasetNameToXml;
this.enableManagerContext = enableManagerContext;
} }
public int getPort() public int getPort()
...@@ -140,6 +149,11 @@ public class BigDataServer ...@@ -140,6 +149,11 @@ public class BigDataServer
return hostname; return hostname;
} }
public String getThumbnailDirectory()
{
return null;
}
/** /**
* Get datasets. * Get datasets.
* *
...@@ -149,6 +163,11 @@ public class BigDataServer ...@@ -149,6 +163,11 @@ public class BigDataServer
{ {
return datasetNameToXml; return datasetNameToXml;
} }
public boolean enableManagerContext()
{
return enableManagerContext;
}
} }
@SuppressWarnings( "static-access" ) @SuppressWarnings( "static-access" )
...@@ -182,6 +201,10 @@ public class BigDataServer ...@@ -182,6 +201,10 @@ public class BigDataServer
.withArgName( "FILE" ) .withArgName( "FILE" )
.create( "d" ) ); .create( "d" ) );
options.addOption( OptionBuilder
.withDescription( "enable statistics and manager context. EXPERIMENTAL!" )
.create( "m" ) );
try try
{ {
final CommandLineParser parser = new BasicParser(); final CommandLineParser parser = new BasicParser();
...@@ -197,6 +220,10 @@ public class BigDataServer ...@@ -197,6 +220,10 @@ public class BigDataServer
final HashMap< String, String > datasets = new HashMap< String, String >( defaultParameters.getDatasets() ); final HashMap< String, String > datasets = new HashMap< String, String >( defaultParameters.getDatasets() );
boolean enableManagerContext = false;
if ( cmd.hasOption( "m" ) )
enableManagerContext = true;
if ( cmd.hasOption( "d" ) ) if ( cmd.hasOption( "d" ) )
{ {
// process the file given with "-d" // process the file given with "-d"
...@@ -243,7 +270,7 @@ public class BigDataServer ...@@ -243,7 +270,7 @@ public class BigDataServer
if ( datasets.isEmpty() ) if ( datasets.isEmpty() )
throw new IllegalArgumentException( "Dataset list is empty." ); 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 ) catch ( final ParseException | IllegalArgumentException e )
{ {
...@@ -267,7 +294,39 @@ public class BigDataServer ...@@ -267,7 +294,39 @@ public class BigDataServer
LOG.info( "Dataset added: {" + name + ", " + xmlpath + "}" ); 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(); final ContextHandlerCollection handlers = new ContextHandlerCollection();
...@@ -276,7 +335,7 @@ public class BigDataServer ...@@ -276,7 +335,7 @@ public class BigDataServer
final String name = entry.getKey(); final String name = entry.getKey();
final String xmlpath = entry.getValue(); final String xmlpath = entry.getValue();
final String context = "/" + name; 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 ); ctx.setContextPath( context );
handlers.addHandler( ctx ); handlers.addHandler( ctx );
} }
......
...@@ -78,7 +78,12 @@ public class CellHandler extends ContextHandler ...@@ -78,7 +78,12 @@ public class CellHandler extends ContextHandler
*/ */
private final String settingsXmlString; 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 XmlIoSpimDataMinimal io = new XmlIoSpimDataMinimal();
final SpimDataMinimal spimData = io.load( xmlFilename ); final SpimDataMinimal spimData = io.load( xmlFilename );
...@@ -97,7 +102,7 @@ public class CellHandler extends ContextHandler ...@@ -97,7 +102,7 @@ public class CellHandler extends ContextHandler
datasetXmlString = buildRemoteDatasetXML( io, spimData, baseUrl ); datasetXmlString = buildRemoteDatasetXML( io, spimData, baseUrl );
metadataJson = buildMetadataJsonString( imgLoader, seq ); metadataJson = buildMetadataJsonString( imgLoader, seq );
settingsXmlString = buildSettingsXML( baseFilename ); settingsXmlString = buildSettingsXML( baseFilename );
createThumbnail( spimData, baseFilename ); thumbnailFilename = createThumbnail( spimData, baseFilename, datasetName, thumbnailsDirectory );
} }
@Override @Override
...@@ -170,9 +175,7 @@ public class CellHandler extends ContextHandler ...@@ -170,9 +175,7 @@ public class CellHandler extends ContextHandler
private void provideThumbnail( final Request baseRequest, final HttpServletResponse response ) throws IOException private void provideThumbnail( final Request baseRequest, final HttpServletResponse response ) throws IOException
{ {
// Just check it once final Path path = Paths.get( thumbnailFilename );
final Path path = Paths.get( baseFilename + ".png" );
if ( Files.exists( path ) ) if ( Files.exists( path ) )
{ {
final byte[] imageData = Files.readAllBytes(path); final byte[] imageData = Files.readAllBytes(path);
...@@ -270,19 +273,25 @@ public class CellHandler extends ContextHandler ...@@ -270,19 +273,25 @@ public class CellHandler extends ContextHandler
/** /**
* Create PNG thumbnail file named "{@code <baseFilename>.png}". * 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 String thumbnailFileName = thumbnailsDirectory + "/" + datasetName + ".png";
final BufferedImage bi = ThumbnailGenerator.makeThumbnail( spimData, baseFilename, Constants.THUMBNAIL_WIDTH, Constants.THUMBNAIL_HEIGHT ); final File thumbnailFile = new File( thumbnailFileName );
try if ( !thumbnailFile.isFile() ) // do not recreate thumbnail if it
{ // already exists
ImageIO.write( bi, "png", thumbnailFile );
}
catch ( final IOException e )
{ {
LOG.warn( "Could not create thumbnail png for dataset \"" + baseFilename + "\"" ); final BufferedImage bi = ThumbnailGenerator.makeThumbnail( spimData, baseFilename, Constants.THUMBNAIL_WIDTH, Constants.THUMBNAIL_HEIGHT );
LOG.warn( e.getMessage() ); 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;
} }
/** /**
......
...@@ -23,6 +23,10 @@ import java.io.PrintWriter; ...@@ -23,6 +23,10 @@ import java.io.PrintWriter;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.text.DecimalFormat; import java.text.DecimalFormat;
/**
* @author HongKee Moon <moon@mpi-cbg.de>
* @author Tobias Pietzsch <tobias.pietzsch@gmail.com>
*/
public class ManagerHandler extends ContextHandler public class ManagerHandler extends ContextHandler
{ {
private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger( ManagerHandler.class ); private static final org.eclipse.jetty.util.log.Logger LOG = Log.getLogger( ManagerHandler.class );
...@@ -43,13 +47,23 @@ public class ManagerHandler extends ContextHandler ...@@ -43,13 +47,23 @@ public class ManagerHandler extends ContextHandler
private long sizeDataSets = 0; 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.baseURL = baseURL;
this.server = server; this.server = server;
this.handlers = handlers; this.handlers = handlers;
this.statHandler = statHandler; this.statHandler = statHandler;
this.connectorStats = connectorStats; this.connectorStats = connectorStats;
this.thumbnailsDirectoryName = thumbnailsDirectoryName;
setContextPath( "/" + Constants.MANAGER_CONTEXT_NAME ); setContextPath( "/" + Constants.MANAGER_CONTEXT_NAME );
} }
...@@ -77,7 +91,6 @@ public class ManagerHandler extends ContextHandler ...@@ -77,7 +91,6 @@ public class ManagerHandler extends ContextHandler
{ {
return; return;
} }
} }
public String getByteSizeString( final long size ) public String getByteSizeString( final long size )
...@@ -103,11 +116,8 @@ public class ManagerHandler extends ContextHandler ...@@ -103,11 +116,8 @@ public class ManagerHandler extends ContextHandler
private String getHtml() private String getHtml()
{ {
// manager.st should be under {WorkingFolder}/templates/ final StringTemplateGroup templates = new StringTemplateGroup( "manager" );
final StringTemplateGroup templates = final StringTemplate t = templates.getInstanceOf( "templates/manager" );
new StringTemplateGroup( "manager", "templates" );
final StringTemplate t = templates.getInstanceOf( "manager" );
t.setAttribute( "bytesSent", getByteSizeString( statHandler.getResponsesBytesTotal() ) ); t.setAttribute( "bytesSent", getByteSizeString( statHandler.getResponsesBytesTotal() ) );
t.setAttribute( "msgPerSec", connectorStats.getMessagesOutPerSecond() ); t.setAttribute( "msgPerSec", connectorStats.getMessagesOutPerSecond() );
...@@ -136,16 +146,12 @@ public class ManagerHandler extends ContextHandler ...@@ -136,16 +146,12 @@ public class ManagerHandler extends ContextHandler
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) ) for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
{ {
CellHandler contextHandler = null; sb.append( "<tr>\n<th>" );
if ( handler instanceof CellHandler ) final CellHandler contextHandler = ( CellHandler ) handler;
{ sb.append( contextHandler.getContextPath() + "</th>\n<td>" );
sb.append( "<tr>\n<th>" ); sb.append( contextHandler.getXmlFile() + "</td>\n</tr>\n" );
contextHandler = ( CellHandler ) handler; noDataSets++;
sb.append( contextHandler.getContextPath() + "</th>\n<td>" ); sizeDataSets += new File( contextHandler.getXmlFile().replace( ".xml", ".h5" ) ).length();
sb.append( contextHandler.getXmlFile() + "</td>\n</tr>\n" );
noDataSets++;
sizeDataSets += new File( contextHandler.getXmlFile().replace( ".xml", ".h5" ) ).length();
}
} }
contexts = sb.toString(); contexts = sb.toString();
} }
...@@ -154,25 +160,45 @@ public class ManagerHandler extends ContextHandler ...@@ -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 private void deploy( final String datasetName, final String fileLocation, final Request baseRequest, final HttpServletResponse response ) throws IOException
{ {
LOG.info( "Add new context: " + datasetName ); LOG.info( "Add new context: " + datasetName );
CellHandler ctx = null; final String context = "/" + datasetName;
try
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 ); CellHandler ctx = null;
e.printStackTrace(); 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.setContentType( "text/html" );
response.setStatus( HttpServletResponse.SC_OK ); response.setStatus( HttpServletResponse.SC_OK );
baseRequest.setHandled( true ); baseRequest.setHandled( true );
final PrintWriter ow = response.getWriter(); 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(); ow.close();
} }
...@@ -181,27 +207,24 @@ public class ManagerHandler extends ContextHandler ...@@ -181,27 +207,24 @@ public class ManagerHandler extends ContextHandler
LOG.info( "Remove the context: " + datasetName ); LOG.info( "Remove the context: " + datasetName );
boolean ret = false; boolean ret = false;
final String context = "/" + datasetName;
for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) ) for ( final Handler handler : server.getChildHandlersByClass( CellHandler.class ) )
{ {
CellHandler contextHandler = null; final CellHandler contextHandler = ( CellHandler ) handler;
if ( handler instanceof CellHandler ) if ( context.equals( contextHandler.getContextPath() ) )
{ {
contextHandler = ( CellHandler ) handler; try
if ( datasetName.equals( contextHandler.getContextPath() ) ) {
contextHandler.stop();
}
catch ( final Exception e )
{ {
try e.printStackTrace();
{
contextHandler.stop();
}
catch ( final Exception e )
{
e.printStackTrace();
}
contextHandler.destroy();
handlers.removeHandler( contextHandler );
ret = true;
break;
} }
contextHandler.destroy();
handlers.removeHandler( contextHandler );
ret = true;
break;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment