[ 
https://issues.apache.org/jira/browse/METRON-777?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16102576#comment-16102576
 ] 

ASF GitHub Bot commented on METRON-777:
---------------------------------------

Github user mattf-horton commented on a diff in the pull request:

    https://github.com/apache/metron/pull/530#discussion_r129734433
  
    --- Diff: 
bundles-maven-plugin/src/main/java/org/apache/metron/BundleMojo.java ---
    @@ -0,0 +1,742 @@
    +/*
    + * Licensed to the Apache Software Foundation (ASF) under one or more
    + * contributor license agreements.  See the NOTICE file distributed with
    + * this work for additional information regarding copyright ownership.
    + * The ASF licenses this file to You under the Apache License, Version 2.0
    + * (the "License"); you may not use this file except in compliance with
    + * the License.  You may obtain a copy of the License at
    + *
    + *     http://www.apache.org/licenses/LICENSE-2.0
    + *
    + * Unless required by applicable law or agreed to in writing, software
    + * distributed under the License is distributed on an "AS IS" BASIS,
    + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    + * See the License for the specific language governing permissions and
    + * limitations under the License.
    + */
    +package org.apache.metron;
    +
    +import java.io.File;
    +import java.io.IOException;
    +import java.text.SimpleDateFormat;
    +import java.util.Date;
    +import java.util.HashSet;
    +import java.util.List;
    +import java.util.Set;
    +import org.apache.maven.archiver.MavenArchiveConfiguration;
    +import org.apache.maven.archiver.MavenArchiver;
    +import org.apache.maven.artifact.Artifact;
    +import org.apache.maven.artifact.DependencyResolutionRequiredException;
    +import org.apache.maven.artifact.factory.ArtifactFactory;
    +import org.apache.maven.artifact.installer.ArtifactInstaller;
    +import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
    +import org.apache.maven.artifact.repository.ArtifactRepository;
    +import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
    +import org.apache.maven.artifact.resolver.ArtifactCollector;
    +import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
    +import org.apache.maven.artifact.resolver.ArtifactResolutionException;
    +import org.apache.maven.artifact.resolver.ArtifactResolver;
    +import org.apache.maven.plugin.AbstractMojo;
    +import org.apache.maven.plugin.MojoExecutionException;
    +import org.apache.maven.plugin.MojoFailureException;
    +import org.apache.maven.plugin.dependency.utils.DependencyStatusSets;
    +import org.apache.maven.plugin.dependency.utils.DependencyUtil;
    +import org.apache.maven.plugin.dependency.utils.filters.DestFileFilter;
    +import 
org.apache.maven.plugin.dependency.utils.resolvers.ArtifactsResolver;
    +import 
org.apache.maven.plugin.dependency.utils.resolvers.DefaultArtifactsResolver;
    +import 
org.apache.maven.plugin.dependency.utils.translators.ArtifactTranslator;
    +import 
org.apache.maven.plugin.dependency.utils.translators.ClassifierTypeTranslator;
    +import org.apache.maven.plugins.annotations.LifecyclePhase;
    +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.apache.maven.execution.MavenSession;
    +import org.apache.maven.plugins.annotations.Component;
    +import org.apache.maven.project.MavenProjectHelper;
    +import 
org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
    +import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter;
    +import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
    +import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter;
    +import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
    +import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter;
    +import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
    +import 
