You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by tr...@apache.org on 2018/04/04 01:54:05 UTC

svn commit: r1828296 [2/2] - in /jackrabbit/commons/filevault-package-maven-plugin/trunk: ./ src/main/java/org/apache/jackrabbit/filevault/maven/packaging/ src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/ src/main/resources/META-INF/...

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java?rev=1828296&r1=1828295&r2=1828296&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/VaultMojo.java Wed Apr  4 01:54:04 2018
@@ -17,45 +17,24 @@
 package org.apache.jackrabbit.filevault.maven.packaging;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.OutputStream;
-import java.nio.file.Files;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Iterator;
+import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
 
 import javax.annotation.Nonnull;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.jackrabbit.filevault.maven.packaging.impl.DependencyValidator;
 import org.apache.jackrabbit.filevault.maven.packaging.impl.FileValidator;
-import org.apache.jackrabbit.filevault.maven.packaging.impl.PackageDependency;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
-import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
-import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
-import org.apache.jackrabbit.vault.fs.io.AccessControlHandling;
-import org.apache.jackrabbit.vault.packaging.PackageId;
-import org.apache.jackrabbit.vault.packaging.PackageType;
 import org.apache.jackrabbit.vault.util.PlatformNameFormat;
-import org.apache.maven.archiver.ManifestConfiguration;
 import org.apache.maven.archiver.MavenArchiveConfiguration;
 import org.apache.maven.archiver.MavenArchiver;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Component;
@@ -63,19 +42,13 @@ import org.apache.maven.plugins.annotati
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.archiver.ArchiveEntry;
 import org.codehaus.plexus.archiver.FileSet;
 import org.codehaus.plexus.util.AbstractScanner;
 import org.codehaus.plexus.util.DirectoryScanner;
 import org.codehaus.plexus.util.FileUtils;
-import org.codehaus.plexus.util.IOUtil;
 import org.codehaus.plexus.util.StringUtils;
 
-import aQute.bnd.header.Attrs;
-import aQute.bnd.header.Parameters;
-import aQute.bnd.osgi.Processor;
-
 import static org.codehaus.plexus.archiver.util.DefaultFileSet.fileSet;
 
 /**
@@ -86,44 +59,16 @@ import static org.codehaus.plexus.archiv
         defaultPhase = LifecyclePhase.PACKAGE,
         requiresDependencyResolution = ResolutionScope.COMPILE
 )
-public class VaultMojo extends AbstractMojo {
-
-    private static final String JCR_ROOT = "jcr_root/";
-
-    private static final String VAULT_DIR = "META-INF/vault";
-
-    public static final String PROPERTIES_FILE = VAULT_DIR + "/properties.xml";
-
-    public static final String FILTER_FILE = VAULT_DIR + "/filter.xml";
-
-    private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
+public class VaultMojo extends AbstractPackageMojo {
 
     private static final String PACKAGE_TYPE = "zip";
 
     private static final String PACKAGE_EXT = "." + PACKAGE_TYPE;
 
-    public static final String MF_KEY_PACKAGE_TYPE = "Content-Package-Type";
-
-    public static final String MF_KEY_PACKAGE_ID = "Content-Package-Id";
-
-    private static final String MF_KEY_PACKAGE_DEPENDENCIES = "Content-Package-Dependencies";
-
-    public static final String MF_KEY_PACKAGE_ROOTS = "Content-Package-Roots";
-
-    private static final String MF_KEY_PACKAGE_DESC = "Content-Package-Description";
-
-    private static final String MF_KEY_IMPORT_PACKAGE = "Import-Package";
-
     @Component
     private ArtifactHandlerManager artifactHandlerManager;
 
     /**
-     * The Maven project.
-     */
-    @Parameter(property = "project", readonly = true, required = true)
-    private MavenProject project;
-
-    /**
      * The directory containing the content to be packaged up into the content
      * package.
      *
@@ -150,26 +95,6 @@ public class VaultMojo extends AbstractM
     private File[] jcrRootSourceDirectory;
 
     /**
-     * The directory that contains the META-INF/vault. Multiple directories can be specified as a comma separated list,
-     * which will act as a search path and cause the plugin to look for the first existing directory.
-     * <p>
-     * This directory is added as fileset to the package archiver before the the {@link #workDirectory}. This means that
-     * files specified in this directory have precedence over the one present in the {@link #workDirectory}. For example,
-     * if this directory contains a {@code properties.xml} it will not be overwritten by the generated one. A special
-     * case is the {@code filter.xml} which will be merged with inline filters if present.
-     */
-    @Parameter(
-            property = "vault.metaInfVaultDirectory",
-            required = true,
-            defaultValue =
-                    "${project.basedir}/META-INF/vault," +
-                    "${project.basedir}/src/main/META-INF/vault," +
-                    "${project.basedir}/src/main/content/META-INF/vault," +
-                    "${project.basedir}/src/content/META-INF/vault"
-    )
-    private File[] metaInfVaultDirectory;
-
-    /**
      * The name of the generated package ZIP file without the ".zip" file
      * extension.
      */
