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

Reply via email to