]> source.dussan.org Git - poi.git/commitdiff
Patch from Raúl Wegmann from bug #56735 / GitHub Pull #10 - Rationalise POI temp...
authorNick Burch <nick@apache.org>
Thu, 24 Jul 2014 18:58:27 +0000 (18:58 +0000)
committerNick Burch <nick@apache.org>
Thu, 24 Jul 2014 18:58:27 +0000 (18:58 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1613246 13f79535-47bb-0310-9956-ffa450edef68

14 files changed:
src/java/org/apache/poi/util/TempFile.java
src/java/org/apache/poi/util/TempFileCreationStrategy.java [new file with mode: 0644]
src/ooxml/java/org/apache/poi/openxml4j/opc/ZipPackage.java
src/ooxml/java/org/apache/poi/util/PackageHelper.java
src/ooxml/java/org/apache/poi/xssf/streaming/GZIPSheetDataWriter.java
src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
src/ooxml/java/org/apache/poi/xssf/streaming/SheetDataWriter.java
src/ooxml/testcases/org/apache/poi/openxml4j/OpenXML4JTestDataSamples.java
src/ooxml/testcases/org/apache/poi/openxml4j/opc/TestPackage.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFTable.java
src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestFontRendering.java
src/testcases/org/apache/poi/hssf/usermodel/TestHSSFName.java
src/testcases/org/apache/poi/ss/formula/function/ExcelFileFormatDocFunctionExtractor.java
src/testcases/org/apache/poi/ss/formula/ptg/TestExternalFunctionFormulas.java

index 82578886bfc7125ba2715e613c4ba6783e53c221..a20341ee1272a0db4243d7525b24886ae139ec8c 100644 (file)
 package org.apache.poi.util;
 
 import java.io.File;
-import java.util.Random;
+import java.io.IOException;
 
 /**
- * Interface for creating temporary files.  Collects them all into one directory.
- *
- * @author Glen Stampoultzis
+ * Interface for creating temporary files. Collects them all into one directory by default.
  */
 public final class TempFile {
-    private static File dir;
-    private static final Random rnd = new Random();
-
+    
+    /** The strategy used by {@link #createTempFile(String, String)} to create the temporary files. */
+    private static TempFileCreationStrategy strategy = new DefaultTempFileCreationStrategy();
+    
     /**
-     * Creates a temporary file.  Files are collected into one directory and by default are
-     * deleted on exit from the VM.  Files can be kept by defining the system property
-     * <code>poi.keep.tmp.files</code>.
+     * Configures the strategy used by {@link #createTempFile(String, String)} to create the temporary files.
+     *
+     * @param strategy The new strategy to be used to create the temporary files.
+     * 
+     * @throws IllegalArgumentException When the given strategy is <code>null</code>.
+     */
+    public static void setTempFileCreationStrategy(TempFileCreationStrategy strategy) {
+        if (strategy == null) {
+            throw new IllegalArgumentException("strategy == null");
+        }
+        TempFile.strategy = strategy;
+    }
+    
+    /**
+     * Creates a new and empty temporary file. By default, files are collected into one directory and are
+     * deleted on exit from the VM, although they can be kept by defining the system property
+     * <code>poi.keep.tmp.files</code> (see {@link DefaultTempFileCreationStrategy}).
      * <p>
      * Don't forget to close all files or it might not be possible to delete them.
+     *
+     * @param prefix The prefix to be used to generate the name of the temporary file.
+     * @param suffix The suffix to be used to generate the name of the temporary file.
+     * 
+     * @return The path to the newly created and empty temporary file.
+     * 
+     * @throws IOException If no temporary file could be created.
      */
-    public static File createTempFile(String prefix, String suffix) {
-        // Identify and create our temp dir, if needed
-        if (dir == null)
-        {
-            dir = new File(System.getProperty("java.io.tmpdir"), "poifiles");
-            dir.mkdir();
-            if (System.getProperty("poi.keep.tmp.files") == null)
-                dir.deleteOnExit();
+    public static File createTempFile(String prefix, String suffix) throws IOException {
+        return strategy.createTempFile(prefix, suffix);
+    }
+    
+    /**
+     * 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. 
+     * Files can be kept by defining the system property <code>poi.keep.tmp.files</code>.
+     */
+    public static class DefaultTempFileCreationStrategy implements TempFileCreationStrategy {
+        
+        /** The directory where the temporary files will be created (<code>null</code> to use the default directory). */
+        private File dir;
+        
+        /**
+         * Creates the strategy so that it creates the temporary files in the default directory.
+         * 
+         * @see File#createTempFile(String, String)
+         */
+        public DefaultTempFileCreationStrategy() {
+            this(null);
         }
-
-        // Generate a unique new filename 
-        File newFile = new File(dir, prefix + rnd.nextInt() + suffix);
-        if (newFile.exists())
-        {
-           // That name is already taken, try another
-           newFile = createTempFile(prefix, suffix);
+        
+        /**
+         * Creates the strategy allowing to set the  
+         *
+         * @param dir The directory where the temporary files will be created (<code>null</code> to use the default directory).
+         * 
+         * @see File#createTempFile(String, String, File)
+         */
+        public DefaultTempFileCreationStrategy(File dir) {
+            this.dir = dir;
         }
+        
+        @Override
+        public File createTempFile(String prefix, String suffix) throws IOException {
+            // Identify and create our temp dir, if needed
+            if (dir == null)
+            {
+                dir = new File(System.getProperty("java.io.tmpdir"), "poifiles");
+                dir.mkdir();
+                if (System.getProperty("poi.keep.tmp.files") == null)
+                    dir.deleteOnExit();
+            }
 
-        // Set the delete on exit flag, unless explicitly disabled
-        if (System.getProperty("poi.keep.tmp.files") == null)
-            newFile.deleteOnExit();
+            // Generate a unique new filename 
+            File newFile = File.createTempFile(prefix, suffix, dir);
 
-        // All done
-        return newFile;
+            // Set the delete on exit flag, unless explicitly disabled
+            if (System.getProperty("poi.keep.tmp.files") == null)
+                newFile.deleteOnExit();
+
+            // All done
+            return newFile;
+        }
+        
     }
 }
diff --git a/src/java/org/apache/poi/util/TempFileCreationStrategy.java b/src/java/org/apache/poi/util/TempFileCreationStrategy.java
new file mode 100644 (file)
index 0000000..1e9ae9c
--- /dev/null
@@ -0,0 +1,38 @@
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.util;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * Interface used by the {@link TempFile} utility class to create temporary files.
+ */
+public interface TempFileCreationStrategy {
+    /**
+     * Creates a new and empty temporary file.
+     *
+     * @param prefix The prefix to be used to generate the name of the temporary file.
+     * @param suffix The suffix to be used to generate the name of the temporary file.
+     * 
+     * @return The path to the newly created and empty temporary file.
+     * 
+     * @throws IOException If no temporary file could be created.
+     */
+    public File createTempFile(String prefix, String suffix) throws IOException;
+}
index a352a8d1f669024364f89dd85acf3f7fdf248390..62f26b7546ea82790d2a32f068a0fe7d59fd0b01 100644 (file)
@@ -43,6 +43,7 @@ import org.apache.poi.openxml4j.util.ZipFileZipEntrySource;
 import org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;
+import org.apache.poi.util.TempFile;
 
 /**
  * Physical zip package.
@@ -343,7 +344,7 @@ public final class ZipPackage extends Package {
                        if (targetFile.exists()) {
                                // Case of a package previously open
 
-                               File tempFile = File.createTempFile(
+                               File tempFile = TempFile.createTempFile(
                                                generateTempFileName(FileHelper
                                                                .getDirectory(targetFile)), ".tmp");
 
index f4ab0520555bf428dd64dcf0263e4af6d0fd3e45..884868f1beb01e56a25a6e52e2b55519c4439e21 100644 (file)
@@ -29,8 +29,6 @@ import java.net.URI;
 
 /**
  * Provides handy methods to work with OOXML packages
- *
- * @author Yegor Kozlov
  */
 public final class PackageHelper {
 
@@ -80,18 +78,6 @@ public final class PackageHelper {
         return OPCPackage.open(path);
     }
 
-    /**
-     * Creates an empty file in the default temporary-file directory,
-     */
-    public static File createTempFile() {
-        File file = TempFile.createTempFile("poi-ooxml-", ".tmp");
-        //there is no way to pass an existing file to Package.create(file),
-        //delete first, the file will be re-created in Packe.create(file)
-        file.delete();
-        return file;
-
-    }
-
     /**
      * Recursively copy package parts to the destination package
      */
index dbe7c12a31621e4b29fa313196b51581431d820e..d194f4fb164ca36e4bd2e843efcebf3f150b9b6d 100644 (file)
@@ -29,6 +29,7 @@ import java.io.Writer;
 import java.util.zip.GZIPInputStream;\r
 import java.util.zip.GZIPOutputStream;\r
 \r
+import org.apache.poi.util.TempFile;\r
 import org.apache.poi.xssf.model.SharedStringsTable;\r
 \r
 /**\r
@@ -51,8 +52,8 @@ public class GZIPSheetDataWriter extends SheetDataWriter {
      * @return temp file to write sheet data\r
      */\r
     @Override\r
-    public File createTempFile()throws IOException {\r
-        return File.createTempFile("poi-sxssf-sheet-xml", ".gz");\r
+    public File createTempFile() throws IOException {\r
+        return TempFile.createTempFile("poi-sxssf-sheet-xml", ".gz");\r
     }\r
 \r
     /**\r
index 2f1d55947b2872aa7a2713e3482f0f7db0d5a9b4..576e0b8f814d5662eb83531ff733c3749b733212 100644 (file)
@@ -43,6 +43,7 @@ import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.util.TempFile;
 import org.apache.poi.xssf.model.SharedStringsTable;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -820,7 +821,7 @@ public class SXSSFWorkbook implements Workbook
        }
        
         //Save the template
-        File tmplFile = File.createTempFile("poi-sxssf-template", ".xlsx");
+        File tmplFile = TempFile.createTempFile("poi-sxssf-template", ".xlsx");
         try
         {
             FileOutputStream os = new FileOutputStream(tmplFile);
index fbdda65436f3b65754c7989ed113739fa168043c..95b3a0bcb9c742fa86fc86b01f349b9a13ab2912 100644 (file)
@@ -33,6 +33,7 @@ import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.CellStyle;\r
 import org.apache.poi.ss.usermodel.FormulaError;\r
 import org.apache.poi.ss.util.CellReference;\r
+import org.apache.poi.util.TempFile;\r
 import org.apache.poi.xssf.model.SharedStringsTable;\r
 import org.apache.poi.xssf.usermodel.XSSFRichTextString;\r
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellType;\r
@@ -75,8 +76,8 @@ public class SheetDataWriter {
      * \r
      * @return temp file to write sheet data\r
      */\r
-    public File createTempFile()throws IOException {\r
-        return File.createTempFile("poi-sxssf-sheet", ".xml");\r
+    public File createTempFile() throws IOException {\r
+        return TempFile.createTempFile("poi-sxssf-sheet", ".xml");\r
     }\r
 \r
     /**\r
index bf93681a4bb8993796f737647253779d59926c5e..1c6b942a58f74ef85e6b06e11ae3da75ec991b76 100644 (file)
@@ -22,11 +22,10 @@ import org.apache.poi.util.TempFile;
 
 import java.io.File;
 import java.io.InputStream;
+import java.io.IOException;
 
 /**
  * Centralises logic for finding/opening sample files for ooxml4j unit tests 
- * 
- * @author jmicich
  */
 public final class OpenXML4JTestDataSamples {
     private static final POIDataSamples _samples = POIDataSamples.getOpenXML4JInstance();
@@ -46,7 +45,7 @@ public final class OpenXML4JTestDataSamples {
                return _samples.getFile(sampleFileName);
        }
        
-       public static File getOutputFile(String outputFileName) {
+       public static File getOutputFile(String outputFileName) throws IOException {
         String suffix = outputFileName.substring(outputFileName.lastIndexOf('.'));
         return TempFile.createTempFile(outputFileName, suffix);
        }
index 01116abcf9fcb6be33c2b80a249a04d2dffd1a23..fe5bb21d466178f5b59c210c7f13a7963b1ea994 100644 (file)
@@ -454,7 +454,7 @@ public final class TestPackage extends TestCase {
         *  write changes to it.
         */
        public void testOpenFileThenOverwrite() throws Exception {
-        File tempFile = File.createTempFile("poiTesting","tmp");
+        File tempFile = TempFile.createTempFile("poiTesting","tmp");
         File origFile = OpenXML4JTestDataSamples.getSampleFile("TestPackageCommon.docx");
         FileHelper.copyFile(origFile, tempFile);
         
@@ -491,8 +491,8 @@ public final class TestPackage extends TestCase {
      *  to another file, then delete both
      */
     public void testOpenFileThenSaveDelete() throws Exception {
-        File tempFile = File.createTempFile("poiTesting","tmp");
-        File tempFile2 = File.createTempFile("poiTesting","tmp");
+        File tempFile = TempFile.createTempFile("poiTesting","tmp");
+        File tempFile2 = TempFile.createTempFile("poiTesting","tmp");
         File origFile = OpenXML4JTestDataSamples.getSampleFile("TestPackageCommon.docx");
         FileHelper.copyFile(origFile, tempFile);
         
index 78e5d80a0f4ab2da15a02a35dd05d751e10b5e4a..de7eff6be733bb47605fb0d9f353066a70f4fa6e 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.poi.xssf.usermodel;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.util.TempFile;
 import org.junit.Test;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTable;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableColumn;
@@ -52,7 +53,7 @@ public final class TestXSSFTable {
         }
 
         // save the worksheet as-is using SXSSF
-        File outputFile = File.createTempFile("poi-56274", ".xlsx");
+        File outputFile = TempFile.createTempFile("poi-56274", ".xlsx");
         SXSSFWorkbook outputWorkbook = new org.apache.poi.xssf.streaming.SXSSFWorkbook(inputWorkbook);
         outputWorkbook.write(new FileOutputStream(outputFile));
 
index 5f981f5405c9525fe7fc6d1674508bcdbe0d93eb..a6fa77005985ada85d20d10a9cc6f6c8dec250c8 100644 (file)
@@ -41,6 +41,7 @@ import javax.imageio.ImageIO;
 import org.apache.poi.POIDataSamples;\r
 import org.apache.poi.hslf.model.Slide;\r
 import org.apache.poi.hslf.model.TextPainter;\r
+import org.apache.poi.util.TempFile;\r
 import org.junit.Ignore;\r
 import org.junit.Test;\r
 \r
@@ -114,7 +115,7 @@ public class TestFontRendering {
         \r
         // allow to find out what the actual difference is in CI where this fails currently\r
         if(!Arrays.equals(expectedData, actualData)) {\r
-            ImageIO.write(imgActual, "PNG", File.createTempFile("TestFontRendering", ".png"));\r
+            ImageIO.write(imgActual, "PNG", TempFile.createTempFile("TestFontRendering", ".png"));\r
         }\r
         assertTrue("Expected to have matching raster-arrays, but found differences, size " + expectedData.length + " and " + actualData.length, \r
                 Arrays.equals(expectedData, actualData));\r
index 3a61f3cd3ff5b25d49208541b67a6cf393c6a3fc..2903e9b059203e93345e0746ae73d9490aceeed4 100644 (file)
@@ -30,14 +30,10 @@ import org.apache.poi.ss.formula.ptg.Ptg;
 import org.apache.poi.ss.formula.FormulaType;
 import org.apache.poi.ss.usermodel.BaseTestNamedRange;
 import org.apache.poi.ss.util.AreaReference;
+import org.apache.poi.util.TempFile;
 
 /**
  * Tests various functionality having to do with {@link org.apache.poi.ss.usermodel.Name}.
- *
- * @author Andrew C. Oliver (acoliver at apache dot org)
- * @author ROMANL
- * @author Danny Mui (danny at muibros.com)
- * @author Amol S. Deshmukh &lt; amol at ap ache dot org &gt;
  */
 public final class TestHSSFName extends BaseTestNamedRange {
 
@@ -115,7 +111,7 @@ public final class TestHSSFName extends BaseTestNamedRange {
              // In case you fancy checking in excel, to ensure it
              //  won't complain about the file now
              try {
-                 File tempFile = File.createTempFile("POI-45126-", ".xls");
+                 File tempFile = TempFile.createTempFile("POI-45126-", ".xls");
                  FileOutputStream fout = new FileOutputStream(tempFile);
                  nwb.write(fout);
                  fout.close();
index e6646ae826b278d8c45f0b00a5ebdc82c3db0a42..a4849a782bd4ab8cba5c7b6eac63b2ed41c6e940 100644 (file)
@@ -17,6 +17,8 @@
 
 package org.apache.poi.ss.formula.function;
 
+import org.apache.poi.util.TempFile;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -57,8 +59,6 @@ import org.xml.sax.helpers.XMLReaderFactory;
  * the file 'functionMetadata.txt'.   There are more than 300 built-in functions in Excel and the
  * intention of this class is to make it easier to maintain the metadata, by extracting it from
  * a reliable source.
- *
- * @author Josh Micich
  */
 public final class ExcelFileFormatDocFunctionExtractor {
 
@@ -577,7 +577,7 @@ public final class ExcelFileFormatDocFunctionExtractor {
                        URLConnection conn = url.openConnection();
                        InputStream is = conn.getInputStream();
                        System.out.println("downloading " + url.toExternalForm());
-                       result = File.createTempFile("excelfileformat", ".odt");
+                       result = TempFile.createTempFile("excelfileformat", ".odt");
                        OutputStream os = new FileOutputStream(result);
                        while(true) {
                                int bytesRead = is.read(buf);
index f1edbe21d00640e739dfb9488e5dfeb875e7cc77..968d926eef70088f6f4e3bc776b580e4a3f28d9c 100644 (file)
@@ -17,6 +17,8 @@
 
 package org.apache.poi.ss.formula.ptg;
 
+import org.apache.poi.util.TempFile;
+
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -32,9 +34,6 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.CellValue;
 /**
  * Tests for functions from external workbooks (e.g. YEARFRAC).
- * 
- * 
- * @author Josh Micich
  */
 public final class TestExternalFunctionFormulas extends TestCase {
 
@@ -60,7 +59,7 @@ public final class TestExternalFunctionFormulas extends TestCase {
                if (false) {
                        // In case you fancy checking in excel
                        try {
-                               File tempFile = File.createTempFile("testExtFunc", ".xls");
+                               File tempFile = TempFile.createTempFile("testExtFunc", ".xls");
                                FileOutputStream fout = new FileOutputStream(tempFile);
                                wb.write(fout);
                                fout.close();