@@ -188,148 +113,17 @@ public class VaultMojo extends AbstractM
     private File outputDirectory;
 
     /**
-     * Optional file that specifies the source of the workspace filter. The filters specified in the configuration
-     * and injected via emebedds or subpackages are merged into it.
-     */
-    @Parameter
-    private File filterSource;
-
-    /**
-     * Optional reference to PNG image that should be used as thumbnail for the content package.
-     */
-    @Parameter
-    private File thumbnailImage;
-
-    /**
-     * The directory containing the content to be packaged up into the content
-     * package.
-     */
-    @Parameter(
-            defaultValue = "${project.build.directory}/vault-work",
-            required = true)
-    private File workDirectory;
-
-    /**
      * The archive configuration to use. See <a
      * href="http://maven.apache.org/shared/maven-archiver/index.html">the
      * documentation for Maven Archiver</a>.
+     * 
+     * All settings related to manifest are not relevant as this gets overwritten by the manifest in {@link AbstractPackageMojo#workDirectory}
      */
     @Parameter
     private MavenArchiveConfiguration archive;
 
     /**
-     * Adds a path prefix to all resources useful for shallower source trees.
-     */
-    @Parameter(property = "vault.prefix")
-    private String prefix;
-
-    /**
-     * The groupId used for the generated content package. This will be part of
-     * the target installation path of the content package.
-     */
-    @Parameter(
-            property = "vault.group",
-            defaultValue="${project.groupId}",
-            required = true)
-    private String group;
-
-    /**
-     * The name of the content package
-     */
-    @Parameter(
-            property = "vault.name",
-            defaultValue="${project.artifactId}",
-            required = true)
-    private String name;
-
-    /**
-     * The version of the content package.
-     */
-    @Parameter(
-            property = "vault.version",
-            defaultValue = "${project.version}",
-            required = true)
-    private String version;
-
-    /**
-     * Defines whether the package requires root. This will become the
-     * {@code requiresRoot} property of the properties.xml file.
-     */
-    @Parameter(
-            property = "vault.requiresRoot",
-            defaultValue="false",
-            required = true)
-    private boolean requiresRoot;
-
-    /**
-     * Defines whether the package is allowed to contain index definitions. This will become the
-     * {@code allowIndexDefinitions} property of the properties.xml file.
-     */
-    @Parameter(
-            property = "vault.allowIndexDefinitions",
-            defaultValue="false",
-            required = true)
-    private boolean allowIndexDefinitions;
-
-    /**
-     * Defines the Access control handling. This will become the
-     * {@code acHandling} property of the properties.xml file.<br/>
-     * Possible values:
-     * <ul>
-     * <li>{@code ignore}: Ignores the packaged access control and leaves the target unchanged.</li>
-     * <li>{@code overwrite}: Applies the access control provided with the package to the target. this also removes
-     * existing access control.</li>
-     * <li>{@code merge}: Merge access control provided with the package with the one in the content by replacing the
-     * access control entries of corresponding principals (i.e. package first). It never alters access control entries of
-     * principals not present in the package.</li>
-     * <li>{@code merge_preserve}: Merge access control in the content with the one provided with the package by
-     * adding the access control entries of principals not present in the content (i.e. content first). It never alters
-     * access control entries already existing in the content.</li>
-     * <li>{@code clear}: Clears all access control on the target system.</li>
-     * </ul>
-     */
-    @Parameter(
-            property = "vault.acHandling",
-            alias = "acHandling",
-            required = false)
-    private AccessControlHandling accessControlHandling;
-
-    /**
-     * Sets the access control handling.
-     * @param type the string representation of the ac handling
-     * @throws MojoFailureException if an error occurs
-     */
-    public void setAccessControlHandling(String type) throws MojoFailureException {
-        try {
-            accessControlHandling = AccessControlHandling.valueOf(type.toUpperCase());
-        } catch (IllegalArgumentException e) {
-            throw new MojoFailureException("Invalid accessControlHandling specified: " + type +".\n" +
-                    "Must be empty or one of '" + StringUtils.join(AccessControlHandling.values(), "','") + "'.");
-        }
-
-    }
-    
-    /**
-     * Controls if errors during dependency validation should fail the build.
-     */
-    @Parameter(
-            property = "vault.failOnDependencyErrors",
-            defaultValue="true",
-            required = true)
-    private boolean failOnDependencyErrors;
-
-    /**
-     * Controls if empty workspace filter fails the build.
-     */
-    @Parameter(
-            property = "vault.failOnEmptyFilter",
-            defaultValue="true",
-            required = true)
-    private boolean failOnEmptyFilter;
-
-
-    /**
-     * The file name patterns to exclude in addition to the ones listed in 
+     * The file name patterns to exclude in addition to the ones listed in
      * {@link AbstractScanner#DEFAULTEXCLUDES}. The format of each pattern is described in {@link DirectoryScanner}.
      */
     @Parameter(property = "vault.excludes",
@@ -337,206 +131,34 @@ public class VaultMojo extends AbstractM
                required = true)
     private String[] excludes;
 
-    /**
-     * Defines the path under which the embedded bundles are placed. defaults to '/apps/bundles/install'
-     */
-    @Parameter(property = "vault.embeddedTarget")
-    private String embeddedTarget;
-
-    /**
-     * List of filters for artifacts to embed in the package.
-     * The {@code Embedded} class represents one or multiple embedded artifact dependencies
-     * from the project descriptor.
-     * Each {@code <embedded>} element may configure any of the following fields
-     *  <p>
-     * <table>
-     * <tr><td>groupId</td><td>String</td><td>Filter criterion against the group id of a project dependency. A pattern of format {@code &lt;filter&gt;{,&lt;filter&gt;}}. Each {@code filter} is a string which is either an exclude (if it starts with a {@code ~}) or an include otherwise. If the first {@code filter} is an include the pattern acts as whitelist, otherwise as blacklist. The last matching filter determines the outcome. Only matching group ids are being considered for being embedded.</td></tr>
-     * <tr><td>artifactId</td><td>String</td><td>Filter criterion against the artifact ids of a project dependency. A pattern of format {@code &lt;filter&gt;{,&lt;filter&gt;}}. Each {@code filter} is a string which is either an exclude (if it starts with a {@code ~}) or an include otherwise. If the first {@code filter} is an include the pattern acts as whitelist, otherwise as blacklist. The last matching filter determines the outcome. Only matching artifacts ids are being considered for being embedded.</td></tr>
-     * <tr><td>scope</td><td>ScopeArtifactFilter</td><td>Filter criterion against the <a href="https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope">scope of a project dependency</a>. Possible values are <ul><li>{@code test}, which allows every scope</li><li>{@code compile+runtime} which allows every scope except {@code test}</li><li>{@code runtime+system} which allows every scope except {@code test} and {@code provided}</li><li>{@code compile} which allows only scope {@code compile}, {@code provided} and {@code system}</li><li>{@code runtime} which only allows scope {@code runtime} and {@code compile}.</td></tr>
-     * <tr><td>type</td><td>String</td><td>Filter criterion against the type of a project dependency. The value given here must be equal to the project dependency's type.</td></tr>
-     * <tr><td>classifier</td><td>String</td><td>Filter criterion against the classifier of a project dependency. The value given here must be equal to the project dependency's classifier.</td></tr>
-     * <tr><td>filter</td><td>Boolean</td><td>If set to {@code true} adds the embedded artifact location to the package's filter.</td></tr>
-     * <tr><td>target</td><td>String</td><td>The parent folder location in the package where to place the embedded artifact. Falls back to {@link #embeddedTarget} if not set.</td></tr>
-     * </table>
-     * </pre>
-     * All fields are optional. All filter criteria is concatenated with AND logic (i.e. every criterion must match for a specific dependency to be embedded).
-     * <i>The difference between {@link #embeddeds} and {@link #subPackages} is that for the former an explicit target is given while for the latter the target is being computed from the artifact's vault property file.</i>
-     */
-    @Parameter
-    private Embedded[] embeddeds = new Embedded[0];
-
-    /**
-     * Defines whether to fail the build when an embedded artifact is not
-     * found in the project's dependencies
-     */
-    @Parameter(property = "vault.failOnMissingEmbed", defaultValue = "false", required = true)
-    private boolean failOnMissingEmbed;
-
-    /**
-     * Defines the content package type. this is either 'application', 'content', 'container' or 'mixed'.
-     * If omitted, it is calculated automatically based on filter definitions. certain package types imply restrictions,
-     * for example, 'application' and 'content' packages are not allowed to contain sub packages or embedded bundles.<br/>
-     * Possible values:
-     * <ul>
-     *   <li>{@code application}: An application package consists purely of application content. It serializes
-     *       entire subtrees with no inclusion or exclusion filters. it does not contain any subpackages nor OSGi
-     *       configuration or bundles.</li> 
-     *   <li>{@code content}: A content package consists only of content and user defined configuration.
-     *       It usually serializes entire subtrees but can contain inclusion or exclusion filters. it does not contain
-     *       any subpackages nor OSGi configuration or bundles.</li> 
-     *   <li>{@code container}: A container package only contains sub packages and OSGi configuration and bundles.
-     *       The container package is only used as container for deployment.</li> 
-     *   <li>{@code mixed}: Catch all type for a combination of the above.</li> 
-     * </ul>
-     */
-    @Parameter(property = "vault.packageType")
-    private PackageType packageType;
 
     /**
-     * Sets the package type.
-     * @param type the string representation of the package type
-     * @throws MojoFailureException if an error occurrs
+     * Creates a {@link FileSet} for the archiver
+     * @param directory the directory
+     * @param prefix the prefix
+     * @return the fileset
      */
