You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by kw...@apache.org on 2021/02/03 09:01:01 UTC

[jackrabbit-filevault-package-maven-plugin] 01/01: JCRVLT-495 allow to limit filtering to certain extensions

This is an automated email from the ASF dual-hosted git repository.

kwin pushed a commit to branch feature/JCRVLT-495-improve-filtering
in repository https://gitbox.apache.org/repos/asf/jackrabbit-filevault-package-maven-plugin.git

commit 44d01ec4acd0257028f33fee29584169d3a90e94
Author: Konrad Windszus <kw...@apache.org>
AuthorDate: Wed Feb 3 10:00:45 2021 +0100

    JCRVLT-495 allow to limit filtering to certain extensions
---
 .../filevault/maven/packaging/VaultMojo.java       | 99 +++++++++++++++++-----
 .../filevault/maven/packaging/VaultMojoTest.java   | 13 +++
 .../filevault/maven/packaging/it/FilteringIT.java  | 54 ++++++++----
 .../simple-filter/expected-files.txt               |  1 +
 .../simple-filter/jcr_root/apps/foo/.content.xml   |  4 +
 5 files changed, 136 insertions(+), 35 deletions(-)

diff --git a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java
index 914ba15..6d83495 100644
--- a/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java
+++ b/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java
@@ -32,9 +32,11 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.apache.commons.io.FilenameUtils;
 import org.apache.jackrabbit.filevault.maven.packaging.impl.util.PlexusIoNonExistingDirectoryResource;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
