Author: bodewig
Date: Sat Aug 1 19:17:58 2009
New Revision: 799909
URL: http://svn.apache.org/viewvc?rev=799909&view=rev
Log:
check name/directory/size and lastModified read from zip is consistent with what we write
Modified:
commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/AbstractTestCase.java
commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java?rev=799909&r1=799908&r2=799909&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
(original)
+++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
Sat Aug 1 19:17:58 2009
@@ -87,7 +87,8 @@
}
public ZipArchiveEntry(File inputFile, String entryName) {
- this(entryName);
+ this(inputFile.isDirectory() && !entryName.endsWith("/") ?
+ entryName + "/" : entryName);
if (inputFile.isFile()){
setSize(inputFile.length());
}
Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/AbstractTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/AbstractTestCase.java?rev=799909&r1=799908&r2=799909&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/AbstractTestCase.java
(original)
+++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/AbstractTestCase.java
Sat Aug 1 19:17:58 2009
@@ -338,4 +338,25 @@
protected String getExpectedString(ArchiveEntry entry) {
return entry.getName();
}
+
+ /**
+ * Creates a temporary directory and a temporary file inside that
+ * directory, returns both of them (the directory is the first
+ * element of the two element array).
+ */
+ protected File[] createTempDirAndFile() throws IOException {
+ File tmpDir = File.createTempFile("testdir", "");
+ tmpDir.delete();
+ tmpDir.mkdir();
+ tmpDir.deleteOnExit();
+ File tmpFile = File.createTempFile("testfile", "", tmpDir);
+ tmpFile.deleteOnExit();
+ FileOutputStream fos = new FileOutputStream(tmpFile);
+ try {
+ fos.write(new byte[] {'f', 'o', 'o'});
+ return new File[] {tmpDir, tmpFile};
+ } finally {
+ fos.close();
+ }
+ }
}
Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java?rev=799909&r1=799908&r2=799909&view=diff
==============================================================================
--- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
(original)
+++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/ZipTestCase.java
Sat Aug 1 19:17:58 2009
@@ -24,10 +24,13 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import org.apache.commons.compress.AbstractTestCase;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
+import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
+import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.IOUtils;
public final class ZipTestCase extends AbstractTestCase {
@@ -153,4 +156,174 @@
results.contains("test2.xml");
results.contains("test3.xml");
}
+
+ public void testDirectoryEntryFromFile() throws Exception {
+ File[] tmp = createTempDirAndFile();
+ File archive = null;
+ ZipArchiveOutputStream zos = null;
+ ZipFile zf = null;
+ try {
+ archive = File.createTempFile("test.", ".zip", tmp[0]);
+ archive.deleteOnExit();
+ zos = new ZipArchiveOutputStream(archive);
+ long beforeArchiveWrite = tmp[0].lastModified();
+ ZipArchiveEntry in = new ZipArchiveEntry(tmp[0], "foo");
+ zos.putArchiveEntry(in);
+ zos.closeArchiveEntry();
+ zos.close();
+ zos = null;
+ zf = new ZipFile(archive);
+ ZipArchiveEntry out = zf.getEntry("foo/");
+ assertNotNull(out);
+ assertEquals("foo/", out.getName());
+ assertEquals(0, out.getSize());
+ // ZIP stores time with a granularity of 2 seconds
+ assertEquals(beforeArchiveWrite / 2000,
+ out.getLastModifiedDate().getTime() / 2000);
+ assertTrue(out.isDirectory());
+ } finally {
+ ZipFile.closeQuietly(zf);
+ if (zos != null) {
+ zos.close();
+ }
+ if (archive != null) {
+ archive.delete();
+ }
+ tmp[1].delete();
+ tmp[0].delete();
+ }
+ }
+
+ public void testExplicitDirectoryEntry() throws Exception {
+ File[] tmp = createTempDirAndFile();
+ File archive = null;
+ ZipArchiveOutputStream zos = null;
+ ZipFile zf = null;
+ try {
+ archive = File.createTempFile("test.", ".zip", tmp[0]);
+ archive.deleteOnExit();
+ zos = new ZipArchiveOutputStream(archive);
+ long beforeArchiveWrite = tmp[0].lastModified();
+ ZipArchiveEntry in = new ZipArchiveEntry("foo/");
+ in.setTime(beforeArchiveWrite);
+ zos.putArchiveEntry(in);
+ zos.closeArchiveEntry();
+ zos.close();
+ zos = null;
+ zf = new ZipFile(archive);
+ ZipArchiveEntry out = zf.getEntry("foo/");
+ assertNotNull(out);
+ assertEquals("foo/", out.getName());
+ assertEquals(0, out.getSize());
+ assertEquals(beforeArchiveWrite / 2000,
+ out.getLastModifiedDate().getTime() / 2000);
+ assertTrue(out.isDirectory());
+ } finally {
+ ZipFile.closeQuietly(zf);
+ if (zos != null) {
+ zos.close();
+ }
+ if (archive != null) {
+ archive.delete();
+ }
+ tmp[1].delete();
+ tmp[0].delete();
+ }
+ }
+
+ public void testFileEntryFromFile() throws Exception {
+ File[] tmp = createTempDirAndFile();
+ File archive = null;
+ ZipArchiveOutputStream zos = null;
+ ZipFile zf = null;
+ FileInputStream fis = null;
+ try {
+ archive = File.createTempFile("test.", ".zip", tmp[0]);
+ archive.deleteOnExit();
+ zos = new ZipArchiveOutputStream(archive);
+ ZipArchiveEntry in = new ZipArchiveEntry(tmp[1], "foo");
+ zos.putArchiveEntry(in);
+ byte[] b = new byte[(int) tmp[1].length()];
+ fis = new FileInputStream(tmp[1]);
+ int read;
+ while ((read = fis.read(b)) > 0) {
+ zos.write(b);
+ }
+ fis.close();
+ fis = null;
+ zos.closeArchiveEntry();
+ zos.close();
+ zos = null;
+ zf = new ZipFile(archive);
+ ZipArchiveEntry out = zf.getEntry("foo");
+ assertNotNull(out);
+ assertEquals("foo", out.getName());
+ assertEquals(tmp[1].length(), out.getSize());
+ assertEquals(tmp[1].lastModified() / 2000,
+ out.getLastModifiedDate().getTime() / 2000);
+ assertFalse(out.isDirectory());
+ } finally {
+ ZipFile.closeQuietly(zf);
+ if (zos != null) {
+ zos.close();
+ }
+ if (archive != null) {
+ archive.delete();
+ }
+ if (fis != null) {
+ fis.close();
+ }
+ tmp[1].delete();
+ tmp[0].delete();
+ }
+ }
+
+ public void testExplicitFileEntry() throws Exception {
+ File[] tmp = createTempDirAndFile();
+ File archive = null;
+ ZipArchiveOutputStream zos = null;
+ ZipFile zf = null;
+ FileInputStream fis = null;
+ try {
+ archive = File.createTempFile("test.", ".zip", tmp[0]);
+ archive.deleteOnExit();
+ zos = new ZipArchiveOutputStream(archive);
+ ZipArchiveEntry in = new ZipArchiveEntry("foo");
+ in.setTime(tmp[1].lastModified());
+ in.setSize(tmp[1].length());
+ zos.putArchiveEntry(in);
+ byte[] b = new byte[(int) tmp[1].length()];
+ fis = new FileInputStream(tmp[1]);
+ int read;
+ while ((read = fis.read(b)) > 0) {
+ zos.write(b);
+ }
+ fis.close();
+ fis = null;
+ zos.closeArchiveEntry();
+ zos.close();
+ zos = null;
+ zf = new ZipFile(archive);
+ ZipArchiveEntry out = zf.getEntry("foo");
+ assertNotNull(out);
+ assertEquals("foo", out.getName());
+ assertEquals(tmp[1].length(), out.getSize());
+ assertEquals(tmp[1].lastModified() / 2000,
+ out.getLastModifiedDate().getTime() / 2000);
+ assertFalse(out.isDirectory());
+ } finally {
+ ZipFile.closeQuietly(zf);
+ if (zos != null) {
+ zos.close();
+ }
+ if (archive != null) {
+ archive.delete();
+ }
+ if (fis != null) {
+ fis.close();
+ }
+ tmp[1].delete();
+ tmp[0].delete();
+ }
+ }
}
|