You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2012/06/04 18:35:07 UTC

svn commit: r1346025 [1/3] - in /ant/core/trunk: ./ src/main/org/apache/tools/zip/ src/tests/junit/org/apache/tools/ant/taskdefs/ src/tests/junit/org/apache/tools/zip/

Author: bodewig
Date: Mon Jun  4 16:35:06 2012
New Revision: 1346025

URL: http://svn.apache.org/viewvc?rev=1346025&view=rev
Log:
merge Zip64 support from Commons Compress

Added:
    ant/core/trunk/src/main/org/apache/tools/zip/GeneralPurposeBit.java
      - copied, changed from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/GeneralPurposeBit.java
    ant/core/trunk/src/main/org/apache/tools/zip/UnsupportedZipFeatureException.java
      - copied, changed from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java
    ant/core/trunk/src/main/org/apache/tools/zip/Zip64ExtendedInformationExtraField.java
      - copied, changed from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java
    ant/core/trunk/src/main/org/apache/tools/zip/Zip64Mode.java
      - copied, changed from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64Mode.java
    ant/core/trunk/src/main/org/apache/tools/zip/Zip64RequiredException.java
      - copied, changed from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64RequiredException.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipConstants.java
      - copied, changed from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipConstants.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipEightByteInteger.java
      - copied, changed from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEightByteInteger.java
Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/src/main/org/apache/tools/zip/AbstractUnicodeExtraField.java
    ant/core/trunk/src/main/org/apache/tools/zip/AsiExtraField.java
    ant/core/trunk/src/main/org/apache/tools/zip/ExtraFieldUtils.java
    ant/core/trunk/src/main/org/apache/tools/zip/FallbackZipEncoding.java
    ant/core/trunk/src/main/org/apache/tools/zip/Simple8BitZipEncoding.java
    ant/core/trunk/src/main/org/apache/tools/zip/UnicodeCommentExtraField.java
    ant/core/trunk/src/main/org/apache/tools/zip/UnicodePathExtraField.java
    ant/core/trunk/src/main/org/apache/tools/zip/UnparseableExtraFieldData.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipEncoding.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipEncodingHelper.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipEntry.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipFile.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipLong.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipOutputStream.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipShort.java
    ant/core/trunk/src/main/org/apache/tools/zip/ZipUtil.java
    ant/core/trunk/src/tests/junit/org/apache/tools/ant/taskdefs/ZipExtraFieldTest.java
    ant/core/trunk/src/tests/junit/org/apache/tools/zip/ExtraFieldUtilsTest.java
    ant/core/trunk/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java

Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Mon Jun  4 16:35:06 2012
@@ -9,7 +9,6 @@ Changes that could break older environme
    the task now really leaves the EOL characters alone. This also implies that
    EOL ASIS will not insert a newline even if fixlast is set to true.
    Bugzilla report 53036
-   
 
 Fixed bugs:
 -----------
@@ -34,6 +33,10 @@ Fixed bugs:
 Other changes:
 --------------
 
+* merged the ZIP package from Commons Compress, it can now read
+  archives using Zip64 extensions (files and archives bigger that 4GB
+  and with more that 64k entries).
+
 Changes from Ant 1.8.3 TO Ant 1.8.4
 ===================================
 

Modified: ant/core/trunk/src/main/org/apache/tools/zip/AbstractUnicodeExtraField.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/AbstractUnicodeExtraField.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/AbstractUnicodeExtraField.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/AbstractUnicodeExtraField.java Mon Jun  4 16:35:06 2012
@@ -105,24 +105,42 @@ public abstract class AbstractUnicodeExt
      * @return The utf-8 encoded name.
      */
     public byte[] getUnicodeName() {
-        return unicodeName;
+        byte[] b = null;
+        if (unicodeName != null) {
+            b = new byte[unicodeName.length];
+            System.arraycopy(unicodeName, 0, b, 0, b.length);
+        }
+        return b;
     }
 
     /**
      * @param unicodeName The utf-8 encoded name to set.
      */
     public void setUnicodeName(byte[] unicodeName) {
-        this.unicodeName = unicodeName;
+        if (unicodeName != null) {
+            this.unicodeName = new byte[unicodeName.length];
+            System.arraycopy(unicodeName, 0, this.unicodeName, 0,
+                             unicodeName.length);
+        } else {
+            this.unicodeName = null;
+        }
         data = null;
     }
 
+    /** {@inheritDoc} */
     public byte[] getCentralDirectoryData() {
         if (data == null) {
             this.assembleData();
         }
-        return data;
+        byte[] b = null;
+        if (data != null) {
+            b = new byte[data.length];
+            System.arraycopy(data, 0, b, 0, b.length);
+        }
+        return b;
     }
 
