You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2009/06/05 16:02:49 UTC

svn commit: r782019 - in /maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin: DefaultPluginCache.java PluginCache.java

Author: jvanzyl
Date: Fri Jun  5 14:02:49 2009
New Revision: 782019

URL: http://svn.apache.org/viewvc?rev=782019&view=rev
Log:
o missing components from the MNG-4041 commit

Added:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginCache.java   (with props)
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginCache.java   (with props)

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginCache.java?rev=782019&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginCache.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginCache.java Fri Jun  5 14:02:49 2009
@@ -0,0 +1,309 @@
+package org.apache.maven.plugin;
+
+/*
+ * 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.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Exclusion;
+import org.apache.maven.model.ModelUtils;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginExecution;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.component.annotations.Component;
+
+/**
+ * Default PluginCache implementation. Assumes cached data does not change.
+ */
+@Component( role = PluginCache.class )
+public class DefaultPluginCache
+    implements PluginCache
+{
+
+    private static class CacheKey
+    {
+        private final Plugin plugin;
+
+        private final List<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
+        
+        private final int hashCode;
+
+        public CacheKey( Plugin plugin, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
+        {
+            this.plugin = ModelUtils.clonePlugin( plugin );
+            this.repositories.add( localRepository );
+            this.repositories.addAll( remoteRepositories );
+
+            int hash = 17;
+            hash = hash * 31 + pluginHashCode( plugin );
+            hash = hash * 31 + repositories.hashCode();
+            this.hashCode = hash;
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return hashCode;
+        }
+
+        @Override
+        public boolean equals( Object o )
+        {
+            if ( o == this )
+            {
+                return true;
+            }
+
+            if ( !( o instanceof CacheKey ) )
+            {
+                return false;
+            }
+
+            CacheKey other = (CacheKey) o;
+
+            return pluginEquals( plugin, other.plugin );
+        }
+    }
+
+    private final Map<CacheKey, PluginDescriptor> descriptorsCache = new HashMap<CacheKey, PluginDescriptor>();
+
+    private final Map<CacheKey, CacheRecord> cache = new HashMap<CacheKey, CacheRecord>();
+
+    public CacheRecord get( Plugin plugin, ArtifactRepository localRepository,
+                            List<ArtifactRepository> remoteRepositories )
+    {
+        return cache.get( new CacheKey( plugin, localRepository, remoteRepositories ) );
+    }
+
+    public PluginDescriptor getPluginDescriptor( Plugin plugin, ArtifactRepository localRepository,
+                                                 List<ArtifactRepository> remoteRepositories )
+    {
+        return clone( descriptorsCache.get( new CacheKey( plugin, localRepository, remoteRepositories ) ) );
+    }
+
+    protected static PluginDescriptor clone( PluginDescriptor original )
+    {
+        if ( original == null )
+        {
+            return null;
+        }
+
+        PluginDescriptor cloned = new PluginDescriptor();
+        cloned.setGroupId( original.getGroupId() );
+        cloned.setArtifactId( original.getArtifactId() );
+        cloned.setVersion( original.getVersion() );
+        cloned.setGoalPrefix( original.getGoalPrefix() );
+        cloned.setSource( original.getSource() );
+        cloned.setInheritedByDefault( original.isInheritedByDefault() );
+
+        cloned.setIntroducedDependencyArtifacts( original.getIntroducedDependencyArtifacts() ); // TODO do we need to clone this?
+        cloned.setName( original.getName() );
+        cloned.setDescription( original.getDescription() );
+        cloned.setPlugin( ModelUtils.clonePlugin( original.getPlugin() ) ); // TODO not sure I need to clone here
+        cloned.setPluginArtifact( original.getPluginArtifact() );
+
+        cloned.setId( original.getId() );
+        cloned.setIsolatedRealm( original.isIsolatedRealm() );
+        cloned.setComponents( original.getComponents() );
+        cloned.setDependencies( original.getDependencies() );
+
+        return cloned;
+    }
+    
+    public void put( Plugin plugin, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories,
+                     ClassRealm pluginRealm, List<Artifact> pluginArtifacts )
+    {
+        if ( pluginRealm == null || pluginArtifacts == null )
+        {
+            throw new NullPointerException();
+        }
+
+        CacheKey key = new CacheKey( plugin, localRepository, remoteRepositories );
+        CacheRecord record = new CacheRecord( pluginRealm, pluginArtifacts );
+        cache.put( key, record );
+    }
+
+    public void putPluginDescriptor( Plugin plugin, ArtifactRepository localRepository,
+                                     List<ArtifactRepository> remoteRepositories, PluginDescriptor pluginDescriptor )
+    {
+        CacheKey key = new CacheKey( plugin, localRepository, remoteRepositories );
+        descriptorsCache.put( key, clone( pluginDescriptor ) );
+    }
+
+    public void flush()
+    {
+        cache.clear();
+        descriptorsCache.clear();
+    }
+
+    protected static int pluginHashCode( Plugin plugin )
+    {
+        int hash = 17;
+
+        hash = hash * 31 + plugin.getGroupId().hashCode();
+        hash = hash * 31 + plugin.getArtifactId().hashCode();
+        hash = hash * 31 + plugin.getVersion().hashCode();
+
+        hash = hash * 31 + ( plugin.isExtensions() ? 1 : 0 );
+
+        for ( Dependency dependency : plugin.getDependencies() )
+        {
+            hash = hash * 31 + dependency.getGroupId().hashCode();
+            hash = hash * 31 + dependency.getArtifactId().hashCode();
+            hash = hash * 31 + dependency.getVersion().hashCode();
+            hash = hash * 31 + dependency.getType().hashCode();
+            hash = hash * 31 + ( dependency.getClassifier() != null ? dependency.getClassifier().hashCode() : 0 );
+            hash = hash * 31 + ( dependency.getScope() != null ? dependency.getScope().hashCode() : 0 );
+
+            for ( Exclusion exclusion : dependency.getExclusions() )
+            {
+                hash = hash * 31 + exclusion.getGroupId().hashCode();
+                hash = hash * 31 + exclusion.getArtifactId().hashCode();
+            }
+        }
+
+        /*
+         * Must consider executions because each execution ends up as separate plexus component, with its own
+         * configuration, etc.
+         */
+        for ( PluginExecution execution : plugin.getExecutions() )
+        {
+            hash = hash * 31 + execution.getId().hashCode();
+            hash = hash * 31 + ( execution.getInherited() != null ? execution.getInherited().hashCode() : 0 );
+            hash = hash * 31 + ( execution.getPhase() != null ? execution.getPhase().hashCode() : 0); 
+            hash = hash * 31 + ( execution.getConfiguration() != null ? execution.getConfiguration().hashCode() : 0 );
+            hash = hash * 31 + execution.getGoals().hashCode();
+        }
+
+        return hash;
+    }
+
+    protected static boolean pluginEquals( Plugin a, Plugin b )
+    {
+        return eq( a.getGroupId(), b.getGroupId() ) //
+            && eq( a.getArtifactId(), b.getArtifactId() ) //
+            && eq( a.getVersion(), b.getVersion() ) // 
+            && a.isExtensions() == b.isExtensions() //
+            && pluginExecutionsEquals( a.getExecutions(), b.getExecutions() ) //
+            && dependenciesEquals( a.getDependencies(), b.getDependencies() );
+    }
+
+    protected static boolean pluginExecutionsEquals( List<PluginExecution> a, List<PluginExecution> b )
+    {
+        if ( a.size() != b.size() )
+        {
+            return false;
+        }
+
+        Iterator<PluginExecution> aI = a.iterator();
+        Iterator<PluginExecution> bI = b.iterator();
+
+        while ( aI.hasNext() )
+        {
+            PluginExecution aD = aI.next();
+            PluginExecution bD = bI.next();
+
+            boolean r = eq( aD.getId(), bD.getId() ) //
+                && eq( aD.getInherited(), bD.getInherited() ) //
+                && eq( aD.getPhase(), bD.getPhase() ) // 
+                && eq( aD.getConfiguration(), bD.getConfiguration() ) //
+                && eq( aD.getGoals(), bD.getGoals() );
+
+            if ( !r )
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private static boolean dependenciesEquals( List<Dependency> a, List<Dependency> b )
+    {
+        if ( a.size() != b.size() )
+        {
+            return false;
+        }
+
+        Iterator<Dependency> aI = a.iterator();
+        Iterator<Dependency> bI = b.iterator();
+
+        while ( aI.hasNext() )
+        {
+            Dependency aD = aI.next();
+            Dependency bD = bI.next();
+
+            boolean r = eq( aD.getGroupId(), bD.getGroupId() ) //
+                && eq( aD.getArtifactId(), bD.getArtifactId() ) //
+                && eq( aD.getVersion(), bD.getVersion() ) // 
+                && eq( aD.getType(), bD.getType() ) //
+                && eq( aD.getClassifier(), bD.getScope() );
+
+            r &= exclusionsEquals( aD.getExclusions(), bD.getExclusions() );
+
+            if ( !r )
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private static boolean exclusionsEquals( List<Exclusion> a, List<Exclusion> b )
+    {
+        if ( a.size() != b.size() )
+        {
+            return false;
+        }
+
+        Iterator<Exclusion> aI = a.iterator();
+        Iterator<Exclusion> bI = b.iterator();
+
+        while ( aI.hasNext() )
+        {
+            Exclusion aD = aI.next();
+            Exclusion bD = bI.next();
+
+            boolean r = eq( aD.getGroupId(), bD.getGroupId() ) //
+                && eq( aD.getArtifactId(), bD.getArtifactId() );
+
+            if ( !r )
+            {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    private static <T> boolean eq( T s1, T s2 )
+    {
+        return s1 != null ? s1.equals( s2 ) : s2 == null;
+    }
+
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginCache.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginCache.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginCache.java?rev=782019&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginCache.java (added)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginCache.java Fri Jun  5 14:02:49 2009
@@ -0,0 +1,38 @@
+package org.apache.maven.plugin;
+
+import java.util.List;
+
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+
+public interface PluginCache
+{
+    
+    public static class CacheRecord
+    {
+        public final ClassRealm realm;
+        public final List<Artifact> artifacts;
+
+        public CacheRecord( ClassRealm realm, List<Artifact> artifacts )
+        {
+            this.realm = realm;
+            this.artifacts = artifacts;
+        }
+    }
+
+    PluginDescriptor getPluginDescriptor( Plugin plugin, ArtifactRepository localRepository,
+                                          List<ArtifactRepository> remoteRepositories );
+
+    void putPluginDescriptor( Plugin plugin, ArtifactRepository localRepository,
+                              List<ArtifactRepository> remoteRepositories, PluginDescriptor pluginDescriptor );
+
+    CacheRecord get( Plugin plugin, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories );
+
+    void put( Plugin plugin, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories,
+              ClassRealm pluginRealm, List<Artifact> pluginArtifacts );
+
+    void flush();
+}

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginCache.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginCache.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"