add flag to keep the compression methods when updating 7z archives or adding files from sevenzfilesets

git-svn-id: https://svn.apache.org/repos/asf/ant/antlibs/compress/trunk@1576191 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/docs/archive.html b/docs/archive.html
index ffcf32e..e4c5bab 100644
--- a/docs/archive.html
+++ b/docs/archive.html
@@ -297,6 +297,15 @@
         at all.</td>
       <td valign="top" align="center">No, default is LZMA2.</td>
     </tr>
+    <tr>
+      <td valign="top">keepcompression</td>
+      <td valign="top">For entries coming from existing archives (like
+        nested <em>sevenzfileset</em>s or while updating the archive), keep
+        the compression as it has been originally instead of using the
+        <em>contentCompression</em> attribute.  Defaults to false.
+        <em>since 1.5</em></td>
+      <td align="center" valign="top">No</td>
+    </tr>
   </table>
 
   <h3><a name="tar">Tar</a></h3>
@@ -516,7 +525,7 @@
       <td valign="top">For entries coming from existing archives (like
         nested <em>zipfileset</em>s or while updating the archive), keep
         the compression as it has been originally instead of using the
-        <em>level</em> attribute.  Defaults false.</td>
+        <em>level</em> attribute.  Defaults to false.</td>
       <td align="center" valign="top">No</td>
     </tr>
     <tr>
diff --git a/project-template.ivy.xml b/project-template.ivy.xml
index 1e61157..28a94fe 100644
--- a/project-template.ivy.xml
+++ b/project-template.ivy.xml
@@ -52,7 +52,7 @@
   </publications>
   <dependencies>
     <dependency org="org.apache.commons" name="commons-compress"
-                rev="1.7"/>
-    <dependency org="org.tukaani" name="xz" rev="1.4"/>
+                rev="1.8"/>
+    <dependency org="org.tukaani" name="xz" rev="1.5"/>
   </dependencies>
 </ivy-module>
diff --git a/project-template.pom b/project-template.pom
index 380ef78..89b0a73 100644
--- a/project-template.pom
+++ b/project-template.pom
@@ -50,12 +50,12 @@
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-compress</artifactId>
-      <version>1.7</version>
+      <version>1.8</version>
     </dependency>
     <dependency>
       <groupId>org.tukaani</groupId>
       <artifactId>xz</artifactId>
-      <version>1.4</version>
+      <version>1.5</version>
     </dependency>
   </dependencies>
 </project>
diff --git a/src/main/org/apache/ant/compress/resources/SevenZResource.java b/src/main/org/apache/ant/compress/resources/SevenZResource.java
index 856a1ec..516d1aa 100644
--- a/src/main/org/apache/ant/compress/resources/SevenZResource.java
+++ b/src/main/org/apache/ant/compress/resources/SevenZResource.java
@@ -40,6 +40,8 @@
  */
 public final class SevenZResource extends CommonsCompressArchiveResource {
 
+    private Iterable/*<? extends SevenZMethodConfiguration>*/ contentMethods;
+
     /**
      * Default constructor.
      */
@@ -142,6 +144,15 @@
     }
 
     /**
+     * Gets the (compression) methods to used for entry's content.
+     *
+     * @since 1.5
+     */
+    public Iterable/*<? extends SevenZMethodConfiguration>*/ getContentMethods() {
+        return contentMethods;
+    }
+
+    /**
      * fetches information from the named entry inside the archive.
      */
     protected void fetchEntry() {
@@ -177,4 +188,12 @@
         }
     }
 
+    protected void setEntry(ArchiveEntry e) {
+        super.setEntry(e);
+        if (e != null) {
+            SevenZArchiveEntry ze = (SevenZArchiveEntry) e;
+            contentMethods = ze.getContentMethods();
+        }
+    }
+
 }
diff --git a/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java b/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
index f520295..afb8ea3 100644
--- a/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
+++ b/src/main/org/apache/ant/compress/taskdefs/ArchiveBase.java
@@ -913,6 +913,8 @@
      * Various flags a (archive) resource may hold in addition to
      * being a plain resource.
      */
