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));
 


Reply via email to