You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by on...@apache.org on 2016/07/03 22:58:06 UTC

svn commit: r1751177 - in /poi/trunk/src: java/org/apache/poi/util/TempFile.java java/org/apache/poi/util/TempFileCreationStrategy.java testcases/org/apache/poi/util/TestTempFile.java

Author: onealj
Date: Sun Jul  3 22:58:06 2016
New Revision: 1751177

URL: http://svn.apache.org/viewvc?rev=1751177&view=rev
Log:
bug 59788: create temporary directories

Modified:
    poi/trunk/src/java/org/apache/poi/util/TempFile.java
    poi/trunk/src/java/org/apache/poi/util/TempFileCreationStrategy.java
    poi/trunk/src/testcases/org/apache/poi/util/TestTempFile.java

Modified: poi/trunk/src/java/org/apache/poi/util/TempFile.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/util/TempFile.java?rev=1751177&r1=1751176&r2=1751177&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/TempFile.java (original)
+++ poi/trunk/src/java/org/apache/poi/util/TempFile.java Sun Jul  3 22:58:06 2016
@@ -19,6 +19,7 @@ package org.apache.poi.util;
 
 import java.io.File;
 import java.io.IOException;
+import java.security.SecureRandom;
 
 /**
  * Interface for creating temporary files. Collects them all into one directory by default.
@@ -29,6 +30,10 @@ public final class TempFile {
 
     /** Define a constant for this property as it is sometimes mistypes as "tempdir" otherwise */
     public static final String JAVA_IO_TMPDIR = "java.io.tmpdir";
+    
+    private TempFile() {
+        // no instances of this class
+    }
 
     /**
      * Configures the strategy used by {@link #createTempFile(String, String)} to create the temporary files.
@@ -62,6 +67,10 @@ public final class TempFile {
         return strategy.createTempFile(prefix, suffix);
     }
     
+    public static File createTempDirectory(String name) throws IOException {
+        return strategy.createTempDirectory(name);
+    }
+    
     /**
      * Default implementation of the {@link TempFileCreationStrategy} used by {@link TempFile}:
      * Files are collected into one directory and by default are deleted on exit from the VM. 
@@ -92,9 +101,9 @@ public final class TempFile {
             this.dir = dir;
         }
         
-        @Override
-        public File createTempFile(String prefix, String suffix) throws IOException {
+        private void createPOIFilesDirectory() throws IOException {
             // Identify and create our temp dir, if needed
+            // The directory is not deleted, even if it was created by this TempFleCreationStrategy
             if (dir == null) {
                 String tmpDir = System.getProperty(JAVA_IO_TMPDIR);
                 if (tmpDir == null) {
@@ -102,10 +111,20 @@ public final class TempFile {
                 }
                 dir = new File(tmpDir, "poifiles");
             }
-
-             if (!(dir.exists() || dir.mkdirs()) || !dir.isDirectory()) {
-                throw new IOException("Could not create temporary directory '" + dir + "'");
+            
+            createTempDirectory(dir);
+        }
+        
+        private void createTempDirectory(File directory) throws IOException {
+            if (!(directory.exists() || directory.mkdirs()) || !directory.isDirectory()) {
+                throw new IOException("Could not create temporary directory '" + directory + "'");
             }
+        }
+        
+        @Override
+        public File createTempFile(String prefix, String suffix) throws IOException {
+            // Identify and create our temp dir, if needed
+            createPOIFilesDirectory();
             
             // Generate a unique new filename 
             File newFile = File.createTempFile(prefix, suffix, dir);
@@ -118,5 +137,26 @@ public final class TempFile {
             // All done
             return newFile;
         }
+        
+        private static final SecureRandom random = new SecureRandom();
+        @Override
+        public File createTempDirectory(String prefix) throws IOException {
+            // Identify and create our temp dir, if needed
+            createPOIFilesDirectory();
+            
+            // Generate a unique new filename
+            // FIXME: Java 7+: use java.nio.Files#createTempDirectory
+            final long n = random.nextLong();
+            File newDirectory = new File(dir, prefix + Long.toString(n));
+            createTempDirectory(newDirectory);
+
+            // Set the delete on exit flag, unless explicitly disabled
+            if (System.getProperty("poi.keep.tmp.files") == null) {
+                newDirectory.deleteOnExit();
+            }
+
+            // All done
+            return newDirectory;
+        }
     }
 }

Modified: poi/trunk/src/java/org/apache/poi/util/TempFileCreationStrategy.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/util/TempFileCreationStrategy.java?rev=1751177&r1=1751176&r2=1751177&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/util/TempFileCreationStrategy.java (original)
+++ poi/trunk/src/java/org/apache/poi/util/TempFileCreationStrategy.java Sun Jul  3 22:58:06 2016
@@ -35,4 +35,15 @@ public interface TempFileCreationStrateg
      * @throws IOException If no temporary file could be created.
      */
     File createTempFile(String prefix, String suffix) throws IOException;
