This is an automated email from the ASF dual-hosted git repository.
cstamas pushed a commit to branch maven-filtering-3.x
in repository https://gitbox.apache.org/repos/asf/maven-filtering.git
The following commit(s) were added to refs/heads/maven-filtering-3.x by this
push:
new 270585b Issue 289: filter file names one component at a time (#325)
270585b is described below
commit 270585b4d8cdec5cb6e1026af3bc7de625d5234b
Author: Paul Barnes <[email protected]>
AuthorDate: Mon Mar 2 04:07:56 2026 -0600
Issue 289: filter file names one component at a time (#325)
This PR filters file pathnames one component at a time in order to avoid
conflicts between the configured escapeString and the file separator. By
filtering a component at a time, the file separator does not occur in the path
name component being filtered.
This is a fix for issue #289, on the maven-filtering-3.x branch.
---
.../filtering/DefaultMavenResourcesFiltering.java | 38 ++++++++++++------
.../DefaultMavenResourcesFilteringTest.java | 46 +++++++++++++++++++++-
.../{ => subfolder}/${pom.version}.txt | 0
3 files changed, 71 insertions(+), 13 deletions(-)
diff --git
a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
index 47c7171..f1eef65 100644
---
a/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
+++
b/src/main/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFiltering.java
@@ -27,10 +27,12 @@ import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
+import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Iterator;
import java.util.List;
import java.util.Locale;
@@ -501,21 +503,33 @@ public class DefaultMavenResourcesFiltering implements
MavenResourcesFiltering {
*/
private String filterFileName(String name, List<FilterWrapper> wrappers)
throws MavenFilteringException {
- Reader reader = new StringReader(name);
- for (FilterWrapper wrapper : wrappers) {
- reader = wrapper.getReader(reader);
- }
+ StringBuilder sb = new StringBuilder();
+ Path path = Paths.get(name);
+ Iterator<Path> iterator = path.iterator();
+ while (iterator.hasNext()) {
+ String component = iterator.next().toString();
+ Reader reader = new StringReader(component);
+ for (FilterWrapper wrapper : wrappers) {
+ reader = wrapper.getReader(reader);
+ }
- try (StringWriter writer = new StringWriter()) {
- IOUtil.copy(reader, writer);
- String filteredFilename = writer.toString();
+ try (StringWriter writer = new StringWriter()) {
+ IOUtil.copy(reader, writer);
+ String filteredComponent = writer.toString();
+ sb.append(filteredComponent);
+ if (iterator.hasNext()) {
+ sb.append(FileSystems.getDefault().getSeparator());
+ }
- if (LOGGER.isDebugEnabled()) {
- LOGGER.debug("renaming filename " + name + " to " +
filteredFilename);
+ } catch (IOException e) {
+ throw new MavenFilteringException("Failed filtering filename"
+ name, e);
}
- return filteredFilename;
- } catch (IOException e) {
- throw new MavenFilteringException("Failed filtering filename" +
name, e);
}
+ String filteredFilename = sb.toString();
+
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("renaming filename " + name + " to " +
filteredFilename);
+ }
+ return filteredFilename;
}
}
diff --git
a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java
b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java
index 228fb66..3d1247a 100644
---
a/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java
+++
b/src/test/java/org/apache/maven/shared/filtering/DefaultMavenResourcesFilteringTest.java
@@ -23,6 +23,7 @@ import javax.inject.Inject;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
@@ -991,7 +992,7 @@ class DefaultMavenResourcesFilteringTest {
Resource resource = new Resource();
resource.setDirectory(unitFilesDir);
resource.setFiltering(true);
- resource.addInclude("${pom.version}*");
+ resource.addInclude("**/${pom.version}*");
resource.setTargetPath("testTargetPath");
MavenResourcesExecution mavenResourcesExecution = new
MavenResourcesExecution(
@@ -1009,6 +1010,49 @@ class DefaultMavenResourcesFilteringTest {
File[] files = targetPathFile.listFiles();
assertEquals(1, files.length);
+ assertEquals("subfolder", files[0].getName());
+ assertTrue(files[0].isDirectory());
+
+ files = files[0].listFiles();
+ assertEquals(1, files.length);
+ assertEquals("1.0.txt", files[0].getName());
+ }
+
+ @Test
+ void filterFileNameWithFileSeparatorAsEscape() throws Exception {
+
+ String unitFilesDir = getBasedir() +
"/src/test/units-files/maven-filename-filtering";
+
+ Resource resource = new Resource();
+ resource.setDirectory(unitFilesDir);
+ resource.setFiltering(true);
+ resource.addInclude("**/${pom.version}*");
+ resource.setTargetPath("testTargetPath");
+
+ MavenResourcesExecution mavenResourcesExecution = new
MavenResourcesExecution(
+ Collections.singletonList(resource),
+ outputDirectory,
+ mavenProject,
+ "UTF-8",
+ Collections.<String>emptyList(),
+ Collections.<String>emptyList(),
+ new StubMavenSession());
+ mavenResourcesExecution.setFilterFilenames(true);
+
+ // more likely to occur on windows, where the file
+ // separator is the same as the common escape string "\"
+
mavenResourcesExecution.setEscapeString(FileSystems.getDefault().getSeparator());
+ mavenResourcesFiltering.filterResources(mavenResourcesExecution);
+
+ File targetPathFile = new File(outputDirectory, "testTargetPath");
+
+ File[] files = targetPathFile.listFiles();
+ assertEquals(1, files.length);
+ assertEquals("subfolder", files[0].getName());
+ assertTrue(files[0].isDirectory());
+
+ files = files[0].listFiles();
+ assertEquals(1, files.length);
assertEquals("1.0.txt", files[0].getName());
}
diff --git a/src/test/units-files/maven-filename-filtering/${pom.version}.txt
b/src/test/units-files/maven-filename-filtering/subfolder/${pom.version}.txt
similarity index 100%
rename from src/test/units-files/maven-filename-filtering/${pom.version}.txt
rename to
src/test/units-files/maven-filename-filtering/subfolder/${pom.version}.txt