You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bo...@apache.org on 2012/03/20 21:08:49 UTC

svn commit: r1303122 - /commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarUtils.java

Author: bodewig
Date: Tue Mar 20 20:08:49 2012
New Revision: 1303122

URL: http://svn.apache.org/viewvc?rev=1303122&view=rev
Log:
extract the old encoding/decoding methods into a ZipEncoding implementation and use ZipEncoding consistently

Modified:
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarUtils.java

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarUtils.java?rev=1303122&r1=1303121&r2=1303122&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarUtils.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarUtils.java Tue Mar 20 20:08:49 2012
@@ -37,6 +37,40 @@ public class TarUtils {
     static final ZipEncoding DEFAULT_ENCODING =
         ZipEncodingHelper.getZipEncoding(null);
 
+    /**
+     * Encapsulates the algorithms used up to Commons Compress 1.3 as
+     * ZipEncoding.
+     */
+    private static final ZipEncoding FALLBACK_ENCODING = new ZipEncoding() {
+            public boolean canEncode(String name) { return true; }
+
+            public ByteBuffer encode(String name) {
+                final int length = name.length();
+                byte[] buf = new byte[length];
+
+                // copy until end of input or output is reached.
+                for (int i = 0; i < length; ++i) {
+                    buf[i] = (byte) name.charAt(i);
+                }
+                return ByteBuffer.wrap(buf);
+            }
+
+            public String decode(byte[] buffer) {
+                final int length = buffer.length;
+                StringBuffer result = new StringBuffer(length);
+
+                for (int i = 0; i < length; ++i) {
+                    byte b = buffer[i];
+                    if (b == 0) { // Trailing null
+                        break;
+                    }
+                    result.append((char) (b & 0xFF)); // Allow for sign-extension
+                }
+
+                return result.toString();
+            }
+        };
+
     /** Private constructor to prevent instantiation of this utility class. */
     private TarUtils(){    
     }
@@ -221,28 +255,13 @@ public class TarUtils {
         try {
             return parseName(buffer, offset, length, DEFAULT_ENCODING);
         } catch (IOException ex) {
-            return parseNameFallback(buffer, offset, length);
-        }
-    }
-
-    /*
-     * Used if default encoding cannot encode name and no explicit
-     * encoding has been specified.
-     */
-    private static String parseNameFallback(byte[] buffer, final int offset,
-                                            final int length) {
-        StringBuffer result = new StringBuffer(length);
-        int          end = offset + length;
-
-        for (int i = offset; i < end; ++i) {
-            byte b = buffer[i];
-            if (b == 0) { // Trailing null
-                break;
+            try {
+                return parseName(buffer, offset, length, FALLBACK_ENCODING);
+            } catch (IOException ex2) {
+                // impossible
+                throw new RuntimeException(ex2);
             }
-            result.append((char) (b & 0xFF)); // Allow for sign-extension
         }
-
-        return result.toString();
     }
 
     /**
@@ -295,34 +314,18 @@ public class TarUtils {
         try {
             return formatNameBytes(name, buf, offset, length, DEFAULT_ENCODING);
         } catch (IOException ex) {
-            return formatNameBytesFallback(name, buf, offset, length);
-        }
-    }
-
-    /*
-     * Used if default encoding cannot format name and no explicit encoding
-     * has been specified.
-     */
-    private static int formatNameBytesFallback(String name, byte[] buf,
-                                               final int offset,
-                                               final int length) {
-        int i;
-
-        // copy until end of input or output is reached.
-        for (i = 0; i < length && i < name.length(); ++i) {
-            buf[offset + i] = (byte) name.charAt(i);
-        }
-
-        // Pad any remaining output bytes with NUL
-        for (; i < length; ++i) {
-            buf[offset + i] = 0;
+            try {
+                return formatNameBytes(name, buf, offset, length,
+                                       FALLBACK_ENCODING);
+            } catch (IOException ex2) {
+                // impossible
+                throw new RuntimeException(ex2);
+            }
         }
-
-        return offset + length;
     }
 
     /**
-     * Copy a name (StringBuffer) into a buffer.
+     * Copy a name into a buffer.
      * Copies characters from the name into the buffer
      * starting at the specified offset. 
      * If the buffer is longer than the name, the buffer
@@ -554,4 +557,5 @@ public class TarUtils {
 
         return sum;
     }
+
 }