-    public void setPackageType(String type) throws MojoFailureException {
-        try {
-            packageType = PackageType.valueOf(type.toUpperCase());
-        } catch (IllegalArgumentException e) {
-            throw new MojoFailureException("Invalid package type specified: " + type +".\n" +
-                    "Must be empty or one of 'application', 'content', 'container', 'mixed'");
-        }
-
+    @Nonnull
+    private FileSet createFileSet(@Nonnull File directory, @Nonnull String prefix) {
+        return createFileSet(directory, prefix, null);
     }
 
     /**
-     * Defines additional bundle dependency via the osgi import-package entry in the manifest.
-     */
-    @Parameter(
-            property = "vault.importPackage",
-            defaultValue =
-                    // exclude HTL compiler packages as they are never real dependencies of the content
-                    "-org.apache.sling.scripting.sightly.compiler.expression.nodes," +
-                    "-org.apache.sling.scripting.sightly.java.compiler," +
-                    "-org.apache.sling.scripting.sightly.render"
-    )
-    private String importPackage;
-
-    /**
-     * Defines the content of the filter.xml file
-     */
-    @Parameter
-    private final Filters filters = new Filters();
-
-    /**
-     * Defines the list of dependencies
-     * A dependency is declared as a {@code <dependency>} element of a list
-     * style {@code <dependencies>} element:
-     * <pre>
-     * &lt;dependency&gt;
-     *     &lt;group&gt;theGroup&lt;/group&gt;
-     *     &lt;name&gt;theName&lt;/name&gt;
-     *     &lt;version&gt;1.5&lt;/version&gt;
-     * &lt;/dependency&gt;
-     * </pre>
-     * <p>
-     * The dependency can also reference a maven project dependency, this is preferred
-     * as it yields to more robust builds.
-     * <pre>
-     * &lt;dependency&gt;
-     *     &lt;groupId&gt;theGroup&lt;/groupId&gt;
-     *     &lt;artifactId&gt;theName&lt;/artifactId&gt;
-     * &lt;/dependency&gt;
-     * </pre>
-     * <p>
-     * The {@code versionRange} may be indicated as a single version, in which
-     * case the version range has no upper bound and defines the minimal version
-     * accepted. Otherwise, the version range defines a lower and upper bound of
-     * accepted versions, where the bounds are either included using parentheses
-     * {@code ()} or excluded using brackets {@code []}
-     */
-    @Parameter
-    private Dependency[] dependencies = new Dependency[0];
-
-    /**
-     * Defines the packages that define the repository structure.
-     * For the format description look at {@link #dependencies}.
-     * <p>
-     * The repository-init feature of sling-start can define initial content that will be available in the
-     * repository before the first package is installed. Packages that depend on those nodes have no way to reference
-     * any dependency package that provides these nodes. A "real" package that would creates those nodes cannot be
-     * installed in the repository, because it would void the repository init structure. On the other hand would filevault
-     * complain, if the package was listed as dependency but not installed in the repository. So therefor this
-     * repository-structure packages serve as indicator packages that helps satisfy the structural dependencies, but are
-     * not added as real dependencies to the package.
-     */
-    @Parameter
-    private Dependency[] repositoryStructurePackages = new Dependency[0];
-
-    /**
-     * computed dependency string
-     * @see #computeDependencies()
-     */
-    private String dependenciesString;
-
-    /**
-     * Defines the list of sub packages to be embedded in this package.
-     * The {@code SubPackage} class represents one or multiple subpackage artifact dependencies
-     * from the project descriptor. Each {@code <subPackage>} element may configure any of the following fields
-     *  <p>
-     * <table>
-     * <tr><td>groupId</td><td>String</td><td>Filter criterion against the group id of a project dependency. A pattern of format {@code &lt;filter&gt;{,&lt;filter&gt;}}. Each {@code filter} is a string which is either an exclude (if it starts with a {@code ~}) or an include otherwise. If the first {@code filter} is an include the pattern acts as whitelist, otherwise as blacklist. The last matching filter determines the outcome. Only matching group ids are being considered for being embedded.</td></tr>
-     * <tr><td>artifactId</td><td>String</td><td>Filter criterion against the artifact ids of a project dependency. A pattern of format {@code &lt;filter&gt;{,&lt;filter&gt;}}. Each {@code filter} is a string which is either an exclude (if it starts with a {@code ~}) or an include otherwise. If the first {@code filter} is an include the pattern acts as whitelist, otherwise as blacklist. The last matching filter determines the outcome. Only matching artifacts ids are being considered for being embedded.</td></tr>
-     * <tr><td>scope</td><td>ScopeArtifactFilter</td><td>Filter criterion against the <a href="https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope">scope of a project dependency</a>. Possible values are <ul><li>{@code test}, which allows every scope</li><li>{@code compile+runtime} which allows every scope except {@code test}</li><li>{@code runtime+system} which allows every scope except {@code test} and {@code provided}</li><li>{@code compile} which allows only scope {@code compile}, {@code provided} and {@code system}</li><li>{@code runtime} which only allows scope {@code runtime} and {@code compile}.</td></tr>
-     * <tr><td>type</td><td>String</td><td>Filter criterion against the type of a project dependency. The value given here must be equal to the project dependency's type. In most cases should be "content-package" or "zip".</td></tr>
-     * <tr><td>classifier</td><td>String</td><td>Filter criterion against the classifier of a project dependency. The value given here must be equal to the project dependency's classifier.</td></tr>
-     * <tr><td>filter</td><td>Boolean</td><td>If set to {@code true} adds the embedded artifact location to the package's filter</td></tr>
-     * </table>
-     * </pre>
-     * All fields are optional. All filter criteria is concatenated with AND logic (i.e. every criterion must match for a specific dependency to be embedded).
-     * <i>The difference between {@link #embeddeds} and {@link #subPackages} is that for the former an explicit target is given while for the latter the target is being computed from the artifact's vault property file.</i>
-     */
-    @Parameter
-    private SubPackage[] subPackages = new SubPackage[0];
-
-    /**
-     * File to store the generated manifest snippet.
-     */
-    @Parameter(property = "vault.generatedImportPackage", defaultValue = "${project.build.directory}/vault-generated-import.txt")
-    private File generatedImportPackage;
-
-    /**
-     * Specifies additional properties to be set in the properties.xml file.
-     * These properties cannot overwrite the following predefined properties:
-     * <p>
-     * <table>
-     * <tr><td>group</td><td>Use <i>group</i> parameter to set</td></tr>
-     * <tr><td>name</td><td>Use <i>name</i> parameter to set</td></tr>
-     * <tr><td>version</td><td>Use <i>version</i> parameter to set</td></tr>
-     * <tr><td>groupId</td><td><i>groupId</i> of the Maven project descriptor</td></tr>
-     * <tr><td>artifactId</td><td><i>artifactId</i> of the Maven project descriptor</td></tr>
-     * <tr><td>dependencies</td><td>Use <i>dependencies</i> parameter to set</td></tr>
-     * <tr><td>createdBy</td><td>The value of the <i>user.name</i> system property</td></tr>
-     * <tr><td>created</td><td>The current system time</td></tr>
-     * <tr><td>requiresRoot</td><td>Use <i>requiresRoot</i> parameter to set</td></tr>
-     * <tr><td>allowIndexDefinitions</td><td>Use <i>allowIndexDefinitions</i> parameter to set</td></tr>
-     * <tr><td>packagePath</td><td>Automatically generated from the group and package name</td></tr>
-     * <tr><td>packageType</td><td>Set via the package type parameter</td></tr>
-     * <tr><td>acHandling</td><td>Use <i>accessControlHandling</i> parameter to set</td></tr>
-     * </table>
-     */
-    @Parameter
-    private final Properties properties = new Properties();
-
-    /**
      * Creates a {@link FileSet} for the archiver
      * @param directory the directory
      * @param prefix the prefix
+     * @param additionalExcludes excludes
      * @return the fileset
      */
     @Nonnull
-    private FileSet createFileSet(@Nonnull File directory, @Nonnull String prefix) {
+    private FileSet createFileSet(@Nonnull File directory, @Nonnull String prefix, List<String> additionalExcludes) {
+        List<String> excludes = new LinkedList<>(Arrays.asList(this.excludes));
+        if (additionalExcludes != null) {
+            excludes.addAll(additionalExcludes);
+        }
         return fileSet(directory)
                 .prefixed(prefix)
-                .includeExclude(null, excludes)
+                .includeExclude(null, excludes.toArray(new String[excludes.size()]))
                 .includeEmptyDirs(true);
     }
 
@@ -545,27 +167,11 @@ public class VaultMojo extends AbstractM
      */
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
-        if (prefix == null) {
-            prefix = "";
-        } else if (!prefix.endsWith("/")) {
-            prefix += "/";
-        }
-
-        final File vaultDir = new File(workDirectory, VAULT_DIR);
         final File finalFile = new File(outputDirectory, finalName + PACKAGE_EXT);
 
         try {
             // find the meta-inf source directory
-            File metaInfDirectory = null;
-            for (File dir: metaInfVaultDirectory) {
-                if (dir.exists() && dir.isDirectory()) {
-                    metaInfDirectory = dir;
-                    break;
-                }
-            }
-            if (metaInfDirectory != null) {
-                getLog().info("using meta-inf/vault from " + metaInfDirectory.getPath());
-            }
+            File metaInfDirectory = getMetaInfDir();
             // find the source directory
             File jcrSourceDirectory = null;
             if (builtContentDirectory != null) {
@@ -583,39 +189,22 @@ public class VaultMojo extends AbstractM
                 getLog().info("packaging content from " + jcrSourceDirectory.getPath());
             }
 
-            vaultDir.mkdirs();
-
-            Map<String, File> embeddedFiles = copyEmbeddeds();
-            embeddedFiles.putAll(copySubPackages());
-
-            computePackageFilters(vaultDir, metaInfDirectory);
-            validatePackageType();
-            computeImportPackage();
-            computeDependencies();
-            if (packageType == PackageType.APPLICATION) {
-                validateDependencies();
-            } else {
-                getLog().info("Ignoring dependency validation due to non-application package type: " + packageType);
-            }
-
-            final Properties vaultProperties = computeProperties();
-            final FileOutputStream fos = new FileOutputStream(new File(vaultDir, "properties.xml"));
-            vaultProperties.storeToXML(fos, project.getName());
-
-            copyFile("/vault/config.xml", new File(vaultDir, "config.xml"));
-            copyFile("/vault/settings.xml", new File(vaultDir, "settings.xml"));
+            // retrieve filters
+            Filters filters = loadFilterFile();
+            Map<String, File> embeddedFiles = getEmbeddedFilesMap();
 
             ContentPackageArchiver contentPackageArchiver = new ContentPackageArchiver();
             contentPackageArchiver.setIncludeEmptyDirs(true);
             if (metaInfDirectory != null) {
                 // ensure that generated filter.xml comes first
-                File filterXML = new File(vaultDir, "filter.xml");
+                File filterXML = getFilterFile();
                 if (filterXML.exists()) {
                     contentPackageArchiver.addFile(filterXML, "META-INF/vault/filter.xml");
                 }
                 contentPackageArchiver.addFileSet(createFileSet(metaInfDirectory, "META-INF/vault/"));
             }
-            contentPackageArchiver.addFileSet(createFileSet(workDirectory, ""));
+            contentPackageArchiver.addFileSet(createFileSet(workDirectory, "", Collections.singletonList("META-INF/MANIFEST.MF")));
+            contentPackageArchiver.addFileSet(createFileSet(workDirectory, "", null));
 
             // include content from build only if it exists
             if (jcrSourceDirectory != null && jcrSourceDirectory.exists()) {
@@ -684,21 +273,11 @@ public class VaultMojo extends AbstractM
                     throw new MojoExecutionException("Package should not contain index definitions, because 'allowIndexDefinitions=false'.");
                 }
             }
-            
-            // add package thumbnail
-            if (thumbnailImage != null && thumbnailImage.exists()) {
-                File vaultDefinitionFolder = new File(vaultDir, "definition");
-                if (!vaultDefinitionFolder.exists()) {
-                    vaultDefinitionFolder.mkdir();
-                }
-                copyFile("/vault/definition/.content.xml", new File(vaultDefinitionFolder, ".content.xml"));
-                FileUtils.copyFile(thumbnailImage, new File(vaultDefinitionFolder, "thumbnail.png"));
-            }
 
             MavenArchiver mavenArchiver = new MavenArchiver();
             mavenArchiver.setArchiver(contentPackageArchiver);
             mavenArchiver.setOutputFile(finalFile);
-            mavenArchiver.createArchive(null, project, getMavenArchiveConfiguration(vaultProperties));
+            mavenArchiver.createArchive(null, project, getMavenArchiveConfiguration(getManifestFile()));
 
             // set the file for the project's artifact and ensure the
             // artifact is correctly handled with the "zip" handler
@@ -712,512 +291,17 @@ public class VaultMojo extends AbstractM
         }
     }
 
