From 91e63c6dea312dde84c64b103a641694c52f5f0a Mon Sep 17 00:00:00 2001 From: nitram509 Date: Mon, 25 Jul 2016 23:11:57 +0200 Subject: [PATCH] SHELF implement finish() --- .../org/meteogroup/jbrotli/BrotliStreamCompressor.java | 5 +++-- .../meteogroup/jbrotli/BrotliStreamDeCompressor.java | 2 +- .../org/meteogroup/jbrotli/io/BrotliOutputStream.java | 10 ++++++++++ .../jbrotli/BrotliStreamCompressorByteArrayTest.java | 8 ++++++++ .../meteogroup/jbrotli/io/BrotliOutputStreamTest.java | 8 ++++---- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/jbrotli/src/main/java/org/meteogroup/jbrotli/BrotliStreamCompressor.java b/jbrotli/src/main/java/org/meteogroup/jbrotli/BrotliStreamCompressor.java index 0cebbda..1e7cf59 100644 --- a/jbrotli/src/main/java/org/meteogroup/jbrotli/BrotliStreamCompressor.java +++ b/jbrotli/src/main/java/org/meteogroup/jbrotli/BrotliStreamCompressor.java @@ -23,7 +23,7 @@ import static java.lang.Math.min; import static org.meteogroup.jbrotli.BrotliErrorChecker.assertBrotliOk; -public final class BrotliStreamCompressor implements Closeable { +public final class BrotliStreamCompressor implements Closeable, AutoCloseable { static { assertBrotliOk(initJavaFieldIdCache()); @@ -119,10 +119,11 @@ public final int getMaxInputBufferSize() throws BrotliException { * Every stream must be finished, to create byte byte meta data according to the specification. * If a stream is NOT finished, de-compressors are unable to parse a stream (find the end), * which results in an error. + * This method also flushes the stream. * @return the last bytes, to close the stream. */ public final byte[] finishStream() { - return compressBytes(new byte[0], 0, 0, false, true); + return compressBytes(new byte[0], 0, 0, true, true); } @Override diff --git a/jbrotli/src/main/java/org/meteogroup/jbrotli/BrotliStreamDeCompressor.java b/jbrotli/src/main/java/org/meteogroup/jbrotli/BrotliStreamDeCompressor.java index bb75bec..3a07751 100644 --- a/jbrotli/src/main/java/org/meteogroup/jbrotli/BrotliStreamDeCompressor.java +++ b/jbrotli/src/main/java/org/meteogroup/jbrotli/BrotliStreamDeCompressor.java @@ -23,7 +23,7 @@ import static org.meteogroup.jbrotli.BrotliError.DECOMPRESS_BROTLI_RESULT_NEEDS_MORE_OUTPUT; import static org.meteogroup.jbrotli.BrotliErrorChecker.assertBrotliOk; -public final class BrotliStreamDeCompressor implements Closeable { +public final class BrotliStreamDeCompressor implements Closeable, AutoCloseable { static { assertBrotliOk(initJavaFieldIdCache()); diff --git a/jbrotli/src/main/java/org/meteogroup/jbrotli/io/BrotliOutputStream.java b/jbrotli/src/main/java/org/meteogroup/jbrotli/io/BrotliOutputStream.java index d32b359..46c1126 100644 --- a/jbrotli/src/main/java/org/meteogroup/jbrotli/io/BrotliOutputStream.java +++ b/jbrotli/src/main/java/org/meteogroup/jbrotli/io/BrotliOutputStream.java @@ -89,4 +89,14 @@ public void close() throws IOException { public int getBrotliCompressionBufferSize() throws BrotliException { return brotliStreamCompressor.getMaxInputBufferSize(); } + + /** + * Write "finish" stream byte markers into the resulting stream. + * This is a mandatory step, to explicitly finish a brotli stream + * @throws IOException + * @see {@link BrotliStreamCompressor#finishStream()} + */ + public void finish() throws IOException { + outputStream.write(brotliStreamCompressor.finishStream()); + } } diff --git a/jbrotli/src/test/java/org/meteogroup/jbrotli/BrotliStreamCompressorByteArrayTest.java b/jbrotli/src/test/java/org/meteogroup/jbrotli/BrotliStreamCompressorByteArrayTest.java index d31a03f..09afab4 100644 --- a/jbrotli/src/test/java/org/meteogroup/jbrotli/BrotliStreamCompressorByteArrayTest.java +++ b/jbrotli/src/test/java/org/meteogroup/jbrotli/BrotliStreamCompressorByteArrayTest.java @@ -48,11 +48,19 @@ public void tearDown() throws Exception { @Test public void compress_with_byte_array_and_flushing() throws Exception { byte[] out = compressor.compressArray(A_BYTES, true); +// out = concat(out, compressor.finishStream()); assertThat(out).hasSize(10); assertThat(out).isEqualTo(A_BYTES_COMPRESSED); } + private byte[] concat(byte[] bytes1, byte[] bytes2) { + byte[] result = new byte[bytes1.length + bytes2.length]; + System.arraycopy(bytes1, 0, result, 0, bytes1.length); + System.arraycopy(bytes2, 0, result, bytes1.length, bytes2.length); + return result; + } + @Test public void compress_with_byte_array_without_flushing() throws Exception { diff --git a/jbrotli/src/test/java/org/meteogroup/jbrotli/io/BrotliOutputStreamTest.java b/jbrotli/src/test/java/org/meteogroup/jbrotli/io/BrotliOutputStreamTest.java index 9b8f87c..81a24c5 100644 --- a/jbrotli/src/test/java/org/meteogroup/jbrotli/io/BrotliOutputStreamTest.java +++ b/jbrotli/src/test/java/org/meteogroup/jbrotli/io/BrotliOutputStreamTest.java @@ -59,7 +59,7 @@ public void byte_wise_compression_works() throws Exception { for (int i : testBytes) { brotliOutputStream.write(i); } - brotliOutputStream.flush(); + brotliOutputStream.finish(); // then assertThat(decompress(baos.toByteArray(), testBytes.length)).isEqualTo(testBytes); @@ -70,7 +70,7 @@ public void byte_array_wise_compression_works() throws Exception { // when brotliOutputStream.write(testBytes); - brotliOutputStream.flush(); + brotliOutputStream.finish(); // then assertThat(decompress(baos.toByteArray(), testBytes.length)).isEqualTo(testBytes); @@ -85,7 +85,7 @@ public void big_byte_array_gets_compressed_when_underlying_brotli_compressor_is_ // when brotliOutputStream.write(testBytes); - brotliOutputStream.flush(); + brotliOutputStream.finish(); // then assertThat(decompress(baos.toByteArray(), testBytes.length)).isEqualTo(testBytes); @@ -96,7 +96,7 @@ public void byte_array_length_and_offset_wise_compression_works() throws Excepti // when brotliOutputStream.write(testBytes, 10, 100); - brotliOutputStream.flush(); + brotliOutputStream.finish(); // then byte[] decompressed = decompress(baos.toByteArray(), testBytes.length);