+    // FIXME this isn't really scaling if it wants to be a catch all
+    // for all relevant flags of all formats.
     public class ResourceFlags {
         private final int mode;
         private final boolean modeSet;
@@ -922,6 +924,7 @@
         private final String userName;
         private final String groupName;
         private final int compressionMethod;
+        private Iterable/*<? extends SevenZMethodConfiguration>*/ contentMethods;
 
         public ResourceFlags() {
             this(-1);
@@ -935,22 +938,28 @@
                              int compressionMethod) {
             this(mode, extraFields, EntryHelper.UNKNOWN_ID,
                  EntryHelper.UNKNOWN_ID, null, null,
-                 compressionMethod);
+                 compressionMethod, null);
         }
 
         public ResourceFlags(int mode, int uid, int gid) {
-            this(mode, new ZipExtraField[0], uid, gid, null, null, -1);
+            this(mode, new ZipExtraField[0], uid, gid, null, null, -1, null);
         }
 
         public ResourceFlags(int mode, int uid, int gid, String userName,
                              String groupName) {
-            this(mode, new ZipExtraField[0], uid, gid, userName, groupName, -1);
+            this(mode, new ZipExtraField[0], uid, gid, userName, groupName, -1, null);
+        }
+
+        public ResourceFlags(Iterable/*<? extends SevenZMethodConfiguration>*/ contentMethods) {
+            this(-1, new ZipExtraField[0], EntryHelper.UNKNOWN_ID,
+                 EntryHelper.UNKNOWN_ID, null, null, -1, contentMethods);
         }
 
         private ResourceFlags(int mode, ZipExtraField[] extraFields,
                               int uid, int gid,
                               String userName, String groupName,
-                              int compressionMethod) {
+                              int compressionMethod,
+                              Iterable/*<? extends SevenZMethodConfiguration>*/ contentMethods) {
             this.mode = mode;
             this.extraFields = extraFields;
             this.gid = gid;
@@ -960,6 +969,7 @@
             int m = mode & UnixStat.PERM_MASK;
             modeSet = mode >= 0 && (m > 0 || (m == 0 && preserve0permissions));
             this.compressionMethod = compressionMethod;
+            this.contentMethods = contentMethods;
         }
 
         public boolean hasModeBeenSet() { return modeSet; }
@@ -985,6 +995,11 @@
 
         public boolean hasCompressionMethod() { return compressionMethod >= 0; }
         public int getCompressionMethod() { return compressionMethod; }
+
+        public boolean hasContentMethods() { return contentMethods != null; }
+        public Iterable/*<? extends SevenZMethodConfiguration>*/ getContentMethods() {
+            return contentMethods;
+        }
     }
 
     /**
diff --git a/src/main/org/apache/ant/compress/taskdefs/SevenZ.java b/src/main/org/apache/ant/compress/taskdefs/SevenZ.java
index f0b9435..355e6ae 100644
--- a/src/main/org/apache/ant/compress/taskdefs/SevenZ.java
+++ b/src/main/org/apache/ant/compress/taskdefs/SevenZ.java
@@ -38,6 +38,7 @@
  */
 public class SevenZ extends ArchiveBase {
 
+    private boolean keepCompression = false;
     private String contentCompression;
 
     public SevenZ() {
@@ -66,6 +67,11 @@
                     entry.setLastModifiedDate(new Date(r.getResource()
                                                        .getLastModified()));
                     entry.setSize(r.getResource().getSize());
+                    if (keepCompression
+                        && r.getResourceFlags().hasContentMethods()) {
+                        entry.setContentMethods(r.getResourceFlags()
+                                                .getContentMethods());
+                    }
                     return entry;
                 }
             });
@@ -88,4 +94,15 @@
     public void setContentCompression(String method) {
         this.contentCompression = method;
     }
+
+    /**
+     * Whether the original compression of entries coming from a 7z
+     * archive should be kept (for example when updating an archive).
+     * Default is false.
+     * @param keep if true, keep the original compression
+     * @since 1.5
+     */
+    public void setKeepCompression(boolean keep) {
+        keepCompression = keep;
+    }
 }