diff --git a/commons/src/main/java/com/powsybl/commons/datasource/DirectoryDataSource.java b/commons/src/main/java/com/powsybl/commons/datasource/DirectoryDataSource.java index 5025ef8730f..a905128c174 100644 --- a/commons/src/main/java/com/powsybl/commons/datasource/DirectoryDataSource.java +++ b/commons/src/main/java/com/powsybl/commons/datasource/DirectoryDataSource.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.FileVisitOption; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; @@ -126,7 +127,7 @@ public Set listNames(String regex) throws IOException { // Consider only files in the given folder, do not go into folders Pattern p = Pattern.compile(regex); int maxDepth = 1; - try (Stream paths = Files.walk(directory, maxDepth)) { + try (Stream paths = Files.walk(directory, maxDepth, FileVisitOption.FOLLOW_LINKS)) { var filenames = paths .filter(Files::isRegularFile) .map(Path::getFileName) diff --git a/commons/src/test/java/com/powsybl/commons/datasource/DirectoryDataSourceTest.java b/commons/src/test/java/com/powsybl/commons/datasource/DirectoryDataSourceTest.java index cab00111655..7a470015875 100644 --- a/commons/src/test/java/com/powsybl/commons/datasource/DirectoryDataSourceTest.java +++ b/commons/src/test/java/com/powsybl/commons/datasource/DirectoryDataSourceTest.java @@ -16,12 +16,14 @@ import java.io.IOException; import java.nio.file.Files; +import java.nio.file.Path; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; /** * @author Nicolas Rol {@literal } @@ -169,4 +171,24 @@ protected DirectoryDataSource createDataSourceForPolynomialRegexTest() throws IO Files.createFile(testDir.resolve(filename)); return new DirectoryDataSource(testDir, ""); } + + @Test + void testSymbolicLink() throws IOException { + // Create a folder with a file + Path realPath = testDir.resolve("realPath"); + Files.createDirectories(realPath); + Files.createFile(fileSystem.getPath(realPath + "/test_file.txt")); + + // Create a symbolic link to the real path + Path symbolicPath = testDir.resolve("symbolicPath"); + Files.createSymbolicLink(symbolicPath, realPath); + + // Create two data sources + DirectoryDataSource datasourceOnRealPath = new DirectoryDataSource(realPath, "test_file"); + DirectoryDataSource datasourceOnSymbolicPath = new DirectoryDataSource(symbolicPath, "test_file"); + assertEquals(1, datasourceOnRealPath.listNames(".*").size()); + assertEquals(1, datasourceOnSymbolicPath.listNames(".*").size()); + assertTrue(datasourceOnRealPath.listNames(".*").contains("test_file.txt")); + assertTrue(datasourceOnSymbolicPath.listNames(".*").contains("test_file.txt")); + } }