-    /**
-     * Computes the package filters.
-     *
-     * Requirements:
-     * - backward compatibility: if a filter.xml is copied to vault-work with the resource plugin, then it should still "work" correctly.
-     * - if there are any comments in the original filter source, they should not get lost, if possible
-     * - if there are filters specified in the pom and in a filter source, they should get merged.
-     * - if the prefix property is set, it should be used if no filter is set.
-     * - if both, a inline filter and a implicit filter is present, the build fails.
-     * - re-run the package goal w/o cleaning the target first must work
-     *
-     * @throws IOException if an I/O error occurs
-     * @throws MojoExecutionException if the build fails
-     */
-    private void computePackageFilters(File vaultWorkDir, File vaultMetaDir) throws IOException, MojoExecutionException {
-        // backward compatibility: if implicit filter exists, use it. but check for conflicts
-        File filterFile = new File(vaultWorkDir, "filter.xml");
-        if (filterFile.exists() && filterFile.lastModified() != 0) {
-            // if both, a inline filter and a implicit filter is present, the build fails.
-            if (!filters.getFilterSets().isEmpty()) {
-                getLog().error("Refuse to merge inline filters and non-sourced filter.xml. If this is intended, specify the filter.xml via the 'filterSource' property.");
-                throw new MojoExecutionException("conflicting filters.");
-            }
-            // load filters for further processing
-            try {
-                filters.load(filterFile);
-            } catch (ConfigurationException e) {
-                throw new IOException(e);
-            }
-
-            getLog().warn("The project is using a filter.xml provided via the resource plugin.");
-            getLog().warn("This is deprecated and might no longer be supported in future versions.");
-            getLog().warn("Use the 'filterSource' property to specify the filter or use inline filters.");
-            return;
-        }
-
-        // if last modified of vault-work/META-INF/vault/filter.xml == 0 -> delete it
-        if (filterFile.exists() && filterFile.lastModified() == 0) {
-            try {
-                Files.delete(filterFile.toPath());
-            } catch (IOException e) {
-                getLog().error("Unable to delete previously generated filter.xml. re-run the goals with a clean setup.");
-                throw new MojoExecutionException("Unable to delete file.", e);
-            }
-        }
-
-        // check for filters file in vaultDir
-        if (vaultMetaDir != null) {
-            File metaFilterFile = new File(vaultMetaDir, "filter.xml");
-            if (metaFilterFile.exists()) {
-                if (filterSource != null && !filterSource.equals(metaFilterFile)) {
-                    getLog().error("Project contains filter.xml in META-INF/vault but also specifies a filter source.");
-                    throw new MojoExecutionException("conflicting filters.");
-                }
-                filterSource = metaFilterFile;
-            }
-        }
-
-        // if filterSource exists, read the filters into sourceFilters
-        DefaultWorkspaceFilter sourceFilters = new DefaultWorkspaceFilter();
-        if (filterSource != null && filterSource.exists()) {
-            getLog().info("Loading filter from " + filterSource.getPath());
-            try {
-                sourceFilters.load(filterSource);
-            } catch (ConfigurationException e) {
-                throw new IOException(e);
-            }
-            if (!filters.getFilterSets().isEmpty()) {
-                getLog().info("Merging inline filters.");
-                mergeFilters(sourceFilters, filters);
-            }
-            filters.getFilterSets().clear();
-            filters.getFilterSets().addAll(sourceFilters.getFilterSets());
-            filters.getPropertyFilterSets().clear();
-            filters.getPropertyFilterSets().addAll(sourceFilters.getPropertyFilterSets());
-
-            // reset source filters for later. this looks a bit complicated but is needed to keep the same
-            // filter order as in previous versions
-            sourceFilters = new DefaultWorkspaceFilter();
-            try {
-                sourceFilters.load(filterSource);
-            } catch (ConfigurationException e) {
-                throw new IOException(e);
-            }
-            sourceFilters.resetSource();
-        }
-
-        // if the prefix property is set, it should be used if no filter is set
-        if (filters.getFilterSets().isEmpty() && prefix.length() > 0) {
-            addWorkspaceFilter(prefix);
-        }
-
-        // if no filter is defined at all, fail
-        if (filters.getFilterSets().isEmpty()) {
-            if (failOnEmptyFilter) {
-                final String msg = "No workspace filter defined (failOnEmptyFilter=true)";
-                getLog().error(msg);
-                throw new MojoExecutionException(msg);
-            } else {
-                getLog().warn("No workspace filter defined. Package import might have unexpected results.");
-            }
-        }
-
-        // if the source filters and the generated filters are the same, copy the source file to retain the comments
-        if (filterSource != null && sourceFilters.getSourceAsString().equals(filters.getSourceAsString())) {
-            FileUtils.copyFile(filterSource, filterFile);
-        } else {
-            // generate xml and write to filter.xml
-            getLog().info("Generating filter.xml from plugin configuration");
-            FileUtils.fileWrite(filterFile.getAbsolutePath(), filters.getSourceAsString());
-        }
-
-        // update the last modified time of filter.xml to for generated filters
-        if (!filterFile.setLastModified(0)) {
-            getLog().warn("Unable to set last modified of filters file. make sure to clean the project before next run.");
-        }
-    }
-
-    private void mergeFilters(DefaultWorkspaceFilter dst, DefaultWorkspaceFilter src) {
-        for (PathFilterSet fs: src.getFilterSets()) {
-            // check for collision
-            for (PathFilterSet mfs: dst.getFilterSets()) {
-                if (mfs.getRoot().equals(fs.getRoot())) {
-                    throw new IllegalArgumentException("Merging of equal filter roots not allowed for: " + fs.getRoot());
-                }
-            }
-            dst.add(fs);
-        }
-    }
-
-    /**
-     * Computes the dependency string.
-     */
-    private void computeDependencies() throws IOException {
-        if (dependencies.length > 0) {
-            dependenciesString = PackageDependency.toString(Dependency.resolve(project, getLog(), dependencies));
-        }
-        Dependency.resolve(project, getLog(), repositoryStructurePackages);
-    }
-
-    /**
-     * Checks if the filter roots of this package are covered by the dependencies and also checks for colliding roots
-     * in the dependencies.
-     */
-    private void validateDependencies() throws MojoExecutionException {
-        List<String> errors = new DependencyValidator()
-                .addDependencies(dependencies)
-                .addRepositoryStructure(repositoryStructurePackages)
-                .setFilters(filters)
-                .validate()
-                .getErrors();
-
-        if (errors.size() > 0) {
-            String msg = String.format("%d error(s) detected during dependency analysis.", errors.size());
-            if (failOnDependencyErrors) {
-                getLog().error(msg);
-                for (String error: errors) {
-                    getLog().error(error);
-                }
-                throw new MojoExecutionException(msg);
-            }
-            getLog().warn(msg);
-            for (String error: errors) {
-                getLog().warn(error);
-            }
-        } else {
-            getLog().info("All dependencies satisfied.");
-        }
-    }
-
-    /**
-     * Computes the import-package definition from the given bundles if not provided by the project.
-     */
-    private void computeImportPackage() throws IOException {
-        TreeMap<String, Attrs> importParams = new TreeMap<String, Attrs>();
-        if (generatedImportPackage.exists()) {
-            String importPackageStr = FileUtils.fileRead(generatedImportPackage);
-            if (importPackageStr.length() > 0) {
-                importParams.putAll(new Parameters(importPackageStr));
-            }
-        }
-
-        // override computed patterns
-        if (importPackage != null) {
-            getLog().debug("merging analyzer-packages with:\n" + importPackage + "\n");
-            for (Map.Entry<String, Attrs> entry : new Parameters(importPackage).entrySet()) {
-                boolean delete = false;
-                String pkg = entry.getKey();
-                if ("-*".equals(pkg)) {
-                    importParams.clear();
-                    continue;
-                }
-                if (pkg.charAt(0) == '-') {
-                    pkg = pkg.substring(1);
-                    delete = true;
-                }
-                if (pkg.endsWith("*")) {
-                    String pkgDot = pkg.substring(0, pkg.length() - 1);
-                    if (!pkgDot.endsWith(".")) {
-                        // matches both, the packages and sub packages
-                        pkg = pkgDot;
-                        pkgDot = pkg + ".";
-                    }
-                    Iterator<Map.Entry<String, Attrs>> iter = importParams.entrySet().iterator();
-                    while (iter.hasNext()) {
-                        Map.Entry<String, Attrs> e = iter.next();
-                        String pkgName = e.getKey();
-                        if (pkgName.equals(pkg) || pkgName.startsWith(pkgDot)) {
-                            if (delete) {
-                                iter.remove();
-                            } else {
-                                e.setValue(entry.getValue());
-                            }
-                        }
-                    }
-                } else {
-                    if (delete) {
-                        importParams.remove(pkg);
-                    } else {
-                        importParams.put(pkg, entry.getValue());
-                    }
-                }
-            }
-        }
-        importPackage = Processor.printClauses(importParams);
-
-        if (!importPackage.isEmpty()) {
-            getLog().info("Merged detected packages from analyzer with 'importPackage':");
-            for (Map.Entry<String, Attrs> e: importParams.entrySet()) {
-                StringBuilder report = new StringBuilder();
-                report.append("  ").append(e.getKey());
-                try {
-                    Processor.printClause(e.getValue(), report);
-                } catch (IOException e1) {
-                    throw new IllegalStateException("Internal error while generating report", e1);
-                }
-                getLog().info(report);
-            }
-            getLog().info("");
-        }
-    }
-
-    private MavenArchiveConfiguration getMavenArchiveConfiguration(Properties vaultProperties) throws IOException {
+    private MavenArchiveConfiguration getMavenArchiveConfiguration(File manifestFile) throws IOException {
         if (archive == null) {
             archive = new MavenArchiveConfiguration();
-            archive.setManifest(new ManifestConfiguration());
 
             archive.setAddMavenDescriptor(true);
             archive.setCompress(true);
             archive.setIndex(false);
-            archive.getManifest().setAddDefaultSpecificationEntries(false);
-            archive.getManifest().setAddDefaultImplementationEntries(true);
-
-            PackageId id = new PackageId(group, name, version);
-            archive.addManifestEntry(MF_KEY_PACKAGE_TYPE, packageType.name().toLowerCase());
-            archive.addManifestEntry(MF_KEY_PACKAGE_ID, id.toString());
-            archive.addManifestEntry(MF_KEY_PACKAGE_DESC, vaultProperties.getProperty("description", ""));
-            if (dependenciesString != null && dependenciesString.length() > 0) {
-                archive.addManifestEntry(MF_KEY_PACKAGE_DEPENDENCIES, dependenciesString);
-            }
-            // be sure to avoid duplicates
-            Set<String> rts = new TreeSet<String>();
-            for (PathFilterSet p: filters.getFilterSets()) {
-                rts.add(p.getRoot());
-            }
-            String[] roots = rts.toArray(new String[rts.size()]);
-            Arrays.sort(roots);
-            archive.addManifestEntry(MF_KEY_PACKAGE_ROOTS, StringUtils.join(roots, ","));
-
-            if (StringUtils.isNotEmpty(importPackage)) {
-                archive.addManifestEntry(MF_KEY_IMPORT_PACKAGE, StringUtils.deleteWhitespace(importPackage));
-            }
         }
-
+        // use the manifest being generated beforehand
+        archive.setManifestFile(manifestFile);
+        
         return archive;
     }
-
-    private Properties computeProperties() {
-        final Properties props = new Properties();
-
-        // find the description of the content package (bug #30546)
-        // this is allowed to be overwritten by the properties map (GRANITE-1527)
-        String description = project.getDescription();
-        if (description == null) {
-            description = project.getName();
-            if (description == null) {
-                description = project.getArtifactId();
-            }
-        }
-        props.put("description", description);
-
-        // add all user defined properties
-        // before the rest of the properties to prevent user
-        // overwriting of predefined properties
-        // (see JavaDoc of properties field for list)
-
-        // but make sure, that we don't have null values in there
-        for (Object o : properties.keySet()) {
-            if (properties.get(o) == null) {
-                properties.put(o, "");
-            }
-        }
-
-        props.putAll(properties);
-
-        // package descriptor properties
-        props.put("group", group);
-        props.put("name", name);
-        props.put("version", version);
-
-        // maven artifact identification
-        props.put("groupId", project.getGroupId());
-        props.put("artifactId", project.getArtifactId());
-
-        // dependencies
-        if (dependenciesString != null && dependenciesString.length() > 0) {
-            props.put("dependencies", dependenciesString);
-        }
-
-        // creation stamp
-        if (!props.containsKey("createdBy")) {
-            props.put("createdBy", System.getProperty("user.name"));
-        }
-        props.put("created", DATE_FORMAT.format(new Date()));
-
-        // configurable properties
-        props.put("requiresRoot", String.valueOf(requiresRoot));
-        props.put("allowIndexDefinitions", String.valueOf(allowIndexDefinitions));
-        props.put("packageType", packageType.name().toLowerCase());
-        if (accessControlHandling != null) {
-            props.put("acHandling", accessControlHandling.name().toLowerCase());
-        }
-        return props;
-    }
-
-    private void copyFile(String source, File target) throws IOException {
-
-        // nothing to do if the file exists
-        if (target.exists()) {
-            return;
-        }
-
-        target.getParentFile().mkdirs();
-
-        InputStream ins = getClass().getResourceAsStream(source);
-        if (ins != null) {
-            OutputStream out = null;
-            try {
-                out = new FileOutputStream(target);
-                IOUtil.copy(ins, out);
-            } finally {
-                IOUtil.close(ins);
-                IOUtil.close(out);
-            }
-        }
-    }
-
-    private Map<String, File> copyEmbeddeds() throws IOException, MojoFailureException {
-        Map<String, File> fileMap = new HashMap<String, File>();
-        for (Embedded emb : embeddeds) {
-            final List<Artifact> artifacts = emb.getMatchingArtifacts(project);
-            if (artifacts.isEmpty()) {
-                if (failOnMissingEmbed) {
-                    throw new MojoFailureException("Embedded artifact specified " + emb + ", but no matching dependency artifact found. Add the missing dependency or fix the embed definition.");
-                } else {
-                    getLog().warn("No matching artifacts for " + emb);
-                    continue;
-                }
-            }
-            if (emb.getDestFileName() != null && artifacts.size() > 1) {
-                getLog().warn("destFileName defined but several artifacts match for " + emb);
-            }
-
-            String targetPath = emb.getTarget();
-            if (targetPath == null) {
-                targetPath = embeddedTarget;
-                if (targetPath == null) {
-                    final String loc = (prefix.length() == 0)
-                            ? "/apps/"
-                            : prefix;
-                    targetPath = loc + "bundles/install/";
-                    getLog().info("No target path set on " + emb + "; assuming default " + targetPath);
-                }
-            }
-            targetPath = makeAbsolutePath(targetPath);
-
-            targetPath = JCR_ROOT + targetPath;
-            targetPath = FileUtils.normalize(targetPath);
-            if (!targetPath.endsWith("/")) {
-                targetPath += "/";
-            }
-
-            getLog().info("Embedding --- " + emb + " ---");
-            for (final Artifact artifact : artifacts) {
-                final File source = artifact.getFile();
-                String destFileName = emb.getDestFileName();
-
-                // todo: add support for patterns
-                if (destFileName == null) {
-                    destFileName = source.getName();
-                }
-                final String targetPathName = targetPath + destFileName;
-                final String targetNodePathName = targetPathName.substring(JCR_ROOT.length() - 1);
-
-                fileMap.put(targetPathName, source);
-                getLog().info(String.format("Embedding %s (from %s) -> %s", artifact.getId(), source.getAbsolutePath(), targetPathName));
-
-                if (emb.isFilter()) {
-                    addWorkspaceFilter(targetNodePathName);
-                }
-            }
-        }
-        return fileMap;
-    }
-
-    private Map<String, File> copySubPackages() throws IOException {
-        Map<String, File> fileMap = new HashMap<String, File>();
-        for (SubPackage pack : subPackages) {
-            final List<Artifact> artifacts = pack.getMatchingArtifacts(project);
-            if (artifacts.isEmpty()) {
-                getLog().warn("No matching artifacts for " + pack);
-                continue;
-            }
-
-            // get the package path
-            getLog().info("Embedding --- " + pack + " ---");
-            for (Artifact artifact : artifacts) {
-                final File source = artifact.getFile();
-
-                // load properties
-                ZipFile zip = null;
-                InputStream in = null;
-                Properties props = new Properties();
-                try {
-                    zip = new ZipFile(source, ZipFile.OPEN_READ);
-                    ZipEntry e = zip.getEntry("META-INF/vault/properties.xml");
-                    if (e == null) {
-                        getLog().error("Package does not contain properties.xml");
-                        throw new IOException("properties.xml missing");
-                    }
-                    in = zip.getInputStream(e);
-                    props.loadFromXML(in);
-                } finally {
-                    IOUtil.close(in);
-                    if (zip != null) {
-                        zip.close();
-                    }
-                }
-                PackageId pid = new PackageId(
-                        props.getProperty("group"),
-                        props.getProperty("name"),
-                        props.getProperty("version")
-                );
-                final String targetNodePathName = pid.getInstallationPath() + ".zip";
-                final String targetPathName = "jcr_root" + targetNodePathName;
-
-                fileMap.put(targetPathName, source);
-                getLog().info("Embedding " + artifact.getId() + " -> " + targetPathName);
-                if (pack.isFilter()) {
-                    addWorkspaceFilter(targetNodePathName);
-                }
-            }
-        }
-        return fileMap;
-    }
-
-    private void addWorkspaceFilter(final String filterRoot) {
-        filters.add(new PathFilterSet(filterRoot));
-    }
-
-    private String makeAbsolutePath(final String relPath) {
-        final String absPath;
-        if (!relPath.startsWith("/")) {
-            absPath = ((prefix.length() == 0) ? "/" : prefix) + relPath;
-            getLog().info("Relative path resolved to " + absPath);
-        } else {
-            absPath = relPath;
-        }
-
-        return absPath;
-    }
-
-    private void validatePackageType() throws MojoFailureException {
-        if (packageType == null) {
-            // auto detect...
-            boolean hasApps = false;
-            boolean hasOther = false;
-            for (PathFilterSet p: filters.getFilterSets()) {
-                if ("cleanup".equals(p.getType())) {
-                    continue;
-                }
-                String root = p.getRoot();
-                if ("/apps".equals(root) || root.startsWith("/apps/") || "/libs".equals(root) || root.startsWith("/libs/")) {
-                    hasApps = true;
-                } else {
-                    hasOther = true;
-                }
-            }
-            if (hasApps && !hasOther) {
-                packageType = PackageType.APPLICATION;
-            } else if (hasOther && !hasApps) {
-                packageType = PackageType.CONTENT;
-            } else {
-                packageType = PackageType.MIXED;
-            }
-        }
-    }
-
 }

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/PackageInfo.java
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/PackageInfo.java?rev=1828296&r1=1828295&r2=1828296&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/PackageInfo.java (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/java/org/apache/jackrabbit/filevault/maven/packaging/impl/PackageInfo.java Wed Apr  4 01:54:04 2018
@@ -28,7 +28,7 @@ import java.util.zip.ZipFile;
 import javax.annotation.Nonnull;
 
 import org.apache.commons.lang.StringUtils;
-
+import org.apache.jackrabbit.filevault.maven.packaging.GenerateMetadataMojo;
 import org.apache.jackrabbit.filevault.maven.packaging.VaultMojo;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
 import org.apache.jackrabbit.vault.fs.config.ConfigurationException;
@@ -70,18 +70,18 @@ public class PackageInfo {
             ZipEntry e = entries.nextElement();
             if (JarFile.MANIFEST_NAME.equalsIgnoreCase(e.getName())) {
                 Manifest mf = new Manifest(zip.getInputStream(e));
-                String idStr = mf.getMainAttributes().getValue(VaultMojo.MF_KEY_PACKAGE_ID);
+                String idStr = mf.getMainAttributes().getValue(GenerateMetadataMojo.MF_KEY_PACKAGE_ID);
                 if (idStr != null) {
                     id = PackageId.fromString(idStr);
                 }
-                String roots = mf.getMainAttributes().getValue(VaultMojo.MF_KEY_PACKAGE_ROOTS);
+                String roots = mf.getMainAttributes().getValue(GenerateMetadataMojo.MF_KEY_PACKAGE_ROOTS);
                 filter = new DefaultWorkspaceFilter();
                 if (roots != null) {
                     for (String root: StringUtils.split(roots, ',')) {
                         filter.add(new PathFilterSet(root));
                     }
                 }
-                String type = mf.getMainAttributes().getValue(VaultMojo.MF_KEY_PACKAGE_TYPE);
+                String type = mf.getMainAttributes().getValue(GenerateMetadataMojo.MF_KEY_PACKAGE_TYPE);
                 if (type != null) {
                     packageType = PackageType.valueOf(type.toUpperCase());
                 }

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml?rev=1828296&r1=1828295&r2=1828296&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml Wed Apr  4 01:54:04 2018
@@ -27,5 +27,19 @@
                 <ignore/>
             </action>
         </pluginExecution>
+        <pluginExecution>
+            <pluginExecutionFilter>
+                <goals>
+                    <goal>generate-metadata</goal>
+                </goals>
+            </pluginExecutionFilter>
+            <action>
+                <execute>
+                    <!-- e.g. a change on the filter.xml file would be relevant  -->
+                    <runOnIncremental>true</runOnIncremental>
+                    <runOnConfiguration>true</runOnConfiguration>
+                </execute>
+            </action>
+        </pluginExecution>
     </pluginExecutions>
 </lifecycleMappingMetadata>
\ No newline at end of file

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/resources/META-INF/plexus/components.xml?rev=1828296&r1=1828295&r2=1828296&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/resources/META-INF/plexus/components.xml (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/main/resources/META-INF/plexus/components.xml Wed Apr  4 01:54:04 2018
@@ -31,7 +31,8 @@
                             <compile>org.apache.maven.plugins:maven-compiler-plugin:compile</compile>
                             <process-classes>
                                 org.apache.jackrabbit:filevault-package-maven-plugin:check-signature,
-                                org.apache.jackrabbit:filevault-package-maven-plugin:analyze-classes
+                                org.apache.jackrabbit:filevault-package-maven-plugin:analyze-classes,
+                                org.apache.jackrabbit:filevault-package-maven-plugin:generate-metadata
                             </process-classes>
                             <process-test-resources>org.apache.maven.plugins:maven-resources-plugin:testResources
                             </process-test-resources>

Modified: jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/filter-tests/no-filter-container-in-execution/pom.xml
URL: http://svn.apache.org/viewvc/jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/filter-tests/no-filter-container-in-execution/pom.xml?rev=1828296&r1=1828295&r2=1828296&view=diff
==============================================================================
--- jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/filter-tests/no-filter-container-in-execution/pom.xml (original)
+++ jackrabbit/commons/filevault-package-maven-plugin/trunk/src/test/resources/test-projects/filter-tests/no-filter-container-in-execution/pom.xml Wed Apr  4 01:54:04 2018
@@ -40,9 +40,9 @@
                 </configuration>
                 <executions>
                     <execution>
-                        <id>default-package</id>
+                        <id>default-generate-metadata</id>
                         <goals>
-                            <goal>package</goal>
+                            <goal>generate-metadata</goal>
                         </goals>
                         <configuration>
                             <embeddeds>