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

cstamas pushed a commit to branch maven-resolver-1.9.x
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


The following commit(s) were added to refs/heads/maven-resolver-1.9.x by this 
push:
     new c1a8e857b [1.9.x] Name mappers cleanup and new GAECV mapper (#1674)
c1a8e857b is described below

commit c1a8e857ba4b5a3332b13efc5542b58ce2e55128
Author: Tamas Cservenak <[email protected]>
AuthorDate: Tue Nov 18 14:04:41 2025 +0100

    [1.9.x] Name mappers cleanup and new GAECV mapper (#1674)
    
    Cleanup name mappers usage and introduce new, more selective mapper GAECV.
    
    Changes:
    * introduce GAECV next to existing GAV name mapper.
    * make default GAECV
---
 .../eclipse/aether/impl/guice/AetherModule.java    | 24 +++++++-
 .../impl/synccontext/named/GAECVNameMapper.java    | 66 ++++++++++++++++++++
 .../impl/synccontext/named/GAVNameMapper.java      | 31 +++++++---
 .../impl/synccontext/named/NameMappers.java        | 71 ++++++++++++++++++++--
 .../named/NamedLockFactoryAdapterFactoryImpl.java  |  5 +-
 .../providers/FileGAECVNameMapperProvider.java}    | 35 +++++++----
 .../FileHashingGAECVNameMapperProvider.java}       | 35 +++++++----
 .../named/providers/GAECVNameMapperProvider.java}  | 35 +++++++----
 .../src/site/markdown/synccontextfactory.md.vm     |  5 +-
 .../impl/synccontext/FileLockAdapterTest.java      |  5 +-
 .../NamedLockFactoryAdapterTestSupport.java        |  5 +-
 .../synccontext/named/BasedirNameMapperTest.java   |  2 +-
 .../impl/synccontext/named/GAVNameMapperTest.java  |  2 +-
 .../synccontext/named/HashingNameMapperTest.java   |  2 +-
 .../NamedLockFactoryAdapterTestSupport.java        |  5 +-
 .../aether/supplier/RepositorySystemSupplier.java  |  3 +
 src/site/markdown/configuration.md                 |  2 +-
 17 files changed, 269 insertions(+), 64 deletions(-)

diff --git 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
index aad52e535..81bc001f5 100644
--- 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/impl/guice/AetherModule.java
@@ -95,8 +95,11 @@ import 
org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
 import 
org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactory;
 import 
org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactoryImpl;
 import 
org.eclipse.aether.internal.impl.synccontext.named.providers.DiscriminatingNameMapperProvider;
+import 
org.eclipse.aether.internal.impl.synccontext.named.providers.FileGAECVNameMapperProvider;
 import 
org.eclipse.aether.internal.impl.synccontext.named.providers.FileGAVNameMapperProvider;
+import 
org.eclipse.aether.internal.impl.synccontext.named.providers.FileHashingGAECVNameMapperProvider;
 import 
org.eclipse.aether.internal.impl.synccontext.named.providers.FileHashingGAVNameMapperProvider;
+import 
org.eclipse.aether.internal.impl.synccontext.named.providers.GAECVNameMapperProvider;
 import 
org.eclipse.aether.internal.impl.synccontext.named.providers.GAVNameMapperProvider;
 import 
org.eclipse.aether.internal.impl.synccontext.named.providers.StaticNameMapperProvider;
 import org.eclipse.aether.named.NamedLockFactory;
