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)); + } + }