[bug-69715] in DefaultTempFileCreationStrategy, allow initDir to not yet exist

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1926444 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
PJ Fanning 2025-06-15 14:14:07 +00:00
parent f6c1cbd229
commit e5ac02f7d0
2 changed files with 19 additions and 10 deletions

View File

@ -52,6 +52,9 @@ public class DefaultTempFileCreationStrategy implements TempFileCreationStrategy
/** The directory where the temporary files will be created (<code>null</code> to use the default directory). */
private volatile File dir;
/** The directory where that was passed to the constructor (<code>null</code> 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.
* <p>
* 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)}.
* </p>
@ -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

View File

@ -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