From e80a61a3066388eb20844abdfccaab251a40ee61 Mon Sep 17 00:00:00 2001
From: "Jukka.Zitting" <jukka@apache.org>
Date: Sat, 30 Jun 2012 13:26:52 +0200
Subject: [PATCH] COMPRESS-192: Allow setting of the zip encoding in
 ArchiveStreamFactory

Add get/setZipEncoding methods to ArchiveStreamFactory and use the specified value to control encoding in contructed zip streams
---
 .../compress/archivers/ArchiveStreamFactory.java   |   44 ++++++++++++++++++--
 .../archivers/zip/ZipArchiveInputStream.java       |   11 ++++-
 2 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java b/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java
index 90820df..73cea3c 100644
--- a/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java
+++ b/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java
@@ -105,6 +105,31 @@ public class ArchiveStreamFactory {
     public static final String ZIP = "zip";
 
     /**
+     * Zip encoding, null for the default.
+     */
+    private String zipEncoding = null;
+
+    /**
+     * Returns the encoding to use for zip files, or null for the default.
+     *
+     * @return zip encoding, or null
+     * @since 1.5
+     */
+    public String getZipEncoding() {
+        return zipEncoding;
+    }
+
+    /**
+     * Sets the encoding to use for zip files. Use null for the default.
+     *
+     * @return zipEncoding zip encoding, or null
+     * @since 1.5
+     */
+    public void setZipEncoding(String zipEncoding) {
+        this.zipEncoding = zipEncoding;
+    }
+
+    /**
      * Create an archive input stream from an archiver name and an input stream.
      * 
      * @param archiverName the archive name, i.e. "ar", "zip", "tar", "jar", "dump" or "cpio"
@@ -129,7 +154,11 @@ public class ArchiveStreamFactory {
             return new ArArchiveInputStream(in);
         }
         if (ZIP.equalsIgnoreCase(archiverName)) {
-            return new ZipArchiveInputStream(in);
+            if (zipEncoding != null) {
+                return new ZipArchiveInputStream(in, zipEncoding);
+            } else {
+                return new ZipArchiveInputStream(in);
+            }
         }
         if (TAR.equalsIgnoreCase(archiverName)) {
             return new TarArchiveInputStream(in);
@@ -170,7 +199,11 @@ public class ArchiveStreamFactory {
             return new ArArchiveOutputStream(out);
         }
         if (ZIP.equalsIgnoreCase(archiverName)) {
-            return new ZipArchiveOutputStream(out);
+            ZipArchiveOutputStream zip = new ZipArchiveOutputStream(out);
+            if (zipEncoding != null) {
+                zip.setEncoding(zipEncoding);
+            }
+            return zip;
         }
         if (TAR.equalsIgnoreCase(archiverName)) {
             return new TarArchiveOutputStream(out);
@@ -210,7 +243,11 @@ public class ArchiveStreamFactory {
             int signatureLength = in.read(signature);
             in.reset();
             if (ZipArchiveInputStream.matches(signature, signatureLength)) {
-                return new ZipArchiveInputStream(in);
+                if (zipEncoding != null) {
+                    return new ZipArchiveInputStream(in, zipEncoding);
+                } else {
+                    return new ZipArchiveInputStream(in);
+                }
             } else if (JarArchiveInputStream.matches(signature, signatureLength)) {
                 return new JarArchiveInputStream(in);
             } else if (ArArchiveInputStream.matches(signature, signatureLength)) {
@@ -257,4 +294,5 @@ public class ArchiveStreamFactory {
 
         throw new ArchiveException("No Archiver found for the stream signature");
     }
+
 }
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
index 377bad6..0d65141 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveInputStream.java
@@ -129,7 +129,16 @@ public class ZipArchiveInputStream extends ArchiveInputStream {
     private static final long TWO_EXP_32 = ZIP64_MAGIC + 1;
 
     public ZipArchiveInputStream(InputStream inputStream) {
-        this(inputStream, ZipEncodingHelper.UTF8, true);
+        this(inputStream, ZipEncodingHelper.UTF8);
+    }
+
+    /**
+     * @param encoding the encoding to use for file names, use null
+     * for the platform's default encoding
+     * @since 1.5
+     */
+    public ZipArchiveInputStream(InputStream inputStream, String encoding) {
+        this(inputStream, encoding, true);
     }
 
     /**
-- 
1.7.10.msysgit.1

