From db0653d89ee642ef87eca9f982d1ad3851317c85 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Mon, 17 Mar 2025 14:41:01 +0100 Subject: [PATCH 01/11] [MRESOLVER-687] Adding Maven Validator To prevent un-interpolated artifact/dependency/local/remote repo enter Resolver, that treats all coordinates as opaque. --- TODO --- .../resolver/validator/MavenValidator.java | 93 +++++++++++++++++++ .../validator/MavenValidatorFactory.java | 36 +++++++ .../standalone/RepositorySystemSupplier.java | 49 +++++++++- pom.xml | 2 +- 4 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidator.java create mode 100644 impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidatorFactory.java diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidator.java new file mode 100644 index 000000000000..2cdcf577849b --- /dev/null +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidator.java @@ -0,0 +1,93 @@ +/* + * 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.impl.resolver.validator; + +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.metadata.Metadata; +import org.eclipse.aether.repository.LocalRepository; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.spi.validator.Validator; + +/** + * Simplest Maven specific validator that is meant to prevent un-interpolated + * elements enter resolver; if it does, is most likely some bug. + */ +public class MavenValidator implements Validator { + protected boolean containsPlaceholder(String value) { + return value != null && value.contains("${"); + } + + @Override + public void isValidArtifact(Artifact artifact) throws IllegalArgumentException { + if (containsPlaceholder(artifact.getGroupId()) + || containsPlaceholder(artifact.getArtifactId()) + || containsPlaceholder(artifact.getVersion()) + || containsPlaceholder(artifact.getClassifier()) + || containsPlaceholder(artifact.getExtension())) { + throw new IllegalArgumentException("Not fully interpolated artifact " + artifact); + } + } + + @Override + public void isValidMetadata(Metadata metadata) throws IllegalArgumentException { + if (containsPlaceholder(metadata.getGroupId()) + || containsPlaceholder(metadata.getArtifactId()) + || containsPlaceholder(metadata.getVersion()) + || containsPlaceholder(metadata.getType())) { + throw new IllegalArgumentException("Not fully interpolated metadata " + metadata); + } + } + + @Override + public void isValidDependency(Dependency dependency) throws IllegalArgumentException { + Artifact artifact = dependency.getArtifact(); + if (containsPlaceholder(artifact.getGroupId()) + || containsPlaceholder(artifact.getArtifactId()) + || containsPlaceholder(artifact.getVersion()) + || containsPlaceholder(artifact.getClassifier()) + || containsPlaceholder(artifact.getExtension()) + || containsPlaceholder(dependency.getScope()) + || dependency.getExclusions().stream() + .anyMatch(e -> containsPlaceholder(e.getGroupId()) + || containsPlaceholder(e.getArtifactId()) + || containsPlaceholder(e.getClassifier()) + || containsPlaceholder(e.getExtension()))) { + throw new IllegalArgumentException("Not fully interpolated dependency " + dependency); + } + } + + @Override + public void isValidLocalRepository(LocalRepository localRepository) throws IllegalArgumentException { + if (containsPlaceholder(localRepository.getBasePath().toString()) + || containsPlaceholder(localRepository.getContentType()) + || containsPlaceholder(localRepository.getId())) { + throw new IllegalArgumentException("Not fully interpolated local repository " + localRepository); + } + } + + @Override + public void isValidRemoteRepository(RemoteRepository remoteRepository) throws IllegalArgumentException { + if (containsPlaceholder(remoteRepository.getUrl()) + || containsPlaceholder(remoteRepository.getContentType()) + || containsPlaceholder(remoteRepository.getId())) { + throw new IllegalArgumentException("Not fully interpolated remote repository " + remoteRepository); + } + } +} diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidatorFactory.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidatorFactory.java new file mode 100644 index 000000000000..57039f9b23a7 --- /dev/null +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidatorFactory.java @@ -0,0 +1,36 @@ +/* + * 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.impl.resolver.validator; + +import org.apache.maven.api.di.Named; +import org.apache.maven.api.di.Singleton; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.spi.validator.Validator; +import org.eclipse.aether.spi.validator.ValidatorFactory; + +@Named +@Singleton +public class MavenValidatorFactory implements ValidatorFactory { + private final MavenValidator instance = new MavenValidator(); + + @Override + public Validator newInstance(RepositorySystemSession repositorySystemSession) { + return instance; + } +} diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java index 606c7078aabb..0b5530bfc339 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java @@ -23,6 +23,7 @@ import org.apache.maven.api.annotations.Nullable; import org.apache.maven.api.di.Named; import org.apache.maven.api.di.Provides; +import org.apache.maven.impl.resolver.validator.MavenValidatorFactory; import org.eclipse.aether.RepositoryListener; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; @@ -40,11 +41,40 @@ 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.*; +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.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.DefaultTrackingFileManager; +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.checksum.DefaultChecksumAlgorithmFactorySelector; import org.eclipse.aether.internal.impl.checksum.Md5ChecksumAlgorithmFactory; import org.eclipse.aether.internal.impl.checksum.Sha1ChecksumAlgorithmFactory; @@ -94,6 +124,7 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; 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; @@ -220,6 +251,16 @@ static PathProcessor newPathProcessor() { return new DefaultPathProcessor(); } + @Provides + static Map newValidatorFactories() { + return Map.of("maven", new MavenValidatorFactory()); + } + + @Provides + static RepositorySystemValidator newRepositorySystemValidator(Map validatorFactories) { + return new DefaultRepositorySystemValidator(validatorFactories); + } + @Provides static RepositorySystem newRepositorySystem( VersionResolver versionResolver, @@ -234,7 +275,8 @@ static RepositorySystem newRepositorySystem( SyncContextFactory syncContextFactory, RemoteRepositoryManager remoteRepositoryManager, RepositorySystemLifecycle repositorySystemLifecycle, - @Nullable Map artifactDecoratorFactories) { + @Nullable Map artifactDecoratorFactories, + RepositorySystemValidator repositorySystemValidator) { return new DefaultRepositorySystem( versionResolver, versionRangeResolver, @@ -248,7 +290,8 @@ static RepositorySystem newRepositorySystem( syncContextFactory, remoteRepositoryManager, repositorySystemLifecycle, - artifactDecoratorFactories != null ? artifactDecoratorFactories : Map.of()); + artifactDecoratorFactories != null ? artifactDecoratorFactories : Map.of(), + repositorySystemValidator); } @Provides diff --git a/pom.xml b/pom.xml index 04805ad9d767..081c18a1dee7 100644 --- a/pom.xml +++ b/pom.xml @@ -162,7 +162,7 @@ under the License. 1.27 1.4.0 4.0.4 - 2.0.7 + 2.0.8-SNAPSHOT 4.1.0 0.9.0.M3 2.0.17 From b42f8965366b0f1b102c8f63339d5822b2a8eaca Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Mon, 17 Mar 2025 15:52:52 +0100 Subject: [PATCH 02/11] Updates --- .../maven/impl/standalone/RepositorySystemSupplier.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java index 0b5530bfc339..97e841c117da 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java @@ -18,6 +18,8 @@ */ package org.apache.maven.impl.standalone; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import org.apache.maven.api.annotations.Nullable; @@ -252,12 +254,12 @@ static PathProcessor newPathProcessor() { } @Provides - static Map newValidatorFactories() { - return Map.of("maven", new MavenValidatorFactory()); + static List newValidatorFactories() { + return List.of(new MavenValidatorFactory()); } @Provides - static RepositorySystemValidator newRepositorySystemValidator(Map validatorFactories) { + static RepositorySystemValidator newRepositorySystemValidator(List validatorFactories) { return new DefaultRepositorySystemValidator(validatorFactories); } From 185cdbfa439cc6ca5f3639412de9fc7f19d37b7a Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Mon, 17 Mar 2025 15:55:22 +0100 Subject: [PATCH 03/11] Reformat --- .../apache/maven/impl/standalone/RepositorySystemSupplier.java | 1 - 1 file changed, 1 deletion(-) diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java index 97e841c117da..11fd02efa29a 100644 --- a/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java +++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java @@ -18,7 +18,6 @@ */ package org.apache.maven.impl.standalone; -import java.util.ArrayList; import java.util.List; import java.util.Map; From ac7f0dc89d4691d2df21fbf0e44050164cdda805 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 18 Mar 2025 15:35:22 +0100 Subject: [PATCH 04/11] Rename methods --- .../maven/impl/resolver/validator/MavenValidator.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidator.java index 2cdcf577849b..3726a7719f37 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidator.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/validator/MavenValidator.java @@ -35,7 +35,7 @@ protected boolean containsPlaceholder(String value) { } @Override - public void isValidArtifact(Artifact artifact) throws IllegalArgumentException { + public void validateArtifact(Artifact artifact) throws IllegalArgumentException { if (containsPlaceholder(artifact.getGroupId()) || containsPlaceholder(artifact.getArtifactId()) || containsPlaceholder(artifact.getVersion()) @@ -46,7 +46,7 @@ public void isValidArtifact(Artifact artifact) throws IllegalArgumentException { } @Override - public void isValidMetadata(Metadata metadata) throws IllegalArgumentException { + public void validateMetadata(Metadata metadata) throws IllegalArgumentException { if (containsPlaceholder(metadata.getGroupId()) || containsPlaceholder(metadata.getArtifactId()) || containsPlaceholder(metadata.getVersion()) @@ -56,7 +56,7 @@ public void isValidMetadata(Metadata metadata) throws IllegalArgumentException { } @Override - public void isValidDependency(Dependency dependency) throws IllegalArgumentException { + public void validateDependency(Dependency dependency) throws IllegalArgumentException { Artifact artifact = dependency.getArtifact(); if (containsPlaceholder(artifact.getGroupId()) || containsPlaceholder(artifact.getArtifactId()) @@ -74,7 +74,7 @@ public void isValidDependency(Dependency dependency) throws IllegalArgumentExcep } @Override - public void isValidLocalRepository(LocalRepository localRepository) throws IllegalArgumentException { + public void validateLocalRepository(LocalRepository localRepository) throws IllegalArgumentException { if (containsPlaceholder(localRepository.getBasePath().toString()) || containsPlaceholder(localRepository.getContentType()) || containsPlaceholder(localRepository.getId())) { @@ -83,7 +83,7 @@ public void isValidLocalRepository(LocalRepository localRepository) throws Illeg } @Override - public void isValidRemoteRepository(RemoteRepository remoteRepository) throws IllegalArgumentException { + public void validateRemoteRepository(RemoteRepository remoteRepository) throws IllegalArgumentException { if (containsPlaceholder(remoteRepository.getUrl()) || containsPlaceholder(remoteRepository.getContentType()) || containsPlaceholder(remoteRepository.getId())) { From 8e1cf3b683090846e83e0400dde8a27f7884231e Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Fri, 21 Mar 2025 14:13:53 +0100 Subject: [PATCH 05/11] Fix UT by making sure repositories are interpolated before being used --- .../maven/impl/model/DefaultModelBuilder.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java index 298dc260727d..e918edf2a49f 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelBuilder.java @@ -69,7 +69,6 @@ import org.apache.maven.api.model.Model; import org.apache.maven.api.model.Parent; import org.apache.maven.api.model.Profile; -import org.apache.maven.api.model.Repository; import org.apache.maven.api.services.BuilderProblem; import org.apache.maven.api.services.BuilderProblem.Severity; import org.apache.maven.api.services.Interpolator; @@ -498,9 +497,21 @@ public ModelBuilderException newModelBuilderException() { return new ModelBuilderException(result); } - public void mergeRepositories(List toAdd, boolean replace) { - List repos = - toAdd.stream().map(session::createRemoteRepository).toList(); + public void mergeRepositories(Model model, boolean replace) { + if (model.getRepositories().isEmpty()) { + return; + } + // We need to interpolate the repositories before we can use them + Model interpolatedModel = interpolateModel( + Model.newBuilder() + .pomFile(model.getPomFile()) + .repositories(model.getRepositories()) + .build(), + request, + this); + List repos = interpolatedModel.getRepositories().stream() + .map(session::createRemoteRepository) + .toList(); if (replace) { Set ids = repos.stream().map(RemoteRepository::getId).collect(Collectors.toSet()); repositories = repositories.stream() @@ -1016,7 +1027,7 @@ Model resolveAndReadParentExternally(Model childModel, DefaultProfileActivationC // add repositories specified by the current model so that we can resolve the parent if (!childModel.getRepositories().isEmpty()) { var previousRepositories = repositories; - mergeRepositories(childModel.getRepositories(), false); + mergeRepositories(childModel, false); if (!Objects.equals(previousRepositories, repositories)) { if (logger.isDebugEnabled()) { logger.debug("Merging repositories from " + childModel.getId() + "\n" @@ -1196,7 +1207,7 @@ private Model readEffectiveModel() throws ModelBuilderException { if (!resultModel.getRepositories().isEmpty()) { List oldRepos = repositories.stream().map(Object::toString).toList(); - mergeRepositories(resultModel.getRepositories(), true); + mergeRepositories(resultModel, true); List newRepos = repositories.stream().map(Object::toString).toList(); if (!Objects.equals(oldRepos, newRepos)) { From 97c8e0f31f3555b3f2ec65a41cde5aae2d55cb06 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Fri, 21 Mar 2025 14:32:37 +0100 Subject: [PATCH 06/11] Allow snapshot repo --- .mvn/maven.config | 1 + 1 file changed, 1 insertion(+) create mode 100644 .mvn/maven.config diff --git a/.mvn/maven.config b/.mvn/maven.config new file mode 100644 index 000000000000..073198922492 --- /dev/null +++ b/.mvn/maven.config @@ -0,0 +1 @@ +-Dapache.snapshots From bf346f325fa44d8c10567373d69a05e8b7e795b9 Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Fri, 28 Mar 2025 15:29:00 +0100 Subject: [PATCH 07/11] Move the property to `.mvn/maven.properties` file --- .../.mvn/maven.properties | 2 ++ .../resources/mng-5639-import-scope-pom-resolution/pom.xml | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) create mode 100644 its/core-it-suite/src/test/resources/mng-5639-import-scope-pom-resolution/.mvn/maven.properties diff --git a/its/core-it-suite/src/test/resources/mng-5639-import-scope-pom-resolution/.mvn/maven.properties b/its/core-it-suite/src/test/resources/mng-5639-import-scope-pom-resolution/.mvn/maven.properties new file mode 100644 index 000000000000..0344983373a6 --- /dev/null +++ b/its/core-it-suite/src/test/resources/mng-5639-import-scope-pom-resolution/.mvn/maven.properties @@ -0,0 +1,2 @@ +# Value corresponds to the folder name in this directory +repository.url.suffix.property = repo-set-by-property diff --git a/its/core-it-suite/src/test/resources/mng-5639-import-scope-pom-resolution/pom.xml b/its/core-it-suite/src/test/resources/mng-5639-import-scope-pom-resolution/pom.xml index ee0ca564cd41..c119576f3342 100644 --- a/its/core-it-suite/src/test/resources/mng-5639-import-scope-pom-resolution/pom.xml +++ b/its/core-it-suite/src/test/resources/mng-5639-import-scope-pom-resolution/pom.xml @@ -29,11 +29,6 @@ under the License. Checks that an import POM in the dependencyManagement section can be successfully resolved from a repository defining a URL that contains a property. - - - repo-set-by-property - - From be9a84a2c3cf67dec8aa9f819d6d5cefdb052aba Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Thu, 3 Apr 2025 14:49:18 +0200 Subject: [PATCH 08/11] Update supplier --- .../stubs/RepositorySystemSupplier.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/impl/maven-testing/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java b/impl/maven-testing/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java index 5f7246db79ec..7e1926451088 100644 --- a/impl/maven-testing/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java +++ b/impl/maven-testing/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java @@ -18,6 +18,7 @@ */ package org.apache.maven.api.plugin.testing.stubs; +import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -57,6 +58,7 @@ import org.apache.maven.impl.resolver.VersionsMetadataGeneratorFactory; import org.apache.maven.impl.resolver.relocation.DistributionManagementArtifactRelocationSource; import org.apache.maven.impl.resolver.relocation.UserPropertiesArtifactRelocationSource; +import org.apache.maven.impl.resolver.validator.MavenValidatorFactory; import org.eclipse.aether.RepositoryListener; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; @@ -74,6 +76,7 @@ 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; @@ -96,6 +99,7 @@ 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.DefaultTrackingFileManager; import org.eclipse.aether.internal.impl.DefaultTransporterProvider; import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager; @@ -157,6 +161,7 @@ import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; 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; @@ -1081,6 +1086,36 @@ protected ModelBuilder createModelBuilder() { new DefaultRootLocator()); } + private RepositorySystemValidator repositorySystemValidator; + + public RepositorySystemValidator getRepositorySystemValidator() { + checkClosed(); + if (repositorySystemValidator == null) { + repositorySystemValidator = createRepositorySystemValidator(); + } + return repositorySystemValidator; + } + + protected RepositorySystemValidator createRepositorySystemValidator() { + return new DefaultRepositorySystemValidator(getValidatorFactories()); + } + + private List validatorFactories; + + public final List getValidatorFactories() { + checkClosed(); + if (validatorFactories == null) { + validatorFactories = createValidatorFactories(); + } + return validatorFactories; + } + + protected List createValidatorFactories() { + List result = new ArrayList<>(); + result.add(new MavenValidatorFactory()); + return result; + } + private RepositorySystem repositorySystem; public final RepositorySystem getRepositorySystem() { @@ -1105,7 +1140,8 @@ protected RepositorySystem createRepositorySystem() { getSyncContextFactory(), getRemoteRepositoryManager(), getRepositorySystemLifecycle(), - getArtifactDecoratorFactories()); + getArtifactDecoratorFactories(), + getRepositorySystemValidator()); } @Override From eccef1c2ba73209edacd47b08cee3369aadbd22d Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Fri, 4 Apr 2025 15:07:28 +0200 Subject: [PATCH 09/11] Post merge fixes and apply resolver changes --- .../standalone/RepositorySystemSupplier.java | 21 +++++++++++++-- .../stubs/RepositorySystemSupplier.java | 26 ++++++++++++++++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java index 158f2e3d05b0..7089b9fb6690 100644 --- a/impl/maven-impl/src/main/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java +++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/standalone/RepositorySystemSupplier.java @@ -89,8 +89,10 @@ 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.PrefixesRemoteRepositoryFilterSource; +import org.eclipse.aether.internal.impl.offline.OfflinePipelineRepositoryConnectorFactory; 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; @@ -109,6 +111,7 @@ import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory; 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; @@ -182,8 +185,8 @@ static UpdatePolicyAnalyzer newUpdatePolicyAnalyzer() { @Provides static RepositoryConnectorProvider newRepositoryConnectorProvider( Map connectorFactories, - RemoteRepositoryFilterManager remoteRepositoryFilterManager) { - return new DefaultRepositoryConnectorProvider(connectorFactories, remoteRepositoryFilterManager); + Map pipelineConnectorFactories) { + return new DefaultRepositoryConnectorProvider(connectorFactories, pipelineConnectorFactories); } @Named("basic") @@ -202,6 +205,20 @@ static BasicRepositoryConnectorFactory newBasicRepositoryConnectorFactory( providedChecksumsSources); } + @Named(OfflinePipelineRepositoryConnectorFactory.NAME) + @Provides + static OfflinePipelineRepositoryConnectorFactory newOfflinePipelineConnectorFactory( + OfflineController offlineController) { + return new OfflinePipelineRepositoryConnectorFactory(offlineController); + } + + @Named(FilteringPipelineRepositoryConnectorFactory.NAME) + @Provides + static FilteringPipelineRepositoryConnectorFactory newFilteringPipelineConnectorFactory( + RemoteRepositoryFilterManager remoteRepositoryFilterManager) { + return new FilteringPipelineRepositoryConnectorFactory(remoteRepositoryFilterManager); + } + @Provides static RepositoryLayoutProvider newRepositoryLayoutProvider(Map layoutFactories) { return new DefaultRepositoryLayoutProvider(layoutFactories); diff --git a/impl/maven-testing/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java b/impl/maven-testing/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java index 7e1926451088..18a48a4b4710 100644 --- a/impl/maven-testing/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java +++ b/impl/maven-testing/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java @@ -123,8 +123,10 @@ 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.PrefixesRemoteRepositoryFilterSource; +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; @@ -145,6 +147,7 @@ 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; @@ -725,6 +728,27 @@ protected Map createRepositoryConnectorFacto 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( + OfflinePipelineRepositoryConnectorFactory.NAME, + new OfflinePipelineRepositoryConnectorFactory(getOfflineController())); + result.put( + FilteringPipelineRepositoryConnectorFactory.NAME, + new FilteringPipelineRepositoryConnectorFactory(getRemoteRepositoryFilterManager())); + return result; + } + private RepositoryConnectorProvider repositoryConnectorProvider; public final RepositoryConnectorProvider getRepositoryConnectorProvider() { @@ -737,7 +761,7 @@ public final RepositoryConnectorProvider getRepositoryConnectorProvider() { protected RepositoryConnectorProvider createRepositoryConnectorProvider() { return new DefaultRepositoryConnectorProvider( - getRepositoryConnectorFactories(), getRemoteRepositoryFilterManager()); + getRepositoryConnectorFactories(), getPipelineRepositoryConnectorFactories()); } private Installer installer; From 02b187258869de61405f3106733d2bd9e55eb12d Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 12 Apr 2025 07:55:55 +0200 Subject: [PATCH 10/11] Use released version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0e0bf96747bd..5978a366efe4 100644 --- a/pom.xml +++ b/pom.xml @@ -162,7 +162,7 @@ under the License. 1.28 1.5.0 4.1.0 - 2.0.8-SNAPSHOT + 2.0.8 4.1.0 0.9.0.M3 2.0.17 From e98607c0e8417324a02e8287f36639e71138d7b0 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 12 Apr 2025 07:56:38 +0200 Subject: [PATCH 11/11] Drop unused --- .mvn/maven.config | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .mvn/maven.config diff --git a/.mvn/maven.config b/.mvn/maven.config deleted file mode 100644 index 073198922492..000000000000 --- a/.mvn/maven.config +++ /dev/null @@ -1 +0,0 @@ --Dapache.snapshots