Author: bodewig Date: Sun Dec 8 19:14:25 2013 New Revision: 1549131 URL: http://svn.apache.org/r1549131 Log: COMPRESS-242 make X5455_ExtendedTimestamp more convenient
Modified: commons/proper/compress/trunk/src/changes/changes.xml commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java Modified: commons/proper/compress/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1549131&r1=1549130&r2=1549131&view=diff ============================================================================== --- commons/proper/compress/trunk/src/changes/changes.xml (original) +++ commons/proper/compress/trunk/src/changes/changes.xml Sun Dec 8 19:14:25 2013 @@ -63,6 +63,13 @@ The <action> type attribute can be add,u <action issue="COMPRESS-245" type="fix" date="2013-12-06"> TarArchiveInputStream could fail to read an archive completely. </action> + <action issue="COMPRESS-242" type="fix" date="2013-12-08"> + The time-setters in X5455_ExtendedTimestamp now set the + corresponding flags explicitly - i.e. they set the bit if the + valus is not-null and reset it otherwise. This may cause + incompatibilities if you use setFlags to unset a bit and later + set the time to a non-null value - the flag will now be set. + </action> </release> <release version="1.6" date="2013-10-26" description="Release 1.6"> Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java?rev=1549131&r1=1549130&r2=1549131&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java Sun Dec 8 19:14:25 2013 @@ -85,9 +85,21 @@ public class X5455_ExtendedTimestamp imp private static final ZipShort HEADER_ID = new ZipShort(0x5455); private static final long serialVersionUID = 1L; - static final byte MODIFY_TIME_BIT = 1; - static final byte ACCESS_TIME_BIT = 2; - static final byte CREATE_TIME_BIT = 4; + /** + * The bit set inside the flags by when the last modification time + * is present in this extra field. + */ + public static final byte MODIFY_TIME_BIT = 1; + /** + * The bit set inside the flags by when the lasr access time is + * present in this extra field. + */ + public static final byte ACCESS_TIME_BIT = 2; + /** + * The bit set inside the flags by when the original creation time + * is present in this extra field. + */ + public static final byte CREATE_TIME_BIT = 4; // The 3 boolean fields (below) come from this flags byte. The remaining 5 bits // are ignored according to the current version of the spec (December 2012). @@ -397,7 +409,12 @@ public class X5455_ExtendedTimestamp imp * * @param l ZipLong of the modify time (seconds per epoch) */ - public void setModifyTime(ZipLong l) { this.modifyTime = l; } + public void setModifyTime(ZipLong l) { + bit0_modifyTimePresent = l != null; + flags = (byte) (l != null ? (flags | MODIFY_TIME_BIT) + : (flags & ~MODIFY_TIME_BIT)); + this.modifyTime = l; + } /** * <p> @@ -411,7 +428,12 @@ public class X5455_ExtendedTimestamp imp * * @param l ZipLong of the access time (seconds per epoch) */ - public void setAccessTime(ZipLong l) { this.accessTime = l; } + public void setAccessTime(ZipLong l) { + bit1_accessTimePresent = l != null; + flags = (byte) (l != null ? (flags | ACCESS_TIME_BIT) + : (flags & ~ACCESS_TIME_BIT)); + this.accessTime = l; + } /** * <p> @@ -425,7 +447,12 @@ public class X5455_ExtendedTimestamp imp * * @param l ZipLong of the create time (seconds per epoch) */ - public void setCreateTime(ZipLong l) { this.createTime = l; } + public void setCreateTime(ZipLong l) { + bit2_createTimePresent = l != null; + flags = (byte) (l != null ? (flags | CREATE_TIME_BIT) + : (flags & ~CREATE_TIME_BIT)); + this.createTime = l; + } /** * <p> Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java?rev=1549131&r1=1549130&r2=1549131&view=diff ============================================================================== --- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java (original) +++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java Sun Dec 8 19:14:25 2013 @@ -437,6 +437,27 @@ public class X5455_ExtendedTimestampTest zf.close(); } + public void testBitsAreSetWithTime() { + xf.setModifyJavaTime(new Date(1111)); + assertTrue(xf.isBit0_modifyTimePresent()); + assertEquals(1, xf.getFlags()); + xf.setAccessJavaTime(new Date(2222)); + assertTrue(xf.isBit1_accessTimePresent()); + assertEquals(3, xf.getFlags()); + xf.setCreateJavaTime(new Date(3333)); + assertTrue(xf.isBit2_createTimePresent()); + assertEquals(7, xf.getFlags()); + xf.setModifyJavaTime(null); + assertFalse(xf.isBit0_modifyTimePresent()); + assertEquals(6, xf.getFlags()); + xf.setAccessJavaTime(null); + assertFalse(xf.isBit1_accessTimePresent()); + assertEquals(4, xf.getFlags()); + xf.setCreateJavaTime(null); + assertFalse(xf.isBit2_createTimePresent()); + assertEquals(0, xf.getFlags()); + } + private void parseReparse( final ZipLong time, final byte[] expectedLocal, @@ -458,10 +479,10 @@ public class X5455_ExtendedTimestampTest System.arraycopy(almostExpectedCentral, 0, expectedCentral, 0, almostExpectedCentral.length); expectedCentral[0] = expectedFlags; - xf.setFlags(providedFlags); xf.setModifyTime(time); xf.setAccessTime(time); xf.setCreateTime(time); + xf.setFlags(providedFlags); byte[] result = xf.getLocalFileDataData(); assertTrue(Arrays.equals(expectedLocal, result)); @@ -482,10 +503,10 @@ public class X5455_ExtendedTimestampTest } // Do the same as above, but with Central Directory data: - xf.setFlags(providedFlags); xf.setModifyTime(time); xf.setAccessTime(time); xf.setCreateTime(time); + xf.setFlags(providedFlags); result = xf.getCentralDirectoryData(); assertTrue(Arrays.equals(expectedCentral, result));