MNG-5771 use extension.xml to define core exported artifacts and packages

Signed-off-by: Igor Fedorenko <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/8631d79c
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/8631d79c
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/8631d79c

Branch: refs/heads/master
Commit: 8631d79ca3b2f08a610196ac04a7b7cde4832c4a
Parents: 45563ff
Author: Igor Fedorenko <[email protected]>
Authored: Mon Feb 2 20:06:53 2015 -0500
Committer: Igor Fedorenko <[email protected]>
Committed: Fri Feb 20 10:26:14 2015 -0500

----------------------------------------------------------------------
 .../org/apache/maven/ArtifactFilterManager.java |  10 +-
 .../maven/ArtifactFilterManagerDelegate.java    |   3 +
 .../maven/DefaultArtifactFilterManager.java     | 112 +++---------
 .../classrealm/DefaultClassRealmManager.java    | 163 ++++--------------
 .../extension/internal/DefaultCoreExports.java  |  97 +++++++++++
 .../project/ExtensionDescriptorBuilder.java     |  23 ++-
 .../main/resources/META-INF/maven/extension.xml | 169 +++++++++++++++++++
 7 files changed, 349 insertions(+), 228 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/8631d79c/maven-core/src/main/java/org/apache/maven/ArtifactFilterManager.java
----------------------------------------------------------------------
diff --git 
a/maven-core/src/main/java/org/apache/maven/ArtifactFilterManager.java 
b/maven-core/src/main/java/org/apache/maven/ArtifactFilterManager.java
index 7f0fe1c..2cf9f99 100644
--- a/maven-core/src/main/java/org/apache/maven/ArtifactFilterManager.java
+++ b/maven-core/src/main/java/org/apache/maven/ArtifactFilterManager.java
@@ -27,6 +27,9 @@ public interface ArtifactFilterManager
 {
     /**
      * Returns a filter for core + extension artifacts.
+     * 
+     * @deprecated use {@code META-INF/maven/extension.xml} to define 
artifacts exported by Maven core and plugin
+     *             extensions.
      */
     ArtifactFilter getArtifactFilter();
 
@@ -36,9 +39,10 @@ public interface ArtifactFilterManager
     ArtifactFilter getCoreArtifactFilter();
 
     /**
-     * Exclude an extension artifact (doesn't affect getArtifactFilter's 
result,
-     * only getExtensionArtifactFilter).
-     * @param artifactId
+     * Exclude an extension artifact (doesn't affect getArtifactFilter's 
result, only getExtensionArtifactFilter).
+     * 
+     * @deprecated use {@code META-INF/maven/extension.xml} to define 
artifacts exported by Maven core and plugin
+     *             extensions.
      */
     void excludeArtifact( String artifactId );
 

http://git-wip-us.apache.org/repos/asf/maven/blob/8631d79c/maven-core/src/main/java/org/apache/maven/ArtifactFilterManagerDelegate.java
----------------------------------------------------------------------
diff --git 
a/maven-core/src/main/java/org/apache/maven/ArtifactFilterManagerDelegate.java 
b/maven-core/src/main/java/org/apache/maven/ArtifactFilterManagerDelegate.java
index c97bbfe..1389325 100644
--- 
a/maven-core/src/main/java/org/apache/maven/ArtifactFilterManagerDelegate.java
+++ 
b/maven-core/src/main/java/org/apache/maven/ArtifactFilterManagerDelegate.java
@@ -21,6 +21,9 @@ package org.apache.maven;
 
 import java.util.Set;
 
+/**
+ * @deprecated use {@code META-INF/maven/extension.xml} to define artifacts 
exported by Maven core extensions.
+ */
 public interface ArtifactFilterManagerDelegate
 {
 

http://git-wip-us.apache.org/repos/asf/maven/blob/8631d79c/maven-core/src/main/java/org/apache/maven/DefaultArtifactFilterManager.java
----------------------------------------------------------------------
diff --git 
a/maven-core/src/main/java/org/apache/maven/DefaultArtifactFilterManager.java 
b/maven-core/src/main/java/org/apache/maven/DefaultArtifactFilterManager.java
index dda35bd..80bfd62 100644
--- 
a/maven-core/src/main/java/org/apache/maven/DefaultArtifactFilterManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/DefaultArtifactFilterManager.java
@@ -19,96 +19,43 @@ package org.apache.maven;
  * under the License.
  */
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
 import org.apache.maven.artifact.resolver.filter.ExclusionSetFilter;
-import org.codehaus.plexus.PlexusContainer;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.apache.maven.extension.internal.DefaultCoreExports;
+
+import com.google.common.collect.ImmutableSet;
 
 /**
  * @author Jason van Zyl
- * @todo this should probably be a component with some dynamic control of 
filtering
  */
-@Component( role = ArtifactFilterManager.class )
+@Named
+@Singleton
+@SuppressWarnings( "deprecation" )
 public class DefaultArtifactFilterManager
     implements ArtifactFilterManager
 {
 
-    private static final Set<String> DEFAULT_EXCLUSIONS;
+    // this is a live injected collection
+    protected final List<ArtifactFilterManagerDelegate> delegates;
 
-    @Requirement
-    private PlexusContainer plexus;
-
-    static
-    {
-        Set<String> artifacts = new HashSet<String>();
-
-        artifacts.add( "classworlds:classworlds" );
-        artifacts.add( "org.codehaus.plexus:plexus-classworlds" );
-        artifacts.add( "org.codehaus.plexus:plexus-component-api" );
-        artifacts.add( "org.codehaus.plexus:plexus-container-default" );
-        artifacts.add( "plexus:plexus-container-default" );
-        artifacts.add( "org.sonatype.spice:spice-inject-plexus" );
-        artifacts.add( "org.sonatype.sisu:sisu-inject-plexus" );
-        artifacts.add( "org.eclipse.sisu:org.eclipse.sisu.plexus" );
-        artifacts.add( "org.apache.maven:maven-artifact" );
-        artifacts.add( "org.apache.maven:maven-aether-provider" );
-        artifacts.add( "org.apache.maven:maven-artifact-manager" );
-        artifacts.add( "org.apache.maven:maven-compat" );
-        artifacts.add( "org.apache.maven:maven-core" );
-        artifacts.add( "org.apache.maven:maven-error-diagnostics" );
-        artifacts.add( "org.apache.maven:maven-lifecycle" );
-        artifacts.add( "org.apache.maven:maven-model" );
-        artifacts.add( "org.apache.maven:maven-model-builder" );
-        artifacts.add( "org.apache.maven:maven-monitor" );
-        artifacts.add( "org.apache.maven:maven-plugin-api" );
-        artifacts.add( "org.apache.maven:maven-plugin-descriptor" );
-        artifacts.add( "org.apache.maven:maven-plugin-parameter-documenter" );
-        artifacts.add( "org.apache.maven:maven-plugin-registry" );
-        artifacts.add( "org.apache.maven:maven-profile" );
-        artifacts.add( "org.apache.maven:maven-project" );
-        artifacts.add( "org.apache.maven:maven-repository-metadata" );
-        artifacts.add( "org.apache.maven:maven-settings" );
-        artifacts.add( "org.apache.maven:maven-settings-builder" );
-        artifacts.add( "org.apache.maven:maven-toolchain" );
-        artifacts.add( "org.apache.maven.wagon:wagon-provider-api" );
-        artifacts.add( "org.eclipse.aether:aether-api" );
-        artifacts.add( "org.eclipse.aether:aether-spi" );
-        artifacts.add( "org.eclipse.aether:aether-impl" );
-        //
-        // We must also filter out the old or NoClassDefFoundErrors will 
surface
-        //
-        artifacts.add( "org.sonatype.aether:aether-api" );
-        artifacts.add( "org.sonatype.aether:aether-spi" );
-        artifacts.add( "org.sonatype.aether:aether-impl" );
-
-        /*
-         * NOTE: Don't exclude the wagons or any of their dependencies (apart 
from the wagon API). This would otherwise
-         * provoke linkage errors for wagons contributed by build extensions. 
We also don't need to exclude the wagons
-         * from plugins. Plugins that use wagons directly and declare the 
corresponding dependency will simply use a
-         * wagon from their plugin realm.
-         */
-
-        DEFAULT_EXCLUSIONS = Collections.unmodifiableSet( artifacts );
-    }
+    protected final Set<String> coreArtifacts;
 
-    protected Set<String> excludedArtifacts = new HashSet<String>( 
DEFAULT_EXCLUSIONS );
+    protected final Set<String> excludedArtifacts;
 
-    /**
-     * @deprecated Use this class as a component instead, and then use 
getArtifactFilter().
-     */
-    public static ArtifactFilter createStandardFilter()
+    @Inject
+    public DefaultArtifactFilterManager( List<ArtifactFilterManagerDelegate> 
delegates, DefaultCoreExports extensions )
     {
-        // TODO: configure this from bootstrap or scan lib
-        return new ExclusionSetFilter( DEFAULT_EXCLUSIONS );
+        this.delegates = delegates;
+        this.coreArtifacts = ImmutableSet.copyOf( 
extensions.getExportedArtifacts() );
+        this.excludedArtifacts = new LinkedHashSet<String>( 
extensions.getExportedArtifacts() );
     }
 
     /**
@@ -120,7 +67,7 @@ public class DefaultArtifactFilterManager
     {
         Set<String> excludes = new LinkedHashSet<String>( excludedArtifacts );
 
-        for ( ArtifactFilterManagerDelegate delegate : getDelegates() )
+        for ( ArtifactFilterManagerDelegate delegate : delegates )
         {
             delegate.addExcludes( excludes );
         }
@@ -138,21 +85,6 @@ public class DefaultArtifactFilterManager
         return new ExclusionSetFilter( getCoreArtifactExcludes() );
     }
 
-    private List<ArtifactFilterManagerDelegate> getDelegates()
-    {
-        try
-        {
-            return plexus.lookupList( ArtifactFilterManagerDelegate.class );
-        }
-        catch ( ComponentLookupException e )
-        {
-            return new ArrayList<ArtifactFilterManagerDelegate>();
-        }
-    }
-
-    /* (non-Javadoc)
-     * @see 
org.apache.maven.ArtifactFilterManager#excludeArtifact(java.lang.String)
-     */
     public void excludeArtifact( String artifactId )
     {
         excludedArtifacts.add( artifactId );
@@ -160,9 +92,9 @@ public class DefaultArtifactFilterManager
 
     public Set<String> getCoreArtifactExcludes()
     {
-        Set<String> excludes = new LinkedHashSet<String>( DEFAULT_EXCLUSIONS );
+        Set<String> excludes = new LinkedHashSet<String>( coreArtifacts );
 
-        for ( ArtifactFilterManagerDelegate delegate : getDelegates() )
+        for ( ArtifactFilterManagerDelegate delegate : delegates )
         {
             delegate.addCoreExcludes( excludes );
         }

http://git-wip-us.apache.org/repos/asf/maven/blob/8631d79c/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
----------------------------------------------------------------------
diff --git 
a/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
 
b/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
index a5bb352..206fa58 100644
--- 
a/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
+++ 
b/maven-core/src/main/java/org/apache/maven/classrealm/DefaultClassRealmManager.java
@@ -31,8 +31,13 @@ import java.util.Random;
 import java.util.Set;
 import java.util.TreeMap;
 
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
 import org.apache.maven.artifact.ArtifactUtils;
 import org.apache.maven.classrealm.ClassRealmRequest.RealmType;
+import org.apache.maven.extension.internal.DefaultCoreExports;
 import org.apache.maven.model.Model;
 import org.apache.maven.model.Plugin;
 import org.codehaus.plexus.MutablePlexusContainer;
@@ -40,13 +45,12 @@ import org.codehaus.plexus.PlexusContainer;
 import org.codehaus.plexus.classworlds.ClassWorld;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import 
org.codehaus.plexus.component.repository.exception.ComponentLookupException;
 import org.codehaus.plexus.logging.Logger;
 import org.codehaus.plexus.util.StringUtils;
 import org.eclipse.aether.artifact.Artifact;
 
+import com.google.common.collect.ImmutableMap;
+
 /**
  * Manages the class realms used by Maven. <strong>Warning:</strong> This is 
an internal utility class that is only
  * public for technical reasons, it is not part of the public API. In 
particular, this class can be changed or deleted
@@ -54,7 +58,8 @@ import org.eclipse.aether.artifact.Artifact;
  *
  * @author Benjamin Bentmann
  */
-@Component( role = ClassRealmManager.class )
+@Named
+@Singleton
 public class DefaultClassRealmManager
     implements ClassRealmManager
 {
@@ -69,23 +74,38 @@ public class DefaultClassRealmManager
      */
     private static final ClassLoader PARENT_CLASSLOADER = 
ClassWorld.class.getClassLoader();
 
-    @Requirement
-    private Logger logger;
+    private final Logger logger;
+
+    private final ClassWorld world;
+
+    private final ClassRealm containerRealm;
+
+    // this is a live injected collection
+    private final List<ClassRealmManagerDelegate> delegates;
 
-    @Requirement
-    protected PlexusContainer container;
+    private final Map<String, ClassLoader> coreImports;
 
     private ClassRealm mavenRealm;
 
-    private ClassWorld getClassWorld()
+    @Inject
+    public DefaultClassRealmManager( Logger logger, PlexusContainer container,
+                                     List<ClassRealmManagerDelegate> 
delegates, DefaultCoreExports coreExtensions )
     {
-        return ( (MutablePlexusContainer) container ).getClassWorld();
+        this.logger = logger;
+        this.world = ( (MutablePlexusContainer) container ).getClassWorld();
+        this.containerRealm = container.getContainerRealm();
+        this.delegates = delegates;
+
+        Map<String, ClassLoader> coreImports = new HashMap<String, 
ClassLoader>();
+        for ( String corePackage : coreExtensions.getExportedPackages() )
+        {
+            coreImports.put( corePackage, containerRealm );
+        }
+        this.coreImports = ImmutableMap.copyOf( coreImports );
     }
 
     private ClassRealm newRealm( String id )
     {
-        ClassWorld world = getClassWorld();
-
         synchronized ( world )
         {
             String realmId = id;
@@ -123,8 +143,7 @@ public class DefaultClassRealmManager
 
             List<String> parentImports = new ArrayList<String>();
 
-            Map<String, ClassLoader> foreignImports = new HashMap<String, 
ClassLoader>();
-            importMavenApi( foreignImports );
+            Map<String, ClassLoader> foreignImports = new HashMap<String, 
ClassLoader>( coreImports );
 
             callDelegates( mavenRealm, RealmType.Core, 
mavenRealm.getParentClassLoader(), parentImports,
                            foreignImports, constituents );
@@ -137,104 +156,6 @@ public class DefaultClassRealmManager
         return mavenRealm;
     }
 
-    private void importMavenApi( Map<String, ClassLoader> imports )
-    {
-        ClassRealm coreRealm = getCoreRealm();
-
-        // maven-*
-        imports.put( "org.apache.maven.*", coreRealm );
-        imports.put( "org.apache.maven.artifact", coreRealm );
-        imports.put( "org.apache.maven.classrealm", coreRealm );
-        imports.put( "org.apache.maven.cli", coreRealm );
-        imports.put( "org.apache.maven.configuration", coreRealm );
-        imports.put( "org.apache.maven.exception", coreRealm );
-        imports.put( "org.apache.maven.execution", coreRealm );
-        imports.put( "org.apache.maven.execution.scope", coreRealm );
-        imports.put( "org.apache.maven.lifecycle", coreRealm );
-        imports.put( "org.apache.maven.model", coreRealm );
-        imports.put( "org.apache.maven.monitor", coreRealm );
-        imports.put( "org.apache.maven.plugin", coreRealm );
-        imports.put( "org.apache.maven.profiles", coreRealm );
-        imports.put( "org.apache.maven.project", coreRealm );
-        imports.put( "org.apache.maven.reporting", coreRealm );
-        imports.put( "org.apache.maven.repository", coreRealm );
-        imports.put( "org.apache.maven.rtinfo", coreRealm );
-        imports.put( "org.apache.maven.settings", coreRealm );
-        imports.put( "org.apache.maven.toolchain", coreRealm );
-        imports.put( "org.apache.maven.usability", coreRealm );
-
-        // wagon-api
-        imports.put( "org.apache.maven.wagon.*", coreRealm );
-        imports.put( "org.apache.maven.wagon.authentication", coreRealm );
-        imports.put( "org.apache.maven.wagon.authorization", coreRealm );
-        imports.put( "org.apache.maven.wagon.events", coreRealm );
-        imports.put( "org.apache.maven.wagon.observers", coreRealm );
-        imports.put( "org.apache.maven.wagon.proxy", coreRealm );
-        imports.put( "org.apache.maven.wagon.repository", coreRealm );
-        imports.put( "org.apache.maven.wagon.resource", coreRealm );
-
-        // aether-api, aether-spi, aether-impl
-        imports.put( "org.eclipse.aether.*", coreRealm );
-        imports.put( "org.eclipse.aether.artifact", coreRealm );
-        imports.put( "org.eclipse.aether.collection", coreRealm );
-        imports.put( "org.eclipse.aether.deployment", coreRealm );
-        imports.put( "org.eclipse.aether.graph", coreRealm );
-        imports.put( "org.eclipse.aether.impl", coreRealm );
-        imports.put( "org.eclipse.aether.internal.impl", coreRealm );
-        imports.put( "org.eclipse.aether.installation", coreRealm );
-        imports.put( "org.eclipse.aether.metadata", coreRealm );
-        imports.put( "org.eclipse.aether.repository", coreRealm );
-        imports.put( "org.eclipse.aether.resolution", coreRealm );
-        imports.put( "org.eclipse.aether.spi", coreRealm );
-        imports.put( "org.eclipse.aether.transfer", coreRealm );
-        imports.put( "org.eclipse.aether.version", coreRealm );
-
-        // plexus-classworlds
-        imports.put( "org.codehaus.plexus.classworlds", coreRealm );
-
-        // classworlds (for legacy code)
-        imports.put( "org.codehaus.classworlds", coreRealm );
-
-        // plexus-utils (for DOM-type fields in maven-model)
-        imports.put( "org.codehaus.plexus.util.xml.Xpp3Dom", coreRealm );
-        imports.put( "org.codehaus.plexus.util.xml.pull.XmlPullParser", 
coreRealm );
-        imports.put( 
"org.codehaus.plexus.util.xml.pull.XmlPullParserException", coreRealm );
-        imports.put( "org.codehaus.plexus.util.xml.pull.XmlSerializer", 
coreRealm );
-
-        // plexus-container, plexus-component-annotations
-        imports.put( "org.codehaus.plexus.*", coreRealm );
-        imports.put( "org.codehaus.plexus.component", coreRealm );
-        imports.put( "org.codehaus.plexus.configuration", coreRealm );
-        imports.put( "org.codehaus.plexus.container", coreRealm );
-        imports.put( "org.codehaus.plexus.context", coreRealm );
-        imports.put( "org.codehaus.plexus.lifecycle", coreRealm );
-        imports.put( "org.codehaus.plexus.logging", coreRealm );
-        imports.put( "org.codehaus.plexus.personality", coreRealm );
-
-        // javax.inject (JSR-330)
-        imports.put( "javax.inject.*", coreRealm );
-        // javax.enterprise.inject (JSR-299)
-        imports.put( "javax.enterprise.util.*", coreRealm );
-        imports.put( "javax.enterprise.inject.*", coreRealm );
-
-        // com.google
-        //
-        // We may potentially want to export these, but right now I'm not sure 
that anything Guice specific needs
-        // to be made available to plugin authors. If we find people are 
getting fancy and want to take advantage
-        // of Guice specifics we can expose that later. Really some testing 
needs to be done to see full hiding
-        // of Guice has any impact on what we may categorize as a standard 
JSR-330 based Tesla/Maven plugin.
-        //
-        // imports.put( "com.google.inject.*", coreRealm );
-        // imports.put( "com.google.inject.binder.*", coreRealm );
-        // imports.put( "com.google.inject.matcher.*", coreRealm );
-        // imports.put( "com.google.inject.name.*", coreRealm );
-        // imports.put( "com.google.inject.spi.*", coreRealm );
-        // imports.put( "com.google.inject.util.*", coreRealm );
-
-        // SLF4J
-        imports.put( "org.slf4j.*", coreRealm );
-    }
-
     /**
      * Creates a new class realm with the specified parent and imports.
      *
@@ -312,7 +233,7 @@ public class DefaultClassRealmManager
 
     public ClassRealm getCoreRealm()
     {
-        return container.getContainerRealm();
+        return containerRealm;
     }
 
     public ClassRealm createProjectRealm( Model model, List<Artifact> 
artifacts )
@@ -387,24 +308,10 @@ public class DefaultClassRealmManager
         return gid + ':' + aid + ':' + type + ( StringUtils.isNotEmpty( cls ) 
? ':' + cls : "" ) + ':' + ver;
     }
 
-    private List<ClassRealmManagerDelegate> getDelegates()
-    {
-        try
-        {
-            return container.lookupList( ClassRealmManagerDelegate.class );
-        }
-        catch ( ComponentLookupException e )
-        {
-            logger.error( "Failed to lookup class realm delegates: " + 
e.getMessage(), e );
-
-            return Collections.emptyList();
-        }
-    }
-
     private void callDelegates( ClassRealm classRealm, RealmType type, 
ClassLoader parent, List<String> parentImports,
                                 Map<String, ClassLoader> foreignImports, 
List<ClassRealmConstituent> constituents )
     {
-        List<ClassRealmManagerDelegate> delegates = getDelegates();
+        List<ClassRealmManagerDelegate> delegates = new 
ArrayList<ClassRealmManagerDelegate>( this.delegates );
 
         if ( !delegates.isEmpty() )
         {

http://git-wip-us.apache.org/repos/asf/maven/blob/8631d79c/maven-core/src/main/java/org/apache/maven/extension/internal/DefaultCoreExports.java
----------------------------------------------------------------------
diff --git 
a/maven-core/src/main/java/org/apache/maven/extension/internal/DefaultCoreExports.java
 
b/maven-core/src/main/java/org/apache/maven/extension/internal/DefaultCoreExports.java
new file mode 100644
index 0000000..c4253ee
--- /dev/null
+++ 
b/maven-core/src/main/java/org/apache/maven/extension/internal/DefaultCoreExports.java
@@ -0,0 +1,97 @@
+package org.apache.maven.extension.internal;
+
+/*
+ * 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.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.apache.maven.project.ExtensionDescriptor;
+import org.apache.maven.project.ExtensionDescriptorBuilder;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.util.IOUtil;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * @since 3.2.6
+ */
+@Named
+@Singleton
+public class DefaultCoreExports
+{
+    private static final ExtensionDescriptorBuilder builder = new 
ExtensionDescriptorBuilder();
+
+    private final Set<String> artifacts;
+
+    private final Set<String> packages;
+
+    @Inject
+    public DefaultCoreExports( PlexusContainer container )
+        throws IOException
+    {
+        Set<String> artifacts = new LinkedHashSet<String>();
+        Set<String> packages = new LinkedHashSet<String>();
+
+        Enumeration<URL> extensions =
+            container.getContainerRealm().getResources( 
builder.getExtensionDescriptorLocation() );
+        while ( extensions.hasMoreElements() )
+        {
+            InputStream is = extensions.nextElement().openStream();
+            try
+            {
+                ExtensionDescriptor descriptor = builder.build( is );
+
+                artifacts.addAll( descriptor.getExportedArtifacts() );
+                packages.addAll( descriptor.getExportedPackages() );
+            }
+            finally
+            {
+                IOUtil.close( is );
+            }
+        }
+        this.artifacts = ImmutableSet.copyOf( artifacts );
+        this.packages = ImmutableSet.copyOf( packages );
+    }
+
+    /**
+     * Returns artifacts exported by Maven core and core extensions. Artifacts 
are identified by their
+     * groupId:artifactId.
+     */
+    public Set<String> getExportedArtifacts()
+    {
+        return artifacts;
+    }
+
+    /**
+     * Returns packages exported by Maven core and core extensions.
+     */
+    public Set<String> getExportedPackages()
+    {
+        return packages;
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/8631d79c/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
----------------------------------------------------------------------
diff --git 
a/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
 
b/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
index cebb630..56bef29 100644
--- 
a/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
+++ 
b/maven-core/src/main/java/org/apache/maven/project/ExtensionDescriptorBuilder.java
@@ -43,7 +43,10 @@ import 
org.codehaus.plexus.util.xml.pull.XmlPullParserException;
 public class ExtensionDescriptorBuilder
 {
 
-    private String getExtensionDescriptorLocation()
+    /**
+     * @since 3.2.6 
+     */
+    public String getExtensionDescriptorLocation()
     {
         return "META-INF/maven/extension.xml";
     }
@@ -71,7 +74,14 @@ public class ExtensionDescriptorBuilder
                 {
                     InputStream is = pluginJar.getInputStream( 
pluginDescriptorEntry );
 
-                    extensionDescriptor = build( is );
+                    try
+                    {
+                        extensionDescriptor = build( is );
+                    }
+                    finally
+                    {
+                        IOUtil.close( is );
+                    }
                 }
             }
             finally
@@ -100,7 +110,10 @@ public class ExtensionDescriptorBuilder
         return extensionDescriptor;
     }
 
-    ExtensionDescriptor build( InputStream is )
+    /**
+     * @since 3.2.6
+     */
+    public ExtensionDescriptor build( InputStream is )
         throws IOException
     {
         ExtensionDescriptor extensionDescriptor = new ExtensionDescriptor();
@@ -114,10 +127,6 @@ public class ExtensionDescriptorBuilder
         {
             throw (IOException) new IOException( e.getMessage() ).initCause( e 
);
         }
-        finally
-        {
-            IOUtil.close( is );
-        }
 
         if ( !"extension".equals( dom.getName() ) )
         {

http://git-wip-us.apache.org/repos/asf/maven/blob/8631d79c/maven-core/src/main/resources/META-INF/maven/extension.xml
----------------------------------------------------------------------
diff --git a/maven-core/src/main/resources/META-INF/maven/extension.xml 
b/maven-core/src/main/resources/META-INF/maven/extension.xml
new file mode 100644
index 0000000..667fcd0
--- /dev/null
+++ b/maven-core/src/main/resources/META-INF/maven/extension.xml
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+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.
+-->
+
+<extension>
+  <exportedPackages>
+    <!-- maven-* -->
+    <exportedPackage>org.apache.maven.*</exportedPackage>
+    <exportedPackage>org.apache.maven.artifact</exportedPackage>
+    <exportedPackage>org.apache.maven.classrealm</exportedPackage>
+    <exportedPackage>org.apache.maven.cli</exportedPackage>
+    <exportedPackage>org.apache.maven.configuration</exportedPackage>
+    <exportedPackage>org.apache.maven.exception</exportedPackage>
+    <exportedPackage>org.apache.maven.execution</exportedPackage>
+    <exportedPackage>org.apache.maven.execution.scope</exportedPackage>
+    <exportedPackage>org.apache.maven.lifecycle</exportedPackage>
+    <exportedPackage>org.apache.maven.model</exportedPackage>
+    <exportedPackage>org.apache.maven.monitor</exportedPackage>
+    <exportedPackage>org.apache.maven.plugin</exportedPackage>
+    <exportedPackage>org.apache.maven.profiles</exportedPackage>
+    <exportedPackage>org.apache.maven.project</exportedPackage>
+    <exportedPackage>org.apache.maven.reporting</exportedPackage>
+    <exportedPackage>org.apache.maven.repository</exportedPackage>
+    <exportedPackage>org.apache.maven.rtinfo</exportedPackage>
+    <exportedPackage>org.apache.maven.settings</exportedPackage>
+    <exportedPackage>org.apache.maven.toolchain</exportedPackage>
+    <exportedPackage>org.apache.maven.usability</exportedPackage>
+
+
+    <!-- wagon-api -->
+    <exportedPackage>org.apache.maven.wagon.*</exportedPackage>
+    <exportedPackage>org.apache.maven.wagon.authentication</exportedPackage>
+    <exportedPackage>org.apache.maven.wagon.authorization</exportedPackage>
+    <exportedPackage>org.apache.maven.wagon.events</exportedPackage>
+    <exportedPackage>org.apache.maven.wagon.observers</exportedPackage>
+    <exportedPackage>org.apache.maven.wagon.proxy</exportedPackage>
+    <exportedPackage>org.apache.maven.wagon.repository</exportedPackage>
+    <exportedPackage>org.apache.maven.wagon.resource</exportedPackage>
+
+    <!-- aether-api, aether-spi, aether-impl -->
+    <exportedPackage>org.eclipse.aether.*</exportedPackage>
+    <exportedPackage>org.eclipse.aether.artifact</exportedPackage>
+    <exportedPackage>org.eclipse.aether.collection</exportedPackage>
+    <exportedPackage>org.eclipse.aether.deployment</exportedPackage>
+    <exportedPackage>org.eclipse.aether.graph</exportedPackage>
+    <exportedPackage>org.eclipse.aether.impl</exportedPackage>
+    <exportedPackage>org.eclipse.aether.internal.impl</exportedPackage>
+    <exportedPackage>org.eclipse.aether.installation</exportedPackage>
+    <exportedPackage>org.eclipse.aether.metadata</exportedPackage>
+    <exportedPackage>org.eclipse.aether.repository</exportedPackage>
+    <exportedPackage>org.eclipse.aether.resolution</exportedPackage>
+    <exportedPackage>org.eclipse.aether.spi</exportedPackage>
+    <exportedPackage>org.eclipse.aether.transfer</exportedPackage>
+    <exportedPackage>org.eclipse.aether.version</exportedPackage>
+
+    <!-- plexus-classworlds -->
+    <exportedPackage>org.codehaus.plexus.classworlds</exportedPackage>
+
+    <!-- classworlds (for legacy code) -->
+    <exportedPackage>org.codehaus.classworlds</exportedPackage>
+
+    <!-- plexus-utils (for DOM-type fields in maven-model) -->
+    <exportedPackage>org.codehaus.plexus.util.xml.Xpp3Dom</exportedPackage>
+    
<exportedPackage>org.codehaus.plexus.util.xml.pull.XmlPullParser</exportedPackage>
+    
<exportedPackage>org.codehaus.plexus.util.xml.pull.XmlPullParserException</exportedPackage>
+    
<exportedPackage>org.codehaus.plexus.util.xml.pull.XmlSerializer</exportedPackage>
+
+    <!-- plexus-container, plexus-component-annotations -->
+    <exportedPackage>org.codehaus.plexus.*</exportedPackage>
+    <exportedPackage>org.codehaus.plexus.component</exportedPackage>
+    <exportedPackage>org.codehaus.plexus.configuration</exportedPackage>
+    <exportedPackage>org.codehaus.plexus.container</exportedPackage>
+    <exportedPackage>org.codehaus.plexus.context</exportedPackage>
+    <exportedPackage>org.codehaus.plexus.lifecycle</exportedPackage>
+    <exportedPackage>org.codehaus.plexus.logging</exportedPackage>
+    <exportedPackage>org.codehaus.plexus.personality</exportedPackage>
+
+    <!-- javax.inject (JSR-330) -->
+    <exportedPackage>javax.inject.*</exportedPackage>
+    <!-- javax.enterprise.inject (JSR-299) -->
+    <exportedPackage>javax.enterprise.util.*</exportedPackage>
+    <exportedPackage>javax.enterprise.inject.*</exportedPackage>
+
+
+    <!-- 
+      | We may potentially want to export these, but right now I'm not sure 
that anything Guice specific needs
+      | to be made available to plugin authors. If we find people are getting 
fancy and want to take advantage of
+      | Guice specifics we can expose that later. Really some testing needs to 
be done to see full hiding
+      | of Guice has any impact on what we may categorize as a standard 
JSR-330 based Tesla/Maven plugin.
+
+        <exportedPackage>com.google.inject.*</exportedPackage>
+        <exportedPackage>com.google.inject.binder.*</exportedPackage>
+        <exportedPackage>com.google.inject.matcher.*</exportedPackage>
+        <exportedPackage>com.google.inject.name.*</exportedPackage>
+        <exportedPackage>com.google.inject.spi.*</exportedPackage>
+        <exportedPackage>com.google.inject.util.*</exportedPackage>
+     -->
+
+    <!-- SLF4J -->
+    <exportedPackage>org.slf4j.*</exportedPackage>
+
+  </exportedPackages>
+
+  <exportedArtifacts>
+    <exportedArtifact>classworlds:classworlds</exportedArtifact>
+    <exportedArtifact>org.codehaus.plexus:plexus-classworlds</exportedArtifact>
+    
<exportedArtifact>org.codehaus.plexus:plexus-component-api</exportedArtifact>
+    
<exportedArtifact>org.codehaus.plexus:plexus-container-default</exportedArtifact>
+    <exportedArtifact>plexus:plexus-container-default</exportedArtifact>
+    <exportedArtifact>org.sonatype.spice:spice-inject-plexus</exportedArtifact>
+    <exportedArtifact>org.sonatype.sisu:sisu-inject-plexus</exportedArtifact>
+    
<exportedArtifact>org.eclipse.sisu:org.eclipse.sisu.plexus</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-artifact</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-aether-provider</exportedArtifact>
+    
<exportedArtifact>org.apache.maven:maven-artifact-manager</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-compat</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-core</exportedArtifact>
+    
<exportedArtifact>org.apache.maven:maven-error-diagnostics</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-lifecycle</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-model</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-model-builder</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-monitor</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-plugin-api</exportedArtifact>
+    
<exportedArtifact>org.apache.maven:maven-plugin-descriptor</exportedArtifact>
+    
<exportedArtifact>org.apache.maven:maven-plugin-parameter-documenter</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-plugin-registry</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-profile</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-project</exportedArtifact>
+    
<exportedArtifact>org.apache.maven:maven-repository-metadata</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-settings</exportedArtifact>
+    
<exportedArtifact>org.apache.maven:maven-settings-builder</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-toolchain</exportedArtifact>
+    
<exportedArtifact>org.apache.maven.wagon:wagon-provider-api</exportedArtifact>
+    <exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
+    <exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
+    <exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>
+
+    <!--
+      | We must also filter out the old or NoClassDefFoundErrors will surface  
+     -->
+    <exportedArtifact>org.sonatype.aether:aether-api</exportedArtifact>
+    <exportedArtifact>org.sonatype.aether:aether-spi</exportedArtifact>
+    <exportedArtifact>org.sonatype.aether:aether-impl</exportedArtifact>
+
+    <!--
+      | NOTE: Don't exclude the wagons or any of their dependencies (apart 
from the wagon API). This would otherwise
+      | provoke linkage errors for wagons contributed by build extensions. We 
also don't need to exclude the wagons
+      | from plugins. Plugins that use wagons directly and declare the 
corresponding dependency will simply use a
+      | wagon from their plugin realm. 
+     -->
+  </exportedArtifacts>
+</extension>
\ No newline at end of file

Reply via email to