]> source.dussan.org Git - poi.git/commitdiff
bug 57919: close opened resources
authorJaven O'Neal <onealj@apache.org>
Tue, 20 Jun 2017 08:13:58 +0000 (08:13 +0000)
committerJaven O'Neal <onealj@apache.org>
Tue, 20 Jun 2017 08:13:58 +0000 (08:13 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1799316 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/util/IOUtils.java
src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java

index 1f4429f58f5e11ef9bb1c11e19b4f60a9f13b4a8..3af010b7b5aa1bc0d58f897cb66e113dd94f85d8 100644 (file)
@@ -31,6 +31,7 @@ import java.util.zip.Checksum;
 
 import org.apache.poi.EmptyFileException;
 import org.apache.poi.POIDocument;
+import org.apache.poi.ss.usermodel.Workbook;
 
 public final class IOUtils {
     private static final POILogger logger = POILogFactory.getLogger( IOUtils.class );
@@ -209,6 +210,14 @@ public final class IOUtils {
         }
     }
     
+    public static void write(Workbook doc, OutputStream out) throws IOException {
+        try {
+            doc.write(out);
+        } finally {
+            closeQuietly(out);
+        }
+    }
+    
     /**
      * Write a POI Document ({@link org.apache.poi.ss.usermodel.Workbook}, {@link org.apache.poi.sl.usermodel.SlideShow}, etc) to an output stream and close the output stream.
      * This will attempt to close the output stream at the end even if there was a problem writing the document to the stream.
@@ -265,6 +274,16 @@ public final class IOUtils {
             closeQuietly(doc);
         }
     }
+    
+    // Since the Workbook interface doesn't derive from POIDocument
+    // We'll likely need one of these for each document container interface
+    public static void writeAndClose(Workbook doc, OutputStream out) throws IOException {
+        try {
+            doc.write(out);
+        } finally {
+            closeQuietly(doc);
+        }
+    }
 
     /**
      * Copies all the data from the given InputStream to the OutputStream. It
index 68188cb2207306ed8471a5af7cba3f5f0a848cfa..b1a0c40fc7923981d20fac1f31a7a66f17675862 100644 (file)
@@ -24,11 +24,11 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
 
 import org.apache.poi.hssf.HSSFTestDataSamples;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.TempFile;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
@@ -39,7 +39,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  */
 public class XSSFTestDataSamples {
     /**
-     * Used by {@link writeOutAndReadBack(R wb, String testName)}.  If a
+     * Used by {@link #writeOutAndReadBack(Workbook, String)}.  If a
      * value is set for this in the System Properties, the xlsx file
      * will be written out to that directory.
      */
@@ -74,6 +74,21 @@ public class XSSFTestDataSamples {
      * @throws IOException
      */
     public static <R extends Workbook> File writeOut(R wb, String testName) throws IOException {
+        final File file = getOutputFile(testName);
+        writeOut(wb, file);
+        return file;
+    }
+    
+    private static <R extends Workbook> void writeOut(R wb, File file) throws IOException {
+        IOUtils.write(wb,  new FileOutputStream(file));
+    }
+    
+    // Anticipates the location of where a workbook will be written to
+    // Note that if TEST_OUTPUT_DIR is not set, this will create temporary files
+    // with unique names. Subsequent calls with the same argument may return a different file.
+    // Gets a test data sample file, deleting the file if it exists.
+    // This is used in preparation for writing a workbook out to the returned output file.
+    private static File getOutputFile(String testName) throws IOException {
         final String testOutputDir = System.getProperty(TEST_OUTPUT_DIR);
         final File file;
         if (testOutputDir != null) {
@@ -85,12 +100,6 @@ public class XSSFTestDataSamples {
         if (file.exists()) {
             file.delete();
         }
-        final OutputStream out = new FileOutputStream(file);
-        try {
-            wb.write(out);
-        } finally {
-            out.close();
-        }
         return file;
     }