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.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 @@ protected void configure() { .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 @@ protected void configure() { .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 @@ Map provideChecksumTypes( return Collections.unmodifiableMap(result); } + @SuppressWarnings("checkstyle:parameternumber") @Provides @Singleton Map 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 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 @@ /** * 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). + *

+ * 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 Collection nameLocks( return keys; } - private String getArtifactName(Artifact artifact) { + protected String getArtifactName(Artifact artifact) { return artifactPrefix + artifact.getGroupId() + fieldSeparator @@ -98,9 +101,9 @@ private String getArtifactName(Artifact artifact) { + 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 @@ private String getMetadataName(Metadata metadata) { 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 @@ /** * 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 static NameMapper staticNameMapper() { } 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 static NameMapper fileStaticNameMapper() { } 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 @@ 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 getManuallyCreatedFactories() { HashMap factories = new HashMap<>(); @@ -75,9 +75,12 @@ private static Map getManuallyCreatedNameMappers() { HashMap 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/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAECVNameMapperProvider.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAECVNameMapperProvider.java new file mode 100644 index 000000000..d24fd77af --- /dev/null +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileGAECVNameMapperProvider.java @@ -0,0 +1,46 @@ +/* + * 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.providers; + +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; + +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 { + private final NameMapper mapper; + + public FileGAECVNameMapperProvider() { + this.mapper = NameMappers.fileGaecvNameMapper(); + } + + @Override + public NameMapper get() { + return mapper; + } +} diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAECVNameMapperProvider.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAECVNameMapperProvider.java new file mode 100644 index 000000000..81f6648dc --- /dev/null +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/FileHashingGAECVNameMapperProvider.java @@ -0,0 +1,46 @@ +/* + * 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.providers; + +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; + +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 { + private final NameMapper mapper; + + public FileHashingGAECVNameMapperProvider() { + this.mapper = NameMappers.fileHashingGaecvNameMapper(); + } + + @Override + public NameMapper get() { + return mapper; + } +} diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/GAECVNameMapperProvider.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/GAECVNameMapperProvider.java new file mode 100644 index 000000000..aadec8609 --- /dev/null +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/providers/GAECVNameMapperProvider.java @@ -0,0 +1,46 @@ +/* + * 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.providers; + +import javax.inject.Named; +import javax.inject.Provider; +import javax.inject.Singleton; + +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 { + 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 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 @@ 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.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.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 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 @@ protected Map getNameMappers() { HashMap 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. | `".locks"` | no | | `aether.syncContext.named.factory` | String | Name of the named lock factory implementing the `org.eclipse.aether.named.NamedLockFactory` interface. | `"rwlock-local"` | no | | `aether.syncContext.named.hashing.depth` | int | The directory depth to "spread" hashes in git-like fashion, integer between 0 and 4 (inclusive). | 2 | no | -| `aether.syncContext.named.nameMapper` | String | Name of name mapper implementing the `org.eclipse.aether.internal.impl.synccontext.named.NameMapper` interface. | `"gav"` | no | +| `aether.syncContext.named.nameMapper` | String | Name of name mapper implementing the `org.eclipse.aether.internal.impl.synccontext.named.NameMapper` interface. | `"gaecv"` | no | | `aether.syncContext.named.retry` | int | Count of retries SyncContext adapter should perform, when obtaining locks. | `1` | no | | `aether.syncContext.named.retry.wait` | long | Amount of milliseconds a thread to wait between retries, when obtaining locks. | `200` | no | | `aether.syncContext.named.time` | long | Amount of time a synchronization context shall wait to obtain a lock. | `900` | no |