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 bcb521c19c2c..c5df71ec398e 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,6 +25,7 @@ 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; @@ -92,13 +93,12 @@ public class DefaultPluginVersionResolver public PluginVersionResult resolve( PluginVersionRequest request ) throws PluginVersionResolutionException { - ConcurrentMap cache = getCache( request.getRepositorySession().getData() ); - PluginVersionResult result = resolveFromProject( request ); if ( result == null ) { - String key = getKey( request ); + ConcurrentMap cache = getCache( request.getRepositorySession().getData() ); + Key key = getKey( request ); result = cache.get( key ); if ( result == null ) @@ -405,10 +405,10 @@ private PluginVersionResult resolveFromProject( PluginVersionRequest request, Li } @SuppressWarnings( "unchecked" ) - private ConcurrentMap getCache( SessionData data ) + private ConcurrentMap getCache( SessionData data ) { - ConcurrentMap cache = - ( ConcurrentMap ) data.get( CACHE_KEY ); + ConcurrentMap cache = + ( ConcurrentMap ) data.get( CACHE_KEY ); while ( cache == null ) { cache = new ConcurrentHashMap<>( 256 ); @@ -416,23 +416,53 @@ private ConcurrentMap getCache( SessionData data ) { break; } - cache = ( ConcurrentMap ) data.get( CACHE_KEY ); + cache = ( ConcurrentMap ) data.get( CACHE_KEY ); } return cache; } - private static String getKey( PluginVersionRequest request ) + private static Key getKey( PluginVersionRequest request ) { - StringBuilder sb = new StringBuilder(); - sb.append( request.getGroupId() ); - sb.append( ':' ); - sb.append( request.getArtifactId() ); - for ( RemoteRepository repository : request.getRepositories() ) + return new Key( request.getGroupId(), request.getArtifactId(), request.getRepositories() ); + } + + static class Key + { + final String groupId; + final String artifactId; + final List repositories; + final int hash; + + Key( String groupId, String artifactId, List 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() { - sb.append( ':' ); - sb.append( repository.getId() ); + return hash; } - return sb.toString(); } static class Versions