COMPRESS-391 some tweaks
Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo Commit: http://git-wip-us.apache.org/repos/asf/commons-compress/commit/fef18a23 Tree: http://git-wip-us.apache.org/repos/asf/commons-compress/tree/fef18a23 Diff: http://git-wip-us.apache.org/repos/asf/commons-compress/diff/fef18a23 Branch: refs/heads/master Commit: fef18a23d3b09025e0ddc3733334a4587c3af712 Parents: f2af9f0 Author: Stefan Bodewig <bode...@apache.org> Authored: Thu May 11 20:15:10 2017 +0200 Committer: Stefan Bodewig <bode...@apache.org> Committed: Thu May 11 20:15:10 2017 +0200 ---------------------------------------------------------------------- .../archivers/zip/ResourceAlignmentExtraField.java | 16 ++++++++++------ .../compress/archivers/zip/ZipArchiveEntry.java | 2 ++ .../archivers/zip/ZipArchiveOutputStream.java | 16 ++++++---------- .../compress/archivers/zip/ZipExtraField.java | 6 ++++++ .../commons/compress/archivers/zip/ZipShort.java | 4 ++++ 5 files changed, 28 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/commons-compress/blob/fef18a23/src/main/java/org/apache/commons/compress/archivers/zip/ResourceAlignmentExtraField.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ResourceAlignmentExtraField.java b/src/main/java/org/apache/commons/compress/archivers/zip/ResourceAlignmentExtraField.java index a9f8748..79e20f6 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/ResourceAlignmentExtraField.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/ResourceAlignmentExtraField.java @@ -44,6 +44,8 @@ public class ResourceAlignmentExtraField implements ZipExtraField { public static final int BASE_SIZE = 2; + private static final int ALLOW_METHOD_MESSAGE_CHANGE_FLAG = 0x8000; + private short alignment; private boolean allowMethodChange; @@ -106,14 +108,15 @@ public class ResourceAlignmentExtraField implements ZipExtraField { @Override public byte[] getLocalFileDataData() { - byte[] content = new byte[2+padding]; - ZipShort.putShort(alignment | (allowMethodChange ? 0x8000 : 0), content, 0); + byte[] content = new byte[BASE_SIZE + padding]; + ZipShort.putShort(alignment | (allowMethodChange ? ALLOW_METHOD_MESSAGE_CHANGE_FLAG : 0), + content, 0); return content; } @Override public byte[] getCentralDirectoryData() { - return ZipShort.getBytes(alignment | (allowMethodChange ? 0x8000 : 0)); + return ZipShort.getBytes(alignment | (allowMethodChange ? ALLOW_METHOD_MESSAGE_CHANGE_FLAG : 0)); } @Override @@ -124,10 +127,11 @@ public class ResourceAlignmentExtraField implements ZipExtraField { @Override public void parseFromCentralDirectoryData(byte[] buffer, int offset, int length) throws ZipException { - if (length < 2) + if (length < BASE_SIZE) { throw new ZipException("Too short content for ResourceAlignmentExtraField (0xa11e): " + length); + } int alignmentValue = ZipShort.getValue(buffer, offset); - this.alignment = (short) (alignmentValue&0x7fff); - this.allowMethodChange = (alignmentValue&0x8000) != 0; + this.alignment = (short) (alignmentValue & (ALLOW_METHOD_MESSAGE_CHANGE_FLAG - 1)); + this.allowMethodChange = (alignmentValue & ALLOW_METHOD_MESSAGE_CHANGE_FLAG) != 0; } } http://git-wip-us.apache.org/repos/asf/commons-compress/blob/fef18a23/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java index ffcb953..69e4990 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java @@ -328,6 +328,7 @@ public class ZipArchiveEntry extends java.util.zip.ZipEntry * * @return * alignment for this entry. + * @since 1.14 */ protected int getAlignment() { return this.alignment; @@ -338,6 +339,7 @@ public class ZipArchiveEntry extends java.util.zip.ZipEntry * * @param alignment * requested alignment, 0 for default. + * @since 1.14 */ public void setAlignment(int alignment) { if ((alignment & (alignment - 1)) != 0 || alignment > 0xffff) { http://git-wip-us.apache.org/repos/asf/commons-compress/blob/fef18a23/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java index 5649af3..c667356 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java @@ -142,11 +142,6 @@ public class ZipArchiveOutputStream extends ArchiveOutputStream { @Deprecated public static final int EFS_FLAG = GeneralPurposeBit.UFT8_NAMES_FLAG; - /** - * Size of an extra field field header (id + length). - */ - public static final int EXTRAFIELD_HEADER_SIZE = 4; - private static final byte[] EMPTY = new byte[0]; /** @@ -1043,9 +1038,10 @@ public class ZipArchiveOutputStream extends ArchiveOutputStream { private byte[] createLocalFileHeader(final ZipArchiveEntry ze, final ByteBuffer name, final boolean encodable, final boolean phased, long archiveOffset) throws IOException { ResourceAlignmentExtraField oldAlignmentEx = - (ResourceAlignmentExtraField) ze.getExtraField(ResourceAlignmentExtraField.ID); - if (oldAlignmentEx != null) + (ResourceAlignmentExtraField) ze.getExtraField(ResourceAlignmentExtraField.ID); + if (oldAlignmentEx != null) { ze.removeExtraField(ResourceAlignmentExtraField.ID); + } int alignment = ze.getAlignment(); if (alignment <= 0 && oldAlignmentEx != null) { @@ -1057,16 +1053,16 @@ public class ZipArchiveOutputStream extends ArchiveOutputStream { name.limit() - name.position() + ze.getLocalFileDataExtra().length; - int padding = (int) ((-archiveOffset - oldLength - EXTRAFIELD_HEADER_SIZE + int padding = (int) ((-archiveOffset - oldLength - ZipExtraField.EXTRAFIELD_HEADER_SIZE - ResourceAlignmentExtraField.BASE_SIZE) & (alignment - 1)); ze.addExtraField(new ResourceAlignmentExtraField(alignment, oldAlignmentEx != null ? oldAlignmentEx.allowMethodChange() : false, padding)); } - byte[] extra = ze.getLocalFileDataExtra(); + final byte[] extra = ze.getLocalFileDataExtra(); final int nameLen = name.limit() - name.position(); - int len = LFH_FILENAME_OFFSET + nameLen + extra.length; + final int len = LFH_FILENAME_OFFSET + nameLen + extra.length; final byte[] buf = new byte[len]; System.arraycopy(LFH_SIG, 0, buf, LFH_SIG_OFFSET, WORD); http://git-wip-us.apache.org/repos/asf/commons-compress/blob/fef18a23/src/main/java/org/apache/commons/compress/archivers/zip/ZipExtraField.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipExtraField.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipExtraField.java index 3149774..2c44b2a 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipExtraField.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipExtraField.java @@ -32,6 +32,12 @@ import java.util.zip.ZipException; */ public interface ZipExtraField { /** + * Size of an extra field field header (id + length). + * @since 1.14 + */ + int EXTRAFIELD_HEADER_SIZE = 4; + + /** * The Header-ID. * * @return The HeaderId value http://git-wip-us.apache.org/repos/asf/commons-compress/blob/fef18a23/src/main/java/org/apache/commons/compress/archivers/zip/ZipShort.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipShort.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipShort.java index 65acf21..ccb5094 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipShort.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipShort.java @@ -27,6 +27,10 @@ import org.apache.commons.compress.utils.ByteUtils; * @Immutable */ public final class ZipShort implements Cloneable, Serializable { + /** + * ZipShort with a value of 0. + * @since 1.14 + */ public static final ZipShort ZERO = new ZipShort(0); private static final long serialVersionUID = 1L;