org.apache.maven.shared.artifact.filter.collection.ProjectTransitivityFilter;
    +import org.apache.maven.shared.artifact.filter.collection.TypeFilter;
    +import org.codehaus.plexus.archiver.ArchiverException;
    +import org.codehaus.plexus.archiver.jar.JarArchiver;
    +import org.codehaus.plexus.archiver.jar.ManifestException;
    +import org.codehaus.plexus.archiver.manager.ArchiverManager;
    +import org.codehaus.plexus.util.FileUtils;
    +import org.codehaus.plexus.util.StringUtils;
    +
    +/**
    + * Packages the current project as an Apache Metron Bundle Archive 
(BUNDLE).
    + * Apache Metron Bundles are based on Apache Nifi Archives (NAR)
    + *
    + * The following code is derived from maven-dependencies-plugin and
    + * maven-jar-plugin. The functionality of CopyDependenciesMojo and JarMojo 
was
    + * simplified to the use case of NarMojo.
    + *
    + */
    +@Mojo(name = "bundle", defaultPhase = LifecyclePhase.PACKAGE, threadSafe = 
false, requiresDependencyResolution = ResolutionScope.RUNTIME)
    +public class BundleMojo extends AbstractMojo {
    +
    +    private static final String[] DEFAULT_EXCLUDES = new 
String[]{"**/package.html"};
    +    private static final String[] DEFAULT_INCLUDES = new String[]{"**/**"};
    +
    +    private static final String BUILD_TIMESTAMP_FORMAT = 
"yyyy-MM-dd'T'HH:mm:ss'Z'";
    +
    +    /**
    +     * POM
    +     *
    +     */
    +    @Parameter(defaultValue = "${project}", readonly = true, required = 
true)
    +    protected MavenProject project;
    +
    +    @Parameter(defaultValue = "${session}", readonly = true, required = 
true)
    +    protected MavenSession session;
    +
    +    /**
    +     * List of files to include. Specified as fileset patterns.
    +     */
    +    @Parameter(property = "includes")
    +    protected String[] includes;
    +    /**
    +     * List of files to exclude. Specified as fileset patterns.
    +     */
    +    @Parameter(property = "excludes")
    +    protected String[] excludes;
    +    /**
    +     * Name of the generated NAR.
    +     *
    +     */
    +    @Parameter(alias = "bundleName", property = "bundle.finalName", 
defaultValue = "${project.build.finalName}", required = true)
    +    protected String finalName;
    +    /**
    +     * Name of the prefix for package identifiers like Nar-Id, where Nar 
is the identifier
    +     */
    +    @Parameter(alias = "packageIDPrefix", property = 
"bundle.packageIDPrefix", defaultValue = "Bundle", required = true)
    +    protected String packageIDPrefix;
    +
    +    /**
    +     * The Jar archiver.
    +     *
    +     * \@\component role="org.codehaus.plexus.archiver.Archiver" 
roleHint="jar"
    +     */
    +    @Component(role = org.codehaus.plexus.archiver.Archiver.class, hint = 
"jar")
    +    private JarArchiver jarArchiver;
    +    /**
    +     * The archive configuration to use.
    +     *
    +     * See <a
    +     * href="http://maven.apache.org/shared/maven-archiver/index.html";>the
    +     * documentation for Maven Archiver</a>.
    +     *
    +     */
    +    @Parameter(property = "archive")
    +    protected final MavenArchiveConfiguration archive = new 
MavenArchiveConfiguration();
    +    /**
    +     * Path to the default MANIFEST file to use. It will be used if
    +     * <code>useDefaultManifestFile</code> is set to <code>true</code>.
    +     *
    +     */
    +    @Parameter(property = "defaultManifestFiles", defaultValue = 
"${project.build.outputDirectory}/META-INF/MANIFEST.MF", readonly = true, 
required = true)
    +    protected File defaultManifestFile;
    +
    +    /**
    +     * Set this to <code>true</code> to enable the use of the
    +     * <code>defaultManifestFile</code>.
    +     *
    +     * @since 2.2
    +     */
    +    @Parameter(property = "bundle.useDefaultManifestFile", defaultValue = 
"false")
    +    protected boolean useDefaultManifestFile;
    +
    +    @Component
    +    protected MavenProjectHelper projectHelper;
    +
    +    /**
    +     * Whether creating the archive should be forced.
    +     *
    +     */
    +    @Parameter(property = "bundle.forceCreation", defaultValue = "false")
    +    protected boolean forceCreation;
    +
    +    /**
    +     * Classifier to add to the artifact generated. If given, the artifact 
will
    +     * be an attachment instead.
    +     *
    +     */
    +    @Parameter(property = "classifier")
    +    protected String classifier;
    +
    +    @Component
    +    protected ArtifactInstaller installer;
    +
    +    @Component
    +    protected ArtifactRepositoryFactory repositoryFactory;
    +
    +    /**
    +     * This only applies if the classifier parameter is used.
    +     *
    +     */
    +    @Parameter(property = "mdep.failOnMissingClassifierArtifact", 
defaultValue = "true", required = false)
    +    protected boolean failOnMissingClassifierArtifact = true;
    +
    +    /**
    +     * Comma Separated list of Types to include. Empty String indicates 
include
    +     * everything (default).
    +     *
    +     */
    +    @Parameter(property = "includeTypes", required = false)
    +    protected String includeTypes;
    +
    +    /**
    +     * Comma Separated list of Types to exclude. Empty String indicates 
don't
    +     * exclude anything (default).
    +     *
    +     */
    +    @Parameter(property = "excludeTypes", required = false)
    +    protected String excludeTypes;
    +
    +    /**
    +     * Scope to include. An Empty string indicates all scopes (default).
    +     *
    +     */
    +    @Parameter(property = "includeScope", required = false)
    +    protected String includeScope;
    +
    +    /**
    +     * Scope to exclude. An Empty string indicates no scopes (default).
    +     *
    +     */
    +    @Parameter(property = "excludeScope", required = false)
    +    protected String excludeScope;
    +
    +    /**
    +     * Comma Separated list of Classifiers to include. Empty String 
indicates
    +     * include everything (default).
    +     *
    +     */
    +    @Parameter(property = "includeClassifiers", required = false)
    +    protected String includeClassifiers;
    +
    +    /**
    +     * Comma Separated list of Classifiers to exclude. Empty String 
indicates
    +     * don't exclude anything (default).
    +     *
    +     */
    +    @Parameter(property = "excludeClassifiers", required = false)
    +    protected String excludeClassifiers;
    +
    +    /**
    +     * Specify classifier to look for. Example: sources
    +     *
    +     */
    +    @Parameter(property = "classifier", required = false)
    +    protected String copyDepClassifier;
    +
    +    /**
    +     * Specify type to look for when constructing artifact based on 
classifier.
    +     * Example: java-source,jar,war,bundle
    +     *
    +     */
    +    @Parameter(property = "type", required = false, defaultValue = 
"bundle")
    +    protected String type;
    +
    +    /**
    +     * Comma separated list of Artifact names too exclude.
    +     *
    +     */
    +    @Parameter(property = "excludeArtifacts", required = false)
    +    protected String excludeArtifactIds;
    +
    +    /**
    +     * Comma separated list of Artifact names to include.
    +     *
    +     */
    +    @Parameter(property = "includeArtifacts", required = false)
    +    protected String includeArtifactIds;
    +
    +    /**
    +     * Comma separated list of GroupId Names to exclude.
    +     *
    +     */
    +    @Parameter(property = "excludeArtifacts", required = false)
    +    protected String excludeGroupIds;
    +
    +    /**
    +     * Comma separated list of GroupIds to include.
    +     *
    +     */
    +    @Parameter(property = "includeGroupIds", required = false)
    +    protected String includeGroupIds;
    +
    +    /**
    +     * Directory to store flag files
    +     *
    +     */
    +    @Parameter(property = "markersDirectory", required = false, 
defaultValue = "${project.build.directory}/dependency-maven-plugin-markers")
    +    protected File markersDirectory;
    +
    +    /**
    +     * Overwrite release artifacts
    +     *
    +     */
    +    @Parameter(property = "overWriteReleases", required = false)
    +    protected boolean overWriteReleases;
    +
    +    /**
    +     * Overwrite snapshot artifacts
    +     *
    +     */
    +    @Parameter(property = "overWriteSnapshots", required = false)
    +    protected boolean overWriteSnapshots;
    +
    +    /**
    +     * Overwrite artifacts that don't exist or are older than the source.
    +     *
    +     */
    +    @Parameter(property = "overWriteIfNewer", required = false, 
defaultValue = "true")
    +    protected boolean overWriteIfNewer;
    +
    +    @Parameter(property = "projectBuildDirectory", required = false, 
defaultValue = "${project.build.directory}")
    +    protected File projectBuildDirectory;
    +
    +    /**
    +     * Used to look up Artifacts in the remote repository.
    +     */
    +    @Component
    +    protected ArtifactFactory factory;
    +
    +    /**
    +     * Used to look up Artifacts in the remote repository.
    +     *
    +     */
    +    @Component
    +    protected ArtifactResolver resolver;
    +
    +    /**
    +     * Artifact collector, needed to resolve dependencies.
    +     *
    +     */
    +    @Component(role = 
org.apache.maven.artifact.resolver.ArtifactCollector.class)
    +    protected ArtifactCollector artifactCollector;
    +
    +    @Component(role = 
org.apache.maven.artifact.metadata.ArtifactMetadataSource.class)
    +    protected ArtifactMetadataSource artifactMetadataSource;
    +
    +    /**
    +     * Location of the local repository.
    +     *
    +     */
    +    @Parameter(property = "localRepository", required = true, readonly = 
true)
    +    protected ArtifactRepository local;
    +
    +    /**
    +     * List of Remote Repositories used by the resolver
    +     *
    +     */
    +    @Parameter(property = "project.remoteArtifactRepositories", required = 
true, readonly = true)
    +    protected List remoteRepos;
    +
    +    /**
    +     * To look up Archiver/UnArchiver implementations
    +     *
    +     */
    +    @Component
    +    protected ArchiverManager archiverManager;
    +
    +    /**
    +     * Contains the full list of projects in the reactor.
    +     *
    +     */
    +    @Parameter(property = "reactorProjects", required = true, readonly = 
true)
    +    protected List reactorProjects;
    +
    +    /**
    +     * If the plugin should be silent.
    +     *
    +     */
    +    @Parameter(property = "silent", required = false, defaultValue = 
"false")
    +    public boolean silent;
    +
    +    /**
    +     * Output absolute filename for resolved artifacts
    +     *
    +     */
    +    @Parameter(property = "outputAbsoluteArtifactFilename", defaultValue = 
"false", required = false)
    +    protected boolean outputAbsoluteArtifactFilename;
    +
    +    /* The values to use for populating the Nar-Group, Nar-Id, and 
Nar-Version in the MANIFEST file. By default
    +     * these values will be set to the standard Maven project equivalents, 
but they may be overridden through properties.
    +     *
    +     * For example if the pom.xml for the nifi-test-bundle contained the 
following:
    --- End diff --
    
    should this be metron-test-bundle rather than nifi-test-bundle?


> Create a plugin system for Metron based on 'NAR'
> ------------------------------------------------
>
>                 Key: METRON-777
>                 URL: https://issues.apache.org/jira/browse/METRON-777
>             Project: Metron
>          Issue Type: New Feature
>            Reporter: Otto Fowler
>            Assignee: Otto Fowler
>
> The success of the Metron project will be greatly dependent on community 
> participation, and with that the ability to adapt and extend Metron without 
> having to maintain a fork of the project.
> As organizations and individuals look to extend the Metron system with custom 
> parsers, enrichments, and stellar functions that may be proprietary in 
> nature, the ability to develop and deploy these extensions outside the Metron 
> code base is critically important.
> To that end, and after community discussion and proposal we create or 
> formalize the 'plugin' development story in Metron.  
> The proposal is to adapt the Apache Nifi NAR system for use in Metron.  This 
> will provide the system with:
> * archetype(s) for developer projects and independent development
> * defined packaging and metadata for 'plugin' products
> * loading and instantiation with classloader isolation capabilities
> * removing the necessity for shading plugin jars
> These capabilities will also enable other features, such as plugin lifecycle, 
> plugin configuration+redeployment, and other things.
> The plugin archetypes and their installation will be a followon



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to