You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2021/09/14 18:10:42 UTC

[maven] branch master updated: [MNG-7236] The DefaultPluginVersionResolver should cache results for the session

This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new 23ffe33  [MNG-7236] The DefaultPluginVersionResolver should cache results for the session
23ffe33 is described below

commit 23ffe3349f92cd5bb9a8ba0111a7ab9761b2e72c
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Sep 9 16:25:21 2021 +0200

    [MNG-7236] The DefaultPluginVersionResolver should cache results for the session
---
 .../internal/DefaultPluginVersionResolver.java     | 89 +++++++++++++++++++++-
 1 file changed, 85 insertions(+), 4 deletions(-)

diff --git a/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java b/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
index 17186dd..ec72f2a 100644
--- a/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
+++ b/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
@@ -25,7 +25,10 @@ import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.inject.Inject;
 import javax.inject.Named;
@@ -51,6 +54,7 @@ import org.eclipse.aether.RepositoryListener;
 import org.eclipse.aether.RepositorySystem;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.SessionData;
 import org.eclipse.aether.metadata.DefaultMetadata;
 import org.eclipse.aether.repository.ArtifactRepository;
 import org.eclipse.aether.repository.RemoteRepository;
@@ -75,6 +79,8 @@ public class DefaultPluginVersionResolver
 
     private static final String REPOSITORY_CONTEXT = "plugin";
 
+    private static final Object CACHE_KEY = new Object();
+
     @Inject
     private Logger logger;
 
@@ -94,12 +100,26 @@ public class DefaultPluginVersionResolver
 
         if ( result == null )
         {
-            result = resolveFromRepository( request );
+            ConcurrentMap<Key, PluginVersionResult> cache = getCache( request.getRepositorySession().getData() );
+            Key key = getKey( request );
+            result = cache.get( key );
 
-            if ( logger.isDebugEnabled() )
+            if ( result == null )
             {
-                logger.debug( "Resolved plugin version for " + request.getGroupId() + ":" + request.getArtifactId()
-                    + " to " + result.getVersion() + " from repository " + result.getRepository() );
+                result = resolveFromRepository( request );
+
+                if ( logger.isDebugEnabled() )
+                {
+                    logger.debug( "Resolved plugin version for " + request.getGroupId() + ":" + request.getArtifactId()
+                        + " to " + result.getVersion() + " from repository " + result.getRepository() );
+                }
+
+                cache.putIfAbsent( key, result );
+            }
+            else if ( logger.isDebugEnabled() )
+            {
+                logger.debug( "Reusing cached resolved plugin version for " + request.getGroupId() + ":"
+                        + request.getArtifactId() + " to " + result.getVersion() + " from POM " + request.getPom() );
             }
         }
         else if ( logger.isDebugEnabled() )
@@ -387,6 +407,67 @@ public class DefaultPluginVersionResolver
         return null;
     }
 
+    @SuppressWarnings( "unchecked" )
+    private ConcurrentMap<Key, PluginVersionResult> getCache( SessionData data )
+    {
+        ConcurrentMap<Key, PluginVersionResult> cache =
+                ( ConcurrentMap<Key, PluginVersionResult> ) data.get( CACHE_KEY );
+        while ( cache == null )
+        {
+            cache = new ConcurrentHashMap<>( 256 );
+            if ( data.set( CACHE_KEY, null, cache ) )
+            {
+                break;
+            }
+            cache = ( ConcurrentMap<Key, PluginVersionResult> ) data.get( CACHE_KEY );
+        }
+        return cache;
+    }
+
+    private static Key getKey( PluginVersionRequest request )
+    {
+        return new Key( request.getGroupId(), request.getArtifactId(), request.getRepositories() );
+    }
+
+    static class Key
+    {
+        final String groupId;
+        final String artifactId;
+        final List<RemoteRepository> repositories;
+        final int hash;
+
+        Key( String groupId, String artifactId, List<RemoteRepository> repositories )
+        {
+            this.groupId = groupId;
+            this.artifactId = artifactId;
+            this.repositories = repositories;
+            this.hash = Objects.hash( groupId, artifactId, repositories );
+        }
+
+        @Override
+        public boolean equals( Object o )
+        {
+            if ( this == o )
+            {
+                return true;
+            }
+            if ( o == null || getClass() != o.getClass() )
+            {
+                return false;
+            }
+            Key key = ( Key ) o;
+            return groupId.equals( key.groupId )
+                    && artifactId.equals( key.artifactId )
+                    && repositories.equals( key.repositories );
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return hash;
+        }
+    }
+
     static class Versions
     {