+    /** {@inheritDoc} */
     public ZipShort getCentralDirectoryLength() {
         if (data == null) {
             assembleData();
@@ -130,14 +148,17 @@ public abstract class AbstractUnicodeExt
         return new ZipShort(data.length);
     }
 
+    /** {@inheritDoc} */
     public byte[] getLocalFileDataData() {
         return getCentralDirectoryData();
     }
 
+    /** {@inheritDoc} */
     public ZipShort getLocalFileDataLength() {
         return getCentralDirectoryLength();
     }
 
+    /** {@inheritDoc} */
     public void parseFromLocalFileData(byte[] buffer, int offset, int length)
         throws ZipException {
 

Modified: ant/core/trunk/src/main/org/apache/tools/zip/AsiExtraField.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/AsiExtraField.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/AsiExtraField.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/AsiExtraField.java Mon Jun  4 16:35:06 2012
@@ -45,6 +45,9 @@ import java.util.zip.ZipException;
  * <p>Short is two bytes and Long is four bytes in big endian byte and
  * word order, device numbers are currently not supported.</p>
  *
+ * <p>Since the documentation this class is based upon doesn't mention
+ * the character encoding of the file name at all, it is assumed that
+ * it uses the current platform's default encoding.</p>
  */
 public class AsiExtraField implements ZipExtraField, UnixStat, Cloneable {
 
@@ -116,6 +119,7 @@ public class AsiExtraField implements Zi
                           + 2         // UID
                           + 2         // GID
                           + getLinkedFile().getBytes().length);
+                          // Uses default charset - see class Javadoc
     }
 
     /**
@@ -138,7 +142,7 @@ public class AsiExtraField implements Zi
         byte[] data = new byte[getLocalFileDataLength().getValue() - WORD];
         System.arraycopy(ZipShort.getBytes(getMode()), 0, data, 0, 2);
 
-        byte[] linkArray = getLinkedFile().getBytes();
+        byte[] linkArray = getLinkedFile().getBytes(); // Uses default charset - see class Javadoc
         // CheckStyle:MagicNumber OFF
         System.arraycopy(ZipLong.getBytes(linkArray.length),
                          0, data, 2, WORD);
@@ -311,7 +315,7 @@ public class AsiExtraField implements Zi
             link = "";
         } else {
             System.arraycopy(tmp, 10, linkArray, 0, linkArray.length);
-            link = new String(linkArray);
+            link = new String(linkArray); // Uses default charset - see class Javadoc
         }
         // CheckStyle:MagicNumber ON
         setDirectory((newMode & DIR_FLAG) != 0);
@@ -334,6 +338,7 @@ public class AsiExtraField implements Zi
         return type | (mode & PERM_MASK);
     }
 
+    @Override
     public Object clone() {
         try {
             AsiExtraField cloned = (AsiExtraField) super.clone();

Modified: ant/core/trunk/src/main/org/apache/tools/zip/ExtraFieldUtils.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/ExtraFieldUtils.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/ExtraFieldUtils.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/ExtraFieldUtils.java Mon Jun  4 16:35:06 2012
@@ -38,14 +38,15 @@ public class ExtraFieldUtils {
      *
      * @since 1.1
      */
-    private static final Map implementations;
+    private static final Map<ZipShort, Class<?>> implementations;
 
     static {
-        implementations = new HashMap();
+        implementations = new HashMap<ZipShort, Class<?>>();
         register(AsiExtraField.class);
         register(JarMarker.class);
         register(UnicodePathExtraField.class);
         register(UnicodeCommentExtraField.class);
+        register(Zip64ExtendedInformationExtraField.class);
     }
 
     /**
@@ -57,7 +58,7 @@ public class ExtraFieldUtils {
      *
      * @since 1.1
      */
-    public static void register(Class c) {
+    public static void register(Class<?> c) {
         try {
             ZipExtraField ze = (ZipExtraField) c.newInstance();
             implementations.put(ze.getHeaderId(), c);
@@ -81,7 +82,7 @@ public class ExtraFieldUtils {
      */
     public static ZipExtraField createExtraField(ZipShort headerId)
         throws InstantiationException, IllegalAccessException {
-        Class c = (Class) implementations.get(headerId);
+        Class<?> c = implementations.get(headerId);
         if (c != null) {
             return (ZipExtraField) c.newInstance();
         }
@@ -132,7 +133,7 @@ public class ExtraFieldUtils {
     public static ZipExtraField[] parse(byte[] data, boolean local,
                                         UnparseableExtraField onUnparseableData)
         throws ZipException {
-        List v = new ArrayList();
+        List<ZipExtraField> v = new ArrayList<ZipExtraField>();
         int start = 0;
         LOOP:
         while (start <= data.length - WORD) {
@@ -158,7 +159,7 @@ public class ExtraFieldUtils {
                                                             data.length - start);
                     }
                     v.add(field);
-                    /*FALLTHROUGH*/
+                    //$FALL-THROUGH$
                 case UnparseableExtraField.SKIP_KEY:
                     // since we cannot parse the data we must assume
                     // the extra field consumes the whole rest of the
@@ -189,7 +190,7 @@ public class ExtraFieldUtils {
         }
 
         ZipExtraField[] result = new ZipExtraField[v.size()];
-        return (ZipExtraField[]) v.toArray(result);
+        return v.toArray(result);
     }
 
     /**
@@ -205,8 +206,8 @@ public class ExtraFieldUtils {
             lastIsUnparseableHolder ? data.length - 1 : data.length;
 
         int sum = WORD * regularExtraFieldCount;
-        for (int i = 0; i < data.length; i++) {
-            sum += data[i].getLocalFileDataLength().getValue();
+        for (ZipExtraField element : data) {
+            sum += element.getLocalFileDataLength().getValue();
         }
 
         byte[] result = new byte[sum];
@@ -240,8 +241,8 @@ public class ExtraFieldUtils {
             lastIsUnparseableHolder ? data.length - 1 : data.length;
 
         int sum = WORD * regularExtraFieldCount;
-        for (int i = 0; i < data.length; i++) {
-            sum += data[i].getCentralDirectoryLength().getValue();
+        for (ZipExtraField element : data) {
+            sum += element.getCentralDirectoryLength().getValue();
         }
         byte[] result = new byte[sum];
         int start = 0;

Modified: ant/core/trunk/src/main/org/apache/tools/zip/FallbackZipEncoding.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/FallbackZipEncoding.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/FallbackZipEncoding.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/FallbackZipEncoding.java Mon Jun  4 16:35:06 2012
@@ -30,7 +30,7 @@ import java.nio.ByteBuffer;
  * marks leading to unreadable ZIP entries on some operating
  * systems.</p>
  * 
- * <p>Furthermore this implementation is unable to tell, whether a
+ * <p>Furthermore this implementation is unable to tell whether a
  * given name can be safely encoded or not.</p>
  * 
  * <p>This implementation acts as a last resort implementation, when
@@ -53,7 +53,7 @@ class FallbackZipEncoding implements Zip
     /**
      * Construct a fallback zip encoding, which uses the given charset.
      * 
-     * @param charset The name of the charset or <code>null</code> for
+     * @param charset The name of the charset or {@code null} for
      *                the platform's default character set.
      */
     public FallbackZipEncoding(String charset) {
@@ -73,7 +73,7 @@ class FallbackZipEncoding implements Zip
      * org.apache.tools.zip.ZipEncoding#encode(java.lang.String)
      */
     public ByteBuffer encode(String name) throws IOException {
-        if (this.charset == null) {
+        if (this.charset == null) { // i.e. use default charset, see no-args constructor
             return ByteBuffer.wrap(name.getBytes());
         } else {
             return ByteBuffer.wrap(name.getBytes(this.charset));
@@ -85,7 +85,7 @@ class FallbackZipEncoding implements Zip
      * org.apache.tools.zip.ZipEncoding#decode(byte[])
      */
     public String decode(byte[] data) throws IOException {
-        if (this.charset == null) {
+        if (this.charset == null) { // i.e. use default charset, see no-args constructor
             return new String(data);
         } else {
             return new String(data,this.charset);

Copied: ant/core/trunk/src/main/org/apache/tools/zip/GeneralPurposeBit.java (from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/GeneralPurposeBit.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/GeneralPurposeBit.java?p2=ant/core/trunk/src/main/org/apache/tools/zip/GeneralPurposeBit.java&p1=commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/GeneralPurposeBit.java&r1=1345686&r2=1346025&rev=1346025&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/GeneralPurposeBit.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/GeneralPurposeBit.java Mon Jun  4 16:35:06 2012
@@ -15,13 +15,13 @@
  *  limitations under the License.
  *
  */
-package org.apache.commons.compress.archivers.zip;
+package org.apache.tools.zip;
 
 /**
  * Parser/encoder for the "general purpose bit" field in ZIP's local
  * file and central directory headers.
- * @since 1.1
- * @NotThreadSafe
+ *
+ * @since Ant 1.9.0
  */
 public final class GeneralPurposeBit {
     /**
@@ -44,8 +44,8 @@ public final class GeneralPurposeBit {
      * Indicates that filenames are written in utf-8.
      *
      * <p>The only reason this is public is that {@link
-     * ZipArchiveOutputStream#EFS_FLAG} was public in Apache Commons
-     * Compress 1.0 and we needed a substitute for it.</p>
+     * ZipOutputStream#EFS_FLAG} was public in several versions of
+     * Apache Ant and we needed a substitute for it.</p>
      */
     public static final int UFT8_NAMES_FLAG = 1 << 11;
 

Modified: ant/core/trunk/src/main/org/apache/tools/zip/Simple8BitZipEncoding.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/Simple8BitZipEncoding.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/Simple8BitZipEncoding.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/Simple8BitZipEncoding.java Mon Jun  4 16:35:06 2012
@@ -49,7 +49,7 @@ class Simple8BitZipEncoding implements Z
      * A character entity, which is put to the reverse mapping table
      * of a simple encoding.
      */
-    private static final class Simple8BitChar implements Comparable {
+    private static final class Simple8BitChar implements Comparable<Simple8BitChar> {
         public final char unicode;
         public final byte code;
 
@@ -58,15 +58,28 @@ class Simple8BitZipEncoding implements Z
             this.unicode = unicode;
         }
 
-        public int compareTo(Object o) {
-            Simple8BitChar a = (Simple8BitChar) o;
-
+        public int compareTo(Simple8BitChar a) {
             return this.unicode - a.unicode;
         }
 
+        @Override
         public String toString() {
-            return "0x" + Integer.toHexString(0xffff & (int) unicode)
-                + "->0x" + Integer.toHexString(0xff & (int) code);
+            return "0x" + Integer.toHexString(0xffff & unicode)
+                + "->0x" + Integer.toHexString(0xff & code);
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (o instanceof Simple8BitChar) {
+                Simple8BitChar other = (Simple8BitChar) o;
+                return unicode == other.unicode && code == other.code;
+            }
+            return false;
+        }
+
+        @Override
+        public int hashCode() {
+            return unicode;
         }
     }
 
@@ -81,24 +94,25 @@ class Simple8BitZipEncoding implements Z
      * field.  This list is used to binary search reverse mapping of
      * unicode characters with a character code greater than 127.
      */
-    private final List reverseMapping;
+    private final List<Simple8BitChar> reverseMapping;
 
     /**
      * @param highChars The characters for byte values of 128 to 255
      * stored as an array of 128 chars.
      */
     public Simple8BitZipEncoding(char[] highChars) {
-        this.highChars = highChars;
-        this.reverseMapping = new ArrayList(this.highChars.length);
+        this.highChars = highChars.clone();
+        List<Simple8BitChar> temp =
+            new ArrayList<Simple8BitChar>(this.highChars.length);
 
         byte code = 127;
 
         for (int i = 0; i < this.highChars.length; ++i) {
-            this.reverseMapping.add(new Simple8BitChar(++code,
-                                                       this.highChars[i]));
+            temp.add(new Simple8BitChar(++code, this.highChars[i]));
         }
 
-        Collections.sort(this.reverseMapping);
+        Collections.sort(temp);
+        this.reverseMapping = Collections.unmodifiableList(temp);
     }
 
     /**
@@ -114,7 +128,7 @@ class Simple8BitZipEncoding implements Z
         }
 
         // byte is signed, so 128 == -128 and 255 == -1
-        return this.highChars[128 + (int) b];
+        return this.highChars[128 + b];
     }
 
     /**
@@ -137,7 +151,7 @@ class Simple8BitZipEncoding implements Z
      * @param bb The byte buffer to write to.
      * @param c The character to encode.
      * @return Whether the given unicode character is covered by this encoding.
-     *         If <code>false</code> is returned, nothing is pushed to the
+     *         If {@code false} is returned, nothing is pushed to the
      *         byte buffer. 
      */
     public boolean pushEncodedChar(ByteBuffer bb, char c) {
@@ -158,7 +172,7 @@ class Simple8BitZipEncoding implements Z
     /**
      * @param c A unicode character in the range from 0x0080 to 0x7f00
      * @return A Simple8BitChar, if this character is covered by this encoding.
-     *         A <code>null</code> value is returned, if this character is not
+     *         A {@code null} value is returned, if this character is not
      *         covered by this encoding.
      */
     private Simple8BitChar encodeHighChar(char c) {
@@ -171,7 +185,7 @@ class Simple8BitZipEncoding implements Z
 
             int i = i0 + (i1 - i0) / 2;
 
-            Simple8BitChar m = (Simple8BitChar) this.reverseMapping.get(i);
+            Simple8BitChar m = this.reverseMapping.get(i);
 
             if (m.unicode == c) {
                 return m;
@@ -188,7 +202,7 @@ class Simple8BitZipEncoding implements Z
             return null;
         }
 
-        Simple8BitChar r = (Simple8BitChar) this.reverseMapping.get(i0);
+        Simple8BitChar r = this.reverseMapping.get(i0);
 
         if (r.unicode != c) {
             return null;

Modified: ant/core/trunk/src/main/org/apache/tools/zip/UnicodeCommentExtraField.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/UnicodeCommentExtraField.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/UnicodeCommentExtraField.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/UnicodeCommentExtraField.java Mon Jun  4 16:35:06 2012
@@ -67,6 +67,7 @@ public class UnicodeCommentExtraField ex
         super(comment, bytes);
     }
 
+    /** {@inheritDoc} */
     public ZipShort getHeaderId() {
         return UCOM_ID;
     }

Modified: ant/core/trunk/src/main/org/apache/tools/zip/UnicodePathExtraField.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/UnicodePathExtraField.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/UnicodePathExtraField.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/UnicodePathExtraField.java Mon Jun  4 16:35:06 2012
@@ -66,6 +66,7 @@ public class UnicodePathExtraField exten
         super(name, bytes);
     }
 
+    /** {@inheritDoc} */
     public ZipShort getHeaderId() {
         return UPATH_ID;
     }

Modified: ant/core/trunk/src/main/org/apache/tools/zip/UnparseableExtraFieldData.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/UnparseableExtraFieldData.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/UnparseableExtraFieldData.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/UnparseableExtraFieldData.java Mon Jun  4 16:35:06 2012
@@ -21,12 +21,11 @@ package org.apache.tools.zip;
 /**
  * Wrapper for extra field data that doesn't conform to the recommended format of header-tag + size + data.
  *
- * <p>The header-id is artificial (and not listed as a know ID in
- * the .ZIP File Format Specification).  
- * Since it isn't used anywhere except to satisfy the
+ * <p>The header-id is artificial (and not listed as a known ID in
+ * {@link <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT">
+ * APPNOTE.TXT</a>}).  Since it isn't used anywhere except to satisfy the
  * ZipExtraField contract it shouldn't matter anyway.</p>
- * @see <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT
- * APPNOTE.TXT">.ZIP File Format Specification</a>
+ *
  * @since Ant 1.8.1
  */
 public final class UnparseableExtraFieldData
@@ -103,7 +102,6 @@ public final class UnparseableExtraField
      * @param buffer the buffer to read data from
      * @param offset offset into buffer to read data
      * @param length the length of data
-     * @exception ZipException on error
      */
     public void parseFromCentralDirectoryData(byte[] buffer, int offset,
                                               int length) {

Copied: ant/core/trunk/src/main/org/apache/tools/zip/UnsupportedZipFeatureException.java (from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/UnsupportedZipFeatureException.java?p2=ant/core/trunk/src/main/org/apache/tools/zip/UnsupportedZipFeatureException.java&p1=commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java&r1=1345686&r2=1346025&rev=1346025&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/UnsupportedZipFeatureException.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/UnsupportedZipFeatureException.java Mon Jun  4 16:35:06 2012
@@ -16,19 +16,19 @@
  *
  */
 
-package org.apache.commons.compress.archivers.zip;
+package org.apache.tools.zip;
 
 import java.util.zip.ZipException;
 
 /**
  * Exception thrown when attempting to read or write data for a zip
  * entry that uses ZIP features not supported by this library.
- * @since Commons Compress 1.1
+ * @since Ant 1.9.0
  */
 public class UnsupportedZipFeatureException extends ZipException {
 
     private final Feature reason;
-    private final ZipArchiveEntry entry;
+    private final ZipEntry entry;
     private static final long serialVersionUID = 4430521921766595597L;
 
     /**
@@ -37,7 +37,7 @@ public class UnsupportedZipFeatureExcept
      * @param entry the entry using the feature
      */
     public UnsupportedZipFeatureException(Feature reason,
-                                          ZipArchiveEntry entry) {
+                                          ZipEntry entry) {
         super("unsupported feature " + reason +  " used in entry "
               + entry.getName());
         this.reason = reason;
@@ -54,13 +54,12 @@ public class UnsupportedZipFeatureExcept
     /**
      * The entry using the unsupported feature.
      */
-    public ZipArchiveEntry getEntry() {
+    public ZipEntry getEntry() {
         return entry;
     }
 
     /**
      * ZIP Features that may or may not be supported.
-     * @since Commons Compress 1.1
      */
     public static class Feature {
         /**

Copied: ant/core/trunk/src/main/org/apache/tools/zip/Zip64ExtendedInformationExtraField.java (from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/Zip64ExtendedInformationExtraField.java?p2=ant/core/trunk/src/main/org/apache/tools/zip/Zip64ExtendedInformationExtraField.java&p1=commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java&r1=1345686&r2=1346025&rev=1346025&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64ExtendedInformationExtraField.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/Zip64ExtendedInformationExtraField.java Mon Jun  4 16:35:06 2012
@@ -16,12 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.commons.compress.archivers.zip;
+package org.apache.tools.zip;
 
 import java.util.zip.ZipException;
 
-import static org.apache.commons.compress.archivers.zip.ZipConstants.DWORD;
-import static org.apache.commons.compress.archivers.zip.ZipConstants.WORD;
+import static org.apache.tools.zip.ZipConstants.DWORD;
+import static org.apache.tools.zip.ZipConstants.WORD;
 
 /**
  * Holds size and other extended information for entries that use Zip64
@@ -64,16 +64,16 @@ import static org.apache.commons.compres
  *          Local Header for the original file size will be zero.
  * </pre></p>
  *
- * <p>Currently Commons Compress doesn't support encrypting the
- * central directory so the not about masking doesn't apply.</p>
+ * <p>Currently Ant doesn't support encrypting the
+ * central directory so the note about masking doesn't apply.</p>
  *
  * <p>The implementation relies on data being read from the local file
  * header and assumes that both size values are always present.</p>
  *
- * @since 1.2
- * @NotThreadSafe
+ * @since Ant 1.9.0
  */
-public class Zip64ExtendedInformationExtraField implements ZipExtraField {
+public class Zip64ExtendedInformationExtraField
+    implements CentralDirectoryParsingZipExtraField {
 
     static final ZipShort HEADER_ID = new ZipShort(0x0001);
 
@@ -91,14 +91,12 @@ public class Zip64ExtendedInformationExt
      * reparseCentralDirectoryData}.
      *
      * <p>Not used for anything else</p>
-     *
-     * @since 1.3
      */
     private byte[] rawCentralDirectoryData;
 
     /**
      * This constructor should only be used by the code that reads
-     * archives inside of Commons Compress.
+     * archives inside of Ant.
      */
     public Zip64ExtendedInformationExtraField() { }
 

Copied: ant/core/trunk/src/main/org/apache/tools/zip/Zip64Mode.java (from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64Mode.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/Zip64Mode.java?p2=ant/core/trunk/src/main/org/apache/tools/zip/Zip64Mode.java&p1=commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64Mode.java&r1=1345686&r2=1346025&rev=1346025&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64Mode.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/Zip64Mode.java Mon Jun  4 16:35:06 2012
@@ -16,14 +16,14 @@
  *
  */
 
-package org.apache.commons.compress.archivers.zip;
+package org.apache.tools.zip;
 
 /**
- * The different modes {@link ZipArchiveOutputStream} can operate in.
+ * The different modes {@link ZipOutputStream} can operate in.
  *
- * @see ZipArchiveOutputStream#setUseZip64
+ * @see ZipOutputStream#setUseZip64
  *
- * @since 1.3
+ * @since Ant 1.9.0
  */
 public enum Zip64Mode {
     /**
@@ -35,7 +35,7 @@ public enum Zip64Mode {
      * Don't use Zip64 extensions for any entries.
      *
      * <p>This will cause a {@link Zip64RequiredException} to be
-     * thrown if {@link ZipArchiveOutputStream} detects it needs Zip64
+     * thrown if {@link ZipOutputStream} detects it needs Zip64
      * support.</p>
      */
     Never,

Copied: ant/core/trunk/src/main/org/apache/tools/zip/Zip64RequiredException.java (from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64RequiredException.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/Zip64RequiredException.java?p2=ant/core/trunk/src/main/org/apache/tools/zip/Zip64RequiredException.java&p1=commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64RequiredException.java&r1=1345686&r2=1346025&rev=1346025&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/Zip64RequiredException.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/Zip64RequiredException.java Mon Jun  4 16:35:06 2012
@@ -16,15 +16,15 @@
  *
  */
 
-package org.apache.commons.compress.archivers.zip;
+package org.apache.tools.zip;
 
 import java.util.zip.ZipException;
 
 /**
  * Exception thrown when attempting to write data that requires Zip64
- * support to an archive and {@link ZipArchiveOutputStream#setUseZip64
+ * support to an archive and {@link ZipOutputStream#setUseZip64
  * UseZip64} has been set to {@link Zip64Mode#Never Never}.
- * @since 1.3
+ * @since Ant 1.9.0
  */
 public class Zip64RequiredException extends ZipException {
 
@@ -33,7 +33,7 @@ public class Zip64RequiredException exte
     /**
      * Helper to format "entry too big" messages.
      */
-    static String getEntryTooBigMessage(ZipArchiveEntry ze) {
+    static String getEntryTooBigMessage(ZipEntry ze) {
         return ze.getName() + "'s size exceeds the limit of 4GByte.";
     }
 

Copied: ant/core/trunk/src/main/org/apache/tools/zip/ZipConstants.java (from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipConstants.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/ZipConstants.java?p2=ant/core/trunk/src/main/org/apache/tools/zip/ZipConstants.java&p1=commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipConstants.java&r1=1345686&r2=1346025&rev=1346025&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipConstants.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/ZipConstants.java Mon Jun  4 16:35:06 2012
@@ -15,12 +15,10 @@
  *  limitations under the License.
  *
  */
-package org.apache.commons.compress.archivers.zip;
+package org.apache.tools.zip;
 
 /**
  * Various constants used throughout the package.
- *
- * @since 1.3
  */
 final class ZipConstants {
     private ZipConstants() { }

Copied: ant/core/trunk/src/main/org/apache/tools/zip/ZipEightByteInteger.java (from r1345686, commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEightByteInteger.java)
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/ZipEightByteInteger.java?p2=ant/core/trunk/src/main/org/apache/tools/zip/ZipEightByteInteger.java&p1=commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEightByteInteger.java&r1=1345686&r2=1346025&rev=1346025&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipEightByteInteger.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/ZipEightByteInteger.java Mon Jun  4 16:35:06 2012
@@ -15,18 +15,15 @@
  *  limitations under the License.
  *
  */
-package org.apache.commons.compress.archivers.zip;
+package org.apache.tools.zip;
 
 import java.math.BigInteger;
 
-import static org.apache.commons.compress.archivers.zip.ZipConstants.BYTE_MASK;
+import static org.apache.tools.zip.ZipConstants.BYTE_MASK;
 
 /**
  * Utility class that represents an eight byte integer with conversion
  * rules for the big endian byte order of ZIP files.
- * @Immutable
- *
- * @since 1.2
  */
 public final class ZipEightByteInteger {
 

Modified: ant/core/trunk/src/main/org/apache/tools/zip/ZipEncoding.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/ZipEncoding.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/ZipEncoding.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/ZipEncoding.java Mon Jun  4 16:35:06 2012
@@ -68,7 +68,7 @@ interface ZipEncoding {
      *         character sequences are mapped to a sequence of utf-16
      *         words encoded in the format <code>%Uxxxx</code>.  It is
      *         assumed, that the byte buffer is positioned at the
-     *         beinning of the encoded result, the byte buffer has a
+     *         beginning of the encoded result, the byte buffer has a
      *         backing array and the limit of the byte buffer points
      *         to the end of the encoded result.
      * @throws IOException 

Modified: ant/core/trunk/src/main/org/apache/tools/zip/ZipEncodingHelper.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/ZipEncodingHelper.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/ZipEncodingHelper.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/ZipEncodingHelper.java Mon Jun  4 16:35:06 2012
@@ -62,10 +62,10 @@ abstract class ZipEncodingHelper {
         }
     }
 
-    private static final Map simpleEncodings;
+    private static final Map<String, SimpleEncodingHolder> simpleEncodings;
 
     static {
-        simpleEncodings = new HashMap();
+        simpleEncodings = new HashMap<String, SimpleEncodingHolder>();
 
         char[] cp437_high_chars =
             new char[] { 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0,
@@ -203,7 +203,7 @@ abstract class ZipEncodingHelper {
     /**
      * Instantiates a zip encoding.
      * 
-     * @param name The name of the zip encoding. Specify <code>null</code> for
+     * @param name The name of the zip encoding. Specify {@code null} for
      *             the platform's default encoding.
      * @return A zip encoding for the given encoding name.
      */
@@ -218,8 +218,7 @@ abstract class ZipEncodingHelper {
             return new FallbackZipEncoding();
         }
 
-        SimpleEncodingHolder h =
-            (SimpleEncodingHolder) simpleEncodings.get(name);
+        SimpleEncodingHolder h = simpleEncodings.get(name);
 
         if (h!=null) {
             return h.getEncoding();

Modified: ant/core/trunk/src/main/org/apache/tools/zip/ZipEntry.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/zip/ZipEntry.java?rev=1346025&r1=1346024&r2=1346025&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/zip/ZipEntry.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/zip/ZipEntry.java Mon Jun  4 16:35:06 2012
@@ -18,7 +18,10 @@
 
 package org.apache.tools.zip;
 
+import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.zip.ZipException;
@@ -28,7 +31,8 @@ import java.util.zip.ZipException;
  * access to the internal and external file attributes.
  *
  * <p>The extra data is expected to follow the recommendation of
- * the .ZIP File Format Specification created by PKWARE Inc. :</p>
+ * {@link <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT">
+ * APPNOTE.txt</a>}:</p>
  * <ul>
  *   <li>the extra byte array consists of a sequence of extra fields</li>
  *   <li>each extra fields starts by a two byte header id followed by
@@ -38,11 +42,9 @@ import java.util.zip.ZipException;
  *
  * <p>Any extra data that cannot be parsed by the rules above will be
  * consumed as "unparseable" extra data and treated differently by the
- * methods of this class.  Versions prior to Apache Commons Compress
- * 1.1 would have thrown an exception if any attempt was made to read
- * or write extra data not conforming to the recommendation.</p>
- * @see <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT">
- * .ZIP File Format Specification</a> 
+ * methods of this class.  Older versions would have thrown an
+ * exception if any attempt was made to read or write extra data not
+ * conforming to the recommendation.</p>
  *
  */
 public class ZipEntry extends java.util.zip.ZipEntry implements Cloneable {
@@ -52,30 +54,59 @@ public class ZipEntry extends java.util.
     private static final int SHORT_MASK = 0xFFFF;
     private static final int SHORT_SHIFT = 16;
 
+    /**
+     * The {@link java.util.zip.ZipEntry} base class only supports
+     * the compression methods STORED and DEFLATED. We override the
+     * field so that any compression methods can be used.
+     * <p>
+     * The default value -1 means that the method has not been specified.
+     */
+    private int method = -1;
+
+    /**
+     * The {@link java.util.zip.ZipEntry#setSize} method in the base
+     * class throws an IllegalArgumentException if the size is bigger
+     * than 2GB for Java versions < 7.  Need to keep our own size
+     * information for Zip64 support.
+     */
+    private long size = -1;
+
     private int internalAttributes = 0;
     private int platform = PLATFORM_FAT;
     private long externalAttributes = 0;
-    private LinkedHashMap/*<ZipShort, ZipExtraField>*/ extraFields = null;
+    private LinkedHashMap<ZipShort, ZipExtraField> extraFields = null;
     private UnparseableExtraFieldData unparseableExtra = null;
     private String name = null;
+    private byte[] rawName = null;
+    private GeneralPurposeBit gpb = new GeneralPurposeBit();
 
     /**
      * Creates a new zip entry with the specified name.
+     *
+     * <p>Assumes the entry represents a directory if and only if the
+     * name ends with a forward slash "/".</p>
+     *
      * @param name the name of the entry
      * @since 1.1
      */
     public ZipEntry(String name) {
         super(name);
+        setName(name);
     }
 
     /**
      * Creates a new zip entry with fields taken from the specified zip entry.
+     *
+     * <p>Assumes the entry represents a directory if and only if the
+     * name ends with a forward slash "/".</p>
+     *
      * @param entry the entry to get fields from
      * @since 1.1
      * @throws ZipException on error
      */
     public ZipEntry(java.util.zip.ZipEntry entry) throws ZipException {
         super(entry);
+        setName(entry.getName());
         byte[] extra = entry.getExtra();
         if (extra != null) {
             setExtraFields(ExtraFieldUtils.parse(extra, true,
@@ -85,10 +116,16 @@ public class ZipEntry extends java.util.
             // initializes extra data to an empty byte array
             setExtra();
         }
+        setMethod(entry.getMethod());
+        this.size = entry.getSize();
     }
 
     /**
      * Creates a new zip entry with fields taken from the specified zip entry.
+     *
+     * <p>Assumes the entry represents a directory if and only if the
+     * name ends with a forward slash "/".</p>
+     *
      * @param entry the entry to get fields from
      * @throws ZipException on error
      * @since 1.1
@@ -104,7 +141,26 @@ public class ZipEntry extends java.util.
      * @since 1.9
      */
     protected ZipEntry() {
-        super("");
+        this("");
+    }
+
+    /**
+     * Creates a new zip entry taking some information from the given
+     * file and using the provided name.
+     *
+     * <p>The name will be adjusted to end with a forward slash "/" if
+     * the file is a directory.  If the file is not a directory a
+     * potential trailing forward slash will be stripped from the
+     * entry name.</p>
+     */
+    public ZipEntry(File inputFile, String entryName) {
+        this(inputFile.isDirectory() && !entryName.endsWith("/") ? 
+             entryName + "/" : entryName);
+        if (inputFile.isFile()){
+            setSize(inputFile.length());
+        }
+        setTime(inputFile.lastModified());
+        // TODO are there any other fields we can set here?
     }
 
     /**
@@ -112,6 +168,7 @@ public class ZipEntry extends java.util.
      * @return a cloned copy of this ZipEntry
      * @since 1.1
      */
+    @Override
     public Object clone() {
         ZipEntry e = (ZipEntry) super.clone();
 
@@ -122,6 +179,31 @@ public class ZipEntry extends java.util.
     }
 
     /**
+     * Returns the compression method of this entry, or -1 if the
+     * compression method has not been specified.
+     *
+     * @return compression method
+     */
+    @Override
+    public int getMethod() {
+        return method;
+    }
+
+    /**
+     * Sets the compression method of this entry.
+     *
+     * @param method compression method
+     */
+    @Override
+    public void setMethod(int method) {
+        if (method < 0) {
+            throw new IllegalArgumentException(
+                    "ZIP compression method can not be negative: " + method);
+        }
+        this.method = method;
+    }
+
+    /**
      * Retrieves the internal file attributes.
      *
      * @return the internal file attributes
@@ -213,12 +295,12 @@ public class ZipEntry extends java.util.
      * @since 1.1
      */
     public void setExtraFields(ZipExtraField[] fields) {
-        extraFields = new LinkedHashMap();
-        for (int i = 0; i < fields.length; i++) {
-            if (fields[i] instanceof UnparseableExtraFieldData) {
-                unparseableExtra = (UnparseableExtraFieldData) fields[i];
+        extraFields = new LinkedHashMap<ZipShort, ZipExtraField>();
+        for (ZipExtraField field : fields) {
+            if (field instanceof UnparseableExtraFieldData) {
+                unparseableExtra = (UnparseableExtraFieldData) field;
             } else {
-                extraFields.put(fields[i].getHeaderId(), fields[i]);
+                extraFields.put(field.getHeaderId(), field);
             }
         }
         setExtra();
@@ -246,11 +328,12 @@ public class ZipEntry extends java.util.
                 ? new ZipExtraField[0]
                 : new ZipExtraField[] { unparseableExtra };
         }
-        List result = new ArrayList(extraFields.values());
+        List<ZipExtraField> result =
+            new ArrayList<ZipExtraField>(extraFields.values());
         if (includeUnparseable && unparseableExtra != null) {
             result.add(unparseableExtra);
         }
-        return (ZipExtraField[]) result.toArray(new ZipExtraField[0]);
+        return result.toArray(new ZipExtraField[0]);
     }
 
     /**
@@ -267,7 +350,7 @@ public class ZipEntry extends java.util.
             unparseableExtra = (UnparseableExtraFieldData) ze;
         } else {
             if (extraFields == null) {
-                extraFields = new LinkedHashMap();
+                extraFields = new LinkedHashMap<ZipShort, ZipExtraField>();
             }
             extraFields.put(ze.getHeaderId(), ze);
         }
@@ -286,8 +369,8 @@ public class ZipEntry extends java.util.
         if (ze instanceof UnparseableExtraFieldData) {
             unparseableExtra = (UnparseableExtraFieldData) ze;
         } else {
-            LinkedHashMap copy = extraFields;
-            extraFields = new LinkedHashMap();
+            LinkedHashMap<ZipShort, ZipExtraField> copy = extraFields;
+            extraFields = new LinkedHashMap<ZipShort, ZipExtraField>();
             extraFields.put(ze.getHeaderId(), ze);
             if (copy != null) {
                 copy.remove(ze.getHeaderId());
@@ -330,7 +413,7 @@ public class ZipEntry extends java.util.
      */
     public ZipExtraField getExtraField(ZipShort type) {
         if (extraFields != null) {
-            return (ZipExtraField) extraFields.get(type);
+            return extraFields.get(type);
         }
         return null;
     }
@@ -353,13 +436,14 @@ public class ZipEntry extends java.util.
      * @since 1.1
      * @throws RuntimeException on error
      */
+    @Override
     public void setExtra(byte[] extra) throws RuntimeException {
         try {
             ZipExtraField[] local =
                 ExtraFieldUtils.parse(extra, true,
                                       ExtraFieldUtils.UnparseableExtraField.READ);
             mergeExtraFields(local, true);
-        } catch (Exception e) {
+        } catch (ZipException e) {
             // actually this is not be possible as of Ant 1.8.1
             throw new RuntimeException("Error parsing extra fields for entry: "
                                        + getName() + " - " + e.getMessage(), e);
@@ -387,7 +471,7 @@ public class ZipEntry extends java.util.
                 ExtraFieldUtils.parse(b, false,
                                       ExtraFieldUtils.UnparseableExtraField.READ);
             mergeExtraFields(central, false);
-        } catch (Exception e) {
+        } catch (ZipException e) {
             throw new RuntimeException(e.getMessage(), e);
         }
     }
@@ -430,6 +514,7 @@ public class ZipEntry extends java.util.
      * @return the entry name
      * @since 1.9
      */
+    @Override
     public String getName() {
         return name == null ? super.getName() : name;
     }
@@ -439,6 +524,7 @@ public class ZipEntry extends java.util.
      * @return true if the entry is a directory
      * @since 1.10
      */
+    @Override
     public boolean isDirectory() {
         return getName().endsWith("/");
     }
@@ -448,15 +534,72 @@ public class ZipEntry extends java.util.
      * @param name the name to use
      */
     protected void setName(String name) {
+        if (name != null && getPlatform() == PLATFORM_FAT
+            && name.indexOf("/") == -1) {
+            name = name.replace('\\', '/');
+        }
         this.name = name;
     }
 
     /**
+     * Gets the uncompressed size of the entry data.
+     * @return the entry size
+     */
+    @Override
+    public long getSize() {
+        return size;
+    }
+
+    /**
+     * Sets the uncompressed size of the entry data.
+     * @param size the uncompressed size in bytes
+     * @exception IllegalArgumentException if the specified size is less
+     *            than 0
+     */
+    @Override
+    public void setSize(long size) {
+        if (size < 0) {
+            throw new IllegalArgumentException("invalid entry size");
+        }
+        this.size = size;
+    }
+
+    /**
+     * Sets the name using the raw bytes and the string created from
+     * it by guessing or using the configured encoding.
+     * @param name the name to use created from the raw bytes using
+     * the guessed or configured encoding
+     * @param rawName the bytes originally read as name from the
+     * archive
+     */
+    protected void setName(String name, byte[] rawName) {
+        setName(name);
+        this.rawName = rawName;
+    }
+
+    /**
+     * Returns the raw bytes that made up the name before it has been
+     * converted using the configured or guessed encoding.
+     *
+     * <p>This method will return null if this instance has not been
+     * read from an archive.</p>
+     */
+    public byte[] getRawName() {
+        if (rawName != null) {
+            byte[] b = new byte[rawName.length];
+            System.arraycopy(rawName, 0, b, 0, rawName.length);
+            return b;
+        }
+        return null;
+    }
+
+    /**
      * Get the hashCode of the entry.
      * This uses the name as the hashcode.
      * @return a hashcode.
      * @since Ant 1.7
      */
+    @Override
     public int hashCode() {
         // this method has severe consequences on performance. We cannot rely
         // on the super.hashCode() method since super.getName() always return
@@ -466,14 +609,17 @@ public class ZipEntry extends java.util.
     }
 
     /**
-     * The equality method. In this case, the implementation returns 'this == o'
-     * which is basically the equals method of the Object class.
-     * @param o the object to compare to
-     * @return true if this object is the same as <code>o</code>
-     * @since Ant 1.7
+     * The "general purpose bit" field.
+     */
+    public GeneralPurposeBit getGeneralPurposeBit() {
+        return gpb;
+    }
+
+    /**
+     * The "general purpose bit" field.
      */
-    public boolean equals(Object o) {
-        return (this == o);
+    public void setGeneralPurposeBit(GeneralPurposeBit b) {
+        gpb = b;
     }
 
     /**
@@ -489,23 +635,23 @@ public class ZipEntry extends java.util.
         if (extraFields == null) {
             setExtraFields(f);
         } else {
-            for (int i = 0; i < f.length; i++) {
+            for (ZipExtraField element : f) {
                 ZipExtraField existing;
-                if (f[i] instanceof UnparseableExtraFieldData) {
+                if (element instanceof UnparseableExtraFieldData) {
                     existing = unparseableExtra;
                 } else {
-                    existing = getExtraField(f[i].getHeaderId());
+                    existing = getExtraField(element.getHeaderId());
                 }
                 if (existing == null) {
-                    addExtraField(f[i]);
+                    addExtraField(element);
                 } else {
                     if (local
                         || !(existing
                              instanceof CentralDirectoryParsingZipExtraField)) {
-                        byte[] b = f[i].getLocalFileDataData();
+                        byte[] b = element.getLocalFileDataData();
                         existing.parseFromLocalFileData(b, 0, b.length);
                     } else {
-                        byte[] b = f[i].getCentralDirectoryData();
+                        byte[] b = element.getCentralDirectoryData();
                         ((CentralDirectoryParsingZipExtraField) existing)
                             .parseFromCentralDirectoryData(b, 0, b.length);
                     }
@@ -514,4 +660,54 @@ public class ZipEntry extends java.util.
             setExtra();
         }
     }
+
+    /** {@inheritDoc} */
+    public Date getLastModifiedDate() {
+        return new Date(getTime());
+    }
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+        ZipEntry other = (ZipEntry) obj;
+        String myName = getName();
+        String otherName = other.getName();
+        if (myName == null) {
+            if (otherName != null) {
+                return false;
+            }
+        } else if (!myName.equals(otherName)) {
+            return false;
+        }
+        String myComment = getComment();
+        String otherComment = other.getComment();
+        if (myComment == null) {
+            myComment = "";
+        }
+        if (otherComment == null) {
+            otherComment = "";
+        }
+        return getTime() == other.getTime()
+            && myComment.equals(otherComment)
+            && getInternalAttributes() == other.getInternalAttributes()
+            && getPlatform() == other.getPlatform()
+            && getExternalAttributes() == other.getExternalAttributes()
+            && getMethod() == other.getMethod()
+            && getSize() == other.getSize()
+            && getCrc() == other.getCrc()
+            && getCompressedSize() == other.getCompressedSize()
+            && Arrays.equals(getCentralDirectoryExtra(),
+                             other.getCentralDirectoryExtra())
+            && Arrays.equals(getLocalFileDataExtra(),
+                             other.getLocalFileDataExtra())
+            && gpb.equals(other.gpb);
+    }
 }