]> source.dussan.org Git - poi.git/commitdiff
[bug-68183] SXSSFWorkbook now removes temp files when closed - removing need for...
authorPJ Fanning <fanningpj@apache.org>
Fri, 17 May 2024 11:04:12 +0000 (11:04 +0000)
committerPJ Fanning <fanningpj@apache.org>
Fri, 17 May 2024 11:04:12 +0000 (11:04 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1917780 13f79535-47bb-0310-9956-ffa450edef68

poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java
poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbook.java
poi-ooxml/src/test/java/org/apache/poi/xssf/streaming/TestSXSSFWorkbookWithCustomZipEntrySource.java

index 84b6fba1661fe0d39b25c2ed388974bd5c52f55c..da64a880f2af391692c09614ace9d89b8f0fad94 100644 (file)
@@ -100,6 +100,10 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  *
  * Carefully review your memory budget and compatibility needs before deciding
  * whether to enable shared strings or not.
+ *
+ * <p>To release resources used by this workbook (including disposing of the temporary
+ * files backing this workbook on disk) {@link #close} should be called directly or a
+ * try-with-resources statement should be used.</p>
  */
 public class SXSSFWorkbook implements Workbook {
     /**
@@ -904,8 +908,9 @@ public class SXSSFWorkbook implements Workbook {
     }
 
     /**
-     * Closes the underlying {@link XSSFWorkbook} and {@link OPCPackage}
-     *  on which this Workbook is based, if any.
+     * Disposes of the temporary files backing this workbook on disk and closes the
+     * underlying {@link XSSFWorkbook} and {@link OPCPackage} on which this Workbook is
+     * based, if any.
      *
      * <p>Once this has been called, no further
      *  operations, updates or reads should be performed on the
@@ -923,6 +928,8 @@ public class SXSSFWorkbook implements Workbook {
             }
         }
 
+        // Dispose of any temporary files backing this workbook on disk
+        dispose();
 
         // Tell the base workbook to close, does nothing if
         //  it's a newly created one
@@ -1001,8 +1008,14 @@ public class SXSSFWorkbook implements Workbook {
     /**
      * Dispose of temporary files backing this workbook on disk.
      * Calling this method will render the workbook unusable.
+     *
+     * <p>The {@link #close()} method will also dispose of the temporary files so
+     * explicitly calling this method is unnecessary if the workbook will get closed.</p>
+     *
      * @return true if all temporary files were deleted successfully.
+     * @deprecated use {@link #close()} to close the workbook instead which also disposes of the temporary files
      */
+    @Deprecated
     public boolean dispose() {
         boolean success = true;
         for (SXSSFSheet sheet : _sxFromXHash.keySet()) {
index 1f57111839d469965de1267ea3bf4d1073b5d540..6b723ff259cbb9949cf5b3d039f84acf9ca15814 100644 (file)
@@ -355,6 +355,27 @@ public final class TestSXSSFWorkbook extends BaseTestXWorkbook {
         }
     }
 
+    @Test
+    void workbookTempFilesAreDisposedWhenClosingWorkbook() throws IOException {
+        SXSSFWorkbook wb = new SXSSFWorkbook();
+
+        // Closing / auto-closing the workbook should clean up the temp files
+        try {
+            populateData(wb);
+
+            for (int i = 0; i < wb.getNumberOfSheets(); i++) {
+                assertTrue(wb.getSheetAt(i).getSheetDataWriter().getTempFile().exists());
+            }
+            // Not calling SXSSFWorkbook#dispose since closing the workbook should clean up the temp files
+        } finally {
+            wb.close();
+        }
+
+        for (int i = 0; i < wb.getNumberOfSheets(); i++) {
+            assertFalse(wb.getSheetAt(i).getSheetDataWriter().getTempFile().exists());
+        }
+    }
+
     @Test
     void bug53515() throws Exception {
         try (Workbook wb1 = new SXSSFWorkbook(10)) {
index d89ffbb2b3baec859c1734f6b9479efde2d5d6a3..26b683fdd0025bced86ed43a5409a9d62826ea6c 100644 (file)
@@ -114,7 +114,6 @@ public final class TestSXSSFWorkbookWithCustomZipEntrySource {
         SXSSFCell cell1 = row1.createCell(1);
         cell1.setCellValue(cellValue);
         workbook.write(NullOutputStream.INSTANCE);
-        workbook.close();
         List<File> tempFiles = workbook.getTempFiles();
         assertEquals(1, tempFiles.size());
         File tempFile = tempFiles.get(0);
@@ -127,5 +126,6 @@ public final class TestSXSSFWorkbookWithCustomZipEntrySource {
         }
         workbook.dispose();
         assertFalse(tempFile.exists(), "tempFile deleted after dispose?");
+        workbook.close();
     }
 }
\ No newline at end of file