You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2016/09/20 12:47:49 UTC

svn commit: r1761567 - in /qpid/java/trunk/broker-plugins/management-http/src: main/java/org/apache/qpid/server/management/plugin/GunzipOutputStream.java test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java

Author: kwall
Date: Tue Sep 20 12:47:49 2016
New Revision: 1761567

URL: http://svn.apache.org/viewvc?rev=1761567&view=rev
Log:
QPID-7408: Minor tidy-ups to implementation of GunzipOutputStream

Modified:
    qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/GunzipOutputStream.java
    qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java

Modified: qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/GunzipOutputStream.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/GunzipOutputStream.java?rev=1761567&r1=1761566&r2=1761567&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/GunzipOutputStream.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/GunzipOutputStream.java Tue Sep 20 12:47:49 2016
@@ -37,8 +37,8 @@ public class GunzipOutputStream extends
     private final GZIPHeader _header = new GZIPHeader();
     private final GZIPTrailer _trailer = new GZIPTrailer();
     private final byte[] _singleByteArray = new byte[1];
-    private StreamState _streamState = StreamState.HEADER_PARSING;
     private final CRC32 _crc;
+    private StreamState _streamState = StreamState.HEADER_PARSING;
 
     public GunzipOutputStream(final OutputStream targetOutputStream)
     {
@@ -49,49 +49,51 @@ public class GunzipOutputStream extends
     @Override
     public void write(final byte data[], final int offset, final int length) throws IOException
     {
-        ByteArrayInputStream bais = new ByteArrayInputStream(data, offset, length);
-        int b;
-        while ((b = bais.read()) != -1)
+        try(ByteArrayInputStream bais = new ByteArrayInputStream(data, offset, length))
         {
-            if (_streamState == StreamState.DONE)
-            {
-                // another member is coming
-                _streamState = StreamState.HEADER_PARSING;
-                _crc.reset();
-                _header.reset();
-                _trailer.reset();
-                inf.reset();
-            }
-
-            if (_streamState == StreamState.HEADER_PARSING)
+            int b;
+            while ((b = bais.read()) != -1)
             {
-                _header.headerByte(b);
-                if (_header.getState() == HeaderState.DONE)
+                if (_streamState == StreamState.DONE)
                 {
-                    _streamState = StreamState.INFLATING;
-                    continue;
+                    // another member is coming
+                    _streamState = StreamState.HEADER_PARSING;
+                    _crc.reset();
+                    _header.reset();
+                    _trailer.reset();
+                    inf.reset();
                 }
-            }
 
-            if (_streamState == StreamState.INFLATING)
-            {
-                _singleByteArray[0] = (byte) b;
-                super.write(_singleByteArray, 0, 1);
+                if (_streamState == StreamState.HEADER_PARSING)
+                {
+                    _header.headerByte(b);
+                    if (_header.getState() == HeaderState.DONE)
+                    {
+                        _streamState = StreamState.INFLATING;
+                        continue;
+                    }
+                }
 
-                if (inf.finished())
+                if (_streamState == StreamState.INFLATING)
                 {
-                    _streamState = StreamState.TRAILER_PARSING;
-                    continue;
+                    _singleByteArray[0] = (byte) b;
+                    super.write(_singleByteArray, 0, 1);
+
+                    if (inf.finished())
+                    {
+                        _streamState = StreamState.TRAILER_PARSING;
+                        continue;
+                    }
                 }
-            }
 
-            if (_streamState == StreamState.TRAILER_PARSING)
-            {
-                if (_trailer.trailerByte(b))
+                if (_streamState == StreamState.TRAILER_PARSING)
                 {
-                    _trailer.verify(_crc);
-                    _streamState = StreamState.DONE;
-                    continue;
+                    if (_trailer.trailerByte(b))
+                    {
+                        _trailer.verify(_crc);
+                        _streamState = StreamState.DONE;
+                        continue;
+                    }
                 }
             }
         }
@@ -267,7 +269,7 @@ public class GunzipOutputStream extends
             else
             {
                 throw new IOException(
-                        "Received bytes exceeds GZIP trailer length. Multipe memeber support is not implemented");
+                        String.format("Received too many GZIP trailer bytes. Expecting %d bytes.", TRAILER_SIZE));
             }
         }
 
@@ -275,12 +277,12 @@ public class GunzipOutputStream extends
         {
             try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(_trailerBytes)))
             {
-                long crc32 = readLittleEndianInt(in);
+                long crc32 = readLittleEndianLong(in);
                 if (crc32 != crc.getValue())
                 {
                     throw new IOException("crc32 mismatch. Gzip-compressed data is corrupted");
                 }
-                long isize = readLittleEndianInt(in);
+                long isize = readLittleEndianLong(in);
                 if (isize != (inf.getBytesWritten() & SIZE_MASK))
                 {
                     throw new IOException("Uncompressed size mismatch. Gzip-compressed data is corrupted");
@@ -288,7 +290,7 @@ public class GunzipOutputStream extends
             }
         }
 
