Author: bodewig
Date: Mon Aug 11 08:03:21 2014
New Revision: 1617217

URL: http://svn.apache.org/r1617217
Log:
COMPRESS-285 only check for XZ for Java's presence when really faced with an XZ 
stream

Modified:
    
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
    
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java
    
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/XZUtilsTestCase.java

Modified: 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java?rev=1617217&r1=1617216&r2=1617217&view=diff
==============================================================================
--- 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
 (original)
+++ 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/CompressorStreamFactory.java
 Mon Aug 11 08:03:21 2014
@@ -186,8 +186,8 @@ public class CompressorStreamFactory {
                 return new ZCompressorInputStream(in);
             }
 
-            if (XZUtils.isXZCompressionAvailable() &&
-                XZCompressorInputStream.matches(signature, signatureLength)) {
+            if (XZUtils.matches(signature, signatureLength) &&
+                XZUtils.isXZCompressionAvailable()) {
                 return new XZCompressorInputStream(in, decompressConcatenated);
             }
 

Modified: 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java?rev=1617217&r1=1617216&r2=1617217&view=diff
==============================================================================
--- 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java
 (original)
+++ 
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java
 Mon Aug 11 08:03:21 2014
@@ -30,6 +30,15 @@ import org.apache.commons.compress.compr
 public class XZUtils {
 
     private static final FileNameUtil fileNameUtil;
+    /**
+     * XZ Header Magic Bytes begin a XZ file.
+     *
+     * <p>This is a copy of {@code org.tukaani.xz.XZ.HEADER_MAGIC} in
+     * XZ for Java version 1.5.</p>
+     */
+    private static final byte[] HEADER_MAGIC = {
+        (byte) 0xFD, '7', 'z', 'X', 'Z', '\0'
+    };
 
     static {
         Map<String, String> uncompressSuffix = new HashMap<String, String>();
@@ -44,6 +53,32 @@ public class XZUtils {
     }
 
     /**
+     * Checks if the signature matches what is expected for a .xz file.
+     *
+     * <p>This is more or less a copy of the version found in {@link
+     * XZCompressorInputStream} but doesn't depend on the presence of
+     * XZ for Java.</p>
+     *
+     * @param   signature     the bytes to check
+     * @param   length        the number of bytes to check
+     * @return  true if signature matches the .xz magic bytes, false otherwise
+     * @since 1.9
+     */
+    public static boolean matches(byte[] signature, int length) {
+        if (length < HEADER_MAGIC.length) {
+            return false;
+        }
+
+        for (int i = 0; i < HEADER_MAGIC.length; ++i) {
+            if (signature[i] != HEADER_MAGIC[i]) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
      * Are the classes required to support XZ compression available?
      * @since 1.5
      */

Modified: 
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/XZUtilsTestCase.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/XZUtilsTestCase.java?rev=1617217&r1=1617216&r2=1617217&view=diff
==============================================================================
--- 
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/XZUtilsTestCase.java
 (original)
+++ 
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/XZUtilsTestCase.java
 Mon Aug 11 08:03:21 2014
@@ -65,4 +65,15 @@ public class XZUtilsTestCase extends Tes
         assertEquals("x.wmf.y.xz", XZUtils.getCompressedFilename("x.wmf.y"));
     }
 
+    public void testMatches() {
+        byte[] data = {
+            (byte) 0xFD, '7', 'z', 'X', 'Z', '\0'
+        };
+        assertFalse(XZUtils.matches(data, 5));
+        assertTrue(XZUtils.matches(data, 6));
+        assertTrue(XZUtils.matches(data, 7));
+        data[5] = '0';
+        assertFalse(XZUtils.matches(data, 6));
+    }
+
 }


Reply via email to