org.eclipse.sisu
org.eclipse.sisu.plexus
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
index 3a7f81de7b49..ad4a37971ca6 100644
--- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
@@ -32,7 +32,6 @@
import java.util.Set;
import org.apache.maven.model.Model;
-import org.apache.maven.model.building.DefaultModelBuilderFactory;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.FileModelSource;
import org.apache.maven.model.building.ModelBuilder;
@@ -70,8 +69,6 @@
import org.eclipse.aether.resolution.VersionRequest;
import org.eclipse.aether.resolution.VersionResolutionException;
import org.eclipse.aether.resolution.VersionResult;
-import org.eclipse.aether.spi.locator.Service;
-import org.eclipse.aether.spi.locator.ServiceLocator;
import org.eclipse.aether.transfer.ArtifactNotFoundException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -81,7 +78,7 @@
*/
@Named
@Singleton
-public class DefaultArtifactDescriptorReader implements ArtifactDescriptorReader, Service {
+public class DefaultArtifactDescriptorReader implements ArtifactDescriptorReader {
private RemoteRepositoryManager remoteRepositoryManager;
private VersionResolver versionResolver;
@@ -188,20 +185,6 @@ public DefaultArtifactDescriptorReader(
setArtifactDescriptorDecorators(artifactDescriptorDecorators);
}
- @Deprecated
- public void initService(ServiceLocator locator) {
- setRemoteRepositoryManager(locator.getService(RemoteRepositoryManager.class));
- setVersionResolver(locator.getService(VersionResolver.class));
- setVersionRangeResolver(locator.getService(VersionRangeResolver.class));
- setArtifactResolver(locator.getService(ArtifactResolver.class));
- modelBuilder = locator.getService(ModelBuilder.class);
- if (modelBuilder == null) {
- setModelBuilder(new DefaultModelBuilderFactory().newInstance());
- }
- setRepositoryEventDispatcher(locator.getService(RepositoryEventDispatcher.class));
- setModelCacheFactory(locator.getService(ModelCacheFactory.class));
- }
-
public DefaultArtifactDescriptorReader setRemoteRepositoryManager(RemoteRepositoryManager remoteRepositoryManager) {
this.remoteRepositoryManager =
Objects.requireNonNull(remoteRepositoryManager, "remoteRepositoryManager cannot be null");
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
index f5e1879bdab5..fe20ff400e46 100644
--- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
@@ -54,8 +54,6 @@
import org.eclipse.aether.resolution.VersionRangeRequest;
import org.eclipse.aether.resolution.VersionRangeResolutionException;
import org.eclipse.aether.resolution.VersionRangeResult;
-import org.eclipse.aether.spi.locator.Service;
-import org.eclipse.aether.spi.locator.ServiceLocator;
import org.eclipse.aether.spi.synccontext.SyncContextFactory;
import org.eclipse.aether.util.ConfigUtils;
import org.eclipse.aether.util.version.GenericVersionScheme;
@@ -70,7 +68,7 @@
*/
@Named
@Singleton
-public class DefaultVersionRangeResolver implements VersionRangeResolver, Service {
+public class DefaultVersionRangeResolver implements VersionRangeResolver {
/**
* Configuration property for version range resolution used metadata {@link Metadata.Nature}.
* It may contain string names of {@link Metadata.Nature} enum values, or string value {@code "auto"}
@@ -105,13 +103,6 @@ public DefaultVersionRangeResolver(
setRepositoryEventDispatcher(repositoryEventDispatcher);
}
- @Deprecated
- public void initService(ServiceLocator locator) {
- setMetadataResolver(locator.getService(MetadataResolver.class));
- setSyncContextFactory(locator.getService(SyncContextFactory.class));
- setRepositoryEventDispatcher(locator.getService(RepositoryEventDispatcher.class));
- }
-
public DefaultVersionRangeResolver setMetadataResolver(MetadataResolver metadataResolver) {
this.metadataResolver = Objects.requireNonNull(metadataResolver, "metadataResolver cannot be null");
return this;
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionResolver.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionResolver.java
index 70b65d9b2602..49566d8521cd 100644
--- a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionResolver.java
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionResolver.java
@@ -60,8 +60,6 @@
import org.eclipse.aether.resolution.VersionRequest;
import org.eclipse.aether.resolution.VersionResolutionException;
import org.eclipse.aether.resolution.VersionResult;
-import org.eclipse.aether.spi.locator.Service;
-import org.eclipse.aether.spi.locator.ServiceLocator;
import org.eclipse.aether.spi.synccontext.SyncContextFactory;
import org.eclipse.aether.util.ConfigUtils;
@@ -70,7 +68,7 @@
*/
@Named
@Singleton
-public class DefaultVersionResolver implements VersionResolver, Service {
+public class DefaultVersionResolver implements VersionResolver {
private static final String MAVEN_METADATA_XML = "maven-metadata.xml";
@@ -101,13 +99,6 @@ public DefaultVersionResolver(
setRepositoryEventDispatcher(repositoryEventDispatcher);
}
- @Deprecated
- public void initService(ServiceLocator locator) {
- setMetadataResolver(locator.getService(MetadataResolver.class));
- setSyncContextFactory(locator.getService(SyncContextFactory.class));
- setRepositoryEventDispatcher(locator.getService(RepositoryEventDispatcher.class));
- }
-
public DefaultVersionResolver setMetadataResolver(MetadataResolver metadataResolver) {
this.metadataResolver = Objects.requireNonNull(metadataResolver, "metadataResolver cannot be null");
return this;
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/Maven3ScopeManagerConfiguration.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/Maven3ScopeManagerConfiguration.java
new file mode 100644
index 000000000000..951b94188341
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/Maven3ScopeManagerConfiguration.java
@@ -0,0 +1,198 @@
+/*
+ * 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.apache.maven.repository.supplier;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.stream.Collectors;
+
+import org.eclipse.aether.artifact.ArtifactProperties;
+import org.eclipse.aether.impl.scope.BuildScopeMatrixSource;
+import org.eclipse.aether.impl.scope.BuildScopeSource;
+import org.eclipse.aether.impl.scope.CommonBuilds;
+import org.eclipse.aether.impl.scope.InternalScopeManager;
+import org.eclipse.aether.impl.scope.ScopeManagerConfiguration;
+import org.eclipse.aether.internal.impl.scope.ScopeManagerDump;
+import org.eclipse.aether.scope.DependencyScope;
+import org.eclipse.aether.scope.ResolutionScope;
+import org.eclipse.aether.util.artifact.JavaScopes;
+
+import static org.eclipse.aether.impl.scope.BuildScopeQuery.all;
+import static org.eclipse.aether.impl.scope.BuildScopeQuery.byBuildPath;
+import static org.eclipse.aether.impl.scope.BuildScopeQuery.byProjectPath;
+import static org.eclipse.aether.impl.scope.BuildScopeQuery.select;
+import static org.eclipse.aether.impl.scope.BuildScopeQuery.singleton;
+import static org.eclipse.aether.impl.scope.BuildScopeQuery.union;
+
+/**
+ * Maven3 scope configurations. Configures scope manager to support Maven3 scopes.
+ *
+ * This manager supports the old Maven 3 dependency scopes + new scopes.
+ *
+ * Note: Maven3 CANNOT support new scopes "test-only" and "test-runtime", as it does not distinguish
+ * resolution scope (the class {@code ResolutionScope} has only "TEST", instead of "TEST_COMPILE" and "TEST_RUNTIME").
+ * This scope manager configuration is not used in Maven 3!
+ *
+ * @since 3.10.0
+ */
+public final class Maven3ScopeManagerConfiguration implements ScopeManagerConfiguration {
+ public static final Maven3ScopeManagerConfiguration INSTANCE = new Maven3ScopeManagerConfiguration();
+ public static final String DS_NONE = "none";
+ public static final String DS_COMPILE = JavaScopes.COMPILE;
+ public static final String DS_RUNTIME = JavaScopes.RUNTIME;
+ public static final String DS_PROVIDED = JavaScopes.PROVIDED;
+ public static final String DS_SYSTEM = JavaScopes.SYSTEM;
+ public static final String DS_TEST = JavaScopes.TEST;
+
+ public static final String DS_COMPILE_ONLY = "compile-only";
+ public static final String DS_TEST_ONLY = "test-only";
+ public static final String DS_TEST_RUNTIME = "test-runtime";
+
+ public static final String RS_NONE = "none";
+ public static final String RS_MAIN_COMPILE = "main-compile";
+ public static final String RS_MAIN_COMPILE_PLUS_RUNTIME = "main-compilePlusRuntime";
+ public static final String RS_MAIN_RUNTIME = "main-runtime";
+ public static final String RS_MAIN_RUNTIME_PLUS_SYSTEM = "main-runtimePlusSystem";
+ public static final String RS_TEST = "test";
+ public static final String RS_TEST_COMPILE = "test-compile";
+ public static final String RS_TEST_RUNTIME = "test-runtime";
+
+ private Maven3ScopeManagerConfiguration() {}
+
+ @Override
+ public String getId() {
+ return "Maven3";
+ }
+
+ @Override
+ public boolean isStrictDependencyScopes() {
+ return false;
+ }
+
+ @Override
+ public boolean isStrictResolutionScopes() {
+ return false;
+ }
+
+ @Override
+ public BuildScopeSource getBuildScopeSource() {
+ return new BuildScopeMatrixSource(
+ Arrays.asList(CommonBuilds.PROJECT_PATH_MAIN, CommonBuilds.PROJECT_PATH_TEST),
+ Arrays.asList(CommonBuilds.BUILD_PATH_COMPILE, CommonBuilds.BUILD_PATH_RUNTIME),
+ CommonBuilds.MAVEN_TEST_BUILD_SCOPE);
+ }
+
+ @Override
+ public Collection buildDependencyScopes(InternalScopeManager internalScopeManager) {
+ ArrayList result = new ArrayList<>();
+ result.add(internalScopeManager.createDependencyScope(DS_NONE, false, Collections.emptySet()));
+ result.add(internalScopeManager.createDependencyScope(DS_COMPILE, true, all()));
+ result.add(internalScopeManager.createDependencyScope(
+ DS_COMPILE_ONLY, false, select(CommonBuilds.PROJECT_PATH_MAIN, CommonBuilds.BUILD_PATH_COMPILE)));
+ result.add(internalScopeManager.createDependencyScope(
+ DS_RUNTIME, true, byBuildPath(CommonBuilds.BUILD_PATH_RUNTIME)));
+ result.add(internalScopeManager.createDependencyScope(
+ DS_PROVIDED,
+ false,
+ union(
+ byBuildPath(CommonBuilds.BUILD_PATH_COMPILE),
+ select(CommonBuilds.PROJECT_PATH_TEST, CommonBuilds.BUILD_PATH_RUNTIME))));
+ result.add(internalScopeManager.createDependencyScope(
+ DS_TEST, false, byProjectPath(CommonBuilds.PROJECT_PATH_TEST)));
+ result.add(internalScopeManager.createDependencyScope(
+ DS_TEST_ONLY, false, singleton(CommonBuilds.PROJECT_PATH_TEST, CommonBuilds.BUILD_PATH_COMPILE)));
+ result.add(internalScopeManager.createDependencyScope(
+ DS_TEST_RUNTIME, false, singleton(CommonBuilds.PROJECT_PATH_TEST, CommonBuilds.BUILD_PATH_RUNTIME)));
+ result.add(internalScopeManager.createSystemDependencyScope(
+ DS_SYSTEM, false, all(), ArtifactProperties.LOCAL_PATH));
+ return result;
+ }
+
+ @Override
+ public Collection buildResolutionScopes(InternalScopeManager internalScopeManager) {
+ Collection allDependencyScopes = internalScopeManager.getDependencyScopeUniverse();
+ Collection nonTransitiveDependencyScopes =
+ allDependencyScopes.stream().filter(s -> !s.isTransitive()).collect(Collectors.toSet());
+ DependencyScope system =
+ internalScopeManager.getDependencyScope(DS_SYSTEM).orElse(null);
+
+ ArrayList result = new ArrayList<>();
+ result.add(internalScopeManager.createResolutionScope(
+ RS_NONE,
+ InternalScopeManager.Mode.REMOVE,
+ Collections.emptySet(),
+ Collections.emptySet(),
+ allDependencyScopes));
+ result.add(internalScopeManager.createResolutionScope(
+ RS_MAIN_COMPILE,
+ Collections.singleton("compile"),
+ InternalScopeManager.Mode.ELIMINATE,
+ singleton(CommonBuilds.PROJECT_PATH_MAIN, CommonBuilds.BUILD_PATH_COMPILE),
+ Collections.singletonList(system),
+ nonTransitiveDependencyScopes));
+ result.add(internalScopeManager.createResolutionScope(
+ RS_MAIN_COMPILE_PLUS_RUNTIME,
+ Collections.singleton("compile+runtime"),
+ InternalScopeManager.Mode.ELIMINATE,
+ byProjectPath(CommonBuilds.PROJECT_PATH_MAIN),
+ Collections.singletonList(system),
+ nonTransitiveDependencyScopes));
+ result.add(internalScopeManager.createResolutionScope(
+ RS_MAIN_RUNTIME,
+ Collections.singleton("runtime"),
+ InternalScopeManager.Mode.ELIMINATE,
+ singleton(CommonBuilds.PROJECT_PATH_MAIN, CommonBuilds.BUILD_PATH_RUNTIME),
+ Collections.emptySet(),
+ nonTransitiveDependencyScopes));
+ result.add(internalScopeManager.createResolutionScope(
+ RS_MAIN_RUNTIME_PLUS_SYSTEM,
+ Collections.singleton("runtime+system"),
+ InternalScopeManager.Mode.ELIMINATE,
+ singleton(CommonBuilds.PROJECT_PATH_MAIN, CommonBuilds.BUILD_PATH_RUNTIME),
+ Collections.singletonList(system),
+ nonTransitiveDependencyScopes));
+ result.add(internalScopeManager.createResolutionScope(
+ RS_TEST,
+ InternalScopeManager.Mode.ELIMINATE,
+ byProjectPath(CommonBuilds.PROJECT_PATH_TEST),
+ Collections.singletonList(system),
+ nonTransitiveDependencyScopes));
+ result.add(internalScopeManager.createResolutionScope(
+ RS_TEST_COMPILE,
+ InternalScopeManager.Mode.ELIMINATE,
+ select(CommonBuilds.PROJECT_PATH_TEST, CommonBuilds.BUILD_PATH_COMPILE),
+ Collections.singletonList(system),
+ nonTransitiveDependencyScopes));
+ result.add(internalScopeManager.createResolutionScope(
+ RS_TEST_RUNTIME,
+ InternalScopeManager.Mode.ELIMINATE,
+ select(CommonBuilds.PROJECT_PATH_TEST, CommonBuilds.BUILD_PATH_RUNTIME),
+ Collections.singletonList(system),
+ nonTransitiveDependencyScopes));
+ return result;
+ }
+
+ // ===
+
+ public static void main(String... args) {
+ ScopeManagerDump.dump(Maven3ScopeManagerConfiguration.INSTANCE);
+ }
+}
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/RepositorySystemSupplier.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/RepositorySystemSupplier.java
new file mode 100644
index 000000000000..3b21ac76c082
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/RepositorySystemSupplier.java
@@ -0,0 +1,1191 @@
+/*
+ * 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.apache.maven.repository.supplier;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Supplier;
+
+import org.apache.maven.model.building.DefaultModelBuilderFactory;
+import org.apache.maven.model.building.ModelBuilder;
+import org.apache.maven.repository.internal.DefaultArtifactDescriptorReader;
+import org.apache.maven.repository.internal.DefaultModelCacheFactory;
+import org.apache.maven.repository.internal.DefaultVersionRangeResolver;
+import org.apache.maven.repository.internal.DefaultVersionResolver;
+import org.apache.maven.repository.internal.ModelCacheFactory;
+import org.apache.maven.repository.internal.PluginsMetadataGeneratorFactory;
+import org.apache.maven.repository.internal.SnapshotMetadataGeneratorFactory;
+import org.apache.maven.repository.internal.VersionsMetadataGeneratorFactory;
+import org.eclipse.aether.RepositoryListener;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
+import org.eclipse.aether.impl.ArtifactDescriptorReader;
+import org.eclipse.aether.impl.ArtifactResolver;
+import org.eclipse.aether.impl.DependencyCollector;
+import org.eclipse.aether.impl.Deployer;
+import org.eclipse.aether.impl.Installer;
+import org.eclipse.aether.impl.LocalRepositoryProvider;
+import org.eclipse.aether.impl.MetadataGeneratorFactory;
+import org.eclipse.aether.impl.MetadataResolver;
+import org.eclipse.aether.impl.NamedLockFactorySelector;
+import org.eclipse.aether.impl.OfflineController;
+import org.eclipse.aether.impl.RemoteRepositoryFilterManager;
+import org.eclipse.aether.impl.RemoteRepositoryManager;
+import org.eclipse.aether.impl.RepositoryConnectorProvider;
+import org.eclipse.aether.impl.RepositoryEventDispatcher;
+import org.eclipse.aether.impl.RepositorySystemLifecycle;
+import org.eclipse.aether.impl.RepositorySystemValidator;
+import org.eclipse.aether.impl.UpdateCheckManager;
+import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
+import org.eclipse.aether.impl.VersionRangeResolver;
+import org.eclipse.aether.impl.VersionResolver;
+import org.eclipse.aether.internal.impl.DefaultArtifactPredicateFactory;
+import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
+import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
+import org.eclipse.aether.internal.impl.DefaultChecksumProcessor;
+import org.eclipse.aether.internal.impl.DefaultDeployer;
+import org.eclipse.aether.internal.impl.DefaultInstaller;
+import org.eclipse.aether.internal.impl.DefaultLocalPathComposer;
+import org.eclipse.aether.internal.impl.DefaultLocalPathPrefixComposerFactory;
+import org.eclipse.aether.internal.impl.DefaultLocalRepositoryProvider;
+import org.eclipse.aether.internal.impl.DefaultMetadataResolver;
+import org.eclipse.aether.internal.impl.DefaultOfflineController;
+import org.eclipse.aether.internal.impl.DefaultPathProcessor;
+import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
+import org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider;
+import org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher;
+import org.eclipse.aether.internal.impl.DefaultRepositoryKeyFunctionFactory;
+import org.eclipse.aether.internal.impl.DefaultRepositoryLayoutProvider;
+import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
+import org.eclipse.aether.internal.impl.DefaultRepositorySystemLifecycle;
+import org.eclipse.aether.internal.impl.DefaultRepositorySystemValidator;
+import org.eclipse.aether.internal.impl.DefaultTransporterProvider;
+import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager;
+import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
+import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
+import org.eclipse.aether.internal.impl.LocalPathComposer;
+import org.eclipse.aether.internal.impl.LocalPathPrefixComposerFactory;
+import org.eclipse.aether.internal.impl.Maven2RepositoryLayoutFactory;
+import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
+import org.eclipse.aether.internal.impl.TrackingFileManager;
+import org.eclipse.aether.internal.impl.TrackingFileManagerSupplier;
+import org.eclipse.aether.internal.impl.checksum.DefaultChecksumAlgorithmFactorySelector;
+import org.eclipse.aether.internal.impl.checksum.Md5ChecksumAlgorithmFactory;
+import org.eclipse.aether.internal.impl.checksum.Sha1ChecksumAlgorithmFactory;
+import org.eclipse.aether.internal.impl.checksum.Sha256ChecksumAlgorithmFactory;
+import org.eclipse.aether.internal.impl.checksum.Sha512ChecksumAlgorithmFactory;
+import org.eclipse.aether.internal.impl.checksum.SparseDirectoryTrustedChecksumsSource;
+import org.eclipse.aether.internal.impl.checksum.SummaryFileTrustedChecksumsSource;
+import org.eclipse.aether.internal.impl.checksum.TrustedToProvidedChecksumsSourceAdapter;
+import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector;
+import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate;
+import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector;
+import org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector;
+import org.eclipse.aether.internal.impl.filter.DefaultRemoteRepositoryFilterManager;
+import org.eclipse.aether.internal.impl.filter.FilteringPipelineRepositoryConnectorFactory;
+import org.eclipse.aether.internal.impl.filter.GroupIdRemoteRepositoryFilterSource;
+import org.eclipse.aether.internal.impl.filter.PrefixesLockingInhibitorFactory;
+import org.eclipse.aether.internal.impl.filter.PrefixesRemoteRepositoryFilterSource;
+import org.eclipse.aether.internal.impl.named.DefaultNamedLockFactorySelector;
+import org.eclipse.aether.internal.impl.offline.OfflinePipelineRepositoryConnectorFactory;
+import org.eclipse.aether.internal.impl.resolution.TrustedChecksumsArtifactResolverPostProcessor;
+import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory;
+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.NamedLockFactoryAdapterFactory;
+import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactoryImpl;
+import org.eclipse.aether.internal.impl.transport.http.DefaultChecksumExtractor;
+import org.eclipse.aether.internal.impl.transport.http.Nx2ChecksumExtractor;
+import org.eclipse.aether.internal.impl.transport.http.XChecksumExtractor;
+import org.eclipse.aether.named.NamedLockFactory;
+import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
+import org.eclipse.aether.named.providers.LocalReadWriteLockNamedLockFactory;
+import org.eclipse.aether.named.providers.LocalSemaphoreNamedLockFactory;
+import org.eclipse.aether.named.providers.NoopNamedLockFactory;
+import org.eclipse.aether.spi.artifact.ArtifactPredicateFactory;
+import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
+import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory;
+import org.eclipse.aether.spi.artifact.transformer.ArtifactTransformer;
+import org.eclipse.aether.spi.checksums.ProvidedChecksumsSource;
+import org.eclipse.aether.spi.checksums.TrustedChecksumsSource;
+import org.eclipse.aether.spi.connector.PipelineRepositoryConnectorFactory;
+import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
+import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
+import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector;
+import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
+import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilterSource;
+import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
+import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
+import org.eclipse.aether.spi.connector.transport.TransporterFactory;
+import org.eclipse.aether.spi.connector.transport.TransporterProvider;
+import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractor;
+import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractorStrategy;
+import org.eclipse.aether.spi.io.ChecksumProcessor;
+import org.eclipse.aether.spi.io.PathProcessor;
+import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
+import org.eclipse.aether.spi.locking.LockingInhibitorFactory;
+import org.eclipse.aether.spi.remoterepo.RepositoryKeyFunctionFactory;
+import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor;
+import org.eclipse.aether.spi.synccontext.SyncContextFactory;
+import org.eclipse.aether.spi.validator.ValidatorFactory;
+import org.eclipse.aether.transport.apache.ApacheTransporterFactory;
+import org.eclipse.aether.transport.file.FileTransporterFactory;
+import org.eclipse.aether.util.version.GenericVersionScheme;
+import org.eclipse.aether.version.VersionScheme;
+
+/**
+ * A simple memorizing {@link Supplier} of {@link org.eclipse.aether.RepositorySystem} instance, that on first call
+ * supplies lazily constructed instance, and on each subsequent call same instance. Hence, this instance should be
+ * thrown away immediately once repository system was created and there is no need for more instances. If new
+ * repository system instance needed, new instance of this class must be created. For proper shut down of returned
+ * repository system instance(s) use {@link RepositorySystem#shutdown()} method on supplied instance(s).
+ *
+ * Since Resolver 2.0 this class offers access to various components via public getters, and allows even partial object
+ * graph construction.
+ *
+ * Extend this class {@code createXXX()} methods and override to customize, if needed. The contract of this class makes
+ * sure that these (potentially overridden) methods are invoked only once, and instance created by those methods are
+ * memorized and kept as long as supplier instance is kept open.
+ *
+ * This class is not thread safe and must be used from one thread only, while the constructed {@link RepositorySystem}
+ * is thread safe.
+ *
+ * Important: Given the instance of supplier memorizes the supplier {@link RepositorySystem} instance it supplies,
+ * their lifecycle is shared as well: once supplied repository system is shut-down, this instance becomes closed as
+ * well. Any subsequent {@code getXXX} method invocation attempt will fail with {@link IllegalStateException}.
+ *
+ * @since 3.10.0
+ */
+public class RepositorySystemSupplier implements Supplier {
+ private final AtomicBoolean closed = new AtomicBoolean(false);
+
+ public RepositorySystemSupplier() {}
+
+ private void checkClosed() {
+ if (closed.get()) {
+ throw new IllegalStateException("Supplier is closed");
+ }
+ }
+
+ private PathProcessor pathProcessor;
+
+ public final PathProcessor getPathProcessor() {
+ checkClosed();
+ if (pathProcessor == null) {
+ pathProcessor = createPathProcessor();
+ }
+ return pathProcessor;
+ }
+
+ protected PathProcessor createPathProcessor() {
+ return new DefaultPathProcessor();
+ }
+
+ private ChecksumProcessor checksumProcessor;
+
+ public final ChecksumProcessor getChecksumProcessor() {
+ checkClosed();
+ if (checksumProcessor == null) {
+ checksumProcessor = createChecksumProcessor();
+ }
+ return checksumProcessor;
+ }
+
+ protected ChecksumProcessor createChecksumProcessor() {
+ return new DefaultChecksumProcessor(getPathProcessor());
+ }
+
+ private TrackingFileManager trackingFileManager;
+
+ public final TrackingFileManager getTrackingFileManager() {
+ checkClosed();
+ if (trackingFileManager == null) {
+ trackingFileManager = createTrackingFileManager();
+ }
+ return trackingFileManager;
+ }
+
+ protected TrackingFileManager createTrackingFileManager() {
+ return new TrackingFileManagerSupplier(getNamedLockFactorySelector()).get();
+ }
+
+ private LocalPathComposer localPathComposer;
+
+ public final LocalPathComposer getLocalPathComposer() {
+ checkClosed();
+ if (localPathComposer == null) {
+ localPathComposer = createLocalPathComposer();
+ }
+ return localPathComposer;
+ }
+
+ protected LocalPathComposer createLocalPathComposer() {
+ return new DefaultLocalPathComposer();
+ }
+
+ private LocalPathPrefixComposerFactory localPathPrefixComposerFactory;
+
+ public final LocalPathPrefixComposerFactory getLocalPathPrefixComposerFactory() {
+ checkClosed();
+ if (localPathPrefixComposerFactory == null) {
+ localPathPrefixComposerFactory = createLocalPathPrefixComposerFactory();
+ }
+ return localPathPrefixComposerFactory;
+ }
+
+ protected LocalPathPrefixComposerFactory createLocalPathPrefixComposerFactory() {
+ return new DefaultLocalPathPrefixComposerFactory(getRepositoryKeyFunctionFactory());
+ }
+
+ private RepositorySystemLifecycle repositorySystemLifecycle;
+
+ public final RepositorySystemLifecycle getRepositorySystemLifecycle() {
+ checkClosed();
+ if (repositorySystemLifecycle == null) {
+ repositorySystemLifecycle = createRepositorySystemLifecycle();
+ repositorySystemLifecycle.addOnSystemEndedHandler(() -> closed.set(true));
+ }
+ return repositorySystemLifecycle;
+ }
+
+ protected RepositorySystemLifecycle createRepositorySystemLifecycle() {
+ return new DefaultRepositorySystemLifecycle();
+ }
+
+ private OfflineController offlineController;
+
+ public final OfflineController getOfflineController() {
+ checkClosed();
+ if (offlineController == null) {
+ offlineController = createOfflineController();
+ }
+ return offlineController;
+ }
+
+ protected OfflineController createOfflineController() {
+ return new DefaultOfflineController();
+ }
+
+ private UpdatePolicyAnalyzer updatePolicyAnalyzer;
+
+ public final UpdatePolicyAnalyzer getUpdatePolicyAnalyzer() {
+ checkClosed();
+ if (updatePolicyAnalyzer == null) {
+ updatePolicyAnalyzer = createUpdatePolicyAnalyzer();
+ }
+ return updatePolicyAnalyzer;
+ }
+
+ protected UpdatePolicyAnalyzer createUpdatePolicyAnalyzer() {
+ return new DefaultUpdatePolicyAnalyzer();
+ }
+
+ private ChecksumPolicyProvider checksumPolicyProvider;
+
+ public final ChecksumPolicyProvider getChecksumPolicyProvider() {
+ checkClosed();
+ if (checksumPolicyProvider == null) {
+ checksumPolicyProvider = createChecksumPolicyProvider();
+ }
+ return checksumPolicyProvider;
+ }
+
+ protected ChecksumPolicyProvider createChecksumPolicyProvider() {
+ return new DefaultChecksumPolicyProvider();
+ }
+
+ private UpdateCheckManager updateCheckManager;
+
+ public final UpdateCheckManager getUpdateCheckManager() {
+ checkClosed();
+ if (updateCheckManager == null) {
+ updateCheckManager = createUpdateCheckManager();
+ }
+ return updateCheckManager;
+ }
+
+ protected UpdateCheckManager createUpdateCheckManager() {
+ return new DefaultUpdateCheckManager(getTrackingFileManager(), getUpdatePolicyAnalyzer(), getPathProcessor());
+ }
+
+ private RepositoryKeyFunctionFactory repositoriesKeyFunctionFactory;
+
+ public final RepositoryKeyFunctionFactory getRepositoryKeyFunctionFactory() {
+ checkClosed();
+ if (repositoriesKeyFunctionFactory == null) {
+ repositoriesKeyFunctionFactory = createRepositoryKeyFunctionFactory();
+ }
+ return repositoriesKeyFunctionFactory;
+ }
+
+ protected RepositoryKeyFunctionFactory createRepositoryKeyFunctionFactory() {
+ return new DefaultRepositoryKeyFunctionFactory();
+ }
+
+ private Map namedLockFactories;
+
+ public final Map getNamedLockFactories() {
+ checkClosed();
+ if (namedLockFactories == null) {
+ namedLockFactories = createNamedLockFactories();
+ }
+ return namedLockFactories;
+ }
+
+ protected Map createNamedLockFactories() {
+ HashMap result = new HashMap<>();
+ result.put(NoopNamedLockFactory.NAME, new NoopNamedLockFactory());
+ result.put(LocalReadWriteLockNamedLockFactory.NAME, new LocalReadWriteLockNamedLockFactory());
+ result.put(LocalSemaphoreNamedLockFactory.NAME, new LocalSemaphoreNamedLockFactory());
+ result.put(FileLockNamedLockFactory.NAME, new FileLockNamedLockFactory());
+ return result;
+ }
+
+ private Map nameMappers;
+
+ public final Map getNameMappers() {
+ checkClosed();
+ if (nameMappers == null) {
+ nameMappers = createNameMappers();
+ }
+ return nameMappers;
+ }
+
+ protected Map createNameMappers() {
+ 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;
+ }
+
+ private Map lockingInhibitorFactories;
+
+ public final Map getLockingInhibitorFactories() {
+ checkClosed();
+ if (lockingInhibitorFactories == null) {
+ lockingInhibitorFactories = createLockingInhibitorFactories();
+ }
+ return lockingInhibitorFactories;
+ }
+
+ protected Map createLockingInhibitorFactories() {
+ HashMap result = new HashMap<>();
+ result.put(PrefixesLockingInhibitorFactory.NAME, new PrefixesLockingInhibitorFactory());
+ return result;
+ }
+
+ private NamedLockFactorySelector namedLockFactorySelector;
+
+ public final NamedLockFactorySelector getNamedLockFactorySelector() {
+ checkClosed();
+ if (namedLockFactorySelector == null) {
+ namedLockFactorySelector = createNamedLockFactorySelector();
+ }
+ return namedLockFactorySelector;
+ }
+
+ protected NamedLockFactorySelector createNamedLockFactorySelector() {
+ return new DefaultNamedLockFactorySelector(getNamedLockFactories(), getRepositorySystemLifecycle());
+ }
+
+ private NamedLockFactoryAdapterFactory namedLockFactoryAdapterFactory;
+
+ public final NamedLockFactoryAdapterFactory getNamedLockFactoryAdapterFactory() {
+ checkClosed();
+ if (namedLockFactoryAdapterFactory == null) {
+ namedLockFactoryAdapterFactory = createNamedLockFactoryAdapterFactory();
+ }
+ return namedLockFactoryAdapterFactory;
+ }
+
+ protected NamedLockFactoryAdapterFactory createNamedLockFactoryAdapterFactory() {
+ return new NamedLockFactoryAdapterFactoryImpl(
+ getNamedLockFactorySelector(), getNameMappers(), getLockingInhibitorFactories());
+ }
+
+ private SyncContextFactory syncContextFactory;
+
+ public final SyncContextFactory getSyncContextFactory() {
+ checkClosed();
+ if (syncContextFactory == null) {
+ syncContextFactory = createSyncContextFactory();
+ }
+ return syncContextFactory;
+ }
+
+ protected SyncContextFactory createSyncContextFactory() {
+ return new DefaultSyncContextFactory(getNamedLockFactoryAdapterFactory());
+ }
+
+ private Map checksumAlgorithmFactories;
+
+ public final Map getChecksumAlgorithmFactories() {
+ checkClosed();
+ if (checksumAlgorithmFactories == null) {
+ checksumAlgorithmFactories = createChecksumAlgorithmFactories();
+ }
+ return checksumAlgorithmFactories;
+ }
+
+ protected Map createChecksumAlgorithmFactories() {
+ HashMap result = new HashMap<>();
+ result.put(Sha512ChecksumAlgorithmFactory.NAME, new Sha512ChecksumAlgorithmFactory());
+ result.put(Sha256ChecksumAlgorithmFactory.NAME, new Sha256ChecksumAlgorithmFactory());
+ result.put(Sha1ChecksumAlgorithmFactory.NAME, new Sha1ChecksumAlgorithmFactory());
+ result.put(Md5ChecksumAlgorithmFactory.NAME, new Md5ChecksumAlgorithmFactory());
+ return result;
+ }
+
+ private ChecksumAlgorithmFactorySelector checksumAlgorithmFactorySelector;
+
+ public final ChecksumAlgorithmFactorySelector getChecksumAlgorithmFactorySelector() {
+ checkClosed();
+ if (checksumAlgorithmFactorySelector == null) {
+ checksumAlgorithmFactorySelector = createChecksumAlgorithmFactorySelector();
+ }
+ return checksumAlgorithmFactorySelector;
+ }
+
+ protected ChecksumAlgorithmFactorySelector createChecksumAlgorithmFactorySelector() {
+ return new DefaultChecksumAlgorithmFactorySelector(getChecksumAlgorithmFactories());
+ }
+
+ private ArtifactPredicateFactory artifactPredicateFactory;
+
+ public final ArtifactPredicateFactory getArtifactPredicateFactory() {
+ checkClosed();
+ if (artifactPredicateFactory == null) {
+ artifactPredicateFactory = createArtifactPredicateFactory();
+ }
+ return artifactPredicateFactory;
+ }
+
+ protected ArtifactPredicateFactory createArtifactPredicateFactory() {
+ return new DefaultArtifactPredicateFactory(getChecksumAlgorithmFactorySelector());
+ }
+
+ private Map repositoryLayoutFactories;
+
+ public final Map getRepositoryLayoutFactories() {
+ checkClosed();
+ if (repositoryLayoutFactories == null) {
+ repositoryLayoutFactories = createRepositoryLayoutFactories();
+ }
+ return repositoryLayoutFactories;
+ }
+
+ protected Map createRepositoryLayoutFactories() {
+ HashMap result = new HashMap<>();
+ result.put(
+ Maven2RepositoryLayoutFactory.NAME,
+ new Maven2RepositoryLayoutFactory(
+ getChecksumAlgorithmFactorySelector(), getArtifactPredicateFactory()));
+ return result;
+ }
+
+ private RepositoryLayoutProvider repositoryLayoutProvider;
+
+ public final RepositoryLayoutProvider getRepositoryLayoutProvider() {
+ checkClosed();
+ if (repositoryLayoutProvider == null) {
+ repositoryLayoutProvider = createRepositoryLayoutProvider();
+ }
+ return repositoryLayoutProvider;
+ }
+
+ protected RepositoryLayoutProvider createRepositoryLayoutProvider() {
+ return new DefaultRepositoryLayoutProvider(getRepositoryLayoutFactories());
+ }
+
+ private LocalRepositoryProvider localRepositoryProvider;
+
+ public final LocalRepositoryProvider getLocalRepositoryProvider() {
+ checkClosed();
+ if (localRepositoryProvider == null) {
+ localRepositoryProvider = createLocalRepositoryProvider();
+ }
+ return localRepositoryProvider;
+ }
+
+ protected LocalRepositoryProvider createLocalRepositoryProvider() {
+ LocalPathComposer localPathComposer = getLocalPathComposer();
+ RepositoryKeyFunctionFactory repositoryKeyFunctionFactory = getRepositoryKeyFunctionFactory();
+ HashMap localRepositoryProviders = new HashMap<>(2);
+ localRepositoryProviders.put(
+ SimpleLocalRepositoryManagerFactory.NAME, new SimpleLocalRepositoryManagerFactory(localPathComposer));
+ localRepositoryProviders.put(
+ EnhancedLocalRepositoryManagerFactory.NAME,
+ new EnhancedLocalRepositoryManagerFactory(
+ localPathComposer,
+ getTrackingFileManager(),
+ getLocalPathPrefixComposerFactory(),
+ repositoryKeyFunctionFactory));
+ return new DefaultLocalRepositoryProvider(localRepositoryProviders);
+ }
+
+ private RemoteRepositoryManager remoteRepositoryManager;
+
+ public final RemoteRepositoryManager getRemoteRepositoryManager() {
+ checkClosed();
+ if (remoteRepositoryManager == null) {
+ remoteRepositoryManager = createRemoteRepositoryManager();
+ }
+ return remoteRepositoryManager;
+ }
+
+ protected RemoteRepositoryManager createRemoteRepositoryManager() {
+ return new DefaultRemoteRepositoryManager(
+ getUpdatePolicyAnalyzer(), getChecksumPolicyProvider(), getRepositoryKeyFunctionFactory());
+ }
+
+ private Map remoteRepositoryFilterSources;
+
+ public final Map getRemoteRepositoryFilterSources() {
+ checkClosed();
+ if (remoteRepositoryFilterSources == null) {
+ remoteRepositoryFilterSources = createRemoteRepositoryFilterSources();
+ }
+ return remoteRepositoryFilterSources;
+ }
+
+ protected Map createRemoteRepositoryFilterSources() {
+ HashMap result = new HashMap<>();
+ result.put(
+ GroupIdRemoteRepositoryFilterSource.NAME,
+ new GroupIdRemoteRepositoryFilterSource(
+ getRepositoryKeyFunctionFactory(), getRepositorySystemLifecycle(), getPathProcessor()));
+ result.put(
+ PrefixesRemoteRepositoryFilterSource.NAME,
+ new PrefixesRemoteRepositoryFilterSource(
+ getRepositoryKeyFunctionFactory(),
+ this::getMetadataResolver,
+ this::getRemoteRepositoryManager,
+ getRepositoryLayoutProvider(),
+ getTransporterProvider()));
+ return result;
+ }
+
+ private RemoteRepositoryFilterManager remoteRepositoryFilterManager;
+
+ public final RemoteRepositoryFilterManager getRemoteRepositoryFilterManager() {
+ checkClosed();
+ if (remoteRepositoryFilterManager == null) {
+ remoteRepositoryFilterManager = createRemoteRepositoryFilterManager();
+ }
+ return remoteRepositoryFilterManager;
+ }
+
+ protected RemoteRepositoryFilterManager createRemoteRepositoryFilterManager() {
+ return new DefaultRemoteRepositoryFilterManager(getRemoteRepositoryFilterSources());
+ }
+
+ private Map repositoryListeners;
+
+ public final Map getRepositoryListeners() {
+ checkClosed();
+ if (repositoryListeners == null) {
+ repositoryListeners = createRepositoryListeners();
+ }
+ return repositoryListeners;
+ }
+
+ protected Map createRepositoryListeners() {
+ return new HashMap<>();
+ }
+
+ private RepositoryEventDispatcher repositoryEventDispatcher;
+
+ public final RepositoryEventDispatcher getRepositoryEventDispatcher() {
+ checkClosed();
+ if (repositoryEventDispatcher == null) {
+ repositoryEventDispatcher = createRepositoryEventDispatcher();
+ }
+ return repositoryEventDispatcher;
+ }
+
+ protected RepositoryEventDispatcher createRepositoryEventDispatcher() {
+ return new DefaultRepositoryEventDispatcher(getRepositoryListeners());
+ }
+
+ private Map trustedChecksumsSources;
+
+ public final Map getTrustedChecksumsSources() {
+ checkClosed();
+ if (trustedChecksumsSources == null) {
+ trustedChecksumsSources = createTrustedChecksumsSources();
+ }
+ return trustedChecksumsSources;
+ }
+
+ protected Map createTrustedChecksumsSources() {
+ HashMap result = new HashMap<>();
+ result.put(
+ SparseDirectoryTrustedChecksumsSource.NAME,
+ new SparseDirectoryTrustedChecksumsSource(
+ getRepositoryKeyFunctionFactory(), getChecksumProcessor(), getLocalPathComposer()));
+ result.put(
+ SummaryFileTrustedChecksumsSource.NAME,
+ new SummaryFileTrustedChecksumsSource(
+ getRepositoryKeyFunctionFactory(),
+ getLocalPathComposer(),
+ getRepositorySystemLifecycle(),
+ getPathProcessor()));
+ return result;
+ }
+
+ private Map providedChecksumsSources;
+
+ public final Map getProvidedChecksumsSources() {
+ checkClosed();
+ if (providedChecksumsSources == null) {
+ providedChecksumsSources = createProvidedChecksumsSources();
+ }
+ return providedChecksumsSources;
+ }
+
+ protected Map createProvidedChecksumsSources() {
+ HashMap result = new HashMap<>();
+ result.put(
+ TrustedToProvidedChecksumsSourceAdapter.NAME,
+ new TrustedToProvidedChecksumsSourceAdapter(getTrustedChecksumsSources()));
+ return result;
+ }
+
+ private Map checksumExtractorStrategies;
+
+ public final Map getChecksumExtractorStrategies() {
+ checkClosed();
+ if (checksumExtractorStrategies == null) {
+ checksumExtractorStrategies = createChecksumExtractorStrategies();
+ }
+ return checksumExtractorStrategies;
+ }
+
+ protected Map createChecksumExtractorStrategies() {
+ HashMap result = new HashMap<>();
+ result.put(XChecksumExtractor.NAME, new XChecksumExtractor());
+ result.put(Nx2ChecksumExtractor.NAME, new Nx2ChecksumExtractor());
+ return result;
+ }
+
+ private ChecksumExtractor checksumExtractor;
+
+ public final ChecksumExtractor getChecksumExtractor() {
+ checkClosed();
+ if (checksumExtractor == null) {
+ checksumExtractor = createChecksumExtractor();
+ }
+ return checksumExtractor;
+ }
+
+ protected ChecksumExtractor createChecksumExtractor() {
+ return new DefaultChecksumExtractor(getChecksumExtractorStrategies());
+ }
+
+ private Map transporterFactories;
+
+ public final Map getTransporterFactories() {
+ checkClosed();
+ if (transporterFactories == null) {
+ transporterFactories = createTransporterFactories();
+ }
+ return transporterFactories;
+ }
+
+ protected Map createTransporterFactories() {
+ HashMap result = new HashMap<>();
+ result.put(FileTransporterFactory.NAME, new FileTransporterFactory());
+ result.put(
+ ApacheTransporterFactory.NAME,
+ new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor()));
+ return result;
+ }
+
+ private TransporterProvider transporterProvider;
+
+ public final TransporterProvider getTransporterProvider() {
+ checkClosed();
+ if (transporterProvider == null) {
+ transporterProvider = createTransporterProvider();
+ }
+ return transporterProvider;
+ }
+
+ protected TransporterProvider createTransporterProvider() {
+ return new DefaultTransporterProvider(getTransporterFactories());
+ }
+
+ private BasicRepositoryConnectorFactory basicRepositoryConnectorFactory;
+
+ public final BasicRepositoryConnectorFactory getBasicRepositoryConnectorFactory() {
+ checkClosed();
+ if (basicRepositoryConnectorFactory == null) {
+ basicRepositoryConnectorFactory = createBasicRepositoryConnectorFactory();
+ }
+ return basicRepositoryConnectorFactory;
+ }
+
+ protected BasicRepositoryConnectorFactory createBasicRepositoryConnectorFactory() {
+ return new BasicRepositoryConnectorFactory(
+ getTransporterProvider(),
+ getRepositoryLayoutProvider(),
+ getChecksumPolicyProvider(),
+ getPathProcessor(),
+ getChecksumProcessor(),
+ getProvidedChecksumsSources());
+ }
+
+ private Map repositoryConnectorFactories;
+
+ public final Map getRepositoryConnectorFactories() {
+ checkClosed();
+ if (repositoryConnectorFactories == null) {
+ repositoryConnectorFactories = createRepositoryConnectorFactories();
+ }
+ return repositoryConnectorFactories;
+ }
+
+ protected Map createRepositoryConnectorFactories() {
+ HashMap result = new HashMap<>();
+ result.put(BasicRepositoryConnectorFactory.NAME, getBasicRepositoryConnectorFactory());
+ return result;
+ }
+
+ private Map pipelineRepositoryConnectorFactories;
+
+ public final Map getPipelineRepositoryConnectorFactories() {
+ checkClosed();
+ if (pipelineRepositoryConnectorFactories == null) {
+ pipelineRepositoryConnectorFactories = createPipelineRepositoryConnectorFactories();
+ }
+ return pipelineRepositoryConnectorFactories;
+ }
+
+ protected Map createPipelineRepositoryConnectorFactories() {
+ HashMap result = new HashMap<>();
+ result.put(
+ FilteringPipelineRepositoryConnectorFactory.NAME,
+ new FilteringPipelineRepositoryConnectorFactory(getRemoteRepositoryFilterManager()));
+ result.put(
+ OfflinePipelineRepositoryConnectorFactory.NAME,
+ new OfflinePipelineRepositoryConnectorFactory(getOfflineController()));
+ return result;
+ }
+
+ private RepositoryConnectorProvider repositoryConnectorProvider;
+
+ public final RepositoryConnectorProvider getRepositoryConnectorProvider() {
+ checkClosed();
+ if (repositoryConnectorProvider == null) {
+ repositoryConnectorProvider = createRepositoryConnectorProvider();
+ }
+ return repositoryConnectorProvider;
+ }
+
+ protected RepositoryConnectorProvider createRepositoryConnectorProvider() {
+ return new DefaultRepositoryConnectorProvider(
+ getRepositoryConnectorFactories(), getPipelineRepositoryConnectorFactories());
+ }
+
+ private Installer installer;
+
+ public final Installer getInstaller() {
+ checkClosed();
+ if (installer == null) {
+ installer = createInstaller();
+ }
+ return installer;
+ }
+
+ protected Installer createInstaller() {
+ return new DefaultInstaller(
+ getPathProcessor(),
+ getRepositoryEventDispatcher(),
+ getArtifactGeneratorFactories(),
+ getMetadataGeneratorFactories(),
+ getArtifactTransformers(),
+ getSyncContextFactory());
+ }
+
+ private Deployer deployer;
+
+ public final Deployer getDeployer() {
+ checkClosed();
+ if (deployer == null) {
+ deployer = createDeployer();
+ }
+ return deployer;
+ }
+
+ protected Deployer createDeployer() {
+ return new DefaultDeployer(
+ getPathProcessor(),
+ getRepositoryEventDispatcher(),
+ getRepositoryConnectorProvider(),
+ getRemoteRepositoryManager(),
+ getUpdateCheckManager(),
+ getArtifactGeneratorFactories(),
+ getMetadataGeneratorFactories(),
+ getArtifactTransformers(),
+ getSyncContextFactory(),
+ getOfflineController());
+ }
+
+ private Map dependencyCollectorDelegates;
+
+ public final Map getDependencyCollectorDelegates() {
+ checkClosed();
+ if (dependencyCollectorDelegates == null) {
+ dependencyCollectorDelegates = createDependencyCollectorDelegates();
+ }
+ return dependencyCollectorDelegates;
+ }
+
+ protected Map createDependencyCollectorDelegates() {
+ RemoteRepositoryManager remoteRepositoryManager = getRemoteRepositoryManager();
+ ArtifactDescriptorReader artifactDescriptorReader = getArtifactDescriptorReader();
+ VersionRangeResolver versionRangeResolver = getVersionRangeResolver();
+ HashMap result = new HashMap<>();
+ result.put(
+ DfDependencyCollector.NAME,
+ new DfDependencyCollector(
+ remoteRepositoryManager,
+ artifactDescriptorReader,
+ versionRangeResolver,
+ getArtifactDecoratorFactories()));
+ result.put(
+ BfDependencyCollector.NAME,
+ new BfDependencyCollector(
+ remoteRepositoryManager,
+ artifactDescriptorReader,
+ versionRangeResolver,
+ getArtifactDecoratorFactories()));
+ return result;
+ }
+
+ private DependencyCollector dependencyCollector;
+
+ public final DependencyCollector getDependencyCollector() {
+ checkClosed();
+ if (dependencyCollector == null) {
+ dependencyCollector = createDependencyCollector();
+ }
+ return dependencyCollector;
+ }
+
+ protected DependencyCollector createDependencyCollector() {
+ return new DefaultDependencyCollector(getDependencyCollectorDelegates());
+ }
+
+ private Map artifactResolverPostProcessors;
+
+ public final Map getArtifactResolverPostProcessors() {
+ checkClosed();
+ if (artifactResolverPostProcessors == null) {
+ artifactResolverPostProcessors = createArtifactResolverPostProcessors();
+ }
+ return artifactResolverPostProcessors;
+ }
+
+ protected Map createArtifactResolverPostProcessors() {
+ HashMap result = new HashMap<>();
+ result.put(
+ TrustedChecksumsArtifactResolverPostProcessor.NAME,
+ new TrustedChecksumsArtifactResolverPostProcessor(
+ getChecksumAlgorithmFactorySelector(), getTrustedChecksumsSources()));
+ return result;
+ }
+
+ private ArtifactResolver artifactResolver;
+
+ public final ArtifactResolver getArtifactResolver() {
+ checkClosed();
+ if (artifactResolver == null) {
+ artifactResolver = createArtifactResolver();
+ }
+ return artifactResolver;
+ }
+
+ protected ArtifactResolver createArtifactResolver() {
+ return new DefaultArtifactResolver(
+ getPathProcessor(),
+ getRepositoryEventDispatcher(),
+ getVersionResolver(),
+ getUpdateCheckManager(),
+ getRepositoryConnectorProvider(),
+ getRemoteRepositoryManager(),
+ getSyncContextFactory(),
+ getOfflineController(),
+ getArtifactResolverPostProcessors(),
+ getRemoteRepositoryFilterManager());
+ }
+
+ private MetadataResolver metadataResolver;
+
+ public final MetadataResolver getMetadataResolver() {
+ checkClosed();
+ if (metadataResolver == null) {
+ metadataResolver = createMetadataResolver();
+ }
+ return metadataResolver;
+ }
+
+ protected MetadataResolver createMetadataResolver() {
+ return new DefaultMetadataResolver(
+ getRepositoryEventDispatcher(),
+ getUpdateCheckManager(),
+ getRepositoryConnectorProvider(),
+ getRemoteRepositoryManager(),
+ getSyncContextFactory(),
+ getOfflineController(),
+ getRemoteRepositoryFilterManager(),
+ getPathProcessor());
+ }
+
+ private VersionScheme versionScheme;
+
+ public final VersionScheme getVersionScheme() {
+ checkClosed();
+ if (versionScheme == null) {
+ versionScheme = createVersionScheme();
+ }
+ return versionScheme;
+ }
+
+ protected VersionScheme createVersionScheme() {
+ return new GenericVersionScheme();
+ }
+
+ private Map artifactGeneratorFactories;
+
+ public final Map getArtifactGeneratorFactories() {
+ checkClosed();
+ if (artifactGeneratorFactories == null) {
+ artifactGeneratorFactories = createArtifactGeneratorFactories();
+ }
+ return artifactGeneratorFactories;
+ }
+
+ protected Map createArtifactGeneratorFactories() {
+ // by default none, this is extension point
+ return new HashMap<>();
+ }
+
+ private Map artifactDecoratorFactories;
+
+ public final Map getArtifactDecoratorFactories() {
+ checkClosed();
+ if (artifactDecoratorFactories == null) {
+ artifactDecoratorFactories = createArtifactDecoratorFactories();
+ }
+ return artifactDecoratorFactories;
+ }
+
+ protected Map createArtifactDecoratorFactories() {
+ // by default none, this is extension point
+ return new HashMap<>();
+ }
+
+ // Maven provided
+
+ private Map artifactTransformers;
+
+ public final Map getArtifactTransformers() {
+ checkClosed();
+ if (artifactTransformers == null) {
+ artifactTransformers = createArtifactTransformers();
+ }
+ return artifactTransformers;
+ }
+
+ protected Map createArtifactTransformers() {
+ return new HashMap<>();
+ }
+
+ private Map metadataGeneratorFactories;
+
+ public final Map getMetadataGeneratorFactories() {
+ checkClosed();
+ if (metadataGeneratorFactories == null) {
+ metadataGeneratorFactories = createMetadataGeneratorFactories();
+ }
+ return metadataGeneratorFactories;
+ }
+
+ protected Map createMetadataGeneratorFactories() {
+ // from maven-resolver-provider
+ HashMap result = new HashMap<>();
+ result.put(PluginsMetadataGeneratorFactory.NAME, new PluginsMetadataGeneratorFactory());
+ result.put(VersionsMetadataGeneratorFactory.NAME, new VersionsMetadataGeneratorFactory());
+ result.put(SnapshotMetadataGeneratorFactory.NAME, new SnapshotMetadataGeneratorFactory());
+ return result;
+ }
+
+ private ArtifactDescriptorReader artifactDescriptorReader;
+
+ public final ArtifactDescriptorReader getArtifactDescriptorReader() {
+ checkClosed();
+ if (artifactDescriptorReader == null) {
+ artifactDescriptorReader = createArtifactDescriptorReader();
+ }
+ return artifactDescriptorReader;
+ }
+
+ protected ArtifactDescriptorReader createArtifactDescriptorReader() {
+ // from maven-resolver-provider
+ return new DefaultArtifactDescriptorReader(
+ getRemoteRepositoryManager(),
+ getVersionResolver(),
+ getVersionRangeResolver(),
+ getArtifactResolver(),
+ getModelBuilder(),
+ getRepositoryEventDispatcher(),
+ getModelCacheFactory());
+ }
+
+ private VersionResolver versionResolver;
+
+ public final VersionResolver getVersionResolver() {
+ checkClosed();
+ if (versionResolver == null) {
+ versionResolver = createVersionResolver();
+ }
+ return versionResolver;
+ }
+
+ protected VersionResolver createVersionResolver() {
+ // from maven-resolver-provider
+ return new DefaultVersionResolver(
+ getMetadataResolver(), getSyncContextFactory(), getRepositoryEventDispatcher());
+ }
+
+ private VersionRangeResolver versionRangeResolver;
+
+ public final VersionRangeResolver getVersionRangeResolver() {
+ checkClosed();
+ if (versionRangeResolver == null) {
+ versionRangeResolver = createVersionRangeResolver();
+ }
+ return versionRangeResolver;
+ }
+
+ protected VersionRangeResolver createVersionRangeResolver() {
+ // from maven-resolver-provider
+ return new DefaultVersionRangeResolver(
+ getMetadataResolver(), getSyncContextFactory(), getRepositoryEventDispatcher());
+ }
+
+ private ModelBuilder modelBuilder;
+
+ public final ModelBuilder getModelBuilder() {
+ checkClosed();
+ if (modelBuilder == null) {
+ modelBuilder = createModelBuilder();
+ }
+ return modelBuilder;
+ }
+
+ protected ModelBuilder createModelBuilder() {
+ // from maven-model-builder
+ return new DefaultModelBuilderFactory().newInstance();
+ }
+
+ private ModelCacheFactory modelCacheFactory;
+
+ public final ModelCacheFactory getModelCacheFactory() {
+ checkClosed();
+ if (modelCacheFactory == null) {
+ modelCacheFactory = createModelCacheFactory();
+ }
+ return modelCacheFactory;
+ }
+
+ protected ModelCacheFactory createModelCacheFactory() {
+ // from maven-resolver-provider
+ return new DefaultModelCacheFactory();
+ }
+
+ private Map validatorFactories;
+
+ public final Map getValidatorFactories() {
+ checkClosed();
+ if (validatorFactories == null) {
+ validatorFactories = createValidatorFactories();
+ }
+ return validatorFactories;
+ }
+
+ protected Map createValidatorFactories() {
+ return new HashMap<>();
+ }
+
+ private RepositorySystemValidator repositorySystemValidator;
+
+ public final RepositorySystemValidator getRepositorySystemValidator() {
+ checkClosed();
+ if (repositorySystemValidator == null) {
+ repositorySystemValidator = createRepositorySystemValidator();
+ }
+ return repositorySystemValidator;
+ }
+
+ protected RepositorySystemValidator createRepositorySystemValidator() {
+ return new DefaultRepositorySystemValidator(getValidatorFactories());
+ }
+
+ private RepositorySystem repositorySystem;
+
+ public final RepositorySystem getRepositorySystem() {
+ checkClosed();
+ if (repositorySystem == null) {
+ repositorySystem = createRepositorySystem();
+ }
+ return repositorySystem;
+ }
+
+ protected RepositorySystem createRepositorySystem() {
+ return new DefaultRepositorySystem(
+ getVersionResolver(),
+ getVersionRangeResolver(),
+ getArtifactResolver(),
+ getMetadataResolver(),
+ getArtifactDescriptorReader(),
+ getDependencyCollector(),
+ getInstaller(),
+ getDeployer(),
+ getLocalRepositoryProvider(),
+ getSyncContextFactory(),
+ getRemoteRepositoryManager(),
+ getRepositorySystemLifecycle(),
+ getArtifactDecoratorFactories(),
+ getRepositorySystemValidator());
+ }
+
+ @Override
+ public RepositorySystem get() {
+ return getRepositorySystem();
+ }
+}
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/SessionBuilderSupplier.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/SessionBuilderSupplier.java
new file mode 100644
index 000000000000..d40933365c9c
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/SessionBuilderSupplier.java
@@ -0,0 +1,209 @@
+/*
+ * 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.apache.maven.repository.supplier;
+
+import java.util.Arrays;
+import java.util.Locale;
+import java.util.function.Supplier;
+
+import org.apache.maven.utils.Os;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession.CloseableSession;
+import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
+import org.eclipse.aether.artifact.DefaultArtifactType;
+import org.eclipse.aether.collection.DependencyGraphTransformer;
+import org.eclipse.aether.collection.DependencyManager;
+import org.eclipse.aether.collection.DependencySelector;
+import org.eclipse.aether.collection.DependencyTraverser;
+import org.eclipse.aether.impl.scope.InternalScopeManager;
+import org.eclipse.aether.impl.scope.ScopeManagerConfiguration;
+import org.eclipse.aether.internal.impl.scope.ManagedDependencyContextRefiner;
+import org.eclipse.aether.internal.impl.scope.ManagedScopeDeriver;
+import org.eclipse.aether.internal.impl.scope.ManagedScopeSelector;
+import org.eclipse.aether.internal.impl.scope.OptionalDependencySelector;
+import org.eclipse.aether.internal.impl.scope.ScopeDependencySelector;
+import org.eclipse.aether.internal.impl.scope.ScopeManagerImpl;
+import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
+import org.eclipse.aether.util.artifact.DefaultArtifactTypeRegistry;
+import org.eclipse.aether.util.artifact.JavaScopes;
+import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
+import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager;
+import org.eclipse.aether.util.graph.selector.AndDependencySelector;
+import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
+import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
+import org.eclipse.aether.util.graph.transformer.ConfigurableVersionSelector;
+import org.eclipse.aether.util.graph.transformer.ConflictResolver;
+import org.eclipse.aether.util.graph.transformer.JavaDependencyContextRefiner;
+import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver;
+import org.eclipse.aether.util.graph.transformer.JavaScopeSelector;
+import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
+import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser;
+import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * A simple {@link Supplier} of {@link SessionBuilder} instances, that on each call supplies newly
+ * constructed instance. To create session out of builder, use {@link SessionBuilder#build()}. For proper closing
+ * of sessions, use {@link CloseableSession#close()} method on built instance(s).
+ *
+ * Extend this class and override methods to customize, if needed.
+ *
+ * Resolver session created as this may or may not use {@link org.eclipse.aether.scope.ScopeManager}.
+ *
+ * @since 3.10.0
+ */
+public class SessionBuilderSupplier implements Supplier {
+ protected final RepositorySystem repositorySystem;
+ protected final InternalScopeManager scopeManager;
+
+ /**
+ * Creates Resolver 2 session using Maven 3 elements without {@link InternalScopeManager}.
+ */
+ public SessionBuilderSupplier(RepositorySystem repositorySystem) {
+ this(repositorySystem, null);
+ }
+
+ /**
+ * Creates Resolver 2 session using Maven 3 elements with or without {@link InternalScopeManager}.
+ */
+ public SessionBuilderSupplier(
+ RepositorySystem repositorySystem, ScopeManagerConfiguration scopeManagerConfiguration) {
+ this.repositorySystem = requireNonNull(repositorySystem);
+ this.scopeManager =
+ scopeManagerConfiguration == null ? null : new ScopeManagerImpl(scopeManagerConfiguration); // nullable
+ }
+
+ public void configureSessionBuilder(SessionBuilder session) {
+ session.setSystemProperties(System.getProperties());
+ boolean caseSensitive = !Os.IS_WINDOWS;
+ System.getenv().forEach((key, value) -> {
+ key = "env." + (caseSensitive ? key : key.toUpperCase(Locale.ENGLISH));
+ session.setSystemProperty(key, value);
+ });
+ if (getScopeManager() != null) {
+ session.setScopeManager(getScopeManager());
+ }
+ session.setDependencyTraverser(getDependencyTraverser());
+ session.setDependencyManager(getDependencyManager());
+ session.setDependencySelector(getDependencySelector());
+ session.setDependencyGraphTransformer(getDependencyGraphTransformer());
+ session.setArtifactTypeRegistry(getArtifactTypeRegistry());
+ session.setArtifactDescriptorPolicy(getArtifactDescriptorPolicy());
+ }
+
+ public InternalScopeManager getScopeManager() {
+ return this.scopeManager;
+ }
+
+ public DependencyTraverser getDependencyTraverser() {
+ return new FatArtifactTraverser();
+ }
+
+ public DependencyManager getDependencyManager() {
+ return this.getDependencyManager(false);
+ }
+
+ public DependencyManager getDependencyManager(boolean transitive) {
+ if (getScopeManager() == null) {
+ return transitive ? new TransitiveDependencyManager() : new ClassicDependencyManager();
+ } else {
+ return transitive
+ ? new TransitiveDependencyManager(getScopeManager())
+ : new ClassicDependencyManager(getScopeManager());
+ }
+ }
+
+ public DependencySelector getDependencySelector() {
+ if (getScopeManager() == null) {
+ return new AndDependencySelector(
+ ScopeDependencySelector.legacy(null, Arrays.asList(JavaScopes.TEST, JavaScopes.PROVIDED)),
+ OptionalDependencySelector.fromDirect(),
+ new ExclusionDependencySelector());
+ } else {
+ return new AndDependencySelector(
+ ScopeDependencySelector.legacy(
+ null,
+ Arrays.asList(
+ Maven3ScopeManagerConfiguration.DS_TEST,
+ Maven3ScopeManagerConfiguration.DS_PROVIDED)),
+ OptionalDependencySelector.fromDirect(),
+ new ExclusionDependencySelector());
+ }
+ }
+
+ public DependencyGraphTransformer getDependencyGraphTransformer() {
+ if (getScopeManager() == null) {
+ return new ChainedDependencyGraphTransformer(
+ new ConflictResolver(
+ new ConfigurableVersionSelector(),
+ new JavaScopeSelector(),
+ new SimpleOptionalitySelector(),
+ new JavaScopeDeriver()),
+ new JavaDependencyContextRefiner());
+ } else {
+ return new ChainedDependencyGraphTransformer(
+ new ConflictResolver(
+ new ConfigurableVersionSelector(),
+ new ManagedScopeSelector(getScopeManager()),
+ new SimpleOptionalitySelector(),
+ new ManagedScopeDeriver(getScopeManager())),
+ new ManagedDependencyContextRefiner(getScopeManager()));
+ }
+ }
+
+ public DefaultArtifactTypeRegistry getArtifactTypeRegistry() {
+ DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry();
+ stereotypes.add(new DefaultArtifactType("pom"));
+ stereotypes.add(new DefaultArtifactType("maven-plugin", "jar", "", "java"));
+ stereotypes.add(new DefaultArtifactType("jar", "jar", "", "java"));
+ stereotypes.add(new DefaultArtifactType("ejb", "jar", "", "java"));
+ stereotypes.add(new DefaultArtifactType("ejb-client", "jar", "client", "java"));
+ stereotypes.add(new DefaultArtifactType("test-jar", "jar", "tests", "java"));
+ stereotypes.add(new DefaultArtifactType("javadoc", "jar", "javadoc", "java"));
+ stereotypes.add(new DefaultArtifactType("java-source", "jar", "sources", "java", false, false));
+ stereotypes.add(new DefaultArtifactType("fatjar", "jar", "", "java", true, true));
+ stereotypes.add(new DefaultArtifactType("war", "war", "", "java", false, true));
+ stereotypes.add(new DefaultArtifactType("ear", "ear", "", "java", false, true));
+ stereotypes.add(new DefaultArtifactType("rar", "rar", "", "java", false, true));
+ stereotypes.add(new DefaultArtifactType("par", "par", "", "java", false, true));
+ return stereotypes;
+ }
+
+ public ArtifactDescriptorPolicy getArtifactDescriptorPolicy() {
+ return new SimpleArtifactDescriptorPolicy(true, true);
+ }
+
+ /**
+ * Creates a new Maven-like repository system session by initializing the session with values typical for
+ * Maven-based resolution. In more detail, this method configures settings relevant for the processing of dependency
+ * graphs, most other settings remain at their generic default value. Use the various setters to further configure
+ * the session with authentication, mirror, proxy and other information required for your environment. At least,
+ * local repository manager needs to be configured to make session be able to create session instance.
+ *
+ * @return SessionBuilder configured with minimally required things for "Maven-based resolution". At least LRM must
+ * be set on builder to make it able to create session instances.
+ */
+ @Override
+ public SessionBuilder get() {
+ SessionBuilder builder = repositorySystem.createSessionBuilder();
+ configureSessionBuilder(builder);
+ return builder;
+ }
+}
diff --git a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/MavenRepositorySystemUtilsTest.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/package-info.java
similarity index 52%
rename from maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/MavenRepositorySystemUtilsTest.java
rename to maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/package-info.java
index f0d578cd115e..00b0e92746a8 100644
--- a/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/MavenRepositorySystemUtilsTest.java
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/supplier/package-info.java
@@ -16,27 +16,10 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.maven.repository.internal;
-import org.eclipse.aether.RepositorySystem;
-import org.eclipse.aether.supplier.RepositorySystemSupplier;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-public class MavenRepositorySystemUtilsTest {
-
- @Test
- public void testGetRepositorySystem() {
- RepositorySystem repoSys = new RepositorySystemSupplier().get();
- assertNotNull(repoSys);
- }
-
- @Test
- public void testGetMetadataGeneratorFactories() {
- assertEquals(
- 3,
- new RepositorySystemSupplier().getMetadataGeneratorFactories().size());
- }
-}
+/**
+ * This package contains the supplier to bring up Resolver (not Maven!) instance, when no DI is wanted.
+ *
+ * @since 3.10.0
+ */
+package org.apache.maven.repository.supplier;
diff --git a/maven-resolver-provider/src/test/java/org/apache/maven/repository/supplier/RepositorySystemSupplierTest.java b/maven-resolver-provider/src/test/java/org/apache/maven/repository/supplier/RepositorySystemSupplierTest.java
new file mode 100644
index 000000000000..6f8b8ee10356
--- /dev/null
+++ b/maven-resolver-provider/src/test/java/org/apache/maven/repository/supplier/RepositorySystemSupplierTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.apache.maven.repository.supplier;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession.CloseableSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.impl.Deployer;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.VersionRangeRequest;
+import org.eclipse.aether.resolution.VersionRangeResult;
+import org.eclipse.aether.spi.io.PathProcessor;
+import org.eclipse.aether.util.graph.visitor.DependencyGraphDumper;
+import org.eclipse.aether.version.Version;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class RepositorySystemSupplierTest {
+ @Test
+ void smoke() throws Exception {
+ try (RepositorySystem system = new RepositorySystemSupplier().get();
+ CloseableSession session = new SessionBuilderSupplier(system, Maven3ScopeManagerConfiguration.INSTANCE)
+ .get()
+ .withLocalRepositoryBaseDirectories(new File("target/local-repo").toPath())
+ .build()) {
+ Artifact artifact = new DefaultArtifact("org.apache.maven.resolver:maven-resolver-util:[0,)");
+ VersionRangeRequest rangeRequest = new VersionRangeRequest();
+ rangeRequest.setArtifact(artifact);
+ rangeRequest.setRepositories(Collections.singletonList(
+ new RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2/")
+ .build()));
+ VersionRangeResult rangeResult = system.resolveVersionRange(session, rangeRequest);
+ List versions = rangeResult.getVersions();
+
+ // As of 2023-11-14, Maven Central has 36 versions of this artifact (and it will just grow)
+ Assertions.assertTrue(versions.size() >= 36);
+ System.out.println("Available " + versions.size() + " versions: " + versions);
+ }
+ }
+
+ @Test
+ void smokeV2Feature() throws Exception {
+ try (RepositorySystem system = new RepositorySystemSupplier().get();
+ CloseableSession session = new SessionBuilderSupplier(system, Maven3ScopeManagerConfiguration.INSTANCE)
+ .get()
+ .withLocalRepositoryBaseDirectories(new File("target/local-repo").toPath())
+ .build()) {
+ CollectRequest collectRequest = new CollectRequest();
+ collectRequest.setResolutionScope(session.getScopeManager()
+ .getResolutionScope(Maven3ScopeManagerConfiguration.RS_TEST_RUNTIME)
+ .orElseThrow(AssertionError::new));
+ collectRequest.setRoot(
+ new Dependency(new DefaultArtifact("org.apache.maven:maven-resolver-provider:3.6.1"), ""));
+ collectRequest.setRepositories(Collections.singletonList(
+ new RemoteRepository.Builder("central", "default", "https://repo.maven.apache.org/maven2/")
+ .build()));
+
+ CollectResult collectResult = system.collectDependencies(session, collectRequest);
+
+ collectResult.getRoot().accept(new DependencyGraphDumper(System.out::println));
+ }
+ }
+
+ @Test
+ void closed() {
+ RepositorySystemSupplier systemSupplier = new RepositorySystemSupplier();
+ systemSupplier.get().close(); // get an instance and immediately shut it down, this closes supplier as well
+ Assertions.assertThrows(IllegalStateException.class, systemSupplier::get);
+ Assertions.assertThrows(IllegalStateException.class, systemSupplier::getRepositorySystem);
+ Assertions.assertThrows(IllegalStateException.class, systemSupplier::getChecksumProcessor);
+ }
+
+ @Test
+ void memorizing() {
+ RepositorySystemSupplier systemSupplier = new RepositorySystemSupplier();
+ PathProcessor pathProcessor = systemSupplier.getPathProcessor();
+ Deployer deployer = systemSupplier.getDeployer();
+ try (RepositorySystem repositorySystem = systemSupplier.get()) {
+ Assertions.assertSame(systemSupplier.get(), repositorySystem);
+ Assertions.assertSame(systemSupplier.getPathProcessor(), pathProcessor);
+ Assertions.assertSame(systemSupplier.getDeployer(), deployer);
+ }
+ Assertions.assertThrows(IllegalStateException.class, systemSupplier::get);
+ Assertions.assertThrows(IllegalStateException.class, systemSupplier::getRepositorySystem);
+ Assertions.assertThrows(IllegalStateException.class, systemSupplier::getDeployer);
+ Assertions.assertThrows(IllegalStateException.class, systemSupplier::getPathProcessor);
+ }
+}
diff --git a/pom.xml b/pom.xml
index ed25b3b68699..42be1743c6fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -419,17 +419,6 @@ under the License.
maven-resolver-impl
${resolverVersion}
-