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();
+        }
+    }
 }


Reply via email to