< prev index next >

src/java.base/share/classes/java/util/zip/ZipEntry.java

Print this page
rev 11478 : 8073497: Lazy conversion of ZipEntry time
Reviewed-by: sherman, plevart

*** 1,7 **** /* ! * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 39,49 **** */ public class ZipEntry implements ZipConstants, Cloneable { String name; // entry name ! long time = -1; // last modification time FileTime mtime; // last modification time, from extra field data FileTime atime; // last access time, from extra field data FileTime ctime; // creation time, from extra field data long crc = -1; // crc-32 of entry data long size = -1; // uncompressed size of entry data --- 39,51 ---- */ public class ZipEntry implements ZipConstants, Cloneable { String name; // entry name ! long xdostime = -1; // last modification time (in extended DOS time, ! // where milliseconds lost in conversion might ! // be encoded into the upper half) FileTime mtime; // last modification time, from extra field data FileTime atime; // last access time, from extra field data FileTime ctime; // creation time, from extra field data long crc = -1; // crc-32 of entry data long size = -1; // uncompressed size of entry data
*** 62,71 **** --- 64,95 ---- * Compression method for compressed (deflated) entries. */ public static final int DEFLATED = 8; /** + * DOS time constant for representing timestamps before 1980. + */ + static final long DOSTIME_BEFORE_1980 = (1 << 21) | (1 << 16); + + /** + * Approximately 128 years, in milliseconds (ignoring leap years etc). + * + * This establish an approximate high-bound value for DOS times in + * milliseconds since epoch, used to enable an efficient but + * sufficient bounds check to avoid generating extended last modified + * time entries. + * + * Calculating the exact number is locale dependent, would require loading + * TimeZone data eagerly, and would make little practical sense. Since DOS + * times theoretically go to 2107 - with compatibility not guaranteed + * after 2099 - setting this to a time that is before but near 2099 + * should be sufficient. + */ + private static final long UPPER_DOSTIME_BOUND = + 128L * 365 * 24 * 60 * 60 * 1000; + + /** * Creates a new zip entry with the specified name. * * @param name * The entry name *
*** 91,101 **** * @throws NullPointerException if the entry object is null */ public ZipEntry(ZipEntry e) { Objects.requireNonNull(e, "entry"); name = e.name; ! time = e.time; mtime = e.mtime; atime = e.atime; ctime = e.ctime; crc = e.crc; size = e.size; --- 115,125 ---- * @throws NullPointerException if the entry object is null */ public ZipEntry(ZipEntry e) { Objects.requireNonNull(e, "entry"); name = e.name; ! xdostime = e.xdostime; mtime = e.mtime; atime = e.atime; ctime = e.ctime; crc = e.crc; size = e.size;
*** 135,146 **** * * @see #getTime() * @see #getLastModifiedTime() */ public void setTime(long time) { ! this.time = time; this.mtime = null; } /** * Returns the last modification time of the entry. * --- 159,176 ---- * * @see #getTime() * @see #getLastModifiedTime() */ public void setTime(long time) { ! this.xdostime = javaToExtendedDosTime(time); ! // Avoid setting the mtime field if time is in the valid ! // range for a DOS time ! if (xdostime != DOSTIME_BEFORE_1980 && time <= UPPER_DOSTIME_BOUND) { this.mtime = null; + } else { + this.mtime = FileTime.from(time, TimeUnit.MILLISECONDS); + } } /** * Returns the last modification time of the entry. *
*** 156,166 **** * * @see #setTime(long) * @see #setLastModifiedTime(FileTime) */ public long getTime() { ! return time; } /** * Sets the last modification time of the entry. * --- 186,199 ---- * * @see #setTime(long) * @see #setLastModifiedTime(FileTime) */ public long getTime() { ! if (mtime != null) { ! return mtime.toMillis(); ! } ! return (xdostime != -1) ? extendedDosToJavaTime(xdostime) : -1; } /** * Sets the last modification time of the entry. *
*** 179,189 **** * @see #getLastModifiedTime() * @since 1.8 */ public ZipEntry setLastModifiedTime(FileTime time) { this.mtime = Objects.requireNonNull(time, "lastModifiedTime"); ! this.time = time.to(TimeUnit.MILLISECONDS); return this; } /** * Returns the last modification time of the entry. --- 212,222 ---- * @see #getLastModifiedTime() * @since 1.8 */ public ZipEntry setLastModifiedTime(FileTime time) { this.mtime = Objects.requireNonNull(time, "lastModifiedTime"); ! this.xdostime = javaToExtendedDosTime(time.to(TimeUnit.MILLISECONDS)); return this; } /** * Returns the last modification time of the entry.
*** 202,214 **** * @since 1.8 */ public FileTime getLastModifiedTime() { if (mtime != null) return mtime; ! if (time == -1) return null; ! return FileTime.from(time, TimeUnit.MILLISECONDS); } /** * Sets the last access time of the entry. * --- 235,247 ---- * @since 1.8 */ public FileTime getLastModifiedTime() { if (mtime != null) return mtime; ! if (xdostime == -1) return null; ! return FileTime.from(getTime(), TimeUnit.MILLISECONDS); } /** * Sets the last access time of the entry. *
< prev index next >