You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/09/22 16:17:30 UTC

svn commit: r817669 - in /maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin: DefaultBuildPluginManager.java DefaultPluginRealmCache.java PluginRealmCache.java internal/DefaultMavenPluginManager.java

Author: bentmann
Date: Tue Sep 22 14:17:30 2009
New Revision: 817669

URL: http://svn.apache.org/viewvc?rev=817669&view=rev
Log:
o Generalized plugin realm cache

Modified:
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java
    maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java?rev=817669&r1=817668&r2=817669&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java Tue Sep 22 14:17:30 2009
@@ -47,9 +47,6 @@
     private PlexusContainer container;
 
     @Requirement
-    private PluginRealmCache pluginCache;
-
-    @Requirement
     private MavenPluginManager mavenPluginManager;
 
     @Requirement
@@ -154,30 +151,14 @@
 
         Plugin plugin = pluginDescriptor.getPlugin();
 
-        MavenProject project = session.getCurrentProject();
-        ArtifactRepository localRepository = session.getLocalRepository();
-        List<ArtifactRepository> remoteRepositories = project.getPluginArtifactRepositories();
-
-        PluginRealmCache.CacheRecord cacheRecord = pluginCache.get( plugin, project, localRepository, remoteRepositories );
-
-        if ( cacheRecord != null )
+        try
         {
-            pluginDescriptor.setClassRealm( cacheRecord.realm );
-            pluginDescriptor.setArtifacts( new ArrayList<Artifact>( cacheRecord.artifacts ) );
+            mavenPluginManager.setupPluginRealm( pluginDescriptor, session,
+                                                 session.getCurrentProject().getClassRealm(), null );
         }
-        else
+        catch ( PluginResolutionException e )
         {
-            try
-            {
-                mavenPluginManager.setupPluginRealm( pluginDescriptor, session, project.getClassRealm(), null );
-            }
-            catch ( PluginResolutionException e )
-            {
-                throw new PluginManagerException( plugin, e.getMessage(), e );
-            }
-
-            pluginCache.put( plugin, project, localRepository, remoteRepositories, pluginDescriptor.getClassRealm(),
-                             pluginDescriptor.getArtifacts() );
+            throw new PluginManagerException( plugin, e.getMessage(), e );
         }
 
         return pluginDescriptor.getClassRealm();

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java?rev=817669&r1=817668&r2=817669&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginRealmCache.java Tue Sep 22 14:17:30 2009
@@ -20,6 +20,7 @@
  */
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -30,7 +31,6 @@
 import org.apache.maven.model.Dependency;
 import org.apache.maven.model.Exclusion;
 import org.apache.maven.model.Plugin;
-import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
 import org.codehaus.plexus.component.annotations.Component;
 
@@ -48,22 +48,26 @@
 
         private final List<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
 
-        private final ClassRealm projectRealm;
+        private final ClassLoader parentRealm;
+
+        private final List<String> parentImports;
 
         private final int hashCode;
 
-        public CacheKey( Plugin plugin, MavenProject project, ArtifactRepository localRepository,
+        public CacheKey( Plugin plugin, ClassLoader parentRealm, List<String> parentImports, ArtifactRepository localRepository,
                          List<ArtifactRepository> remoteRepositories )
         {
             this.plugin = plugin.clone();
             this.repositories.add( localRepository );
             this.repositories.addAll( remoteRepositories );
-            this.projectRealm = project.getClassRealm();
+            this.parentRealm = parentRealm;
+            this.parentImports = ( parentImports != null ) ? parentImports : Collections.<String> emptyList();
 
             int hash = 17;
             hash = hash * 31 + pluginHashCode( plugin );
             hash = hash * 31 + repositories.hashCode();
-            hash = hash * 31 + ( projectRealm != null ? projectRealm.hashCode() : 0 );
+            hash = hash * 31 + ( parentRealm != null ? parentRealm.hashCode() : 0 );
+            hash = hash * 31 + this.parentImports.hashCode();
             this.hashCode = hash;
         }
 
@@ -88,32 +92,33 @@
 
             CacheKey other = (CacheKey) o;
 
-            return projectRealm == other.projectRealm && pluginEquals( plugin, other.plugin )
+            return parentRealm == other.parentRealm && pluginEquals( plugin, other.plugin )
                 && eq( repositories, other.repositories );
         }
     }
 
     protected final Map<CacheKey, CacheRecord> cache = new HashMap<CacheKey, CacheRecord>();
 