+    
+    /**
+     * Creates a new and empty temporary directory.
+     *
+     * @param prefix The directory name to be used to generate the name of the temporary directory.
+     * 
+     * @return The path to the newly created and empty temporary directory.
+     * 
+     * @throws IOException If no temporary directory could be created.
+     */
+    File createTempDirectory(String prefix) throws IOException;
 }

Modified: poi/trunk/src/testcases/org/apache/poi/util/TestTempFile.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/testcases/org/apache/poi/util/TestTempFile.java?rev=1751177&r1=1751176&r2=1751177&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/util/TestTempFile.java (original)
+++ poi/trunk/src/testcases/org/apache/poi/util/TestTempFile.java Sun Jul  3 22:58:06 2016
@@ -20,6 +20,7 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.FileOutputStream;
@@ -29,12 +30,16 @@ import java.util.Arrays;
 import org.apache.poi.poifs.dev.TestPOIFSDump;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 public class TestTempFile {
     private String previousTempDir;
-
     private File tempDir;
+    
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
 
     @Before
     public void setUp() throws IOException {
@@ -78,29 +83,54 @@ public class TestTempFile {
     }
 
     @Test
-    public void testCreateTempFile() throws Exception
+    public void testCreateTempFile() throws IOException
     {
         File tempFile = TempFile.createTempFile("test", ".txt");
         FileOutputStream fos = new FileOutputStream(tempFile);
-        fos.write(1);
+        fos.write(1); //file can be written to
         fos.close();
-        assertTrue(tempFile.exists());
-        assertEquals("poifiles", tempFile.getParentFile().getName());
+        assertTrue("temp file exists", tempFile.exists());
+        assertTrue("temp file is a file", tempFile.isFile());
+        assertTrue("temp file's name should start with test",
+                tempFile.getName().startsWith("test"));
+        assertTrue("temp file's name should end with .txt",
+                tempFile.getName().endsWith(".txt"));
+        assertEquals("temp file is saved in poifiles directory",
+                "poifiles", tempFile.getParentFile().getName());
 
         // Can't think of a good way to check whether a file is actually deleted since it would require the VM to stop.
-        assertTrue(tempFile.delete());
+        // Solution: set TempFileCreationStrategy to something that the unit test can trigger a deletion"
+        assertTrue("Unable to delete temp file", tempFile.delete());
     }
     
     @Test
-    public void testConstructor() {
-        // can currently be constructed...
-        new TempFile();
+    public void createTempFileWithDefaultSuffix() throws IOException {
+        File tempFile = TempFile.createTempFile("test", null);
+        assertTrue("temp file's name should end with .tmp",
+                tempFile.getName().endsWith(".tmp"));
     }
     
-    @Test(expected=IllegalArgumentException.class)
+    @Test
+    public void testCreateTempDirectory() throws IOException
+    {
+        File tempDir = TempFile.createTempDirectory("testDir");
+        assertTrue("testDir exists", tempDir.exists());
+        assertTrue("testDir is a directory", tempDir.isDirectory());
+        assertTrue("testDir's name starts with testDir",
+                tempDir.getName().startsWith("testDir"));
+        assertEquals("tempDir is saved in poifiles directory",
+                "poifiles", tempDir.getParentFile().getName());
+
+        // Can't think of a good way to check whether a directory is actually deleted since it would require the VM to stop.
+        // Solution: set TempFileCreationStrategy to something that the unit test can trigger a deletion"
+        assertTrue("Unable to delete tempDir", tempDir.delete());
+    }
+    
+    @Test
     public void testSetTempFileCreationStrategy() throws IOException {
         TempFile.setTempFileCreationStrategy(new TempFile.DefaultTempFileCreationStrategy());
         
+        // Should be able to create two tempfiles with same prefix and suffix
         File file1 = TempFile.createTempFile("TestTempFile", ".tst");
         File file2 = TempFile.createTempFile("TestTempFile", ".tst");
         assertFalse(file1.equals(file2));
@@ -109,6 +139,7 @@ public class TestTempFile {
         assertNotNull(file1);
         assertTrue(file1.delete());
         
+        thrown.expect(IllegalArgumentException.class);
         TempFile.setTempFileCreationStrategy(null);
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org