diff --git a/src/main/org/apache/tools/zip/GeneralPurposeBit.java b/src/main/org/apache/tools/zip/GeneralPurposeBit.java index eaafc2c5c..ab2525dc4 100644 --- a/src/main/org/apache/tools/zip/GeneralPurposeBit.java +++ b/src/main/org/apache/tools/zip/GeneralPurposeBit.java @@ -23,7 +23,7 @@ package org.apache.tools.zip; * * @since Ant 1.9.0 */ -public final class GeneralPurposeBit { +public final class GeneralPurposeBit implements Cloneable { /** * Indicates that the file is encrypted. */ @@ -168,4 +168,14 @@ public final class GeneralPurposeBit { && g.languageEncodingFlag == languageEncodingFlag && g.dataDescriptorFlag == dataDescriptorFlag; } + + @Override + public Object clone() { + try { + return super.clone(); + } catch (CloneNotSupportedException ex) { + // impossible + throw new RuntimeException("GeneralPurposeBit is not Cloneable?", ex); + } + } } diff --git a/src/main/org/apache/tools/zip/ZipEntry.java b/src/main/org/apache/tools/zip/ZipEntry.java index 375a7acfe..8031481af 100644 --- a/src/main/org/apache/tools/zip/ZipEntry.java +++ b/src/main/org/apache/tools/zip/ZipEntry.java @@ -136,6 +136,9 @@ public class ZipEntry extends java.util.zip.ZipEntry implements Cloneable { setInternalAttributes(entry.getInternalAttributes()); setExternalAttributes(entry.getExternalAttributes()); setExtraFields(entry.getExtraFields(true)); + setPlatform(entry.platform); + setGeneralPurposeBit(entry.gpb == null ? null : + (GeneralPurposeBit) entry.gpb.clone()); } /** diff --git a/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java b/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java index b0a3294e8..3c21f6f3a 100644 --- a/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java +++ b/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java @@ -215,4 +215,14 @@ public class ZipEntryTest { ZipEntry entry2 = new ZipEntry("bar"); assertFalse(entry1.equals(entry2)); } + + @Test + public void testCopyConstructor() throws Exception { + ZipEntry archiveEntry = new ZipEntry("fred"); + archiveEntry.setUnixMode(0664); + archiveEntry.setMethod(ZipEntry.DEFLATED); + archiveEntry.getGeneralPurposeBit().useStrongEncryption(true); + ZipEntry copy = new ZipEntry(archiveEntry); + assertEquals(archiveEntry, copy); + } }