-    public CacheRecord get( Plugin plugin, MavenProject project, ArtifactRepository localRepository,
-                            List<ArtifactRepository> remoteRepositories )
+    public CacheRecord get( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
+                            ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
     {
-        return cache.get( new CacheKey( plugin, project, localRepository, remoteRepositories ) );
+        return cache.get( new CacheKey( plugin, parentRealm, parentImports, localRepository, remoteRepositories ) );
     }
 
-    public void put( Plugin plugin, MavenProject project, ArtifactRepository localRepository,
-                     List<ArtifactRepository> remoteRepositories, ClassRealm pluginRealm, List<Artifact> pluginArtifacts )
+    public void put( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
+                     ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories,
+                     ClassRealm pluginRealm, List<Artifact> pluginArtifacts )
     {
         if ( pluginRealm == null || pluginArtifacts == null )
         {
             throw new NullPointerException();
         }
 
-        CacheKey key = new CacheKey( plugin, project, localRepository, remoteRepositories );
+        CacheKey key = new CacheKey( plugin, parentRealm, parentImports, localRepository, remoteRepositories );
 
         if ( cache.containsKey( key ) )
         {
-            throw new IllegalStateException( "Duplicate plugin realm for plugin " + plugin );
+            throw new IllegalStateException( "Duplicate plugin realm for plugin " + plugin.getId() );
         }
 
         CacheRecord record = new CacheRecord( pluginRealm, pluginArtifacts );

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java?rev=817669&r1=817668&r2=817669&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginRealmCache.java Tue Sep 22 14:17:30 2009
@@ -24,9 +24,16 @@
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Plugin;
-import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
 
+/**
+ * Caches plugin class realms. <strong>Warning:</strong> This is an internal utility interface that is only public for
+ * technical reasons, it is not part of the public API. In particular, this interface can be changed or deleted without
+ * prior notice.
+ * 
+ * @author Igor Fedorenko
+ * @author Benjamin Bentmann
+ */
 public interface PluginRealmCache
 {
     
@@ -42,11 +49,12 @@
         }
     }
 
-    CacheRecord get( Plugin plugin, MavenProject project, ArtifactRepository localRepository,
-                     List<ArtifactRepository> remoteRepositories );
+    CacheRecord get( Plugin plugin, ClassLoader parentRealm, List<String> parentImports,
+                     ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories );
 
-    void put( Plugin plugin, MavenProject project, ArtifactRepository localRepository,
+    void put( Plugin plugin, ClassLoader parentRealm, List<String> parentImports, ArtifactRepository localRepository,
               List<ArtifactRepository> remoteRepositories, ClassRealm pluginRealm, List<Artifact> pluginArtifacts );
 
     void flush();
+
 }

Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java?rev=817669&r1=817668&r2=817669&view=diff
==============================================================================
--- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java (original)
+++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java Tue Sep 22 14:17:30 2009
@@ -63,6 +63,7 @@
 import org.apache.maven.plugin.PluginDescriptorParsingException;
 import org.apache.maven.plugin.PluginManagerException;
 import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
+import org.apache.maven.plugin.PluginRealmCache;
 import org.apache.maven.plugin.PluginResolutionException;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.plugin.descriptor.PluginDescriptor;
@@ -125,6 +126,9 @@
     @Requirement
     private PluginDescriptorCache pluginDescriptorCache;
 
+    @Requirement
+    private PluginRealmCache pluginRealmCache;
+
     private PluginDescriptorBuilder builder = new PluginDescriptorBuilder();
 
     public synchronized PluginDescriptor getPluginDescriptor( Plugin plugin, RepositoryRequest repositoryRequest )
@@ -293,6 +297,31 @@
     {
         Plugin plugin = pluginDescriptor.getPlugin();
 
+        PluginRealmCache.CacheRecord cacheRecord =
+            pluginRealmCache.get( plugin, parent, imports, session.getLocalRepository(),
+                                  session.getCurrentProject().getPluginArtifactRepositories() );
+
+        if ( cacheRecord != null )
+        {
+            pluginDescriptor.setClassRealm( cacheRecord.realm );
+            pluginDescriptor.setArtifacts( new ArrayList<Artifact>( cacheRecord.artifacts ) );
+        }
+        else
+        {
+            createPluginRealm( pluginDescriptor, session, parent, imports );
+
+            pluginRealmCache.put( plugin, parent, imports, session.getLocalRepository(),
+                                  session.getCurrentProject().getPluginArtifactRepositories(),
+                                  pluginDescriptor.getClassRealm(), pluginDescriptor.getArtifacts() );
+        }
+    }
+
+    private void createPluginRealm( PluginDescriptor pluginDescriptor, MavenSession session, ClassLoader parent,
+                                  List<String> imports )
+        throws PluginResolutionException, PluginManagerException
+    {
+        Plugin plugin = pluginDescriptor.getPlugin();
+
         if ( plugin == null )
         {
             throw new IllegalArgumentException( "incomplete plugin descriptor, plugin missing" );