X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Forg%2Fapache%2Ftools%2Fzip%2FZipEntry.java;h=ed558fa72cb231381535010a7dc12bd26ad30922;hb=844ccad5a3fcbedec17b2af66d460f31abc7cff1;hp=fc43e0219cf1ed12b76bf350799353392ea06d6b;hpb=6f33f705957d674dc2ab6c994a6ea87f7a91f40f;p=vamsas.git diff --git a/src/org/apache/tools/zip/ZipEntry.java b/src/org/apache/tools/zip/ZipEntry.java index fc43e02..ed558fa 100644 --- a/src/org/apache/tools/zip/ZipEntry.java +++ b/src/org/apache/tools/zip/ZipEntry.java @@ -22,347 +22,392 @@ import java.util.Vector; import java.util.zip.ZipException; /** - * Extension that adds better handling of extra fields and provides - * access to the internal and external file attributes. - * + * Extension that adds better handling of extra fields and provides access to + * the internal and external file attributes. + * */ public class ZipEntry extends java.util.zip.ZipEntry implements Cloneable { - private static final int PLATFORM_UNIX = 3; - private static final int PLATFORM_FAT = 0; - - private int internalAttributes = 0; - private int platform = PLATFORM_FAT; - private long externalAttributes = 0; - private Vector/**/ extraFields = null; - private String name = null; - - /** - * Creates a new zip entry with the specified name. - * @param name the name of the entry - * @since 1.1 - */ - public ZipEntry(String name) { - super(name); - } - - /** - * Creates a new zip entry with fields taken from the specified zip entry. - * @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); - byte[] extra = entry.getExtra(); - if (extra != null) { - setExtraFields(ExtraFieldUtils.parse(extra)); - } else { - // initializes extra data to an empty byte array - setExtra(); - } - } - - /** - * Creates a new zip entry with fields taken from the specified zip entry. - * @param entry the entry to get fields from - * @throws ZipException on error - * @since 1.1 - */ - public ZipEntry(ZipEntry entry) throws ZipException { - this((java.util.zip.ZipEntry) entry); - setInternalAttributes(entry.getInternalAttributes()); - setExternalAttributes(entry.getExternalAttributes()); - setExtraFields(entry.getExtraFields()); - } - - /** - * @since 1.9 - */ - protected ZipEntry() { - super(""); - } - - /** - * Overwrite clone. - * @return a cloned copy of this ZipEntry - * @since 1.1 - */ - public Object clone() { - ZipEntry e = (ZipEntry) super.clone(); - - e.extraFields = extraFields != null ? (Vector) extraFields.clone() : null; - e.setInternalAttributes(getInternalAttributes()); - e.setExternalAttributes(getExternalAttributes()); - e.setExtraFields(getExtraFields()); - return e; - } - - /** - * Retrieves the internal file attributes. - * - * @return the internal file attributes - * @since 1.1 - */ - public int getInternalAttributes() { - return internalAttributes; - } - - /** - * Sets the internal file attributes. - * @param value an int value - * @since 1.1 - */ - public void setInternalAttributes(int value) { - internalAttributes = value; - } - - /** - * Retrieves the external file attributes. - * @return the external file attributes - * @since 1.1 - */ - public long getExternalAttributes() { - return externalAttributes; - } - - /** - * Sets the external file attributes. - * @param value an long value - * @since 1.1 - */ - public void setExternalAttributes(long value) { - externalAttributes = value; - } - - /** - * Sets Unix permissions in a way that is understood by Info-Zip's - * unzip command. - * @param mode an int value - * @since Ant 1.5.2 - */ - public void setUnixMode(int mode) { - setExternalAttributes((mode << 16) - // MS-DOS read-only attribute - | ((mode & 0200) == 0 ? 1 : 0) - // MS-DOS directory flag - | (isDirectory() ? 0x10 : 0)); - platform = PLATFORM_UNIX; - } - - /** - * Unix permission. - * @return the unix permissions - * @since Ant 1.6 - */ - public int getUnixMode() { - return (int) ((getExternalAttributes() >> 16) & 0xFFFF); - } - - /** - * Platform specification to put into the "version made - * by" part of the central file header. - * - * @return 0 (MS-DOS FAT) unless {@link #setUnixMode setUnixMode} - * has been called, in which case 3 (Unix) will be returned. - * - * @since Ant 1.5.2 - */ - public int getPlatform() { - return platform; - } - - /** - * Set the platform (UNIX or FAT). - * @param platform an int value - 0 is FAT, 3 is UNIX - * @since 1.9 - */ - protected void setPlatform(int platform) { - this.platform = platform; - } - - /** - * Replaces all currently attached extra fields with the new array. - * @param fields an array of extra fields - * @since 1.1 - */ - public void setExtraFields(ZipExtraField[] fields) { - extraFields = new Vector(); - for (int i = 0; i < fields.length; i++) { - extraFields.addElement(fields[i]); - } - setExtra(); - } - - /** - * Retrieves extra fields. - * @return an array of the extra fields - * @since 1.1 - */ - public ZipExtraField[] getExtraFields() { - if (extraFields == null) { - return new ZipExtraField[0]; - } - ZipExtraField[] result = new ZipExtraField[extraFields.size()]; - extraFields.copyInto(result); - return result; - } - - /** - * Adds an extra fields - replacing an already present extra field - * of the same type. - * @param ze an extra field - * @since 1.1 - */ - public void addExtraField(ZipExtraField ze) { - if (extraFields == null) { - extraFields = new Vector(); - } - ZipShort type = ze.getHeaderId(); - boolean done = false; - for (int i = 0, fieldsSize = extraFields.size(); !done && i < fieldsSize; i++) { - if (((ZipExtraField) extraFields.elementAt(i)).getHeaderId().equals(type)) { - extraFields.setElementAt(ze, i); - done = true; - } - } - if (!done) { - extraFields.addElement(ze); - } - setExtra(); - } - - /** - * Remove an extra fields. - * @param type the type of extra field to remove - * @since 1.1 - */ - public void removeExtraField(ZipShort type) { - if (extraFields == null) { - extraFields = new Vector(); - } - boolean done = false; - for (int i = 0, fieldsSize = extraFields.size(); !done && i < fieldsSize; i++) { - if (((ZipExtraField) extraFields.elementAt(i)).getHeaderId().equals(type)) { - extraFields.removeElementAt(i); - done = true; - } - } - if (!done) { - throw new java.util.NoSuchElementException(); - } - setExtra(); + private static final int PLATFORM_UNIX = 3; + + private static final int PLATFORM_FAT = 0; + + private int internalAttributes = 0; + + private int platform = PLATFORM_FAT; + + private long externalAttributes = 0; + + private Vector/* */extraFields = null; + + private String name = null; + + /** + * Creates a new zip entry with the specified name. + * + * @param name + * the name of the entry + * @since 1.1 + */ + public ZipEntry(String name) { + super(name); + } + + /** + * Creates a new zip entry with fields taken from the specified zip entry. + * + * @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); + byte[] extra = entry.getExtra(); + if (extra != null) { + setExtraFields(ExtraFieldUtils.parse(extra)); + } else { + // initializes extra data to an empty byte array + setExtra(); } - - /** - * Throws an Exception if extra data cannot be parsed into extra fields. - * @param extra an array of bytes to be parsed into extra fields - * @throws RuntimeException if the bytes cannot be parsed - * @since 1.1 - * @throws RuntimeException on error - */ - public void setExtra(byte[] extra) throws RuntimeException { - try { - setExtraFields(ExtraFieldUtils.parse(extra)); - } catch (Exception e) { - throw new RuntimeException(e.getMessage()); - } + } + + /** + * Creates a new zip entry with fields taken from the specified zip entry. + * + * @param entry + * the entry to get fields from + * @throws ZipException + * on error + * @since 1.1 + */ + public ZipEntry(ZipEntry entry) throws ZipException { + this((java.util.zip.ZipEntry) entry); + setInternalAttributes(entry.getInternalAttributes()); + setExternalAttributes(entry.getExternalAttributes()); + setExtraFields(entry.getExtraFields()); + } + + /** + * @since 1.9 + */ + protected ZipEntry() { + super(""); + } + + /** + * Overwrite clone. + * + * @return a cloned copy of this ZipEntry + * @since 1.1 + */ + public Object clone() { + ZipEntry e = (ZipEntry) super.clone(); + + e.extraFields = extraFields != null ? (Vector) extraFields.clone() : null; + e.setInternalAttributes(getInternalAttributes()); + e.setExternalAttributes(getExternalAttributes()); + e.setExtraFields(getExtraFields()); + return e; + } + + /** + * Retrieves the internal file attributes. + * + * @return the internal file attributes + * @since 1.1 + */ + public int getInternalAttributes() { + return internalAttributes; + } + + /** + * Sets the internal file attributes. + * + * @param value + * an int value + * @since 1.1 + */ + public void setInternalAttributes(int value) { + internalAttributes = value; + } + + /** + * Retrieves the external file attributes. + * + * @return the external file attributes + * @since 1.1 + */ + public long getExternalAttributes() { + return externalAttributes; + } + + /** + * Sets the external file attributes. + * + * @param value + * an long value + * @since 1.1 + */ + public void setExternalAttributes(long value) { + externalAttributes = value; + } + + /** + * Sets Unix permissions in a way that is understood by Info-Zip's unzip + * command. + * + * @param mode + * an int value + * @since Ant 1.5.2 + */ + public void setUnixMode(int mode) { + setExternalAttributes((mode << 16) + // MS-DOS read-only attribute + | ((mode & 0200) == 0 ? 1 : 0) + // MS-DOS directory flag + | (isDirectory() ? 0x10 : 0)); + platform = PLATFORM_UNIX; + } + + /** + * Unix permission. + * + * @return the unix permissions + * @since Ant 1.6 + */ + public int getUnixMode() { + return (int) ((getExternalAttributes() >> 16) & 0xFFFF); + } + + /** + * Platform specification to put into the "version made by" part of + * the central file header. + * + * @return 0 (MS-DOS FAT) unless {@link #setUnixMode setUnixMode} has been + * called, in which case 3 (Unix) will be returned. + * + * @since Ant 1.5.2 + */ + public int getPlatform() { + return platform; + } + + /** + * Set the platform (UNIX or FAT). + * + * @param platform + * an int value - 0 is FAT, 3 is UNIX + * @since 1.9 + */ + protected void setPlatform(int platform) { + this.platform = platform; + } + + /** + * Replaces all currently attached extra fields with the new array. + * + * @param fields + * an array of extra fields + * @since 1.1 + */ + public void setExtraFields(ZipExtraField[] fields) { + extraFields = new Vector(); + for (int i = 0; i < fields.length; i++) { + extraFields.addElement(fields[i]); } - - /** - * Unfortunately {@link java.util.zip.ZipOutputStream - * java.util.zip.ZipOutputStream} seems to access the extra data - * directly, so overriding getExtra doesn't help - we need to - * modify super's data directly. - * - * @since 1.1 - */ - protected void setExtra() { - super.setExtra(ExtraFieldUtils.mergeLocalFileDataData(getExtraFields())); + setExtra(); + } + + /** + * Retrieves extra fields. + * + * @return an array of the extra fields + * @since 1.1 + */ + public ZipExtraField[] getExtraFields() { + if (extraFields == null) { + return new ZipExtraField[0]; } - - /** - * Retrieves the extra data for the local file data. - * @return the extra data for local file - * @since 1.1 - */ - public byte[] getLocalFileDataExtra() { - byte[] extra = getExtra(); - return extra != null ? extra : new byte[0]; + ZipExtraField[] result = new ZipExtraField[extraFields.size()]; + extraFields.copyInto(result); + return result; + } + + /** + * Adds an extra fields - replacing an already present extra field of the same + * type. + * + * @param ze + * an extra field + * @since 1.1 + */ + public void addExtraField(ZipExtraField ze) { + if (extraFields == null) { + extraFields = new Vector(); } - - /** - * Retrieves the extra data for the central directory. - * @return the central directory extra data - * @since 1.1 - */ - public byte[] getCentralDirectoryExtra() { - return ExtraFieldUtils.mergeCentralDirectoryData(getExtraFields()); + ZipShort type = ze.getHeaderId(); + boolean done = false; + for (int i = 0, fieldsSize = extraFields.size(); !done && i < fieldsSize; i++) { + if (((ZipExtraField) extraFields.elementAt(i)).getHeaderId().equals(type)) { + extraFields.setElementAt(ze, i); + done = true; + } } - - /** - * Make this class work in JDK 1.1 like a 1.2 class. - * - *

This either stores the size for later usage or invokes - * setCompressedSize via reflection.

- * @param size the size to use - * @deprecated since 1.7. - * Use setCompressedSize directly. - * @since 1.2 - */ - public void setComprSize(long size) { - setCompressedSize(size); + if (!done) { + extraFields.addElement(ze); } - - /** - * Get the name of the entry. - * @return the entry name - * @since 1.9 - */ - public String getName() { - return name == null ? super.getName() : name; + setExtra(); + } + + /** + * Remove an extra fields. + * + * @param type + * the type of extra field to remove + * @since 1.1 + */ + public void removeExtraField(ZipShort type) { + if (extraFields == null) { + extraFields = new Vector(); } - - /** - * Is this entry a directory? - * @return true if the entry is a directory - * @since 1.10 - */ - public boolean isDirectory() { - return getName().endsWith("/"); + boolean done = false; + for (int i = 0, fieldsSize = extraFields.size(); !done && i < fieldsSize; i++) { + if (((ZipExtraField) extraFields.elementAt(i)).getHeaderId().equals(type)) { + extraFields.removeElementAt(i); + done = true; + } } - - /** - * Set the name of the entry. - * @param name the name to use - */ - protected void setName(String name) { - this.name = name; + if (!done) { + throw new java.util.NoSuchElementException(); } - - /** - * Get the hashCode of the entry. - * This uses the name as the hashcode. - * @return a hashcode. - * @since Ant 1.7 - */ - public int hashCode() { - // this method has severe consequences on performance. We cannot rely - // on the super.hashCode() method since super.getName() always return - // the empty string in the current implemention (there's no setter) - // so it is basically draining the performance of a hashmap lookup - return getName().hashCode(); - } - - /** - * 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 o - * @since Ant 1.7 - */ - public boolean equals(Object o) { - return (this == o); + setExtra(); + } + + /** + * Throws an Exception if extra data cannot be parsed into extra fields. + * + * @param extra + * an array of bytes to be parsed into extra fields + * @throws RuntimeException + * if the bytes cannot be parsed + * @since 1.1 + * @throws RuntimeException + * on error + */ + public void setExtra(byte[] extra) throws RuntimeException { + try { + setExtraFields(ExtraFieldUtils.parse(extra)); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); } + } + + /** + * Unfortunately {@link java.util.zip.ZipOutputStream + * java.util.zip.ZipOutputStream} seems to access the extra data directly, so + * overriding getExtra doesn't help - we need to modify super's data directly. + * + * @since 1.1 + */ + protected void setExtra() { + super.setExtra(ExtraFieldUtils.mergeLocalFileDataData(getExtraFields())); + } + + /** + * Retrieves the extra data for the local file data. + * + * @return the extra data for local file + * @since 1.1 + */ + public byte[] getLocalFileDataExtra() { + byte[] extra = getExtra(); + return extra != null ? extra : new byte[0]; + } + + /** + * Retrieves the extra data for the central directory. + * + * @return the central directory extra data + * @since 1.1 + */ + public byte[] getCentralDirectoryExtra() { + return ExtraFieldUtils.mergeCentralDirectoryData(getExtraFields()); + } + + /** + * Make this class work in JDK 1.1 like a 1.2 class. + * + *

+ * This either stores the size for later usage or invokes setCompressedSize + * via reflection. + *

+ * + * @param size + * the size to use + * @deprecated since 1.7. Use setCompressedSize directly. + * @since 1.2 + */ + public void setComprSize(long size) { + setCompressedSize(size); + } + + /** + * Get the name of the entry. + * + * @return the entry name + * @since 1.9 + */ + public String getName() { + return name == null ? super.getName() : name; + } + + /** + * Is this entry a directory? + * + * @return true if the entry is a directory + * @since 1.10 + */ + public boolean isDirectory() { + return getName().endsWith("/"); + } + + /** + * Set the name of the entry. + * + * @param name + * the name to use + */ + protected void setName(String name) { + this.name = name; + } + + /** + * Get the hashCode of the entry. This uses the name as the hashcode. + * + * @return a hashcode. + * @since Ant 1.7 + */ + public int hashCode() { + // this method has severe consequences on performance. We cannot rely + // on the super.hashCode() method since super.getName() always return + // the empty string in the current implemention (there's no setter) + // so it is basically draining the performance of a hashmap lookup + return getName().hashCode(); + } + + /** + * 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 o + * @since Ant 1.7 + */ + public boolean equals(Object o) { + return (this == o); + } }