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
{