Author: bodewig
Date: Wed Feb 25 16:09:12 2009
New Revision: 747841

URL: http://svn.apache.org/viewvc?rev=747841&view=rev
Log:
add an option to implicitly create Unicode Extra Fields in 
ZiparchiveOutputStream

Modified:
    
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
    
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java
    
commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java

Modified: 
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java?rev=747841&r1=747840&r2=747841&view=diff
==============================================================================
--- 
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
 (original)
+++ 
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
 Wed Feb 25 16:09:12 2009
@@ -270,6 +270,11 @@
     private boolean useEFS = true; 
 
     /**
+     * whether to create UnicodePathExtraField-s for each entry.
+     */
+    private boolean createUnicodeExtraFields = false;
+
+    /**
      * Creates a new ZIP OutputStream filtering the underlying stream.
      * @param out the outputstream to zip
      * @since 1.1
@@ -355,6 +360,15 @@
     }
 
     /**
+     * Whether to create Unicode Extra Fields for all entries.
+     *
+     * <p>Defaults to false.</p>
+     */
+    public void setCreateUnicodeExtraFields(boolean b) {
+        createUnicodeExtraFields = b;
+    }
+
+    /**
      * Finishs writing the contents and closes this as well as the
      * underlying stream.
      *
@@ -450,6 +464,14 @@
         closeEntry();
 
         entry = ze;
+        if (createUnicodeExtraFields) {
+            ze.addExtraField(new UnicodePathExtraField(ze.getName(),
+                                                       encoding));
+            if (ze.getComment() != null) {
+                ze.addExtraField(new UnicodeCommentExtraField(ze.getComment(),
+                                                              encoding));
+            }
+        }
         entries.add(entry);
 
         if (entry.getMethod() == -1) { // not specified

Modified: 
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java?rev=747841&r1=747840&r2=747841&view=diff
==============================================================================
--- 
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java
 (original)
+++ 
commons/sandbox/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java
 Wed Feb 25 16:09:12 2009
@@ -75,17 +75,23 @@
      * </pre>
      * 
      * @param name The filename or comment with possible non-ASCII
-     * unicode characters.
+     * unicode characters.  Must not be null.
      * @param encoding A valid encoding name. The standard zip
      *                 encoding is <code>"CP437"</code>,
      *                 <code>"UTF-8"</code> is supported in ZIP file
-     *                 version <code>6.3</code> or later.
+     *                 version <code>6.3</code> or later.  If null,
+     *                 will use the platform's {...@link
+     *                 java.lang.String#getBytes default encoding}.
      * @return A byte array containing the mapped file
      *         name. Unmappable characters or malformed character
      *         sequences are mapped to a sequence of utf-16 words
      *         encoded in the format <code>%Uxxxx</code>.
      */
     static final byte[] encodeName(String name, String encoding) {
+        if (encoding == null) {
+            return name.getBytes();
+        }
+
         Charset cs = Charset.forName(encoding);
         CharsetEncoder enc = cs.newEncoder();
 

Modified: 
commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java?rev=747841&r1=747840&r2=747841&view=diff
==============================================================================
--- 
commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java
 (original)
+++ 
commons/sandbox/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/UTF8ZipFilesTest.java
 Wed Feb 25 16:09:12 2009
@@ -39,20 +39,44 @@
     private static final String EURO_FOR_DOLLAR_TXT = "\u20AC_for_Dollar.txt";
     private static final String OIL_BARREL_TXT = "\u00D6lf\u00E4sser.txt";
 
-    public void xtestUtf8FileRoundtrip() throws IOException {
-        testFileRoundtrip(UTF_8, true);
+    public void testUtf8FileRoundtripExplicitUnicodeExtra()
+        throws IOException {
+        testFileRoundtrip(UTF_8, true, true);
+    }
+
+    public void testUtf8FileRoundtripNoEFSExplicitUnicodeExtra()
+        throws IOException {
+        testFileRoundtrip(UTF_8, false, true);
+    }
+
+    public void testCP437FileRoundtripExplicitUnicodeExtra()
+        throws IOException {
+        testFileRoundtrip(CP437, false, true);
+    }
+
+    public void testASCIIFileRoundtripExplicitUnicodeExtra()
+        throws IOException {
+        testFileRoundtrip(US_ASCII, false, true);
+    }
+
+    public void testUtf8FileRoundtripImplicitUnicodeExtra()
+        throws IOException {
+        testFileRoundtrip(UTF_8, true, false);
     }
 
-    public void testUtf8FileRoundtripNoEFS() throws IOException {
-        testFileRoundtrip(UTF_8, false);
+    public void testUtf8FileRoundtripNoEFSImplicitUnicodeExtra()
+        throws IOException {
+        testFileRoundtrip(UTF_8, false, false);
     }
 
-    public void testCP437FileRoundtrip() throws IOException {
-        testFileRoundtrip(CP437, false);
+    public void testCP437FileRoundtripImplicitUnicodeExtra()
+        throws IOException {
+        testFileRoundtrip(CP437, false, false);
     }
 
-    public void testASCIIFileRoundtrip() throws IOException {
-        testFileRoundtrip(US_ASCII, false);
+    public void testASCIIFileRoundtripImplicitUnicodeExtra()
+        throws IOException {
+        testFileRoundtrip(US_ASCII, false, false);
     }
 
     /*
@@ -75,7 +99,8 @@
         }
     }
 
-    private static void testFileRoundtrip(String encoding, boolean withEFS)
+    private static void testFileRoundtrip(String encoding, boolean withEFS,
+                                          boolean withExplicitUnicodeExtra)
         throws IOException {
 
         try {
@@ -88,7 +113,7 @@
 
         File file = File.createTempFile(encoding + "-test", ".zip");
         try {
-            createTestFile(file, encoding, withEFS);
+            createTestFile(file, encoding, withEFS, withExplicitUnicodeExtra);
             testFile(file, encoding);
         } finally {
             if (file.exists()) {
@@ -98,7 +123,8 @@
     }
 
     private static void createTestFile(File file, String encoding,
-                                       boolean withEFS)
+                                       boolean withEFS,
+                                       boolean withExplicitUnicodeExtra)
         throws UnsupportedEncodingException, IOException {
 
         ZipArchiveOutputStream zos = null;
@@ -106,10 +132,12 @@
             zos = new ZipArchiveOutputStream(file);
             zos.setEncoding(encoding);
             zos.setUseLanguageEncodingFlag(withEFS);
+            zos.setCreateUnicodeExtraFields(!withExplicitUnicodeExtra);
 
             ZipArchiveEntry ze = new ZipArchiveEntry(OIL_BARREL_TXT);
-            if (!ZipEncodingHelper.canEncodeName(ze.getName(),
-                                                 zos.getEncoding())) {
+            if (withExplicitUnicodeExtra
+                && !ZipEncodingHelper.canEncodeName(ze.getName(),
+                                                    zos.getEncoding())) {
                 ze.addExtraField(new UnicodePathExtraField(ze.getName(),
                                                            zos.getEncoding()));
             }
@@ -119,8 +147,9 @@
             zos.closeEntry();
 
             ze = new ZipArchiveEntry(EURO_FOR_DOLLAR_TXT);
-            if (!ZipEncodingHelper.canEncodeName(ze.getName(),
-                                                 zos.getEncoding())) {
+            if (withExplicitUnicodeExtra
+                && !ZipEncodingHelper.canEncodeName(ze.getName(),
+                                                    zos.getEncoding())) {
                 ze.addExtraField(new UnicodePathExtraField(ze.getName(),
                                                            zos.getEncoding()));
             }
@@ -131,8 +160,9 @@
 
             ze = new ZipArchiveEntry(ASCII_TXT);
 
-            if (!ZipEncodingHelper.canEncodeName(ze.getName(),
-                                                 zos.getEncoding())) {
+            if (withExplicitUnicodeExtra
+                && !ZipEncodingHelper.canEncodeName(ze.getName(),
+                                                    zos.getEncoding())) {
                 ze.addExtraField(new UnicodePathExtraField(ze.getName(),
                                                            zos.getEncoding()));
             }


Reply via email to