diff --git a/pom.xml b/pom.xml
index 5314ddd..123c5cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,18 +5,18 @@
org.codehaus.plexus
plexus
- 23
+ 24
plexus-io
- 3.5.2
+ 3.5.3-SNAPSHOT
Plexus IO Components
scm:git:git@github.com:codehaus-plexus/plexus-io.git
scm:git:git@github.com:codehaus-plexus/plexus-io.git
- plexus-io-3.5.2
+ HEAD
http://github.com/codehaus-plexus/plexus-io
@@ -33,7 +33,7 @@
0.9.0.M4
1.7.36
- 2025-10-08T15:23:37Z
+ 2025-10-08T15:23:44Z
@@ -90,7 +90,7 @@
org.codehaus.plexus
plexus-testing
- 1.6.0
+ 2.0.1
test
diff --git a/src/main/java/org/codehaus/plexus/components/io/attributes/FileAttributes.java b/src/main/java/org/codehaus/plexus/components/io/attributes/FileAttributes.java
index d530790..214387c 100644
--- a/src/main/java/org/codehaus/plexus/components/io/attributes/FileAttributes.java
+++ b/src/main/java/org/codehaus/plexus/components/io/attributes/FileAttributes.java
@@ -160,9 +160,16 @@ public FileAttributes(@Nonnull Path path, boolean followLinks) throws IOExceptio
this.lastModifiedTime = (FileTime) attrs.get("lastModifiedTime");
}
- private static String getPrincipalName(Path path, String attribute) throws IOException {
- Object owner = Files.getAttribute(path, attribute, LinkOption.NOFOLLOW_LINKS);
- return ((Principal) owner).getName();
+ @Nullable
+ private static String getPrincipalName(Path path, String attribute) {
+ try {
+ Object owner = Files.getAttribute(path, attribute, LinkOption.NOFOLLOW_LINKS);
+ return ((Principal) owner).getName();
+ } catch (IOException e) {
+ // Some file systems (e.g., WSL2 mapped network drives) don't provide ownership information
+ // Return null instead of propagating the exception
+ return null;
+ }
}
public FileAttributes(
diff --git a/src/main/java/org/codehaus/plexus/components/io/resources/Deferred.java b/src/main/java/org/codehaus/plexus/components/io/resources/Deferred.java
index 7db54f3..ffb040d 100644
--- a/src/main/java/org/codehaus/plexus/components/io/resources/Deferred.java
+++ b/src/main/java/org/codehaus/plexus/components/io/resources/Deferred.java
@@ -47,9 +47,10 @@ public Deferred(final PlexusIoResource resource, PlexusIoResourceCollection owne
.get()
: null;
if (dfos != null) {
- InputStream inputStream = owner.getInputStream(resource);
- IOUtils.copy(inputStream, dfos);
- IOUtils.closeQuietly(inputStream);
+ try (InputStream inputStream = owner.getInputStream(resource);
+ DeferredFileOutputStream closeable = dfos) {
+ IOUtils.copy(inputStream, dfos);
+ }
}
}
diff --git a/src/main/java/org/codehaus/plexus/components/io/resources/PlexusIoFileResource.java b/src/main/java/org/codehaus/plexus/components/io/resources/PlexusIoFileResource.java
index dd262cb..dbd0a53 100755
--- a/src/main/java/org/codehaus/plexus/components/io/resources/PlexusIoFileResource.java
+++ b/src/main/java/org/codehaus/plexus/components/io/resources/PlexusIoFileResource.java
@@ -108,11 +108,11 @@ private static DeferredFileOutputStream asDeferredStream(
.setThreshold(5000000)
.setPrefix("p-archiver")
.get();
- InputStream inputStream = supplier.getContents();
- InputStream transformed = transToUse.transform(resource, inputStream);
- IOUtils.copy(transformed, dfos);
- IOUtils.closeQuietly(inputStream);
- IOUtils.closeQuietly(transformed);
+ try (InputStream inputStream = supplier.getContents();
+ InputStream transformed = transToUse.transform(resource, inputStream);
+ DeferredFileOutputStream closeable = dfos) {
+ IOUtils.copy(transformed, dfos);
+ }
return dfos;
}
diff --git a/src/test/java/org/codehaus/plexus/components/io/attributes/AbstractResourceAttributesTCK.java b/src/test/java/org/codehaus/plexus/components/io/attributes/AbstractResourceAttributesTCK.java
index 50daec3..af823a9 100644
--- a/src/test/java/org/codehaus/plexus/components/io/attributes/AbstractResourceAttributesTCK.java
+++ b/src/test/java/org/codehaus/plexus/components/io/attributes/AbstractResourceAttributesTCK.java
@@ -29,7 +29,7 @@ protected AbstractResourceAttributesTCK() {}
protected abstract PlexusIoResourceAttributes newAttributes(String mode);
@Test
- final void testSetOctalModeString_OwnerModes() {
+ final void setOctalModeStringOwnerModes() {
verifyStringOctalModeSet("700", new boolean[] {true, true, true, false, false, false, false, false, false});
verifyStringOctalModeSet("600", new boolean[] {true, true, false, false, false, false, false, false, false});
verifyStringOctalModeSet("400", new boolean[] {true, false, false, false, false, false, false, false, false});
@@ -37,7 +37,7 @@ final void testSetOctalModeString_OwnerModes() {
}
@Test
- final void testSetOctalModeString_GroupModes() {
+ final void setOctalModeStringGroupModes() {
verifyStringOctalModeSet("070", new boolean[] {false, false, false, true, true, true, false, false, false});
verifyStringOctalModeSet("060", new boolean[] {false, false, false, true, true, false, false, false, false});
verifyStringOctalModeSet("040", new boolean[] {false, false, false, true, false, false, false, false, false});
@@ -45,7 +45,7 @@ final void testSetOctalModeString_GroupModes() {
}
@Test
- final void testSetOctalModeString_WorldModes() {
+ final void setOctalModeStringWorldModes() {
verifyStringOctalModeSet("007", new boolean[] {false, false, false, false, false, false, true, true, true});
verifyStringOctalModeSet("006", new boolean[] {false, false, false, false, false, false, true, true, false});
verifyStringOctalModeSet("004", new boolean[] {false, false, false, false, false, false, true, false, false});
@@ -53,7 +53,7 @@ final void testSetOctalModeString_WorldModes() {
}
@Test
- final void testSetOctalMode_OwnerModes() {
+ final void setOctalModeOwnerModes() {
verifyOctalModeSet("700", new boolean[] {true, true, true, false, false, false, false, false, false});
verifyOctalModeSet("600", new boolean[] {true, true, false, false, false, false, false, false, false});
verifyOctalModeSet("400", new boolean[] {true, false, false, false, false, false, false, false, false});
@@ -61,7 +61,7 @@ final void testSetOctalMode_OwnerModes() {
}
@Test
- final void testSetOctalMode_GroupModes() {
+ final void setOctalModeGroupModes() {
verifyOctalModeSet("070", new boolean[] {false, false, false, true, true, true, false, false, false});
verifyOctalModeSet("060", new boolean[] {false, false, false, true, true, false, false, false, false});
verifyOctalModeSet("040", new boolean[] {false, false, false, true, false, false, false, false, false});
@@ -69,7 +69,7 @@ final void testSetOctalMode_GroupModes() {
}
@Test
- final void testSetOctalMode_WorldModes() {
+ final void setOctalModeWorldModes() {
verifyOctalModeSet("007", new boolean[] {false, false, false, false, false, false, true, true, true});
verifyOctalModeSet("006", new boolean[] {false, false, false, false, false, false, true, true, false});
verifyOctalModeSet("004", new boolean[] {false, false, false, false, false, false, true, false, false});
diff --git a/src/test/java/org/codehaus/plexus/components/io/attributes/AttributeUtilsTest.java b/src/test/java/org/codehaus/plexus/components/io/attributes/AttributeUtilsTest.java
index 8a56959..49cee7f 100644
--- a/src/test/java/org/codehaus/plexus/components/io/attributes/AttributeUtilsTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/attributes/AttributeUtilsTest.java
@@ -1,7 +1,6 @@
package org.codehaus.plexus.components.io.attributes;
import java.io.File;
-import java.io.IOException;
import java.nio.file.attribute.PosixFilePermission;
import java.util.Set;
@@ -17,9 +16,9 @@
* @author Kristian Rosenvold
*/
@SuppressWarnings("OctalInteger")
-public class AttributeUtilsTest {
+class AttributeUtilsTest {
@Test
- void testMiscPatterns() {
+ void miscPatterns() {
final Set permissions = AttributeUtils.getPermissions(0124);
assertTrue(permissions.contains(PosixFilePermission.OWNER_EXECUTE));
assertTrue(permissions.contains(PosixFilePermission.GROUP_WRITE));
@@ -27,7 +26,7 @@ void testMiscPatterns() {
}
@Test
- void testMorePatterns() {
+ void morePatterns() {
final Set permissions = AttributeUtils.getPermissions(0241);
assertTrue(permissions.contains(PosixFilePermission.OWNER_WRITE));
assertTrue(permissions.contains(PosixFilePermission.GROUP_READ));
@@ -35,7 +34,7 @@ void testMorePatterns() {
}
@Test
- void testEvenMorePatterns() {
+ void evenMorePatterns() {
final Set permissions = AttributeUtils.getPermissions(0412);
assertTrue(permissions.contains(PosixFilePermission.OWNER_READ));
assertTrue(permissions.contains(PosixFilePermission.GROUP_EXECUTE));
@@ -50,7 +49,7 @@ void test777() {
@Test
@DisabledOnOs(OS.WINDOWS)
- void testChmodBackAndForth() throws IOException {
+ void chmodBackAndForth() throws Exception {
final File bxx = File.createTempFile("bxx", "ff");
AttributeUtils.chmod(bxx, 0422);
PlexusIoResourceAttributes firstAttrs = new FileAttributes(bxx);
diff --git a/src/test/java/org/codehaus/plexus/components/io/attributes/FileAttributesTest.java b/src/test/java/org/codehaus/plexus/components/io/attributes/FileAttributesTest.java
index 3449f76..65e917d 100644
--- a/src/test/java/org/codehaus/plexus/components/io/attributes/FileAttributesTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/attributes/FileAttributesTest.java
@@ -17,6 +17,7 @@
*/
import java.io.File;
+import java.nio.file.Files;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.DisabledOnOs;
@@ -27,12 +28,28 @@
/**
* @author Kristian Rosenvold
*/
-public class FileAttributesTest {
+class FileAttributesTest {
@Test
@DisabledOnOs(OS.WINDOWS)
- void testGetPosixFileAttributes() throws Exception {
+ void getPosixFileAttributes() throws Exception {
File file = new File(".");
PlexusIoResourceAttributes fa = new FileAttributes(file);
assertNotNull(fa);
}
+
+ @Test
+ void fileAttributesHandlesIOException() throws Exception {
+ // Test that FileAttributes can be constructed for a regular file
+ // even if ownership information is not available (e.g., WSL2 mapped network drives)
+ File tempFile = Files.createTempFile("plexus-io-test", ".tmp").toFile();
+ try {
+ // This should not throw even if ownership info is unavailable
+ PlexusIoResourceAttributes fa = new FileAttributes(tempFile);
+ assertNotNull(fa);
+ // The attributes object should be usable even if userName/groupName are null
+ assertNotNull(fa.toString());
+ } finally {
+ tempFile.delete();
+ }
+ }
}
diff --git a/src/test/java/org/codehaus/plexus/components/io/attributes/PlexusIoResourceAttributeUtilsTest.java b/src/test/java/org/codehaus/plexus/components/io/attributes/PlexusIoResourceAttributeUtilsTest.java
index 4712e82..e14c358 100644
--- a/src/test/java/org/codehaus/plexus/components/io/attributes/PlexusIoResourceAttributeUtilsTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/attributes/PlexusIoResourceAttributeUtilsTest.java
@@ -17,13 +17,11 @@
*/
import java.io.File;
-import java.io.IOException;
import java.net.URL;
import java.nio.file.NoSuchFileException;
import java.util.Map;
import org.codehaus.plexus.util.StringUtils;
-import org.codehaus.plexus.util.cli.CommandLineException;
import org.codehaus.plexus.util.cli.CommandLineUtils;
import org.codehaus.plexus.util.cli.Commandline;
import org.junit.jupiter.api.Test;
@@ -34,11 +32,11 @@
import static org.junit.jupiter.api.Assertions.*;
@SuppressWarnings("OctalInteger")
-public class PlexusIoResourceAttributeUtilsTest {
+class PlexusIoResourceAttributeUtilsTest {
@Test
@DisabledOnOs(OS.WINDOWS)
- void testGetAttributesForThisTestClass() throws IOException {
+ void getAttributesForThisTestClass() throws Exception {
URL resource = Thread.currentThread()
.getContextClassLoader()
.getResource(getClass().getName().replace('.', '/') + ".class");
@@ -62,7 +60,7 @@ void testGetAttributesForThisTestClass() throws IOException {
@Test
@DisabledOnOs(OS.WINDOWS)
- void testDirectory() throws IOException, CommandLineException {
+ void directory() throws Exception {
URL resource = Thread.currentThread()
.getContextClassLoader()
.getResource(getClass().getName().replace('.', '/') + ".class");
@@ -100,7 +98,7 @@ void testDirectory() throws IOException, CommandLineException {
@Test
@DisabledOnOs(OS.WINDOWS)
- void testSrcResource() throws IOException {
+ void srcResource() throws Exception {
File dir = new File("src/test/resources/symlinks");
final Map fileAttributesByPathScreenScrape =
PlexusIoResourceAttributeUtils.getFileAttributesByPath(dir, true);
@@ -115,15 +113,14 @@ void testSrcResource() throws IOException {
}
@Test
- void testNonExistingDirectory() {
- assertThrows(NoSuchFileException.class, () -> {
- File dir = new File("src/test/noSuchDirectory");
- PlexusIoResourceAttributeUtils.getFileAttributesByPath(dir, true);
- });
+ void nonExistingDirectory() {
+ File dir = new File("src/test/noSuchDirectory");
+ assertThrows(
+ NoSuchFileException.class, () -> PlexusIoResourceAttributeUtils.getFileAttributesByPath(dir, true));
}
@Test
- void testMergeAttributesWithNullBase() {
+ void mergeAttributesWithNullBase() {
PlexusIoResourceAttributes override = new SimpleResourceAttributes(1001, "myUser", 1001, "test", 0);
PlexusIoResourceAttributes defaults = new SimpleResourceAttributes(1000, "defaultUser", 1000, "defaultTest", 0);
@@ -135,7 +132,7 @@ void testMergeAttributesWithNullBase() {
}
@Test
- void testMergeAttributesWithNullOverrideGroup() {
+ void mergeAttributesWithNullOverrideGroup() {
final PlexusIoResourceAttributes override = new SimpleResourceAttributes(1001, "myUser", -1, null, 0);
final PlexusIoResourceAttributes defaults =
new SimpleResourceAttributes(1000, "defaultUser", 1000, "defaultGroup", 0);
@@ -148,7 +145,7 @@ void testMergeAttributesWithNullOverrideGroup() {
}
@Test
- void testMergeAttributesOverride() {
+ void mergeAttributesOverride() {
final PlexusIoResourceAttributes blank = new SimpleResourceAttributes();
final PlexusIoResourceAttributes invalid = new SimpleResourceAttributes(-1, null, -1, null, -1);
final PlexusIoResourceAttributes override =
@@ -250,7 +247,7 @@ void testMergeAttributesOverride() {
}
@Test
- void testFileAttributesGeneric() throws IOException {
+ void fileAttributesGeneric() throws Exception {
PlexusIoResourceAttributes attrs = getFileAttributes(new File("src/test/resources/symlinks/src/fileW.txt"));
assertFalse(attrs.isSymbolicLink());
assertTrue(StringUtils.isNotEmpty(attrs.getUserName()));
@@ -258,7 +255,7 @@ void testFileAttributesGeneric() throws IOException {
@Test
@DisabledOnOs(OS.WINDOWS)
- void testFileAttributes() throws IOException {
+ void fileAttributes() throws Exception {
PlexusIoResourceAttributes attrs = getFileAttributes(new File("src/test/resources/symlinks/src/fileW.txt"));
assertFalse(attrs.isSymbolicLink());
assertTrue(StringUtils.isNotEmpty(attrs.getUserName()));
@@ -268,7 +265,7 @@ void testFileAttributes() throws IOException {
}
@Test
- void testMergeAttributesDefault() {
+ void mergeAttributesDefault() {
final PlexusIoResourceAttributes blank = new SimpleResourceAttributes(null, null, null, null, 0);
final PlexusIoResourceAttributes invalid = new SimpleResourceAttributes(-1, null, -1, null, -1);
final PlexusIoResourceAttributes defaults =
diff --git a/src/test/java/org/codehaus/plexus/components/io/attributes/SymlinkUtilsTest.java b/src/test/java/org/codehaus/plexus/components/io/attributes/SymlinkUtilsTest.java
index 7b216bb..4977a02 100644
--- a/src/test/java/org/codehaus/plexus/components/io/attributes/SymlinkUtilsTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/attributes/SymlinkUtilsTest.java
@@ -25,15 +25,15 @@
import org.junit.jupiter.api.Test;
import static java.nio.charset.StandardCharsets.UTF_8;
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
-public class SymlinkUtilsTest {
+class SymlinkUtilsTest {
final File target = new File("target/symlinkCapabilities");
final String expected = "This is a filed that we'll be symlinking to\n";
@BeforeEach
- public void setup() throws IOException {
+ void setup() throws IOException {
FileUtils.deleteDirectory(target);
Files.createDirectories(target.toPath());
}
diff --git a/src/test/java/org/codehaus/plexus/components/io/filemappers/FileMapperTest.java b/src/test/java/org/codehaus/plexus/components/io/filemappers/FileMapperTest.java
index fbd7d94..4848796 100644
--- a/src/test/java/org/codehaus/plexus/components/io/filemappers/FileMapperTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/filemappers/FileMapperTest.java
@@ -31,7 +31,7 @@
* Test case for the various file mappers.
*/
@PlexusTest
-public class FileMapperTest {
+class FileMapperTest {
@Inject
PlexusContainer container;
@@ -85,7 +85,7 @@ protected void testFileMapper(FileMapper pMapper, String[] pInput, String[] pOut
};
@Test
- void testIdentityMapper() throws Exception {
+ void identityMapper() throws Exception {
final String[] results = getIdentityResults();
testFileMapper(new IdentityMapper(), SAMPLES, results);
}
@@ -98,7 +98,7 @@ private String[] getIdentityResults() {
}
@Test
- void testDefaultMapper() throws Exception {
+ void defaultMapper() throws Exception {
final String[] results = getIdentityResults();
testFileMapper(container.lookup(FileMapper.class), SAMPLES, results);
testFileMapper(container.lookup(FileMapper.class, IdentityMapper.ROLE_HINT), SAMPLES, results);
@@ -106,7 +106,7 @@ void testDefaultMapper() throws Exception {
}
@Test
- void testFileExtensionMapper() throws Exception {
+ void fileExtensionMapper() throws Exception {
final String[] results = getIdentityResults();
for (int i = 2; i <= 10; i += 2) {
results[i] += ".png";
@@ -127,7 +127,7 @@ private void testFileExtensionMapper(final String[] results, final FileExtension
}
@Test
- void testFlattenMapper() throws Exception {
+ void flattenMapper() throws Exception {
final String[] results = getIdentityResults();
results[4] = results[6] = results[8] = results[10] = results[2];
results[5] = results[7] = results[9] = results[11] = results[3];
@@ -141,7 +141,7 @@ private void testMergeMapper(String pTargetName, String[] pResults, MergeFileMap
}
@Test
- void testMergeMapper() throws Exception {
+ void mergeMapper() throws Exception {
final String[] results = getIdentityResults();
final String targetName = "zgh";
for (int i = 2; i < results.length; i++) {
@@ -153,7 +153,7 @@ void testMergeMapper() throws Exception {
}
@Test
- void testPrefixMapper() throws Exception {
+ void prefixMapper() throws Exception {
final String prefix = "x7Rtf";
final String[] results = getIdentityResults();
testFileMapper(new PrefixFileMapper(), SAMPLES, results);
@@ -172,7 +172,7 @@ void testPrefixMapper() throws Exception {
}
@Test
- void testSuffixMapper() throws Exception {
+ void suffixMapper() throws Exception {
final String suffix = "suffix";
String[] samples = Arrays.copyOf(SAMPLES, SAMPLES.length + 2);
samples[samples.length - 2] = "archive.tar.gz";
@@ -208,7 +208,7 @@ private RegExpFileMapper configure(RegExpFileMapper pMapper, String pPattern, St
}
@Test
- void testRegExpFileMapper() throws Exception {
+ void regExpFileMapper() throws Exception {
final String[] results = getIdentityResults();
results[3] = "xyz.jpg";
results[5] = "b/xyz.jpg";
diff --git a/src/test/java/org/codehaus/plexus/components/io/filemappers/FileSelectorTest.java b/src/test/java/org/codehaus/plexus/components/io/filemappers/FileSelectorTest.java
index 6879c7f..1034302 100644
--- a/src/test/java/org/codehaus/plexus/components/io/filemappers/FileSelectorTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/filemappers/FileSelectorTest.java
@@ -39,7 +39,7 @@
* Test case for implementations of {@link FileSelector}.
*/
@PlexusTest
-public class FileSelectorTest {
+class FileSelectorTest {
@Inject
PlexusContainer container;
@@ -80,7 +80,7 @@ private boolean[] getAllTrues() {
}
@Test
- void testAllFilesFileSelector() throws Exception {
+ void allFilesFileSelector() throws Exception {
testFileSelector(new AllFilesFileSelector());
testFileSelector((AllFilesFileSelector) container.lookup(FileSelector.class));
testFileSelector((AllFilesFileSelector) container.lookup(FileSelector.class, AllFilesFileSelector.ROLE_HINT));
@@ -114,14 +114,14 @@ protected void testFileSelector(IncludeExcludeFileSelector pSelector) throws Exc
}
@Test
- void testIncludeExcludeFileSelector() throws Exception {
+ void includeExcludeFileSelector() throws Exception {
testFileSelector(new IncludeExcludeFileSelector());
testFileSelector((IncludeExcludeFileSelector)
container.lookup(FileSelector.class, IncludeExcludeFileSelector.ROLE_HINT));
}
@Test
- void testIncludeExcludeFileSelector_SetExcludes() {
+ void includeExcludeFileSelectorSetExcludes() {
IncludeExcludeFileSelector selector = new IncludeExcludeFileSelector();
// Test that the setExcludes method does not modify the excludes.
diff --git a/src/test/java/org/codehaus/plexus/components/io/filemappers/ResourcesTest.java b/src/test/java/org/codehaus/plexus/components/io/filemappers/ResourcesTest.java
index 540da59..c4d0fa3 100644
--- a/src/test/java/org/codehaus/plexus/components/io/filemappers/ResourcesTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/filemappers/ResourcesTest.java
@@ -46,7 +46,7 @@
* Test case for resource collections.
*/
@PlexusTest
-public class ResourcesTest {
+class ResourcesTest {
@Inject
PlexusContainer container;
@@ -67,7 +67,7 @@ private File getFilesDir() {
private void createFiles() throws IOException {
final File baseDir = getFilesDir();
- FileUtils.deleteDirectory(baseDir);
+ org.apache.commons.io.FileUtils.deleteDirectory(baseDir);
FileUtils.mkdir(baseDir.getPath());
final File aFile = new File(baseDir, A_PATH);
FileUtils.mkdir(aFile.getParentFile().getPath());
@@ -132,11 +132,11 @@ private void compare(InputStream in, File file) throws IOException {
}
private void compare(PlexusIoResource res, File file) throws IOException {
- assertTrue(res.getLastModified() != PlexusIoResource.UNKNOWN_MODIFICATION_DATE);
+ assertNotSame(res.getLastModified(), PlexusIoResource.UNKNOWN_MODIFICATION_DATE);
if (res instanceof PlexusIoFileResource) {
assertEquals(res.getLastModified() / 1000, file.lastModified() / 1000);
}
- assertTrue(res.getSize() != PlexusIoResource.UNKNOWN_RESOURCE_SIZE);
+ assertNotSame(res.getSize(), PlexusIoResource.UNKNOWN_RESOURCE_SIZE);
assertEquals(res.getSize(), file.length());
InputStream in = res.getContents();
compare(in, file);
@@ -200,7 +200,7 @@ private void testFileResourceCollection(PlexusIoFileResourceCollection resourceC
}
@Test
- void testFileCollection() throws Exception {
+ void fileCollection() throws Exception {
createFiles();
testFileResourceCollection((PlexusIoFileResourceCollection) container.lookup(PlexusIoResourceCollection.class));
testFileResourceCollection((PlexusIoFileResourceCollection)
diff --git a/src/test/java/org/codehaus/plexus/components/io/resources/AbstractPlexusIoResourceCollectionTest.java b/src/test/java/org/codehaus/plexus/components/io/resources/AbstractPlexusIoResourceCollectionTest.java
index 4e068ba..12e7f29 100644
--- a/src/test/java/org/codehaus/plexus/components/io/resources/AbstractPlexusIoResourceCollectionTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/resources/AbstractPlexusIoResourceCollectionTest.java
@@ -17,10 +17,10 @@
/**
* @author Kristian Rosenvold
*/
-public class AbstractPlexusIoResourceCollectionTest {
+class AbstractPlexusIoResourceCollectionTest {
@SuppressWarnings("ResultOfMethodCallIgnored")
@Test
- void testGetIncludes() throws Exception {
+ void getIncludes() throws Exception {
AbstractPlexusIoResourceCollection sut = new AbstractPlexusIoResourceCollection() {
public Iterator getResources() {
return Arrays.asList(getResource("r1"), getResource("r2")).iterator();
diff --git a/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoFileResourceDeferredTest.java b/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoFileResourceDeferredTest.java
new file mode 100644
index 0000000..3a5e6c8
--- /dev/null
+++ b/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoFileResourceDeferredTest.java
@@ -0,0 +1,115 @@
+package org.codehaus.plexus.components.io.resources;
+
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+
+import org.apache.commons.io.IOUtils;
+import org.codehaus.plexus.components.io.attributes.FileAttributes;
+import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * Tests for PlexusIoFileResource with DeferredFileOutputStream scenarios.
+ * This specifically tests the fix for issue #118 where temp files were deleted
+ * before they could be accessed, causing FileNotFoundException.
+ */
+class PlexusIoFileResourceDeferredTest {
+
+ @TempDir
+ File tempDir;
+
+ @Test
+ void fileResourceWithTransformerCanReadContentsMultipleTimes() throws Exception {
+ // Create a test file with content larger than typical buffer size
+ File testFile = new File(tempDir, "test-file.txt");
+ byte[] largeContent = new byte[10000]; // 10KB
+ for (int i = 0; i < largeContent.length; i++) {
+ largeContent[i] = (byte) ('A' + (i % 26));
+ }
+ Files.write(testFile.toPath(), largeContent);
+
+ // Create a transformer that modifies the content
+ InputStreamTransformer transformer = (resource, inputStream) -> {
+ // Simple transformer that reads and returns the same content
+ return inputStream;
+ };
+
+ // Create PlexusIoFileResource with transformer
+ PlexusIoFileResource resource =
+ new PlexusIoFileResource(testFile, testFile.getName(), new FileAttributes(testFile), null, transformer);
+
+ // First read - this should work and not delete the temp file
+ try (InputStream is1 = resource.getContents()) {
+ byte[] read1 = IOUtils.toByteArray(is1);
+ assertEquals(largeContent.length, read1.length);
+ }
+
+ // Second read - this should also work if the temp file wasn't prematurely deleted
+ // This is the key test - without the fix, this would throw FileNotFoundException
+ try (InputStream is2 = resource.getContents()) {
+ byte[] read2 = IOUtils.toByteArray(is2);
+ assertEquals(largeContent.length, read2.length);
+ }
+ }
+
+ @Test
+ void fileResourceWithTransformerLargeFile() throws Exception {
+ // Create a large file that exceeds the DeferredFileOutputStream threshold (5MB)
+ File testFile = new File(tempDir, "large-test-file.bin");
+ byte[] chunk = new byte[1024 * 1024]; // 1MB chunks
+ for (int i = 0; i < chunk.length; i++) {
+ chunk[i] = (byte) i;
+ }
+
+ // Write 6MB to exceed the 5MB threshold
+ try (OutputStream os = Files.newOutputStream(testFile.toPath())) {
+ for (int i = 0; i < 6; i++) {
+ os.write(chunk);
+ }
+ }
+
+ InputStreamTransformer transformer = (resource, inputStream) -> inputStream;
+
+ PlexusIoFileResource resource =
+ new PlexusIoFileResource(testFile, testFile.getName(), new FileAttributes(testFile), null, transformer);
+
+ // Verify we can read the content - this tests that the temp file
+ // created by DeferredFileOutputStream is properly accessible
+ long size = resource.getSize();
+ assertTrue(size > 5_000_000, "File should be larger than 5MB threshold");
+
+ try (InputStream is = resource.getContents()) {
+ assertNotNull(is);
+ byte[] firstBytes = new byte[1024];
+ int read = is.read(firstBytes);
+ assertEquals(1024, read);
+ }
+ }
+
+ @Test
+ void fileResourceWithTransformerSmallFile() throws Exception {
+ // Test with a small file that stays in memory (below 5MB threshold)
+ File testFile = new File(tempDir, "small-test-file.txt");
+ String content = "Hello, World!";
+ Files.write(testFile.toPath(), content.getBytes(StandardCharsets.UTF_8));
+
+ InputStreamTransformer transformer = (resource, inputStream) -> inputStream;
+
+ PlexusIoFileResource resource =
+ new PlexusIoFileResource(testFile, testFile.getName(), new FileAttributes(testFile), null, transformer);
+
+ // Multiple reads should work for small files too
+ for (int i = 0; i < 3; i++) {
+ try (InputStream is = resource.getContents()) {
+ String readContent = IOUtils.toString(is, StandardCharsets.UTF_8);
+ assertEquals(content, readContent);
+ }
+ }
+ }
+}
diff --git a/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoFileSupplierResourceCollectionTest.java b/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoFileSupplierResourceCollectionTest.java
index dfcce72..a5ac14a 100755
--- a/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoFileSupplierResourceCollectionTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoFileSupplierResourceCollectionTest.java
@@ -10,9 +10,9 @@
/**
* @author Kristian Rosenvold
*/
-public class PlexusIoFileSupplierResourceCollectionTest {
+class PlexusIoFileSupplierResourceCollectionTest {
@Test
- void testGetName() throws Exception {
+ void getName() throws Exception {
PlexusIoFileResourceCollection coll = new PlexusIoFileResourceCollection();
char nonSeparator = File.separatorChar == '/' ? '\\' : '/';
coll.setPrefix("fud" + nonSeparator);
diff --git a/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoPlexusIoFileResourceTest.java b/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoPlexusIoFileResourceTest.java
index d61cf54..64f37b2 100644
--- a/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoPlexusIoFileResourceTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/resources/PlexusIoPlexusIoFileResourceTest.java
@@ -1,7 +1,6 @@
package org.codehaus.plexus.components.io.resources;
import java.io.File;
-import java.io.IOException;
import org.codehaus.plexus.components.io.attributes.FileAttributes;
import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
@@ -13,11 +12,11 @@
import static org.junit.jupiter.api.Assertions.*;
-public class PlexusIoPlexusIoFileResourceTest {
+class PlexusIoPlexusIoFileResourceTest {
@Test
@DisabledOnOs(OS.WINDOWS)
- void testRealSymlink() throws IOException {
+ void realSymlink() throws Exception {
final File file = new File("src/test/resources/symlinks/src/symDir");
PlexusIoResourceAttributes attrs = FileAttributes.uncached(file);
assertTrue(attrs.isSymbolicLink());
@@ -26,13 +25,13 @@ void testRealSymlink() throws IOException {
assertTrue(r.isDirectory());
final File target = SymlinkUtils.readSymbolicLink(file);
assertTrue(target.getName().endsWith("targetDir"));
- assertTrue(r instanceof SymlinkDestinationSupplier);
+ assertInstanceOf(SymlinkDestinationSupplier.class, r);
assertEquals("targetDir/", ((SymlinkDestinationSupplier) r).getSymlinkDestination());
}
@Test
@DisabledOnOs(OS.WINDOWS)
- void testSymSymlinkFile() throws IOException {
+ void symSymlinkFile() throws Exception {
final File file = new File("src/test/resources/symlinks/src/symSymR");
PlexusIoResource r = ResourceFactory.createResource(file);
assertTrue(r.isSymbolicLink());
@@ -40,14 +39,14 @@ void testSymSymlinkFile() throws IOException {
PlexusIoResource rL = ((PlexusIoSymlinkResource) r).getLink();
assertFalse(rL instanceof PlexusIoSymlinkResource);
PlexusIoResource rT = ((PlexusIoSymlinkResource) r).getTarget();
- assertTrue(rT instanceof PlexusIoSymlinkResource);
+ assertInstanceOf(PlexusIoSymlinkResource.class, rT);
PlexusIoResource rTT = ((PlexusIoSymlinkResource) rT).getTarget();
assertFalse(rTT instanceof PlexusIoSymlinkResource);
}
@Test
@DisabledOnOs(OS.WINDOWS)
- void testSymlinkFile() throws IOException {
+ void symlinkFile() throws Exception {
final File file = new File("src/test/resources/symlinks/src/symR");
PlexusIoResource r = ResourceFactory.createResource(file);
assertTrue(r.isSymbolicLink());
diff --git a/src/test/java/org/codehaus/plexus/components/io/resources/proxy/PlexusIoProxyResourceCollectionTest.java b/src/test/java/org/codehaus/plexus/components/io/resources/proxy/PlexusIoProxyResourceCollectionTest.java
index 1ce7f92..e27301a 100644
--- a/src/test/java/org/codehaus/plexus/components/io/resources/proxy/PlexusIoProxyResourceCollectionTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/resources/proxy/PlexusIoProxyResourceCollectionTest.java
@@ -19,7 +19,6 @@
import javax.annotation.Nonnull;
import java.io.Closeable;
-import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Iterator;
@@ -36,13 +35,13 @@
/**
* Test case for {@link PlexusIoProxyResourceCollection}.
*/
-public class PlexusIoProxyResourceCollectionTest {
+class PlexusIoProxyResourceCollectionTest {
private final String[] SAMPLE_INCLUDES = {"junk.*", "test/**", "dir*/file.xml"};
private final String[] SAMPLE_EXCLUDES = {"*.junk", "somwhere/**"};
@Test
- void testGetDefaultFileSelector() {
+ void getDefaultFileSelector() {
PlexusIoProxyResourceCollection resCol = new PlexusIoProxyResourceCollection(null);
// This will throw an exception if there is a bug
@@ -91,7 +90,7 @@ public void remove() {
}
@Test
- void testClosing() throws IOException {
+ void closing() throws Exception {
final CloseableIterator closeableIterator = new CloseableIterator();
PlexusIoProxyResourceCollection resCol =
new PlexusIoProxyResourceCollection(new AbstractPlexusIoResourceCollection() {
diff --git a/src/test/java/org/codehaus/plexus/components/io/resources/proxy/ProxyFactoryTest.java b/src/test/java/org/codehaus/plexus/components/io/resources/proxy/ProxyFactoryTest.java
index 152b633..0b072a2 100644
--- a/src/test/java/org/codehaus/plexus/components/io/resources/proxy/ProxyFactoryTest.java
+++ b/src/test/java/org/codehaus/plexus/components/io/resources/proxy/ProxyFactoryTest.java
@@ -22,25 +22,25 @@
import static org.junit.jupiter.api.Assertions.*;
-public class ProxyFactoryTest {
+class ProxyFactoryTest {
@Test
- void testCreateProxy() throws Exception {
+ void createProxy() throws Exception {
final PlexusIoResource proxy = ProxyFactory.createProxy(getPomResource(), null);
- assertTrue(proxy instanceof ResourceAttributeSupplier);
- assertTrue(proxy instanceof FileSupplier);
+ assertInstanceOf(ResourceAttributeSupplier.class, proxy);
+ assertInstanceOf(FileSupplier.class, proxy);
assertFalse(proxy instanceof SymlinkDestinationSupplier);
}
@Test
- void testCreateProxyWithNameOverride() throws Exception {
+ void createProxyWithNameOverride() throws Exception {
NameSupplier ns = () -> "fred";
final PlexusIoResource proxy = ProxyFactory.createProxy(getPomResource(), ns);
assertEquals("fred", proxy.getName());
}
@Test
- void testCreateProxyWithResourceAttributeOverride() throws Exception {
+ void createProxyWithResourceAttributeOverride() throws Exception {
final PlexusIoResourceAttributes s = SimpleResourceAttributes.lastResortDummyAttributesForBrokenOS();
ResourceAttributeSupplier ns = () -> s;
final PlexusIoResource proxy = ProxyFactory.createProxy(getPomResource(), ns);
@@ -48,7 +48,7 @@ void testCreateProxyWithResourceAttributeOverride() throws Exception {
}
@Test
- void testCreateProxyWithSizeSupplierOverride() throws Exception {
+ void createProxyWithSizeSupplierOverride() throws Exception {
final PlexusIoResourceAttributes s = SimpleResourceAttributes.lastResortDummyAttributesForBrokenOS();
SizeSupplier ns = () -> 42;
final PlexusIoResource proxy = ProxyFactory.createProxy(getPomResource(), ns);
@@ -56,7 +56,7 @@ void testCreateProxyWithSizeSupplierOverride() throws Exception {
}
@Test
- void testCreateProxyWithContentSupplierOverride() throws Exception {
+ void createProxyWithContentSupplierOverride() throws Exception {
final InputStream s = new ByteArrayInputStream(new byte[10]);
ContentSupplier ns = () -> s;
final PlexusIoResource proxy = ProxyFactory.createProxy(getPomResource(), ns);
@@ -64,7 +64,7 @@ void testCreateProxyWithContentSupplierOverride() throws Exception {
}
@Test
- void testCreateProxyWithSymlinkDestinationSupplierOverride() throws Exception {
+ void createProxyWithSymlinkDestinationSupplierOverride() throws Exception {
SymlinkDestinationSupplier ns = () -> "mordor";
final PlexusIoResource proxy = ProxyFactory.createProxy(getDummySymlinkResource(), ns);
assertEquals("mordor", ((SymlinkDestinationSupplier) proxy).getSymlinkDestination());