diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java index 40f3592a5923..83fd8a596792 100644 --- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java +++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java @@ -81,6 +81,24 @@ public class DefaultRepositorySystemSessionFactory private static final String RESOLVER_MAX_PRIORITY = String.valueOf( Float.MAX_VALUE ); + private static final String MAVEN_RESOLVER_LOCKING_KEY = "maven.resolver.locking"; + + private static final String MAVEN_RESOLVER_LOCKING_DEFAULT = "default"; + + private static final String MAVEN_RESOLVER_LOCKING_LOCAL = "local"; + + private static final String MAVEN_RESOLVER_LOCKING_FILE = "file"; + + private static final String MAVEN_RESOLVER_LOCKING_HAZELCAST = "hazelcast"; + + private static final String MAVEN_RESOLVER_LOCKING_REDISSON = "redisson"; + + private static final String MAVEN_RESOLVER_LOCKING_AUTO = "auto"; + + private static final String MAVEN_RESOLVER_LOCKING_LOCK_FACTORY_KEY = "aether.syncContext.named.factory"; + + private static final String MAVEN_RESOLVER_LOCKING_NAME_MAPPER_KEY = "aether.syncContext.named.nameMapper"; + @Inject private Logger logger; @@ -282,6 +300,35 @@ else if ( !MAVEN_RESOLVER_TRANSPORT_AUTO.equals( transport ) ) + MAVEN_RESOLVER_TRANSPORT_NATIVE + ", " + MAVEN_RESOLVER_TRANSPORT_AUTO ); } + Object locking = configProps.getOrDefault( MAVEN_RESOLVER_LOCKING_KEY, MAVEN_RESOLVER_LOCKING_DEFAULT ); + if ( MAVEN_RESOLVER_LOCKING_DEFAULT.equals( locking ) || MAVEN_RESOLVER_LOCKING_LOCAL.equals( locking ) ) + { + // The "default" mode (user did not set anything) is same as "local" mode + configProps.put( MAVEN_RESOLVER_LOCKING_LOCK_FACTORY_KEY, "rwlock-local" ); + configProps.put( MAVEN_RESOLVER_LOCKING_NAME_MAPPER_KEY, "gav" ); + } + else if ( MAVEN_RESOLVER_LOCKING_FILE.equals( locking ) ) + { + configProps.put( MAVEN_RESOLVER_LOCKING_LOCK_FACTORY_KEY, "file-lock" ); + configProps.put( MAVEN_RESOLVER_LOCKING_NAME_MAPPER_KEY, "file-gav" ); + } + else if ( MAVEN_RESOLVER_LOCKING_HAZELCAST.equals( locking ) ) + { + configProps.put( MAVEN_RESOLVER_LOCKING_LOCK_FACTORY_KEY, "semaphore-hazelcast-client" ); + configProps.put( MAVEN_RESOLVER_LOCKING_NAME_MAPPER_KEY, "discriminating" ); + } + else if ( MAVEN_RESOLVER_LOCKING_REDISSON.equals( locking ) ) + { + configProps.put( MAVEN_RESOLVER_LOCKING_LOCK_FACTORY_KEY, "rwlock-redisson" ); + configProps.put( MAVEN_RESOLVER_LOCKING_NAME_MAPPER_KEY, "discriminating" ); + } + else if ( !MAVEN_RESOLVER_LOCKING_AUTO.equals( locking ) ) + { + throw new IllegalArgumentException( "Unknown resolver locking mode '" + transport + + "'. Supported locking modes are: " + MAVEN_RESOLVER_LOCKING_FILE + ", " + + MAVEN_RESOLVER_LOCKING_LOCAL + ", " + MAVEN_RESOLVER_LOCKING_AUTO ); + } + session.setTransferListener( request.getTransferListener() ); session.setRepositoryListener( eventSpyDispatcher.chainListener( new LoggingRepositoryListener( logger ) ) );