From 171692edf21c6acbe593b1b57579ffd74b4ed34e Mon Sep 17 00:00:00 2001 From: Javen O'Neal Date: Tue, 20 Jun 2017 08:13:58 +0000 Subject: [PATCH] bug 57919: close opened resources 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 | 19 ++++++++++++++ .../apache/poi/xssf/XSSFTestDataSamples.java | 25 +++++++++++++------ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/java/org/apache/poi/util/IOUtils.java b/src/java/org/apache/poi/util/IOUtils.java index 1f4429f58..3af010b7b 100644 --- a/src/java/org/apache/poi/util/IOUtils.java +++ b/src/java/org/apache/poi/util/IOUtils.java @@ -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 diff --git a/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java b/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java index 68188cb22..b1a0c40fc 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/XSSFTestDataSamples.java @@ -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 File writeOut(R wb, String testName) throws IOException { + final File file = getOutputFile(testName); + writeOut(wb, file); + return file; + } + + private static 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; }