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