From 9416f208d98fd950115bdf29490af53fdae349f3 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Wed, 18 Feb 2009 15:21:32 +0000 Subject: [PATCH] allow extra fields to be added at the front git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@745537 13f79535-47bb-0310-9956-ffa450edef68 --- src/main/org/apache/tools/zip/ZipEntry.java | 22 ++++++++++ .../org/apache/tools/zip/ZipEntryTest.java | 40 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/src/main/org/apache/tools/zip/ZipEntry.java b/src/main/org/apache/tools/zip/ZipEntry.java index d1e1deb2c..8c9b93220 100644 --- a/src/main/org/apache/tools/zip/ZipEntry.java +++ b/src/main/org/apache/tools/zip/ZipEntry.java @@ -215,6 +215,9 @@ public class ZipEntry extends java.util.zip.ZipEntry implements Cloneable { /** * Adds an extra fields - replacing an already present extra field * of the same type. + * + *

If no extra field of the same type exists, the field will be + * added as last field.

* @param ze an extra field * @since 1.1 */ @@ -226,6 +229,25 @@ public class ZipEntry extends java.util.zip.ZipEntry implements Cloneable { setExtra(); } + /** + * Adds an extra fields - replacing an already present extra field + * of the same type. + * + *

The new extra field will be the first one.

+ * @param ze an extra field + * @since 1.1 + */ + public void addAsFirstExtraField(ZipExtraField ze) { + LinkedHashMap copy = extraFields; + extraFields = new LinkedHashMap(); + extraFields.put(ze.getHeaderId(), ze); + if (copy != null) { + copy.remove(ze.getHeaderId()); + extraFields.putAll(copy); + } + setExtra(); + } + /** * Remove an extra fields. * @param type the type of extra field to remove diff --git a/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java b/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java index b8e2f6c42..02934b452 100644 --- a/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java +++ b/src/tests/junit/org/apache/tools/zip/ZipEntryTest.java @@ -85,6 +85,46 @@ public class ZipEntryTest extends TestCase { } } + /** + * test handling of extra fields + * + * @since 1.1 + */ + public void testAddAsFirstExtraField() { + AsiExtraField a = new AsiExtraField(); + a.setDirectory(true); + a.setMode(0755); + UnrecognizedExtraField u = new UnrecognizedExtraField(); + u.setHeaderId(new ZipShort(1)); + u.setLocalFileDataData(new byte[0]); + + ZipEntry ze = new ZipEntry("test/"); + ze.setExtraFields(new ZipExtraField[] {a, u}); + byte[] data1 = ze.getExtra(); + + UnrecognizedExtraField u2 = new UnrecognizedExtraField(); + u2.setHeaderId(new ZipShort(1)); + u2.setLocalFileDataData(new byte[] {1}); + + ze.addAsFirstExtraField(u2); + byte[] data2 = ze.getExtra(); + ZipExtraField[] result = ze.getExtraFields(); + assertEquals("second pass", 2, result.length); + assertSame(u2, result[0]); + assertSame(a, result[1]); + assertEquals("length second pass", data1.length + 1, data2.length); + + UnrecognizedExtraField u3 = new UnrecognizedExtraField(); + u3.setHeaderId(new ZipShort(2)); + u3.setLocalFileDataData(new byte[] {1}); + ze.addAsFirstExtraField(u3); + result = ze.getExtraFields(); + assertEquals("third pass", 3, result.length); + assertSame(u3, result[0]); + assertSame(u2, result[1]); + assertSame(a, result[2]); + } + public void testUnixMode() { ZipEntry ze = new ZipEntry("foo"); assertEquals(0, ze.getPlatform());