From 3802b06fd0dcfc47c7bf31532a1f50dc0e78bc02 Mon Sep 17 00:00:00 2001 From: Vojtech Moravec <vojtech.moravec.st@vsb.cz> Date: Tue, 15 Sep 2020 21:38:03 +0200 Subject: [PATCH] Fix incorrect response. We have to set content length before we write to output stream. Because of this we have to use memory stream to compress data and then dump this stream to response stream, after we set the content length. --- src/main/java/bdv/server/CellHandler.java | 38 ++++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/main/java/bdv/server/CellHandler.java b/src/main/java/bdv/server/CellHandler.java index a320ef1..e11e818 100644 --- a/src/main/java/bdv/server/CellHandler.java +++ b/src/main/java/bdv/server/CellHandler.java @@ -4,7 +4,11 @@ import azgracompress.cache.ICacheFile; import azgracompress.cache.QuantizationCacheManager; import azgracompress.compression.CompressionOptions; import azgracompress.compression.ImageCompressor; +import azgracompress.data.V3i; import azgracompress.io.FileInputData; +import azgracompress.io.FlatBufferInputData; +import azgracompress.io.InputData; +import azgracompress.io.MemoryOutputStream; import bdv.BigDataViewer; import bdv.cache.CacheHints; import bdv.cache.LoadingStrategy; @@ -97,6 +101,7 @@ public class CellHandler extends ContextHandler { private final CompressionOptions compressionParams; private ICacheFile compressionCacheFile = null; private ImageCompressor compressor = null; + private MemoryOutputStream cachedCompressionStream = null; public CellHandler(final String baseUrl, final String xmlFilename, final String datasetName, final String thumbnailsDirectory, final CompressionOptions compressionParams) throws SpimDataException, IOException { @@ -129,18 +134,17 @@ public class CellHandler extends ContextHandler { private void initializeCompression() { if (compressionParams == null) return; - this.compressionParams.setInputDataInfo(new FileInputData(this.baseFilename)); - compressor = new ImageCompressor(compressionParams); - QuantizationCacheManager qcm = new QuantizationCacheManager(compressionParams.getCodebookCacheFolder()); this.compressionCacheFile = qcm.loadCacheFile(compressionParams); - if (compressionCacheFile != null) { - - LOG.info("CellHandler loaded codebook cache file. '" + compressionCacheFile.toString() + "'"); - System.out.println("\u001b[33mCellHandler::initializeCompression() loaded codebook cache file. '" + - compressionCacheFile.toString() + "'\u001b[0m"); + if (compressionCacheFile == null) { + return; } + LOG.info("CellHandler loaded codebook cache file. '" + compressionCacheFile + "'"); + System.out.println("\u001b[33mCellHandler::initializeCompression() loaded codebook cache file for: " + baseFilename + "\u001b[0m"); + + compressor = new ImageCompressor(compressionParams, compressionCacheFile); + cachedCompressionStream = new MemoryOutputStream(4096); } private short[] getCachedVolatileCellData(final String[] parts, final int[] cellDims) { @@ -164,6 +168,10 @@ public class CellHandler extends ContextHandler { return ((VolatileCell<VolatileShortArray>) cell).getData().getCurrentStorageArray(); } + private FlatBufferInputData createInputDataObject(final short[] data, final int[] cellDims) { + return new FlatBufferInputData(data, new V3i(cellDims[0], cellDims[1], cellDims[2]), InputData.PixelType.Gray16, this.baseFilename); + } + @Override public void doHandle(final String target, final Request baseRequest, @@ -217,12 +225,17 @@ public class CellHandler extends ContextHandler { final int[] cellDims = new int[]{Integer.parseInt(parts[5]), Integer.parseInt(parts[6]), Integer.parseInt(parts[7])}; final short[] data = getCachedVolatileCellData(parts, cellDims); - final OutputStream responseStream = response.getOutputStream(); assert (compressor != null); - final int contentLength = compressor.streamCompress(responseStream); - responseStream.close(); - response.setContentLength(contentLength); + compressor.setInputData(createInputDataObject(data, cellDims)); + + cachedCompressionStream.reset(); + final int compressedContentLength = compressor.streamCompressChunk(cachedCompressionStream); + response.setContentLength(compressedContentLength); + + try (OutputStream responseStream = response.getOutputStream()) { + responseStream.write(cachedCompressionStream.getBuffer(), 0, cachedCompressionStream.getCurrentBufferLength()); + } response.setContentType("application/octet-stream"); response.setStatus(HttpServletResponse.SC_OK); @@ -241,6 +254,7 @@ public class CellHandler extends ContextHandler { try (DataOutputStream dos = new DataOutputStream(response.getOutputStream())) { compressionCacheFile.writeToStream(dos); } + response.getOutputStream().close(); response.setContentType("application/octet-stream"); response.setStatus(HttpServletResponse.SC_OK); -- GitLab