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:00 UTC

[jackrabbit-filevault-package-maven-plugin] branch feature/JCRVLT-495-improve-filtering created (now 44d01ec)

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

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


      at 44d01ec  JCRVLT-495 allow to limit filtering to certain extensions

This branch includes the following new commits:

     new 44d01ec  JCRVLT-495 allow to limit filtering to certain extensions

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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

Posted by kw...@apache.org.
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