Author: bodewig Date: Tue Jun 30 08:23:08 2009 New Revision: 789607 URL: http://svn.apache.org/viewvc?rev=789607&view=rev Log: Add a BZip2Utils class matching GZipUtils. Submitted by Jukka Zitting. COMPRESS-78
Added: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java (with props) commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/BZip2UtilsTestCase.java (with props) Modified: commons/proper/compress/trunk/src/changes/changes.xml Modified: commons/proper/compress/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=789607&r1=789606&r2=789607&view=diff ============================================================================== --- commons/proper/compress/trunk/src/changes/changes.xml (original) +++ commons/proper/compress/trunk/src/changes/changes.xml Tue Jun 30 08:23:08 2009 @@ -26,6 +26,10 @@ <action issue="COMPRESS-81" type="fix" date="2009-06-30"> TarOutputStream can leave garbage at the end of the archive </action> + <action issue="COMPRESS-78" type="add" date="2009-06-30" + due-to="Jukka Zitting"> + Add a BZip2Utils class modelled after GZipUtils + </action> </release> <release version="1.0" date="2009-05-21" description="First Public Release"> <action dev="all" type="add" date="2009-05-21"> Added: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java?rev=789607&view=auto ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java (added) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java Tue Jun 30 08:23:08 2009 @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.commons.compress.compressors.bzip2; + +import java.util.HashMap; +import java.util.Map; + +/** + * Utility code for the BZip2 compression format. + * @ThreadSafe + * @since Commons Compress 1.1 + */ +public abstract class BZip2Utils { + + /** + * Map from common filename suffixes of bzip2ed files to the corresponding + * suffixes of uncompressed files. For example: from ".tbz2" to ".tar". + * <p> + * This map also contains bzip2-specific suffixes like ".bz2". These + * suffixes are mapped to the empty string, as they should simply be + * removed from the filename when the file is uncompressed. + */ + private static final Map uncompressSuffix = new HashMap(); + + static { + uncompressSuffix.put(".tbz2", ".tar"); + uncompressSuffix.put(".tbz", ".tar"); + uncompressSuffix.put(".bz2", ""); + uncompressSuffix.put(".bz", ""); + } + // N.B. if any shorter or longer keys are added, ensure the for loop limits are changed + + /** Private constructor to prevent instantiation of this utility class. */ + private BZip2Utils() { + } + + /** + * Detects common bzip2 suffixes in the given filename. + * + * @param filename name of a file + * @return <code>true</code> if the filename has a common bzip2 suffix, + * <code>false</code> otherwise + */ + public static boolean isCompressedFilename(String filename) { + String lower = filename.toLowerCase(); + int n = lower.length(); + // Shortest suffix is three letters (.bz), longest is five (.tbz2) + for (int i = 3; i <= 5 && i < n; i++) { + if (uncompressSuffix.containsKey(lower.substring(n - i))) { + return true; + } + } + return false; + } + + /** + * Maps the given name of a bzip2-compressed file to the name that the + * file should have after uncompression. Commonly used file type specific + * suffixes like ".tbz" or ".tbz2" are automatically detected and + * correctly mapped. For example the name "package.tbz2" is mapped to + * "package.tar". And any filenames with the generic ".bz2" suffix + * (or any other generic bzip2 suffix) is mapped to a name without that + * suffix. If no bzip2 suffix is detected, then the filename is returned + * unmapped. + * + * @param filename name of a file + * @return name of the corresponding uncompressed file + */ + public static String getUncompressedFilename(String filename) { + String lower = filename.toLowerCase(); + int n = lower.length(); + // Shortest suffix is three letters (.bz), longest is five (.tbz2) + for (int i = 3; i <= 5 && i < n; i++) { + Object suffix = uncompressSuffix.get(lower.substring(n - i)); + if (suffix != null) { + return filename.substring(0, n - i) + suffix; + } + } + return filename; + } + + /** + * Maps the given filename to the name that the file should have after + * compression with bzip2. Currently this method simply appends the suffix + * ".bz2" to the filename based on the standard behaviour of the "bzip2" + * program, but a future version may implement a more complex mapping if + * a new widely used naming pattern emerges. + * + * @param filename name of a file + * @return name of the corresponding compressed file + */ + public static String getCompressedFilename(String filename) { + return filename + ".bz2"; + } + +} Propchange: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/BZip2UtilsTestCase.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/BZip2UtilsTestCase.java?rev=789607&view=auto ============================================================================== --- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/BZip2UtilsTestCase.java (added) +++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/BZip2UtilsTestCase.java Tue Jun 30 08:23:08 2009 @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.commons.compress.compressors; + +import org.apache.commons.compress.compressors.bzip2.BZip2Utils; + +import junit.framework.TestCase; + +public class BZip2UtilsTestCase extends TestCase { + + public void testIsCompressedFilename() { + assertFalse(BZip2Utils.isCompressedFilename("")); + assertFalse(BZip2Utils.isCompressedFilename(".gz")); + + assertTrue(BZip2Utils.isCompressedFilename("x.tbz2")); + assertTrue(BZip2Utils.isCompressedFilename("x.tbz")); + assertTrue(BZip2Utils.isCompressedFilename("x.bz2")); + assertTrue(BZip2Utils.isCompressedFilename("x.bz")); + + assertFalse(BZip2Utils.isCompressedFilename("xbz2")); + assertFalse(BZip2Utils.isCompressedFilename("xbz")); + + assertTrue(BZip2Utils.isCompressedFilename("x.TBZ2")); + assertTrue(BZip2Utils.isCompressedFilename("x.Tbz2")); + assertTrue(BZip2Utils.isCompressedFilename("x.tbZ2")); + + assertFalse(BZip2Utils.isCompressedFilename("x.bz ")); + assertFalse(BZip2Utils.isCompressedFilename("x.tbz\n")); + assertFalse(BZip2Utils.isCompressedFilename("x.tbz2.y")); + } + + public void testGetUncompressedFilename() { + assertEquals("", BZip2Utils.getUncompressedFilename("")); + assertEquals(".bz2", BZip2Utils.getUncompressedFilename(".bz2")); + + assertEquals("x.tar", BZip2Utils.getUncompressedFilename("x.tbz2")); + assertEquals("x.tar", BZip2Utils.getUncompressedFilename("x.tbz")); + assertEquals("x", BZip2Utils.getUncompressedFilename("x.bz2")); + assertEquals("x", BZip2Utils.getUncompressedFilename("x.bz")); + + assertEquals("x.tar", BZip2Utils.getUncompressedFilename("x.TBZ2")); + assertEquals("X.tar", BZip2Utils.getUncompressedFilename("X.Tbz2")); + assertEquals("X.tar", BZip2Utils.getUncompressedFilename("X.tbZ2")); + + assertEquals("x.bz ", BZip2Utils.getUncompressedFilename("x.bz ")); + assertEquals("x.tbz\n", BZip2Utils.getUncompressedFilename("x.tbz\n")); + assertEquals("x.tbz2.y", BZip2Utils.getUncompressedFilename("x.tbz2.y")); + } + + public void testGetCompressedFilename() { + assertEquals(".bz2", BZip2Utils.getCompressedFilename("")); + assertEquals(" .bz2", BZip2Utils.getCompressedFilename(" ")); + assertEquals("x.bz2", BZip2Utils.getCompressedFilename("x")); + assertEquals("X.bz2", BZip2Utils.getCompressedFilename("X")); + assertEquals("x.tar.bz2", BZip2Utils.getCompressedFilename("x.tar")); + assertEquals("x.TAR.bz2", BZip2Utils.getCompressedFilename("x.TAR")); + } + +} Propchange: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/compressors/BZip2UtilsTestCase.java ------------------------------------------------------------------------------ svn:eol-style = native