@@ -282,6 +285,10 @@ public class AetherModule extends AbstractModule {
                 .annotatedWith(Names.named(NameMappers.GAV_NAME))
                 .toProvider(GAVNameMapperProvider.class)
                 .in(Singleton.class);
+        bind(NameMapper.class)
+                .annotatedWith(Names.named(NameMappers.GAECV_NAME))
+                .toProvider(GAECVNameMapperProvider.class)
+                .in(Singleton.class);
         bind(NameMapper.class)
                 .annotatedWith(Names.named(NameMappers.DISCRIMINATING_NAME))
                 .toProvider(DiscriminatingNameMapperProvider.class)
@@ -290,10 +297,18 @@ public class AetherModule extends AbstractModule {
                 .annotatedWith(Names.named(NameMappers.FILE_GAV_NAME))
                 .toProvider(FileGAVNameMapperProvider.class)
                 .in(Singleton.class);
+        bind(NameMapper.class)
+                .annotatedWith(Names.named(NameMappers.FILE_GAECV_NAME))
+                .toProvider(FileGAECVNameMapperProvider.class)
+                .in(Singleton.class);
         bind(NameMapper.class)
                 .annotatedWith(Names.named(NameMappers.FILE_HGAV_NAME))
                 .toProvider(FileHashingGAVNameMapperProvider.class)
                 .in(Singleton.class);
+        bind(NameMapper.class)
+                .annotatedWith(Names.named(NameMappers.FILE_HGAECV_NAME))
+                .toProvider(FileHashingGAECVNameMapperProvider.class)
+                .in(Singleton.class);
 
         bind(NamedLockFactory.class)
                 .annotatedWith(Names.named(NoopNamedLockFactory.NAME))
@@ -393,20 +408,27 @@ public class AetherModule extends AbstractModule {
         return Collections.unmodifiableMap(result);
     }
 
+    @SuppressWarnings("checkstyle:parameternumber")
     @Provides
     @Singleton
     Map<String, NameMapper> provideNameMappers(
             @Named(NameMappers.STATIC_NAME) NameMapper staticNameMapper,
             @Named(NameMappers.GAV_NAME) NameMapper gavNameMapper,
+            @Named(NameMappers.GAECV_NAME) NameMapper gaecvNameMapper,
             @Named(NameMappers.DISCRIMINATING_NAME) NameMapper 
discriminatingNameMapper,
             @Named(NameMappers.FILE_GAV_NAME) NameMapper fileGavNameMapper,
-            @Named(NameMappers.FILE_HGAV_NAME) NameMapper 
fileHashingGavNameMapper) {
+            @Named(NameMappers.FILE_GAECV_NAME) NameMapper fileGaecvNameMapper,
+            @Named(NameMappers.FILE_HGAV_NAME) NameMapper 
fileHashingGavNameMapper,
+            @Named(NameMappers.FILE_HGAECV_NAME) NameMapper 
fileHashingGaecvNameMapper) {
         Map<String, NameMapper> result = new HashMap<>();
         result.put(NameMappers.STATIC_NAME, staticNameMapper);
         result.put(NameMappers.GAV_NAME, gavNameMapper);
+        result.put(NameMappers.GAECV_NAME, gaecvNameMapper);
         result.put(NameMappers.DISCRIMINATING_NAME, discriminatingNameMapper);
         result.put(NameMappers.FILE_GAV_NAME, fileGavNameMapper);
+        result.put(NameMappers.FILE_GAECV_NAME, fileGaecvNameMapper);
         result.put(NameMappers.FILE_HGAV_NAME, fileHashingGavNameMapper);
+        result.put(NameMappers.FILE_HGAECV_NAME, fileHashingGaecvNameMapper);
         return Collections.unmodifiableMap(result);
     }
 
diff --git 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/GAECVNameMapper.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/GAECVNameMapper.java
new file mode 100644
index 000000000..3d5344beb
--- /dev/null
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/GAECVNameMapper.java
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+package org.eclipse.aether.internal.impl.synccontext.named;
+
+import org.eclipse.aether.artifact.Artifact;
+
+/**
+ * Artifact GAECV {@link NameMapper} extends {@link GAVNameMapper} and 
improves artifact name mapping selectivity by
+ * using all coordinates.
+ *
+ * @since 1.9.25
+ */
+public class GAECVNameMapper extends GAVNameMapper {
+    public GAECVNameMapper(
+            boolean fileSystemFriendly,
+            String artifactPrefix,
+            String artifactSuffix,
+            String metadataPrefix,
+            String metadataSuffix,
+            String fieldSeparator) {
+        super(fileSystemFriendly, artifactPrefix, artifactSuffix, 
metadataPrefix, metadataSuffix, fieldSeparator);
+    }
+
+    @Override
+    protected String getArtifactName(Artifact artifact) {
+        if (artifact.getClassifier().isEmpty()) {
+            return artifactPrefix
+                    + artifact.getGroupId()
+                    + fieldSeparator
+                    + artifact.getArtifactId()
+                    + fieldSeparator
+                    + artifact.getExtension()
+                    + fieldSeparator
+                    + artifact.getBaseVersion()
+                    + artifactSuffix;
+        } else {
+            return artifactPrefix
+                    + artifact.getGroupId()
+                    + fieldSeparator
+                    + artifact.getArtifactId()
+                    + fieldSeparator
+                    + artifact.getExtension()
+                    + fieldSeparator
+                    + artifact.getClassifier()
+                    + fieldSeparator
+                    + artifact.getBaseVersion()
+                    + artifactSuffix;
+        }
+    }
+}
diff --git 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapper.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapper.java
index b08f7867c..39c34eb2c 100644
--- 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapper.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapper.java
@@ -30,21 +30,24 @@ import static java.util.Objects.requireNonNull;
 
 /**
  * Artifact GAV {@link NameMapper}, uses artifact and metadata coordinates to 
name their corresponding locks. Is not
- * considering local repository, only the artifact coordinates. May use custom 
prefixes and sufixes and separators,
+ * considering local repository, only the artifact coordinates. May use custom 
prefixes and suffixes and separators,
  * hence this instance may or may not be filesystem friendly (depends on 
strings used).
+ * <p>
+ * Note: in earlier Resolver 1.9.x versions this mapper was the default, but 
it changed to {@link GAECVNameMapper}
+ * in 1.9.25.
  */
 public class GAVNameMapper implements NameMapper {
-    private final boolean fileSystemFriendly;
+    protected final boolean fileSystemFriendly;
 
-    private final String artifactPrefix;
+    protected final String artifactPrefix;
 
-    private final String artifactSuffix;
+    protected final String artifactSuffix;
 
-    private final String metadataPrefix;
+    protected final String metadataPrefix;
 
-    private final String metadataSuffix;
+    protected final String metadataSuffix;
 
-    private final String fieldSeparator;
+    protected final String fieldSeparator;
 
     public GAVNameMapper(
             boolean fileSystemFriendly,
@@ -88,7 +91,7 @@ public class GAVNameMapper implements NameMapper {
         return keys;
     }
 
-    private String getArtifactName(Artifact artifact) {
+    protected String getArtifactName(Artifact artifact) {
         return artifactPrefix
                 + artifact.getGroupId()
                 + fieldSeparator
@@ -98,9 +101,9 @@ public class GAVNameMapper implements NameMapper {
                 + artifactSuffix;
     }
 
-    private static final String MAVEN_METADATA = "maven-metadata.xml";
+    protected static final String MAVEN_METADATA = "maven-metadata.xml";
 
-    private String getMetadataName(Metadata metadata) {
+    protected String getMetadataName(Metadata metadata) {
         String name = metadataPrefix;
         if (!metadata.getGroupId().isEmpty()) {
             name += metadata.getGroupId();
@@ -122,10 +125,18 @@ public class GAVNameMapper implements NameMapper {
         return name + metadataSuffix;
     }
 
+    /**
+     * @deprecated Use {@link NameMappers} to create name mappers instead.
+     */
+    @Deprecated
     public static NameMapper gav() {
         return new GAVNameMapper(false, "artifact:", "", "metadata:", "", ":");
     }
 
+    /**
+     * @deprecated Use {@link NameMappers} to create name mappers instead.
+     */
+    @Deprecated
     public static NameMapper fileGav() {
         return new GAVNameMapper(true, "artifact~", ".lock", "metadata~", 
".lock", "~");
     }
diff --git 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NameMappers.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NameMappers.java
index 6297c21b2..b4cfb85d7 100644
--- 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NameMappers.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NameMappers.java
@@ -21,11 +21,14 @@ package org.eclipse.aether.internal.impl.synccontext.named;
 /**
  * As end-user "mappers" are actually configurations/compositions and are 
constructed from several NameMapper
  * implementations, this helper class constructing them. This class also holds 
"names" used by service locator and
- * Guice/Sisu as well.
+ * Guice/Sisu as well. Ideally, name mapper you want should exist here, 
constructing name mappers should not be
+ * needed (unless some very specific case or testing).
  *
  * @since 1.9.4
  */
 public final class NameMappers {
+    private NameMappers() {}
+
     public static final String STATIC_NAME = "static";
 
     public static final String GAV_NAME = "gav";
@@ -34,6 +37,21 @@ public final class NameMappers {
 
     public static final String FILE_HGAV_NAME = "file-hgav";
 
+    /**
+     * @since 1.9.25
+     */
+    public static final String GAECV_NAME = "gaecv";
+
+    /**
+     * @since 1.9.25
+     */
+    public static final String FILE_GAECV_NAME = "file-gaecv";
+
+    /**
+     * @since 1.9.25
+     */
+    public static final String FILE_HGAECV_NAME = "file-hgaecv";
+
     /**
      * @since 1.9.6
      */
@@ -46,11 +64,47 @@ public final class NameMappers {
     }
 
     public static NameMapper gavNameMapper() {
-        return GAVNameMapper.gav();
+        return gavNameMapper(false);
+    }
+
+    /**
+     * @since 1.9.25
+     */
+    public static NameMapper gavNameMapper(boolean fileSystemFriendly) {
+        if (fileSystemFriendly) {
+            return new GAVNameMapper(true, "artifact~", ".lock", "metadata~", 
".lock", "~");
+        } else {
+            return new GAVNameMapper(false, "artifact:", "", "metadata:", "", 
":");
+        }
+    }
+
+    /**
+     * @since 1.9.25
+     */
+    public static NameMapper gaecvNameMapper() {
+        return gaecvNameMapper(false);
+    }
+
+    /**
+     * @since 1.9.25
+     */
+    public static NameMapper gaecvNameMapper(boolean fileSystemFriendly) {
+        if (fileSystemFriendly) {
+            return new GAECVNameMapper(true, "artifact~", ".lock", 
"metadata~", ".lock", "~");
+        } else {
+            return new GAECVNameMapper(false, "artifact:", "", "metadata:", 
"", ":");
+        }
     }
 
     public static NameMapper fileGavNameMapper() {
-        return new BasedirNameMapper(GAVNameMapper.fileGav());
+        return new BasedirNameMapper(gavNameMapper(true));
+    }
+
+    /**
+     * @since 1.9.25
+     */
+    public static NameMapper fileGaecvNameMapper() {
+        return new BasedirNameMapper(gaecvNameMapper(true));
     }
 
     /**
@@ -61,10 +115,17 @@ public final class NameMappers {
     }
 
     public static NameMapper fileHashingGavNameMapper() {
-        return new BasedirNameMapper(new 
HashingNameMapper(GAVNameMapper.gav()));
+        return new BasedirNameMapper(new 
HashingNameMapper(gavNameMapper(false)));
+    }
+
+    /**
+     * @since 1.9.25
+     */
+    public static NameMapper fileHashingGaecvNameMapper() {
+        return new BasedirNameMapper(new 
HashingNameMapper(gaecvNameMapper(false)));
     }
 
     public static NameMapper discriminatingNameMapper() {
-        return new DiscriminatingNameMapper(GAVNameMapper.gav());
+        return new DiscriminatingNameMapper(gavNameMapper(false));
     }
 }
diff --git 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapterFactoryImpl.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapterFactoryImpl.java
index 132c47260..d7a229857 100644
--- 
a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapterFactoryImpl.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapterFactoryImpl.java
@@ -60,7 +60,7 @@ import static java.util.Objects.requireNonNull;
 public class NamedLockFactoryAdapterFactoryImpl implements 
NamedLockFactoryAdapterFactory, Service {
     private static final String DEFAULT_FACTORY_NAME = 
LocalReadWriteLockNamedLockFactory.NAME;
 
-    private static final String DEFAULT_NAME_MAPPER_NAME = 
NameMappers.GAV_NAME;
+    private static final String DEFAULT_NAME_MAPPER_NAME = 
NameMappers.GAECV_NAME;
 
     private static Map<String, NamedLockFactory> getManuallyCreatedFactories() 
{
         HashMap<String, NamedLockFactory> factories = new HashMap<>();
@@ -75,9 +75,12 @@ public class NamedLockFactoryAdapterFactoryImpl implements 
NamedLockFactoryAdapt
         HashMap<String, NameMapper> mappers = new HashMap<>();
         mappers.put(NameMappers.STATIC_NAME, NameMappers.staticNameMapper());
         mappers.put(NameMappers.GAV_NAME, NameMappers.gavNameMapper());
+        mappers.put(NameMappers.GAECV_NAME, NameMappers.gaecvNameMapper());
         mappers.put(NameMappers.DISCRIMINATING_NAME, 
NameMappers.discriminatingNameMapper());
         mappers.put(NameMappers.FILE_GAV_NAME, 
NameMappers.fileGavNameMapper());
+        mappers.put(NameMappers.FILE_GAECV_NAME, 
NameMappers.fileGaecvNameMapper());
         mappers.put(NameMappers.FILE_HGAV_NAME, 
NameMappers.fileHashingGavNameMapper());
+        mappers.put(NameMappers.FILE_HGAECV_NAME, 
NameMappers.fileHashingGaecvNameMapper());
         return Collections.unmodifiableMap(mappers);
     }
 
diff --git 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAECVNameMapperProvider.java
similarity index 53%
copy from 
maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
copy to 
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAECVNameMapperProvider.java
index a199b83c8..d24fd77af 100644
--- 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAECVNameMapperProvider.java
@@ -16,18 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.eclipse.aether.internal.impl.synccontext;
+package org.eclipse.aether.internal.impl.synccontext.named.providers;
 
-import org.eclipse.aether.internal.impl.synccontext.named.BasedirNameMapper;
-import org.eclipse.aether.internal.impl.synccontext.named.GAVNameMapper;
-import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
-import org.junit.BeforeClass;
+import javax.inject.Named;
+import javax.inject.Provider;
+import javax.inject.Singleton;
 
-public class FileLockAdapterTest extends NamedLockFactoryAdapterTestSupport {
-    @BeforeClass
-    public static void createNamedLockFactory() {
-        nameMapper = new BasedirNameMapper(GAVNameMapper.fileGav());
-        namedLockFactory = new FileLockNamedLockFactory();
-        createAdapter();
+import org.eclipse.aether.internal.impl.synccontext.named.NameMapper;
+import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
+
+/**
+ * The "file-gaecv" name mapper provider.
+ *
+ * @since 1.9.25
+ */
+@Singleton
+@Named(NameMappers.FILE_GAECV_NAME)
+public class FileGAECVNameMapperProvider implements Provider<NameMapper> {
+    private final NameMapper mapper;
+
+    public FileGAECVNameMapperProvider() {
+        this.mapper = NameMappers.fileGaecvNameMapper();
+    }
+
+    @Override
+    public NameMapper get() {
+        return mapper;
     }
 }
diff --git 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAECVNameMapperProvider.java
similarity index 52%
copy from 
maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
copy to 
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAECVNameMapperProvider.java
index a199b83c8..81f6648dc 100644
--- 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAECVNameMapperProvider.java
@@ -16,18 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.eclipse.aether.internal.impl.synccontext;
+package org.eclipse.aether.internal.impl.synccontext.named.providers;
 
-import org.eclipse.aether.internal.impl.synccontext.named.BasedirNameMapper;
-import org.eclipse.aether.internal.impl.synccontext.named.GAVNameMapper;
-import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
-import org.junit.BeforeClass;
+import javax.inject.Named;
+import javax.inject.Provider;
+import javax.inject.Singleton;
 
-public class FileLockAdapterTest extends NamedLockFactoryAdapterTestSupport {
-    @BeforeClass
-    public static void createNamedLockFactory() {
-        nameMapper = new BasedirNameMapper(GAVNameMapper.fileGav());
-        namedLockFactory = new FileLockNamedLockFactory();
-        createAdapter();
+import org.eclipse.aether.internal.impl.synccontext.named.NameMapper;
+import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
+
+/**
+ * The "file-hgaecv" name mapper provider.
+ *
+ * @since 1.9.25
+ */
+@Singleton
+@Named(NameMappers.FILE_HGAECV_NAME)
+public class FileHashingGAECVNameMapperProvider implements 
Provider<NameMapper> {
+    private final NameMapper mapper;
+
+    public FileHashingGAECVNameMapperProvider() {
+        this.mapper = NameMappers.fileHashingGaecvNameMapper();
+    }
+
+    @Override
+    public NameMapper get() {
+        return mapper;
     }
 }
diff --git 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/GAECVNameMapperProvider.java
similarity index 54%
copy from 
maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
copy to 
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/GAECVNameMapperProvider.java
index a199b83c8..aadec8609 100644
--- 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
+++ 
b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/GAECVNameMapperProvider.java
@@ -16,18 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.eclipse.aether.internal.impl.synccontext;
+package org.eclipse.aether.internal.impl.synccontext.named.providers;
 
-import org.eclipse.aether.internal.impl.synccontext.named.BasedirNameMapper;
-import org.eclipse.aether.internal.impl.synccontext.named.GAVNameMapper;
-import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
-import org.junit.BeforeClass;
+import javax.inject.Named;
+import javax.inject.Provider;
+import javax.inject.Singleton;
 
-public class FileLockAdapterTest extends NamedLockFactoryAdapterTestSupport {
-    @BeforeClass
-    public static void createNamedLockFactory() {
-        nameMapper = new BasedirNameMapper(GAVNameMapper.fileGav());
-        namedLockFactory = new FileLockNamedLockFactory();
-        createAdapter();
+import org.eclipse.aether.internal.impl.synccontext.named.NameMapper;
+import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
+
+/**
+ * The "gaecv" name mapper provider.
+ *
+ * @since 1.9.25
+ */
+@Singleton
+@Named(NameMappers.GAECV_NAME)
+public class GAECVNameMapperProvider implements Provider<NameMapper> {
+    private final NameMapper mapper;
+
+    public GAECVNameMapperProvider() {
+        this.mapper = NameMappers.gaecvNameMapper();
+    }
+
+    @Override
+    public NameMapper get() {
+        return mapper;
     }
 }
diff --git a/maven-resolver-impl/src/site/markdown/synccontextfactory.md.vm 
b/maven-resolver-impl/src/site/markdown/synccontextfactory.md.vm
index c970fa15e..67755b417 100644
--- a/maven-resolver-impl/src/site/markdown/synccontextfactory.md.vm
+++ b/maven-resolver-impl/src/site/markdown/synccontextfactory.md.vm
@@ -61,10 +61,13 @@ For the `aether.syncContext.named.factory` property 
following values are allowed
 
 For the `aether.syncContext.named.nameMapper` property following values are 
allowed:
 
-- `discriminating` (default), uses hostname + local repo + GAV to create 
unique lock names for artifacts.
+- `discriminating`, uses hostname + local repo + GAV to create unique lock 
names for artifacts.
 - `gav` uses GAV to create unique lock names for artifacts and metadata. Is 
not unique if multiple local repositories are involved.
 - `file-gav` uses GAV and session to create absolute file paths (to be used 
with `file-lock` factory)
 - `file-hgav` uses more compact layout than `file-gav` by SHA-1 digest, 
similar to git (to be used with `file-lock` factory)
+- `gaecv` (default) uses GAECV to create unique lock names for artifacts and 
metadata. Is not unique if multiple local repositories are involved.
+- `file-gaecv` uses GAECV and session to create absolute file paths (to be 
used with `file-lock` factory)
+- `file-hgaecv` uses more compact layout than `file-gaecv` by SHA-1 digest, 
similar to git (to be used with `file-lock` factory)
 - `static` uses static (same) string as lock name for any input. Effectively 
providing functionality same as old
   "global" locking SyncContextFactory. Mostly for testing/experimental 
purposes.
 - `file-static` same as `static` but to be used with `file-lock` factory. 
Mostly for testing/experimental purposes.
diff --git 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
index a199b83c8..51ba46288 100644
--- 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
+++ 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/FileLockAdapterTest.java
@@ -18,15 +18,14 @@
  */
 package org.eclipse.aether.internal.impl.synccontext;
 
-import org.eclipse.aether.internal.impl.synccontext.named.BasedirNameMapper;
-import org.eclipse.aether.internal.impl.synccontext.named.GAVNameMapper;
+import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
 import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
 import org.junit.BeforeClass;
 
 public class FileLockAdapterTest extends NamedLockFactoryAdapterTestSupport {
     @BeforeClass
     public static void createNamedLockFactory() {
-        nameMapper = new BasedirNameMapper(GAVNameMapper.fileGav());
+        nameMapper = NameMappers.fileGavNameMapper();
         namedLockFactory = new FileLockNamedLockFactory();
         createAdapter();
     }
diff --git 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/NamedLockFactoryAdapterTestSupport.java
 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/NamedLockFactoryAdapterTestSupport.java
index 93226d814..8eb260cda 100644
--- 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/NamedLockFactoryAdapterTestSupport.java
+++ 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/NamedLockFactoryAdapterTestSupport.java
@@ -29,9 +29,8 @@ import java.util.concurrent.TimeUnit;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.SyncContext;
 import org.eclipse.aether.artifact.DefaultArtifact;
-import 
org.eclipse.aether.internal.impl.synccontext.named.DiscriminatingNameMapper;
-import org.eclipse.aether.internal.impl.synccontext.named.GAVNameMapper;
 import org.eclipse.aether.internal.impl.synccontext.named.NameMapper;
+import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
 import 
org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter;
 import org.eclipse.aether.named.NamedLockFactory;
 import org.eclipse.aether.named.support.LockUpgradeNotSupportedException;
@@ -59,7 +58,7 @@ public abstract class NamedLockFactoryAdapterTestSupport {
     /**
      * Subclass MAY populate this field but subclass must take care of proper 
cleanup as well, if needed!
      */
-    protected static NameMapper nameMapper = new 
DiscriminatingNameMapper(GAVNameMapper.gav());
+    protected static NameMapper nameMapper = 
NameMappers.discriminatingNameMapper();
 
     /**
      * Subclass MUST populate this field but subclass must take care of proper 
cleanup as well, if needed! Once set,
diff --git 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/BasedirNameMapperTest.java
 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/BasedirNameMapperTest.java
index 0054b0285..ce5bc759d 100644
--- 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/BasedirNameMapperTest.java
+++ 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/BasedirNameMapperTest.java
@@ -38,7 +38,7 @@ import static org.hamcrest.Matchers.hasSize;
 public class BasedirNameMapperTest extends NameMapperTestSupport {
     private static final String PS = File.separator;
 
-    BasedirNameMapper mapper = new BasedirNameMapper(new 
HashingNameMapper(GAVNameMapper.gav()));
+    NameMapper mapper = NameMappers.fileHashingGavNameMapper();
 
     @Test
     public void nullsAndEmptyInputs() {
diff --git 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapperTest.java
 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapperTest.java
index 0adc3b0ad..40f5c4fc4 100644
--- 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapperTest.java
+++ 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/GAVNameMapperTest.java
@@ -34,7 +34,7 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasSize;
 
 public class GAVNameMapperTest extends NameMapperTestSupport {
-    NameMapper mapper = GAVNameMapper.fileGav();
+    NameMapper mapper = NameMappers.gavNameMapper(true);
 
     @Test
     public void nullsAndEmptyInputs() {
diff --git 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/HashingNameMapperTest.java
 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/HashingNameMapperTest.java
index 458380ed5..03fb25f1a 100644
--- 
a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/HashingNameMapperTest.java
+++ 
b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/synccontext/named/HashingNameMapperTest.java
@@ -34,7 +34,7 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasSize;
 
 public class HashingNameMapperTest extends NameMapperTestSupport {
-    HashingNameMapper mapper = new HashingNameMapper(GAVNameMapper.gav());
+    HashingNameMapper mapper = new 
HashingNameMapper(NameMappers.gavNameMapper(false));
 
     @Test
     public void nullsAndEmptyInputs() {
diff --git 
a/maven-resolver-named-locks-hazelcast/src/test/java/org/eclipse/aether/named/hazelcast/NamedLockFactoryAdapterTestSupport.java
 
b/maven-resolver-named-locks-hazelcast/src/test/java/org/eclipse/aether/named/hazelcast/NamedLockFactoryAdapterTestSupport.java
index bc3310035..f74b98991 100644
--- 
a/maven-resolver-named-locks-hazelcast/src/test/java/org/eclipse/aether/named/hazelcast/NamedLockFactoryAdapterTestSupport.java
+++ 
b/maven-resolver-named-locks-hazelcast/src/test/java/org/eclipse/aether/named/hazelcast/NamedLockFactoryAdapterTestSupport.java
@@ -29,8 +29,7 @@ import java.util.concurrent.TimeUnit;
 import org.eclipse.aether.RepositorySystemSession;
 import org.eclipse.aether.SyncContext;
 import org.eclipse.aether.artifact.DefaultArtifact;
-import 
org.eclipse.aether.internal.impl.synccontext.named.DiscriminatingNameMapper;
-import org.eclipse.aether.internal.impl.synccontext.named.GAVNameMapper;
+import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
 import 
org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter;
 import org.eclipse.aether.named.NamedLockFactory;
 import org.eclipse.aether.named.support.LockUpgradeNotSupportedException;
@@ -63,7 +62,7 @@ public abstract class NamedLockFactoryAdapterTestSupport {
     private RepositorySystemSession session;
 
     protected static void setNamedLockFactory(final NamedLockFactory 
namedLockFactory) {
-        adapter = new NamedLockFactoryAdapter(new 
DiscriminatingNameMapper(GAVNameMapper.gav()), namedLockFactory);
+        adapter = new 
NamedLockFactoryAdapter(NameMappers.discriminatingNameMapper(), 
namedLockFactory);
     }
 
     @AfterClass
diff --git 
a/maven-resolver-supplier/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
 
b/maven-resolver-supplier/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
index 9e2f299a9..625740c63 100644
--- 
a/maven-resolver-supplier/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
+++ 
b/maven-resolver-supplier/src/main/java/org/eclipse/aether/supplier/RepositorySystemSupplier.java
@@ -186,9 +186,12 @@ public class RepositorySystemSupplier implements 
Supplier<RepositorySystem> {
         HashMap<String, NameMapper> result = new HashMap<>();
         result.put(NameMappers.STATIC_NAME, NameMappers.staticNameMapper());
         result.put(NameMappers.GAV_NAME, NameMappers.gavNameMapper());
+        result.put(NameMappers.GAECV_NAME, NameMappers.gaecvNameMapper());
         result.put(NameMappers.DISCRIMINATING_NAME, 
NameMappers.discriminatingNameMapper());
         result.put(NameMappers.FILE_GAV_NAME, NameMappers.fileGavNameMapper());
+        result.put(NameMappers.FILE_GAECV_NAME, 
NameMappers.fileGaecvNameMapper());
         result.put(NameMappers.FILE_HGAV_NAME, 
NameMappers.fileHashingGavNameMapper());
+        result.put(NameMappers.FILE_HGAECV_NAME, 
NameMappers.fileHashingGaecvNameMapper());
         return result;
     }
 
diff --git a/src/site/markdown/configuration.md 
b/src/site/markdown/configuration.md
index 6669adba3..f1c691574 100644
--- a/src/site/markdown/configuration.md
+++ b/src/site/markdown/configuration.md
@@ -100,7 +100,7 @@ under the License.
 | `aether.syncContext.named.basedir.locksDir`                                 
| String                | The basedir path for file named locks. If relative, 
resolved against local repository root, if absolute, used as is.                
                                                                                
                                                                                
                                                                                
                 [...]
 | `aether.syncContext.named.factory`                                          
| String                | Name of the named lock factory implementing the 
`org.eclipse.aether.named.NamedLockFactory` interface.                          
                                                                                
                                                                                
                                                                                
                     [...]
 | `aether.syncContext.named.hashing.depth`                                    
| int                   | The directory depth to "spread" hashes in git-like 
fashion, integer between 0 and 4 (inclusive).                                   
                                                                                
                                                                                
                                                                                
                  [...]
-| `aether.syncContext.named.nameMapper`                                       
| String                | Name of name mapper implementing the 
`org.eclipse.aether.internal.impl.synccontext.named.NameMapper` interface.      
                                                                                
                                                                                
                                                                                
                                [...]
+| `aether.syncContext.named.nameMapper`                                       
| String                | Name of name mapper implementing the 
`org.eclipse.aether.internal.impl.synccontext.named.NameMapper` interface.      
                                                                                
                                                                                
                                                                                
                                [...]
 | `aether.syncContext.named.retry`                                            
| int                   | Count of retries SyncContext adapter should perform, 
when obtaining locks.                                                           
                                                                                
                                                                                
                                                                                
                [...]
 | `aether.syncContext.named.retry.wait`                                       
| long                  | Amount of milliseconds a thread to wait between 
retries, when obtaining locks.                                                  
                                                                                
                                                                                
                                                                                
                     [...]
 | `aether.syncContext.named.time`                                             
| long                  | Amount of time a synchronization context shall wait 
to obtain a lock.                                                               
                                                                                
                                                                                
                                                                                
                 [...]


Reply via email to