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> " ); + sb.append( "\t\t<a href=" + url + ".bdv>BDV</a><br/>\n" ); sb.append( "\t</td>\n" ); sb.append( "</tr>\n" ); } -- GitLab