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:27:07 UTC

svn commit: r1303135 - in /commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar: TarArchiveEntry.java TarArchiveOutputStream.java TarUtils.java

Author: bodewig
Date: Tue Mar 20 20:27:07 2012
New Revision: 1303135

URL: http://svn.apache.org/viewvc?rev=1303135&view=rev
Log:
allow the encoding to be specified when writing tar archives

Modified:
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
    commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
    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/TarArchiveEntry.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java?rev=1303135&r1=1303134&r2=1303135&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java Tue Mar 20 20:27:07 2012
@@ -811,22 +811,34 @@ public class TarArchiveEntry implements 
      * @param outbuf The tar entry header buffer to fill in.
      */
     public void writeEntryHeader(byte[] outbuf) {
-        writeEntryHeader(outbuf, false);
+        try {
+            writeEntryHeader(outbuf, TarUtils.DEFAULT_ENCODING, false);
+        } catch (IOException ex) {
+            try {
+                writeEntryHeader(outbuf, TarUtils.FALLBACK_ENCODING, false);
+            } catch (IOException ex2) {
+                // impossible
+                throw new RuntimeException(ex2);
+            }
+        }
     }
 
     /**
      * Write an entry's header information to a header buffer.
      *
      * @param outbuf The tar entry header buffer to fill in.
+     * @param encoding encoding to use when writing the file name.
      * @param starMode whether to use the star/GNU tar/BSD tar
      * extension for numeric fields if their value doesn't fit in the
      * maximum size of standard tar archives
      * @since Apache Commons Compress 1.4
      */
-    public void writeEntryHeader(byte[] outbuf, boolean starMode) {
+    public void writeEntryHeader(byte[] outbuf, ZipEncoding encoding,
+                                 boolean starMode) throws IOException {
         int offset = 0;
 
-        offset = TarUtils.formatNameBytes(name, outbuf, offset, NAMELEN);
+        offset = TarUtils.formatNameBytes(name, outbuf, offset, NAMELEN,
+                                          encoding);
         offset = writeEntryHeaderField(mode, outbuf, offset, MODELEN, starMode);
         offset = writeEntryHeaderField(userId, outbuf, offset, UIDLEN,
                                        starMode);
@@ -843,11 +855,14 @@ public class TarArchiveEntry implements 
         }
 
         outbuf[offset++] = linkFlag;
-        offset = TarUtils.formatNameBytes(linkName, outbuf, offset, NAMELEN);
+        offset = TarUtils.formatNameBytes(linkName, outbuf, offset, NAMELEN,
+                                          encoding);
         offset = TarUtils.formatNameBytes(magic, outbuf, offset, MAGICLEN);
         offset = TarUtils.formatNameBytes(version, outbuf, offset, VERSIONLEN);
-        offset = TarUtils.formatNameBytes(userName, outbuf, offset, UNAMELEN);
-        offset = TarUtils.formatNameBytes(groupName, outbuf, offset, GNAMELEN);
+        offset = TarUtils.formatNameBytes(userName, outbuf, offset, UNAMELEN,
+                                          encoding);
+        offset = TarUtils.formatNameBytes(groupName, outbuf, offset, GNAMELEN,
+                                          encoding);
         offset = writeEntryHeaderField(devMajor, outbuf, offset, DEVLEN,
                                        starMode);
         offset = writeEntryHeaderField(devMinor, outbuf, offset, DEVLEN,

Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java?rev=1303135&r1=1303134&r2=1303135&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java (original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java Tue Mar 20 20:27:07 2012
@@ -254,7 +254,8 @@ public class TarArchiveOutputStream exte
         }
         TarArchiveEntry entry = (TarArchiveEntry) archiveEntry;
         Map<String, String> paxHeaders = new HashMap<String, String>();
-        if (entry.getName().length() >= TarConstants.NAMELEN) {
+        final byte[] nameBytes = encoding.encode(entry.getName()).array();
+        if (nameBytes.length >= TarConstants.NAMELEN) {
 
             if (longFileMode == LONGFILE_POSIX) {
                 paxHeaders.put("path", entry.getName());
@@ -264,7 +265,6 @@ public class TarArchiveOutputStream exte
                 TarArchiveEntry longLinkEntry = new TarArchiveEntry(TarConstants.GNU_LONGLINK,
                                                                     TarConstants.LF_GNUTYPE_LONGNAME);
 
-                final byte[] nameBytes = ArchiveUtils.toAsciiBytes(entry.getName());
                 longLinkEntry.setSize(nameBytes.length + 1); // +1 for NUL
                 putArchiveEntry(longLinkEntry);
                 write(nameBytes);
@@ -287,7 +287,8 @@ public class TarArchiveOutputStream exte
             writePaxHeaders(entry.getName(), paxHeaders);
         }
 
-        entry.writeEntryHeader(recordBuf, bigNumberMode == BIGNUMBER_STAR);
+        entry.writeEntryHeader(recordBuf, encoding,
+                               bigNumberMode == BIGNUMBER_STAR);
         buffer.writeRecord(recordBuf);
 
         currBytes = 0;

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=1303135&r1=1303134&r2=1303135&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:27:07 2012
@@ -41,7 +41,7 @@ public class TarUtils {
      * Encapsulates the algorithms used up to Commons Compress 1.3 as
      * ZipEncoding.
      */
-    private static final ZipEncoding FALLBACK_ENCODING = new ZipEncoding() {
+    static final ZipEncoding FALLBACK_ENCODING = new ZipEncoding() {
             public boolean canEncode(String name) { return true; }
 
             public ByteBuffer encode(String name) {