[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