From b713eced94c3521aa603a4976542425ca82da4ea Mon Sep 17 00:00:00 2001
From: Tobias Pietzsch <tobias.pietzsch@gmail.com>
Date: Wed, 11 Feb 2015 18:39:55 +0100
Subject: [PATCH] build and cache remote dataset XML in the constructor (split
 out into helper method)

---
 src/main/java/bdv/server/BigDataServer.java |  2 +-
 src/main/java/bdv/server/CellHandler.java   | 60 +++++++++++----------
 2 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/src/main/java/bdv/server/BigDataServer.java b/src/main/java/bdv/server/BigDataServer.java
index a906b79..07e480b 100644
--- a/src/main/java/bdv/server/BigDataServer.java
+++ b/src/main/java/bdv/server/BigDataServer.java
@@ -264,7 +264,7 @@ public class BigDataServer
 		LOG.info( "Dataset added: {" + name + ", " + xmlpath + "}" );
 	}
 
-	private static ContextHandlerCollection createHandlers( final String baseURL, final Map< String, String > dataSet ) throws SpimDataException
+	private static ContextHandlerCollection createHandlers( final String baseURL, final Map< String, String > dataSet ) throws SpimDataException, IOException
 	{
 		final ContextHandlerCollection handlers = new ContextHandlerCollection();
 
diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java
index ea4b3dc..3a5fea7 100644
--- a/src/main/java/bdv/server/CellHandler.java
+++ b/src/main/java/bdv/server/CellHandler.java
@@ -1,5 +1,6 @@
 package bdv.server;
 
+import bdv.BigDataViewer;
 import bdv.img.cache.CacheHints;
 import bdv.img.cache.LoadingStrategy;
 import bdv.img.cache.VolatileCell;
@@ -54,25 +55,34 @@ public class CellHandler extends ContextHandler
 
 	private final String dataSetURL;
 
-	// Cached XML string for provideXML()
-	private String remoteXmlString = null;
+	/**
+	 * Cached dataset XML to be send to and opened by {@link BigDataViewer}
+	 * clients.
+	 */
+	private final String datasetXmlString;
+
+	/**
+	 * Cached JSON representation of the {@link RemoteImageLoaderMetaData} to be
+	 * send to clients.
+	 */
+	private final String metadataJson;
 
 	// Cached XML string for provideXML()
 	private boolean remoteSettingsChecked = false;
 
 	private String remoteSettingsString = null;
 
-	private final String metadataJson;
-
-	public CellHandler( final String baseUrl, final String xmlFilename ) throws SpimDataException
+	public CellHandler( final String baseUrl, final String xmlFilename ) throws SpimDataException, IOException
 	{
-		final SpimDataMinimal spimData = new XmlIoSpimDataMinimal().load( xmlFilename );
+		final XmlIoSpimDataMinimal io = new XmlIoSpimDataMinimal();
+		final SpimDataMinimal spimData = io.load( xmlFilename );
 		final SequenceDescriptionMinimal seq = spimData.getSequenceDescription();
 		final Hdf5ImageLoader imgLoader = ( Hdf5ImageLoader ) seq.getImgLoader();
 
 		cache = imgLoader.getCache();
 		cacheHints = new CacheHints( LoadingStrategy.BLOCKING, 0, false );
 
+		datasetXmlString = buildRemoteDatasetXML( io, spimData, baseUrl );
 		metadataJson = buildMetadataJsonString( imgLoader, seq );
 
 		// dataSetURL property is used for providing the XML file by replace
@@ -156,35 +166,13 @@ public class CellHandler extends ContextHandler
 
 	public void provideXML( final Request baseRequest, final HttpServletResponse response ) throws IOException, ServletException
 	{
-		if ( null == remoteXmlString )
-		{
-			try
-			{
-				final XmlIoSpimDataMinimal io = new XmlIoSpimDataMinimal();
-				final SpimDataMinimal spimData = io.load( xmlFilename );
-				final SequenceDescriptionMinimal seq = spimData.getSequenceDescription();
-				seq.setImgLoader( new RemoteImageLoader( dataSetURL ) );
-				final Document doc = new Document( io.toXml( spimData, spimData.getBasePath() ) );
-				final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() );
-
-				final StringWriter sw = new StringWriter();
-				xout.output( doc, sw );
-				remoteXmlString = sw.toString();
-			}
-			catch ( final SpimDataException e )
-			{
-				throw new ServletException( e );
-			}
-
-		}
-
 		response.setContentType( "application/xml" );
 		response.setCharacterEncoding( "UTF-8" );
 		response.setStatus( HttpServletResponse.SC_OK );
 		baseRequest.setHandled( true );
 
 		final PrintWriter ow = response.getWriter();
-		ow.write( remoteXmlString );
+		ow.write( datasetXmlString );
 		ow.close();
 	}
 
@@ -334,4 +322,18 @@ public class CellHandler extends ContextHandler
 		gsonBuilder.enableComplexMapKeySerialization();
 		return gsonBuilder.create().toJson( metadata );
 	}
+
+	/**
+	 * Create a modified dataset XML by replacing the ImageLoader with an
+	 * {@link RemoteImageLoader} pointing to the data we are serving.
+	 */
+	private static String buildRemoteDatasetXML( final XmlIoSpimDataMinimal io, final SpimDataMinimal spimData, final String baseUrl ) throws IOException, SpimDataException
+	{
+		final SpimDataMinimal s = new SpimDataMinimal( spimData, new RemoteImageLoader( baseUrl, false ) );
+		final Document doc = new Document( io.toXml( s, s.getBasePath() ) );
+		final XMLOutputter xout = new XMLOutputter( Format.getPrettyFormat() );
+		final StringWriter sw = new StringWriter();
+		xout.output( doc, sw );
+		return sw.toString();
+	}
 }
-- 
GitLab