diff --git a/poi/src/main/java/org/apache/poi/util/DefaultTempFileCreationStrategy.java b/poi/src/main/java/org/apache/poi/util/DefaultTempFileCreationStrategy.java index ea07dc7478..584f7dec4c 100644 --- a/poi/src/main/java/org/apache/poi/util/DefaultTempFileCreationStrategy.java +++ b/poi/src/main/java/org/apache/poi/util/DefaultTempFileCreationStrategy.java @@ -52,6 +52,9 @@ public class DefaultTempFileCreationStrategy implements TempFileCreationStrategy /** The directory where the temporary files will be created (null to use the default directory). */ private volatile File dir; + /** The directory where that was passed to the constructor (null to use the default directory). */ + private final File initDir; + /** The lock to make dir initialized only once. */ private final Lock dirLock = new ReentrantLock(); @@ -67,7 +70,7 @@ public class DefaultTempFileCreationStrategy implements TempFileCreationStrategy /** * Creates the strategy allowing to set a custom directory for the temporary files. *

- * If you provide a non-null dir as input, it must be a directory and must already exist. + * If you provide a non-null dir as input, it must be a directory (if it already exists). * Since POI 5.4.2, this is checked at construction time. In previous versions, it was checked * at the first call to {@link #createTempFile(String, String)} or {@link #createTempDirectory(String)}. *

@@ -77,14 +80,10 @@ public class DefaultTempFileCreationStrategy implements TempFileCreationStrategy * @see Files#createTempFile(Path, String, String, FileAttribute[]) */ public DefaultTempFileCreationStrategy(File dir) { + this.initDir = dir; this.dir = dir; - if (dir != null) { - if (!dir.exists()) { - throw new IllegalArgumentException("The provided directory does not exist: " + dir); - } - if (!dir.isDirectory()) { - throw new IllegalArgumentException("The provided file is not a directory: " + dir); - } + if (dir != null && dir.exists() && !dir.isDirectory()) { + throw new IllegalArgumentException("The provided file is not a directory: " + dir); } } @@ -130,7 +129,11 @@ public class DefaultTempFileCreationStrategy implements TempFileCreationStrategy } protected Path getPOIFilesDirectoryPath() throws IOException { - return Paths.get(getJavaIoTmpDir(), POIFILES); + if (initDir == null) { + return Paths.get(getJavaIoTmpDir(), POIFILES); + } else { + return initDir.toPath(); + } } // Create our temp dir only once by double-checked locking diff --git a/poi/src/test/java/org/apache/poi/util/DefaultTempFileCreationStrategyTest.java b/poi/src/test/java/org/apache/poi/util/DefaultTempFileCreationStrategyTest.java index a79986a355..e95a9b360c 100644 --- a/poi/src/test/java/org/apache/poi/util/DefaultTempFileCreationStrategyTest.java +++ b/poi/src/test/java/org/apache/poi/util/DefaultTempFileCreationStrategyTest.java @@ -82,7 +82,13 @@ class DefaultTempFileCreationStrategyTest { File dir = parentStrategy.createTempDirectory("testProvidedDir"); assertNotNull(dir, "Failed to create temp directory"); assertTrue(dir.delete(), "directory not deleted: " + dir); - assertThrows(IllegalArgumentException.class, () -> new DefaultTempFileCreationStrategy(dir)); + try { + DefaultTempFileCreationStrategy testStrategy = new DefaultTempFileCreationStrategy(dir); + checkGetFile(testStrategy); + } finally { + // Clean up the directory after the test + FileUtils.deleteDirectory(dir); + } } @Test