-        private long readLittleEndianInt(final DataInputStream inData) throws IOException
+        private long readLittleEndianLong(final DataInputStream inData) throws IOException
         {
             return inData.readUnsignedByte()
                    | (inData.readUnsignedByte() << 8)

Modified: qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java
URL: http://svn.apache.org/viewvc/qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java?rev=1761567&r1=1761566&r2=1761567&view=diff
==============================================================================
--- qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java (original)
+++ qpid/java/trunk/broker-plugins/management-http/src/test/java/org/apache/qpid/server/management/plugin/GunzipOutputStreamTest.java Tue Sep 20 12:47:49 2016
@@ -20,13 +20,15 @@
 
 package org.apache.qpid.server.management.plugin;
 
+import static org.junit.Assert.assertArrayEquals;
+
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.zip.GZIPOutputStream;
+import java.nio.ByteBuffer;
 
 import javax.xml.bind.DatatypeConverter;
 
 import org.apache.qpid.test.utils.QpidTestCase;
+import org.apache.qpid.util.GZIPUtils;
 
 
 public class GunzipOutputStreamTest extends QpidTestCase
@@ -43,72 +45,49 @@ public class GunzipOutputStreamTest exte
     private static final String TEST_TEXT = "This is test";
     private static final String TEST_TEXT2 = "Another test text";
 
-    public void testDecompressing() throws IOException
+    public void testDecompressing() throws Exception
     {
-        String testText = generateTestText();
-        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        GunzipOutputStream adapter = new GunzipOutputStream(outputStream);
+        final byte[] originalUncompressedInput = generateTestBytes();
+        final byte[] compressedBytes = GZIPUtils.compressBufferToArray(ByteBuffer.wrap(originalUncompressedInput));
 
-        compressAndDecompressWithAdapter(testText, adapter);
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        GunzipOutputStream guos = new GunzipOutputStream(outputStream);
+        guos.write(compressedBytes);
+        guos.close();
 
-        assertEquals("Unexpected content", testText, new String(outputStream.toByteArray()));
+        assertArrayEquals("Unexpected content", originalUncompressedInput, outputStream.toByteArray());
     }
 
-    public void testDecompressingWithFileName() throws IOException
+    public void testDecompressingWithEmbeddedFileName() throws Exception
     {
         byte[] data = DatatypeConverter.parseBase64Binary(GZIP_CONTENT_WITH_EMBEDDED_FILE_NAME);
 
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        GunzipOutputStream adapter = new GunzipOutputStream(outputStream);
-        adapter.write(data);
+        GunzipOutputStream guos = new GunzipOutputStream(outputStream);
+        guos.write(data);
+        guos.close();
 
         assertEquals("Unexpected content", TEST_TEXT, new String(outputStream.toByteArray()));
     }
 
-    public void testDecompressingMultipleMembers() throws IOException
+    public void testDecompressingMultipleMembers() throws Exception
     {
         byte[] data = DatatypeConverter.parseBase64Binary(GZIP_CONTENT_WITH_MULTIPLE_MEMBERS);
 
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
-        GunzipOutputStream adapter = new GunzipOutputStream(outputStream);
+        GunzipOutputStream guos = new GunzipOutputStream(outputStream);
         for (int i = 0; i < data.length; i++)
         {
-            adapter.write(data[i]);
+            guos.write(data[i]);
         }
+        guos.close();
 
         StringBuilder expected = new StringBuilder(TEST_TEXT);
         expected.append(TEST_TEXT2);
         assertEquals("Unexpected content", expected.toString(), new String(outputStream.toByteArray()));
     }
 
-    private void compressAndDecompressWithAdapter(final String testText, final GunzipOutputStream adapter)
-            throws IOException
-    {
-        byte[] data = compress(testText);
-        byte[] buffer = new byte[256];
-        int remaining = data.length;
-        int written = 0;
-        while (remaining > 0)
-        {
-            int length = Math.min(remaining, buffer.length);
-            System.arraycopy(data, written, buffer, 0, length);
-            adapter.write(buffer, 0, length);
-            written += length;
-            remaining -= length;
-        }
-    }
-
-    private byte[] compress(final String testText) throws IOException
-    {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (GZIPOutputStream zipStream = new GZIPOutputStream(baos))
-        {
-            zipStream.write(testText.getBytes());
-        }
-        return baos.toByteArray();
-    }
-
-    private String generateTestText()
+    private byte[] generateTestBytes()
     {
         StringBuilder sb = new StringBuilder();
         int i = 0;
@@ -124,6 +103,6 @@ public class GunzipOutputStreamTest exte
             }
             sb.append(" ").append(i++);
         }
-        return sb.toString();
+        return sb.toString().getBytes();
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org