You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by mi...@apache.org on 2023/02/05 12:32:59 UTC
[maven] branch master updated: [MNG-7544] MavenMetadataSource#retrieve(MetadataResolutionRequest) does not check for null when reading from project map
This is an automated email from the ASF dual-hosted git repository.
michaelo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/master by this push:
new 0525d90d4 [MNG-7544] MavenMetadataSource#retrieve(MetadataResolutionRequest) does not check for null when reading from project map
0525d90d4 is described below
commit 0525d90d428e0be31c30f0aad68b078a7e2e6ce3
Author: Christoph Läubrich <ch...@laeubi-soft.de>
AuthorDate: Sun Feb 5 08:35:15 2023 +0100
[MNG-7544] MavenMetadataSource#retrieve(MetadataResolutionRequest) does not check for null when reading from project map
Currently, if a project is returned from the workspace reader, but is not part
of the reactor, a NPE occurs. In this case, the repositories are read from
the model instead.
This closes #981
---
.../AbstractArtifactComponentTestCase.java | 3 +-
.../artifact/resolver/ArtifactResolverTest.java | 24 +++++++
.../resolver/TestMavenWorkspaceReader.java | 80 ++++++++++++++++++++++
.../project/artifact/DefaultMetadataSource.java | 8 ++-
.../project/artifact/MavenMetadataSource.java | 48 ++++++++++---
.../apache/maven/project/TestMetadataSource.java | 6 +-
6 files changed, 153 insertions(+), 16 deletions(-)
diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java b/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
index 7aaba7481..3ebf707f8 100644
--- a/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
+++ b/maven-compat/src/test/java/org/apache/maven/artifact/AbstractArtifactComponentTestCase.java
@@ -288,7 +288,7 @@ public abstract class AbstractArtifactComponentTestCase // extends PlexusTestCas
}
}
- protected RepositorySystemSession initRepoSession() throws Exception {
+ protected DefaultRepositorySystemSession initRepoSession() throws Exception {
DefaultRepositorySystemSession session = new DefaultRepositorySystemSession();
session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(true, true));
DependencyTraverser depTraverser = new FatArtifactTraverser();
@@ -311,7 +311,6 @@ public abstract class AbstractArtifactComponentTestCase // extends PlexusTestCas
LocalRepository localRepo = new LocalRepository(localRepository().getBasedir());
session.setLocalRepositoryManager(new SimpleLocalRepositoryManagerFactory().newInstance(session, localRepo));
-
return session;
}
diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java b/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java
index 0bd8f7665..9ed4e43f3 100644
--- a/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java
+++ b/maven-compat/src/test/java/org/apache/maven/artifact/resolver/ArtifactResolverTest.java
@@ -35,6 +35,7 @@ import org.apache.maven.artifact.metadata.ResolutionGroup;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.repository.legacy.metadata.MetadataResolutionRequest;
+import org.eclipse.aether.DefaultRepositorySystemSession;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -65,6 +66,13 @@ public class ArtifactResolverTest extends AbstractArtifactComponentTestCase {
projectArtifact = createLocalArtifact("project", "3.0");
}
+ @Override
+ protected DefaultRepositorySystemSession initRepoSession() throws Exception {
+ DefaultRepositorySystemSession session = super.initRepoSession();
+ session.setWorkspaceReader(new TestMavenWorkspaceReader());
+ return session;
+ }
+
@Override
protected String component() {
return "resolver";
@@ -167,6 +175,17 @@ public class ArtifactResolverTest extends AbstractArtifactComponentTestCase {
assertLocalArtifactPresent(l);
}
+ public void testReadRepoFromModel() throws Exception {
+ Artifact m = createArtifact(TestMavenWorkspaceReader.ARTIFACT_ID, TestMavenWorkspaceReader.VERSION);
+ ArtifactMetadataSource source = getContainer().lookup(ArtifactMetadataSource.class, "maven");
+ ResolutionGroup group = source.retrieve(m, localRepository(), new ArrayList<ArtifactRepository>());
+ List<ArtifactRepository> repositories = group.getResolutionRepositories();
+ assertEquals(1, repositories.size(), "There should be one repository!");
+ ArtifactRepository repository = repositories.get(0);
+ assertEquals(TestMavenWorkspaceReader.REPO_ID, repository.getId());
+ assertEquals(TestMavenWorkspaceReader.REPO_URL, repository.getUrl());
+ }
+
@Test
public void testTransitiveResolutionOrder() throws Exception {
Artifact m = createLocalArtifact("m", "1.0");
@@ -174,6 +193,7 @@ public class ArtifactResolverTest extends AbstractArtifactComponentTestCase {
Artifact n = createLocalArtifact("n", "1.0");
ArtifactMetadataSource mds = new ArtifactMetadataSource() {
+ @Override
public ResolutionGroup retrieve(
Artifact artifact,
ArtifactRepository localRepository,
@@ -183,6 +203,7 @@ public class ArtifactResolverTest extends AbstractArtifactComponentTestCase {
return new ResolutionGroup(artifact, dependencies, remoteRepositories);
}
+ @Override
public List<ArtifactVersion> retrieveAvailableVersions(
Artifact artifact,
ArtifactRepository localRepository,
@@ -190,15 +211,18 @@ public class ArtifactResolverTest extends AbstractArtifactComponentTestCase {
throw new UnsupportedOperationException("Cannot get available versions in this test case");
}
+ @Override
public List<ArtifactVersion> retrieveAvailableVersionsFromDeploymentRepository(
Artifact artifact, ArtifactRepository localRepository, ArtifactRepository remoteRepository) {
throw new UnsupportedOperationException("Cannot get available versions in this test case");
}
+ @Override
public ResolutionGroup retrieve(MetadataResolutionRequest request) {
return retrieve(request.getArtifact(), request.getLocalRepository(), request.getRemoteRepositories());
}
+ @Override
public List<ArtifactVersion> retrieveAvailableVersions(MetadataResolutionRequest request) {
return retrieveAvailableVersions(
request.getArtifact(), request.getLocalRepository(), request.getRemoteRepositories());
diff --git a/maven-compat/src/test/java/org/apache/maven/artifact/resolver/TestMavenWorkspaceReader.java b/maven-compat/src/test/java/org/apache/maven/artifact/resolver/TestMavenWorkspaceReader.java
new file mode 100644
index 000000000..432584fba
--- /dev/null
+++ b/maven-compat/src/test/java/org/apache/maven/artifact/resolver/TestMavenWorkspaceReader.java
@@ -0,0 +1,80 @@
+/*
+ * 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.artifact.resolver;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Repository;
+import org.apache.maven.repository.internal.MavenWorkspaceReader;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.repository.WorkspaceRepository;
+
+public class TestMavenWorkspaceReader implements MavenWorkspaceReader {
+
+ static final String REPO_LAYOUT = "test";
+
+ static final String REPO_URL = "https://test/me";
+
+ static final String REPO_ID = "custom";
+
+ static final String GROUP_ID = "org.apache.maven";
+
+ static final String ARTIFACT_ID = "this.is.a.test";
+
+ static final String VERSION = "99.99";
+
+ private static final WorkspaceRepository WORKSPACE_REPOSITORY = new WorkspaceRepository(REPO_LAYOUT);
+
+ @Override
+ public WorkspaceRepository getRepository() {
+ return WORKSPACE_REPOSITORY;
+ }
+
+ @Override
+ public File findArtifact(Artifact artifact) {
+ return null;
+ }
+
+ @Override
+ public List<String> findVersions(Artifact artifact) {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public Model findModel(Artifact artifact) {
+ if (GROUP_ID.equals(artifact.getGroupId())
+ && ARTIFACT_ID.equals(artifact.getArtifactId())
+ && VERSION.equals(artifact.getVersion())) {
+ Model m = new Model();
+ m.setArtifactId(ARTIFACT_ID);
+ m.setGroupId(GROUP_ID);
+ m.setVersion(VERSION);
+ Repository repository = new Repository();
+ repository.setId(REPO_ID);
+ repository.setUrl(REPO_URL);
+ repository.setLayout(REPO_LAYOUT);
+ m.getRepositories().add(repository);
+ return m;
+ }
+ return null;
+ }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMetadataSource.java b/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMetadataSource.java
index 566dcb740..42c30aee2 100644
--- a/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMetadataSource.java
+++ b/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMetadataSource.java
@@ -24,6 +24,7 @@ import javax.inject.Singleton;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
+import org.apache.maven.bridge.MavenRepositorySystem;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.project.ProjectBuilder;
@@ -40,10 +41,11 @@ public class DefaultMetadataSource extends MavenMetadataSource {
@Inject
public DefaultMetadataSource(
RepositoryMetadataManager repositoryMetadataManager,
- ArtifactFactory repositorySystem,
+ ArtifactFactory artifactFactory,
ProjectBuilder projectBuilder,
MavenMetadataCache cache,
- LegacySupport legacySupport) {
- super(repositoryMetadataManager, repositorySystem, projectBuilder, cache, legacySupport);
+ LegacySupport legacySupport,
+ MavenRepositorySystem mavenRepositorySystem) {
+ super(repositoryMetadataManager, artifactFactory, projectBuilder, cache, legacySupport, mavenRepositorySystem);
}
}
diff --git a/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java b/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
index 3b8023d44..41af27985 100644
--- a/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
+++ b/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
@@ -37,6 +37,7 @@ import java.util.Set;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
@@ -56,12 +57,14 @@ import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.bridge.MavenRepositorySystem;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.DependencyManagement;
import org.apache.maven.model.DistributionManagement;
import org.apache.maven.model.Model;
import org.apache.maven.model.Relocation;
+import org.apache.maven.model.Repository;
import org.apache.maven.model.building.ModelBuildingException;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.model.building.ModelProblem;
@@ -92,23 +95,27 @@ import org.slf4j.LoggerFactory;
public class MavenMetadataSource implements ArtifactMetadataSource {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final RepositoryMetadataManager repositoryMetadataManager;
- private final ArtifactFactory repositorySystem;
+ private final ArtifactFactory artifactFactory;
private final ProjectBuilder projectBuilder;
private final MavenMetadataCache cache;
private final LegacySupport legacySupport;
+ private MavenRepositorySystem mavenRepositorySystem;
+
@Inject
public MavenMetadataSource(
RepositoryMetadataManager repositoryMetadataManager,
- ArtifactFactory repositorySystem,
+ ArtifactFactory artifactFactory,
ProjectBuilder projectBuilder,
MavenMetadataCache cache,
- LegacySupport legacySupport) {
+ LegacySupport legacySupport,
+ MavenRepositorySystem mavenRepositorySystem) {
this.repositoryMetadataManager = repositoryMetadataManager;
- this.repositorySystem = repositorySystem;
+ this.artifactFactory = artifactFactory;
this.projectBuilder = projectBuilder;
this.cache = cache;
this.legacySupport = legacySupport;
+ this.mavenRepositorySystem = mavenRepositorySystem;
}
private void injectSession(MetadataResolutionRequest request) {
@@ -120,6 +127,7 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
}
}
+ @Override
public ResolutionGroup retrieve(
Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories)
throws ArtifactMetadataRetrievalException {
@@ -141,6 +149,7 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
return retrieve(request);
}
+ @Override
public ResolutionGroup retrieve(MetadataResolutionRequest request) throws ArtifactMetadataRetrievalException {
Artifact artifact = request.getArtifact();
@@ -175,10 +184,13 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
Artifact relocatedArtifact = null;
// TODO hack: don't rebuild model if it was already loaded during reactor resolution
- final WorkspaceReader workspace = legacySupport.getRepositorySession().getWorkspaceReader();
- Model model = null;
+ RepositorySystemSession repositorySession = legacySupport.getRepositorySession();
+ final WorkspaceReader workspace = repositorySession.getWorkspaceReader();
+ Model model;
if (workspace instanceof MavenWorkspaceReader) {
model = ((MavenWorkspaceReader) workspace).findModel(RepositoryUtils.toArtifact(artifact));
+ } else {
+ model = null;
}
if (model != null) {
@@ -192,7 +204,7 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
.filter(p -> artifact.equals(p.getArtifact()))
.map(MavenProject::getRemoteArtifactRepositories)
.findFirst()
- .orElseGet(ArrayList::new);
+ .orElseGet(() -> getRepositoriesFromModel(repositorySession, model));
} else {
pomRepositories = new ArrayList<>();
}
@@ -269,6 +281,21 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
return result;
}
+ private List<ArtifactRepository> getRepositoriesFromModel(RepositorySystemSession repositorySession, Model model) {
+ List<ArtifactRepository> pomRepositories = new ArrayList<>();
+ for (Repository modelRepository : model.getRepositories()) {
+ try {
+ pomRepositories.add(MavenRepositorySystem.buildArtifactRepository(modelRepository));
+ } catch (InvalidRepositoryException e) {
+ // can not use this then
+ }
+ }
+ mavenRepositorySystem.injectMirror(repositorySession, pomRepositories);
+ mavenRepositorySystem.injectProxy(repositorySession, pomRepositories);
+ mavenRepositorySystem.injectAuthentication(repositorySession, pomRepositories);
+ return pomRepositories;
+ }
+
private boolean hasFile(Artifact artifact) {
return artifact != null
&& artifact.getFile() != null
@@ -307,7 +334,7 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
ArtifactFilter inheritedFilter = (owner != null) ? owner.getDependencyFilter() : null;
- return createDependencyArtifact(repositorySystem, dependency, inheritedScope, inheritedFilter);
+ return createDependencyArtifact(artifactFactory, dependency, inheritedScope, inheritedFilter);
} catch (InvalidVersionSpecificationException e) {
throw new ArtifactMetadataRetrievalException(
"Invalid version for dependency " + dependency.getManagementKey() + ": " + e.getMessage(), e, pom);
@@ -389,6 +416,7 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
return effectiveFilter;
}
+ @Override
public List<ArtifactVersion> retrieveAvailableVersions(
Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories)
throws ArtifactMetadataRetrievalException {
@@ -400,6 +428,7 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
return retrieveAvailableVersions(request);
}
+ @Override
public List<ArtifactVersion> retrieveAvailableVersions(MetadataResolutionRequest request)
throws ArtifactMetadataRetrievalException {
RepositoryMetadata metadata = new ArtifactRepositoryMetadata(request.getArtifact());
@@ -415,6 +444,7 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
return retrieveAvailableVersionsFromMetadata(metadata.getMetadata(), availableVersions);
}
+ @Override
public List<ArtifactVersion> retrieveAvailableVersionsFromDeploymentRepository(
Artifact artifact, ArtifactRepository localRepository, ArtifactRepository deploymentRepository)
throws ArtifactMetadataRetrievalException {
@@ -488,7 +518,7 @@ public class MavenMetadataSource implements ArtifactMetadataSource {
do {
project = null;
- pomArtifact = repositorySystem.createProjectArtifact(
+ pomArtifact = artifactFactory.createProjectArtifact(
artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), artifact.getScope());
if ("pom".equals(artifact.getType())) {
diff --git a/maven-core/src/test/java/org/apache/maven/project/TestMetadataSource.java b/maven-core/src/test/java/org/apache/maven/project/TestMetadataSource.java
index 47489fc0c..6648da842 100644
--- a/maven-core/src/test/java/org/apache/maven/project/TestMetadataSource.java
+++ b/maven-core/src/test/java/org/apache/maven/project/TestMetadataSource.java
@@ -29,6 +29,7 @@ import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
import org.apache.maven.artifact.metadata.ResolutionGroup;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
+import org.apache.maven.bridge.MavenRepositorySystem;
import org.apache.maven.plugin.LegacySupport;
import org.apache.maven.project.artifact.MavenMetadataCache;
import org.apache.maven.project.artifact.MavenMetadataSource;
@@ -43,8 +44,9 @@ public class TestMetadataSource extends MavenMetadataSource {
ArtifactFactory repositorySystem,
ProjectBuilder projectBuilder,
MavenMetadataCache cache,
- LegacySupport legacySupport) {
- super(repositoryMetadataManager, repositorySystem, projectBuilder, cache, legacySupport);
+ LegacySupport legacySupport,
+ MavenRepositorySystem mavenRepositorySystem) {
+ super(repositoryMetadataManager, repositorySystem, projectBuilder, cache, legacySupport, mavenRepositorySystem);
}
@Override