[jboss-svn-commits] JBoss Common SVN: r3253 - in jzipfile/trunk/src: test/java/org/jboss/jzipfile and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Mon Jun 15 10:59:57 EDT 2009


Author: david.lloyd at jboss.com
Date: 2009-06-15 10:59:57 -0400 (Mon, 15 Jun 2009)
New Revision: 3253

Modified:
   jzipfile/trunk/src/main/java/org/jboss/jzipfile/ZipCatalogBuilder.java
   jzipfile/trunk/src/test/java/org/jboss/jzipfile/SimpleZipFilesTests.java
Log:
Add modification date/time handling

Modified: jzipfile/trunk/src/main/java/org/jboss/jzipfile/ZipCatalogBuilder.java
===================================================================
--- jzipfile/trunk/src/main/java/org/jboss/jzipfile/ZipCatalogBuilder.java	2009-06-13 12:17:12 UTC (rev 3252)
+++ jzipfile/trunk/src/main/java/org/jboss/jzipfile/ZipCatalogBuilder.java	2009-06-15 14:59:57 UTC (rev 3253)
@@ -28,9 +28,12 @@
 import java.util.LinkedHashMap;
 import java.util.Collections;
 import java.util.Collection;
+import java.util.GregorianCalendar;
 import java.util.zip.ZipException;
 import java.io.InputStream;
 import java.io.IOException;
+import static java.lang.Math.max;
+import static java.lang.Math.min;
 
 final class ZipCatalogBuilder {
     private final Map<String, ZipEntry> entryMap = new LinkedHashMap<String, ZipEntry>();
@@ -56,19 +59,28 @@
             while (sig == 0x02014b50) {
                 // central directory file header (0..n)
                 is.readUnsignedShort(); // madeBy
-                int needed = is.readUnsignedShort();
+                final int needed = is.readUnsignedShort();
                 if (needed > 20) {
                     throw new ZipException("Need a later version to extract");
                 }
                 is.readUnsignedShort(); // gpbits
                 final ZipCompressionMethod method = ZipCompressionMethod.getMethod(is.readUnsignedShort());
-                int modTimeBytes = is.readUnsignedShort();
-                int modDateFirst = is.readUnsignedByte();
-                int year = 1980 + ((modDateFirst >> 1) & 0x7f);
-                int modDateSecond = is.readUnsignedByte();
-                int month = modDateFirst << 3 & 0x8 | modDateFirst >> 5;
-                int day = modDateSecond & 0x1f;
+                final int modTimeRaw = is.readUnsignedShort();
+                final int modDateRaw = is.readUnsignedShort();
 
+                final int hour = min(modTimeRaw >> 11, 23);
+                final int minute = min(modTimeRaw >> 5 & 0x3f, 59);
+                final int second = min(modTimeRaw & 0x1f, 59);
+
+                final int year = 1980 + (modDateRaw >> 9);
+                // Months are from 1-12
+                final int month = max(1, min(12, modDateRaw >> 5 & 0x0f));
+                // Days might roll over; if so, let the calendar deal with it
+                final int day = modDateRaw & 0x1f;
+
+                // convert to millis
+                final long modTime = new GregorianCalendar(year, month - 1, day, hour, minute, second).getTimeInMillis();
+
                 int crc32 = is.readInt();
                 int compSize = is.readInt();
                 int uncompSize = is.readInt();
@@ -100,7 +112,7 @@
                     type = ZipEntryType.FILE;
                 }
                 final String comment = new String(commentBytes, "US-ASCII");
-                final ZipEntryImpl entry = new ZipEntryImpl(name, comment, localHeaderOffs, uncompSize & 0xffffffffL, compSize & 0xffffffffL, crc32, type, 0L, method, extraBytes);
+                final ZipEntryImpl entry = new ZipEntryImpl(name, comment, localHeaderOffs, uncompSize & 0xffffffffL, compSize & 0xffffffffL, crc32, type, modTime, method, extraBytes);
                 allEntries.add(entry);
                 if (! entryMap.containsKey(name) && name.length() > 0) {
                     entryMap.put(name, entry);

Modified: jzipfile/trunk/src/test/java/org/jboss/jzipfile/SimpleZipFilesTests.java
===================================================================
--- jzipfile/trunk/src/test/java/org/jboss/jzipfile/SimpleZipFilesTests.java	2009-06-13 12:17:12 UTC (rev 3252)
+++ jzipfile/trunk/src/test/java/org/jboss/jzipfile/SimpleZipFilesTests.java	2009-06-15 14:59:57 UTC (rev 3253)
@@ -27,8 +27,7 @@
 import java.io.InputStream;
 import java.util.Iterator;
 
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.AssertJUnit.*;
 import org.testng.annotations.Test;
 
 @Test
@@ -46,24 +45,29 @@
 
     public void testStored() throws IOException {
        final File file = testFile("single-stored.zip");
-       testZipFile(file);
+       testZipFile(file, 1244852648000L);
     }
 
    public void testDeflated() throws IOException {
         final File file = testFile("single-deflated.zip");
-        testZipFile(file);
+        testZipFile(file, 1244852648000L);
     }
 
-   protected void testZipFile(File file) throws IOException {
-      final ZipCatalog catalog = Zip.readCatalog(file);
-      final Iterator<ZipEntry> i = catalog.allEntries().iterator();
-      assertTrue("Missing entry", i.hasNext());
-      final ZipEntry entry = i.next();
-      assertFalse("Extra entry", i.hasNext());
-      // now open it
-      final InputStream inputStream = Zip.openEntry(file, entry);
-      // read a few bytes
-      inputStream.read(new byte[64]);
-      inputStream.close();
-   }
+    protected void testZipFile(File file, long expectedModTime) throws IOException {
+        final ZipCatalog catalog = Zip.readCatalog(file);
+        final Iterator<ZipEntry> i = catalog.allEntries().iterator();
+        assertTrue("Missing entry", i.hasNext());
+        final ZipEntry entry = i.next();
+        assertFalse("Extra entry", i.hasNext());
+
+        // check the mod time
+        assertEquals("Dates do not match", expectedModTime, entry.getModificationTime());
+
+        // now open it
+        final InputStream inputStream = Zip.openEntry(file, entry);
+
+        // read a few bytes
+        inputStream.read(new byte[64]);
+        inputStream.close();
+    }
 }




More information about the jboss-svn-commits mailing list