@@ -107,12 +109,14 @@ public class VaultMojo extends AbstractSourceAndMetadataPackageMojo {
     private File outputDirectory;
 
     /** Enables resource filtering on the meta-inf source files similar to what the <a href="https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html">maven-resources-plugin</a> does.
+     * It is recommended to limit filtering with {@link #filteredFileExtensions} and {@link #nonFilteredFileExtensions}.
      * @since 1.1.0 
      */
     @Parameter(property = "vault.enableMetaInfFiltering", defaultValue = "false")
     private boolean enableMetaInfFiltering;
 
     /** Enables resource filtering on the {@link AbstractSourceAndMetadataPackageMojo#jcrRootSourceDirectory} source files similar to what the <a href="https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html">maven-resources-plugin</a> does.
+     * It is recommended to limit filtering with {@link #filteredFileExtensions} and {@link #nonFilteredFileExtensions}.
      * @since 1.1.0 
      */
     @Parameter(property = "vault.enableJcrRootFiltering", defaultValue = "false") 
@@ -171,12 +175,22 @@ public class VaultMojo extends AbstractSourceAndMetadataPackageMojo {
     @Parameter(property="vault.escapedBackslashesInFilePath", defaultValue = "false")
     private boolean escapedBackslashesInFilePath;
 
-    /** Additional list of file extensions that should not be filtered.
-     * (already defined are : jpg, jpeg, gif, bmp, png)
+    /** Additional list of file extensions that should not be filtered, e.g. binaries.
+     * Already predefined as extensions which should never be filtered are: jpg, jpeg, gif, bmp, png, ico.
+     * Instead of using this deny list approach for binary files and others which should not be filtered, 
+     * consider using an allow list via {@link VaultMojo#filteredFileExtensions} instead.
      * @since 1.1.0 */
     @Parameter(property="vault.nonFilteredFileExtensions")
     private List<String> nonFilteredFileExtensions;
 
+    /** 
+     * Restricts the files which should be filtered to the ones having one of the given extensions.
+     * Evaluated after {@link #nonFilteredFileExtensions}.
+     * If empty or not set all files except for the ones from {@link #nonFilteredFileExtensions} are filtered.
+     * @since 1.1.8 */
+    @Parameter(property="vault.filteredFileExtensions")
+    private Set<String> filteredFileExtensions;
+
     /** Stop searching endToken at the end of line when filtering is applied.
      * 
      * @since 1.1.0 */
@@ -248,13 +262,15 @@ public class VaultMojo extends AbstractSourceAndMetadataPackageMojo {
         Path destFile = Paths.get(destFileName);
         if ((destFile.startsWith(Constants.ROOT_DIR) && enableJcrRootFiltering) ||
             (destFile.startsWith(Constants.META_INF) && enableMetaInfFiltering)) {
-            getLog().info("Apply filtering to " + getProjectRelativeFilePath(sourceFile));
-            Resource resource = new Resource();
-            resource.setDirectory(sourceFile.getParent());
-            resource.setIncludes(Collections.singletonList(sourceFile.getName()));
-            resource.setFiltering(true);
-            File newTargetDirectory = applyFiltering(destFile.getParent().toString(), mavenResourcesExecution, resource);
-            sourceFile = new File(newTargetDirectory, sourceFile.getName());
+            if (filteredFileExtensions.isEmpty() || filteredFileExtensions.contains(FilenameUtils.getExtension(sourceFile.toString()))) {
+                getLog().info("Apply filtering to " + getProjectRelativeFilePath(sourceFile));
+                Resource resource = new Resource();
+                resource.setDirectory(sourceFile.getParent());
+                resource.setIncludes(Collections.singletonList(sourceFile.getName()));
+                resource.setFiltering(true);
+                File newTargetDirectory = applyFiltering(destFile.getParent().toString(), mavenResourcesExecution, resource);
+                sourceFile = new File(newTargetDirectory, sourceFile.getName());
+            }
         }
         getLog().debug("Adding file " + getProjectRelativeFilePath(sourceFile) + " to package at " + destFileName + "'");
         archiver.addFile(sourceFile, destFileName);
@@ -274,21 +290,65 @@ public class VaultMojo extends AbstractSourceAndMetadataPackageMojo {
             (fileSet.getPrefix().startsWith(Constants.META_INF) && enableMetaInfFiltering)) {
             
             getLog().info("Apply filtering to FileSet below " + getProjectRelativeFilePath(fileSet.getDirectory()));
-            Resource resource = new Resource();
-            resource.setDirectory(fileSet.getDirectory().getPath());
-            if (fileSet.getIncludes() != null) {
-                resource.setIncludes(Arrays.asList(fileSet.getIncludes()));
+            Resource filteringSourceResource = new Resource();
+            filteringSourceResource.setDirectory(fileSet.getDirectory().getPath());
+            
+            // since allow lists (i.e. only filtering specific extensions) is not natively supported
+            // split up the fileSet
+            if (filteredFileExtensions != null && !filteredFileExtensions.isEmpty()) {
+                if (fileSet.getIncludes() != null) {
+                    throw new IllegalStateException("FileSet can not have includes set, as those are used for filteredFileExtensions");
+                }
+                // create an additional file set with unfiltered files
+                DefaultFileSet unfilteredFileSet = cloneFileSet(fileSet);
+                List<String> filteredFileExtensionPatterns = getFilterFileExtensionsPatterns(filteredFileExtensions);
+                
+                // add all filtered file extensions to excludes
+                String[] excludes = Stream.of(Arrays.asList(fileSet.getExcludes()), filteredFileExtensionPatterns).flatMap(x -> x.stream()).toArray(String[]::new);
+                unfilteredFileSet.setExcludes(excludes);
+                
+                getLog().debug("Adding unfiltered fileSet '" + getString(unfilteredFileSet) + "' to package");
+                archiver.addFileSet(unfilteredFileSet);
+                filteringSourceResource.setIncludes(filteredFileExtensionPatterns);
+            } else {
+                if (fileSet.getIncludes() != null) {
+                    filteringSourceResource.setIncludes(Arrays.asList(fileSet.getIncludes()));
+                }
             }
+           
             if (fileSet.getExcludes() != null) {
-                resource.setExcludes(Arrays.asList(fileSet.getExcludes()));
+                filteringSourceResource.setExcludes(Arrays.asList(fileSet.getExcludes()));
                 // default exclude are managed via mavenResourcesExecution
             }
-            resource.setFiltering(true);
-            File newTargetDirectory = applyFiltering(fileSet.getPrefix(), mavenResourcesExecution, resource);
-            fileSet.setDirectory(newTargetDirectory);
+            filteringSourceResource.setFiltering(true);
+            File newTargetDirectory = applyFiltering(fileSet.getPrefix(), mavenResourcesExecution, filteringSourceResource);
+            if (newTargetDirectory.exists()) {
+                fileSet.setDirectory(newTargetDirectory);
+                getLog().debug("Adding filtered fileSet '" + getString(fileSet) + "' to package");
+                archiver.addFileSet(fileSet);
+            }
+        } else {
+            getLog().debug("Adding fileSet '" + getString(fileSet) + "' to package");
+            archiver.addFileSet(fileSet);
         }
-        getLog().debug("Adding fileSet '" + getString(fileSet) + "' to package");
-        archiver.addFileSet(fileSet);
+    }
+
+    private static List<String> getFilterFileExtensionsPatterns(Set<String> filteredFileExtensions) {
+        return filteredFileExtensions.stream().map( s -> "**/*." + s).collect(Collectors.toList());
+    }
+
+    static DefaultFileSet cloneFileSet(DefaultFileSet defaultFileSet) {
+        DefaultFileSet newFileSet = new DefaultFileSet(defaultFileSet.getDirectory());
+        newFileSet.setCaseSensitive(defaultFileSet.isCaseSensitive());
+        newFileSet.setExcludes(defaultFileSet.getExcludes());
+        newFileSet.setFileMappers(defaultFileSet.getFileMappers());
+        newFileSet.setFileSelectors(defaultFileSet.getFileSelectors());
+        newFileSet.setIncludes(defaultFileSet.getIncludes());
+        newFileSet.setIncludingEmptyDirectories(defaultFileSet.isIncludingEmptyDirectories());
+        newFileSet.setPrefix(defaultFileSet.getPrefix());
+        newFileSet.setStreamTransformer(defaultFileSet.getStreamTransformer());
+        newFileSet.setUsingDefaultExcludes(defaultFileSet.isUsingDefaultExcludes());
+        return newFileSet;
     }
 
     private static String getString(FileSet fileSet) {
@@ -304,6 +364,7 @@ public class VaultMojo extends AbstractSourceAndMetadataPackageMojo {
         File targetPath = new File(project.getBuild().getDirectory(), "filteredFiles");
         mavenResourcesExecution.setOutputDirectory(targetPath);
         targetPath = new File(targetPath, prefix);
+        // split up between filtered and non filtered
         // which path to set as target (is a temporary path)
         getLog().debug("Applying filtering to resource " + resource);
         resource.setTargetPath(targetPath.getPath());
diff --git a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojoTest.java b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojoTest.java
index 10a319f..7536fe4 100644
--- a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojoTest.java
+++ b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojoTest.java
@@ -21,7 +21,10 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Set;
 
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.jackrabbit.filevault.maven.packaging.it.ProjectBuilder;
+import org.codehaus.plexus.archiver.util.DefaultFileSet;
 import org.hamcrest.Matchers;
 import org.junit.Assert;
 import org.junit.Test;
@@ -45,4 +48,14 @@ public class VaultMojoTest {
         Collection<File> uncoveredFiles = VaultMojo.getUncoveredFiles(sourceDirectory, excludes, "", entryNames);
         Assert.assertThat(uncoveredFiles, Matchers.empty());
     }
+
+    @Test
+    public void testCloneFileSet() {
+        DefaultFileSet fileSet = new DefaultFileSet();
+        fileSet.setIncludes(new String[] { "ab", "c" });
+        fileSet.setExcludes(new String[] { "de", "f" });
+        fileSet.setIncludingEmptyDirectories(true);
+        DefaultFileSet clonedFileSet = VaultMojo.cloneFileSet(fileSet);
+        Assert.assertTrue("Expected " + ToStringBuilder.reflectionToString(fileSet) + " but got " + ToStringBuilder.reflectionToString(clonedFileSet), EqualsBuilder.reflectionEquals(fileSet, clonedFileSet));
+    }
 }
diff --git a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/FilteringIT.java b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/FilteringIT.java
index b7adc82..4d1279d 100644
--- a/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/FilteringIT.java
+++ b/src/test/java/org/apache/jackrabbit/filevault/maven/packaging/it/FilteringIT.java
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.filevault.maven.packaging.it;
 
 import java.io.IOException;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.it.VerificationException;
 import org.junit.Test;
 
@@ -26,41 +27,62 @@ import org.junit.Test;
  */
 public class FilteringIT {
 
-    private ProjectBuilder verify(String projectName, boolean enableJcrRootFiltering, boolean enableMetaInfFiltering, String ... goals) throws VerificationException, IOException {
-        return new ProjectBuilder()
+    private ProjectBuilder verify(String projectName, boolean enableJcrRootFiltering, boolean enableMetaInfFiltering, String filteredFileExtensions, String ... goals) throws VerificationException, IOException {
+        ProjectBuilder projectBuilder = new ProjectBuilder()
                 .setTestProjectDir("filtering-tests/" + projectName)
                 .setTestGoals(goals)
                 .setProperty("vault.enableMetaInfFiltering", Boolean.toString(enableMetaInfFiltering))
-                .setProperty("vault.enableJcrRootFiltering", Boolean.toString(enableJcrRootFiltering))
+                .setProperty("vault.enableJcrRootFiltering", Boolean.toString(enableJcrRootFiltering));
+        if (StringUtils.isNotBlank(filteredFileExtensions)) {
+            projectBuilder.setProperty("vault.filteredFileExtensions", filteredFileExtensions);
+        }
+        return projectBuilder
                 .build()
                 .verifyExpectedFiles();
     }
 
     @Test
     public void test_simple_filter_with_filtering_enabled() throws Exception {
-        verify("simple-filter", true, true)
+        verify("simple-filter", true, true, null)
+            .verifyExpectedFileChecksum("META-INF/vault/properties.xml", "295fb69e")
             .verifyExpectedFileChecksum("jcr_root/apps/bar/test1.properties", "10791371")
-            .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "7563f01d");
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "7563f01d")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/.content.xml", "d9b1ad2");
     }
 
     @Test
     public void test_simple_filter_with_filtering_disabled() throws Exception {
-        verify("simple-filter", false, false)
-        .verifyExpectedFileChecksum("jcr_root/apps/bar/test1.properties", "34e5a01d")
-        .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "a41ae6f8");
+        verify("simple-filter", false, false, null)
+            .verifyExpectedFileChecksum("META-INF/vault/properties.xml", "5953911b")
+            .verifyExpectedFileChecksum("jcr_root/apps/bar/test1.properties", "34e5a01d")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "a41ae6f8")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/.content.xml", "f8aee8df");
     }
 
     @Test
-    public void test_simple_filter_with_filtering_partially_enabled() throws Exception {
-        verify("simple-filter", true, false)
-        .verifyExpectedFileChecksum("jcr_root/apps/bar/test1.properties", "10791371")
-        .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "7563f01d");
+    public void test_simple_filter_with_filtering_enabled_on_jcrroot() throws Exception {
+        verify("simple-filter", true, false, null)
+            .verifyExpectedFileChecksum("META-INF/vault/properties.xml", "5953911b")
+            .verifyExpectedFileChecksum("jcr_root/apps/bar/test1.properties", "10791371")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "7563f01d")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/.content.xml", "d9b1ad2");
     }
 
     @Test
-    public void test_simple_filter_with_filtering_partially_enabled2() throws Exception {
-        verify("simple-filter", false, true)
-        .verifyExpectedFileChecksum("jcr_root/apps/bar/test1.properties", "34e5a01d")
-        .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "a41ae6f8");
+    public void test_simple_filter_with_filtering_enabled_on_metainf() throws Exception {
+        verify("simple-filter", false, true, null)
+            .verifyExpectedFileChecksum("META-INF/vault/properties.xml", "295fb69e")
+            .verifyExpectedFileChecksum("jcr_root/apps/bar/test1.properties", "34e5a01d")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "a41ae6f8")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/.content.xml", "f8aee8df");
+    }
+    
+    @Test
+    public void test_simple_filter_with_filtering_partially_enabled_on_jcrroot() throws Exception {
+        verify("simple-filter", true, false, "xml")
+            .verifyExpectedFileChecksum("META-INF/vault/properties.xml", "5953911b")
+            .verifyExpectedFileChecksum("jcr_root/apps/bar/test1.properties", "34e5a01d")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/test2.properties", "a41ae6f8")
+            .verifyExpectedFileChecksum("jcr_root/apps/foo/.content.xml", "d9b1ad2");
     }
 }
diff --git a/src/test/resources/test-projects/filtering-tests/simple-filter/expected-files.txt b/src/test/resources/test-projects/filtering-tests/simple-filter/expected-files.txt
index 2a8bd38..8bedede 100644
--- a/src/test/resources/test-projects/filtering-tests/simple-filter/expected-files.txt
+++ b/src/test/resources/test-projects/filtering-tests/simple-filter/expected-files.txt
@@ -15,4 +15,5 @@ jcr_root/apps/
 jcr_root/apps/bar/
 jcr_root/apps/bar/test1.properties
 jcr_root/apps/foo/
+jcr_root/apps/foo/.content.xml
 jcr_root/apps/foo/test2.properties
\ No newline at end of file
diff --git a/src/test/resources/test-projects/filtering-tests/simple-filter/jcr_root/apps/foo/.content.xml b/src/test/resources/test-projects/filtering-tests/simple-filter/jcr_root/apps/foo/.content.xml
new file mode 100644
index 0000000..d61361e
--- /dev/null
+++ b/src/test/resources/test-projects/filtering-tests/simple-filter/jcr_root/apps/foo/.content.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jcr:root xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
+jcr:primaryType="nt:unstructured"
+customKey2="${customKey}" />
\ No newline at end of file