Skip to content

Commit

Permalink
Replace ModelCache with RequestCache, use ArtifactResolver in Default…
Browse files Browse the repository at this point in the history
…ProjectBuilder
  • Loading branch information
gnodet committed Jan 31, 2025
1 parent 67842da commit ccc05dc
Show file tree
Hide file tree
Showing 8 changed files with 227 additions and 305 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,16 @@
import javax.inject.Inject;

import java.io.File;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.maven.SimpleLookup;
import org.apache.maven.api.ProducedArtifact;
import org.apache.maven.api.services.ArtifactManager;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.metadata.SwitchableMetadataSource;
import org.apache.maven.artifact.repository.ArtifactRepository;
Expand All @@ -34,7 +40,12 @@
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.impl.DefaultArtifact;
import org.apache.maven.impl.DefaultArtifactCoordinatesFactory;
import org.apache.maven.impl.DefaultArtifactResolver;
import org.apache.maven.impl.DefaultModelVersionParser;
import org.apache.maven.impl.DefaultRepositoryFactory;
import org.apache.maven.impl.DefaultVersionParser;
import org.apache.maven.impl.InternalSession;
import org.apache.maven.internal.impl.DefaultSession;
import org.apache.maven.model.Dependency;
Expand All @@ -52,6 +63,7 @@
import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.util.version.GenericVersionScheme;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

Expand All @@ -76,6 +88,9 @@ class LegacyRepositorySystemTest {
@Inject
private PlexusContainer container;

@Inject
private org.eclipse.aether.RepositorySystem resolverRepositorySystem;

protected List<ArtifactRepository> getRemoteRepositories() throws Exception {
File repoDir = new File(getBasedir(), "src/test/remote-repo").getAbsoluteFile();

Expand Down Expand Up @@ -129,11 +144,32 @@ void testThatASystemScopedDependencyIsNotResolvedFromRepositories() throws Excep
legacySupport.setSession(mavenSession);
InternalSession iSession = new DefaultSession(
mavenSession,
resolverRepositorySystem,
null,
null,
null,
new SimpleLookup(List.of(new DefaultRepositoryFactory(new DefaultRemoteRepositoryManager(
new DefaultUpdatePolicyAnalyzer(), new DefaultChecksumPolicyProvider())))),
new SimpleLookup(List.of(
new DefaultRepositoryFactory(new DefaultRemoteRepositoryManager(
new DefaultUpdatePolicyAnalyzer(), new DefaultChecksumPolicyProvider())),
new DefaultVersionParser(new DefaultModelVersionParser(new GenericVersionScheme())),
new DefaultArtifactCoordinatesFactory(),
new DefaultArtifactResolver(),
new ArtifactManager() {
private final Map<String, Path> paths = new ConcurrentHashMap<>();

@Override
public Optional<Path> getPath(org.apache.maven.api.Artifact artifact) {
Path path = paths.get(artifact.key());
if (path == null && artifact instanceof DefaultArtifact defaultArtifact) {
path = defaultArtifact.getArtifact().getPath();
}
return Optional.ofNullable(path);
}

@Override
public void setPath(ProducedArtifact artifact, Path path) {
paths.put(artifact.key(), path);
}
})),
null);
InternalSession.associate(session, iSession);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Collections;
Expand All @@ -46,7 +47,9 @@

import org.apache.maven.ProjectCycleException;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.api.ArtifactCoordinates;
import org.apache.maven.api.Language;
import org.apache.maven.api.LocalRepository;
import org.apache.maven.api.ProjectScope;
import org.apache.maven.api.SessionData;
import org.apache.maven.api.annotations.Nonnull;
Expand All @@ -60,6 +63,10 @@
import org.apache.maven.api.model.Plugin;
import org.apache.maven.api.model.Profile;
import org.apache.maven.api.model.ReportPlugin;
import org.apache.maven.api.services.ArtifactResolver;
import org.apache.maven.api.services.ArtifactResolverException;
import org.apache.maven.api.services.ArtifactResolverRequest;
import org.apache.maven.api.services.ArtifactResolverResult;
import org.apache.maven.api.services.BuilderProblem.Severity;
import org.apache.maven.api.services.ModelBuilder;
import org.apache.maven.api.services.ModelBuilderException;
Expand All @@ -81,6 +88,7 @@
import org.apache.maven.impl.DefaultSourceRoot;
import org.apache.maven.impl.InternalSession;
import org.apache.maven.impl.resolver.ArtifactDescriptorUtils;
import org.apache.maven.internal.impl.InternalMavenSession;
import org.apache.maven.model.building.DefaultModelProblem;
import org.apache.maven.model.building.FileModelSource;
import org.apache.maven.model.building.ModelBuildingRequest;
Expand All @@ -92,9 +100,6 @@
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.repository.LocalRepositoryManager;
import org.eclipse.aether.repository.WorkspaceRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -309,21 +314,28 @@ public int hashCode() {

class BuildSession implements AutoCloseable {
private final ProjectBuildingRequest request;
private final RepositorySystemSession session;
private final InternalSession session;
private final ModelBuilder.ModelBuilderSession modelBuilderSession;
private final Map<String, MavenProject> projectIndex = new ConcurrentHashMap<>(256);

BuildSession(ProjectBuildingRequest request) {
this.request = request;
this.session =
RepositoryUtils.overlay(request.getLocalRepository(), request.getRepositorySession(), repoSystem);
InternalSession iSession = InternalSession.from(session);
InternalSession session = InternalSession.from(request.getRepositorySession());
String basedir = request.getLocalRepository() != null
? request.getLocalRepository().getBasedir()
: null;
if (basedir != null) {
LocalRepository localRepository = session.createLocalRepository(Paths.get(basedir));
session = InternalSession.from(session.withLocalRepository(localRepository));
}
this.session = session;
this.modelBuilderSession = modelBuilder.newSession();
// Save the ModelBuilderSession for later retrieval by the DefaultConsumerPomBuilder.
// Use replace(key, null, value) to make sure the *main* session, i.e. the one used
// to load the projects, is stored. This is to avoid the session being overwritten
// if a plugin uses the ProjectBuilder.
iSession.getData()
this.session
.getData()
.replace(SessionData.key(ModelBuilder.ModelBuilderSession.class), null, modelBuilderSession);
}

Expand Down Expand Up @@ -408,15 +420,23 @@ ProjectBuildingResult build(Artifact artifact, boolean allowStubModel) throws Pr
boolean localProject;

try {
ArtifactRequest pomRequest = new ArtifactRequest();
pomRequest.setArtifact(pomArtifact);
pomRequest.setRepositories(RepositoryUtils.toRepos(request.getRemoteRepositories()));
ArtifactResult pomResult = repoSystem.resolveArtifact(session, pomRequest);

pomArtifact = pomResult.getArtifact();
localProject = pomResult.getRepository() instanceof WorkspaceRepository;
} catch (org.eclipse.aether.resolution.ArtifactResolutionException e) {
if (e.getResults().get(0).isMissing() && allowStubModel) {
ArtifactCoordinates coordinates = session.createArtifactCoordinates(session.getArtifact(pomArtifact));
ArtifactResolverRequest req = ArtifactResolverRequest.builder()
.session(session)
.repositories(request.getRemoteRepositories().stream()
.map(RepositoryUtils::toRepo)
.map(session::getRemoteRepository)
.toList())
.coordinates(List.of(coordinates))
.build();
ArtifactResolverResult res =
session.getService(ArtifactResolver.class).resolve(req);
ArtifactResolverResult.ResultItem resItem = res.getResult(coordinates);

pomArtifact = InternalMavenSession.from(session).toArtifact(resItem.getArtifact());
localProject = resItem.getRepository() instanceof org.apache.maven.api.WorkspaceRepository;
} catch (ArtifactResolverException e) {
if (e.getResult().getResults().values().iterator().next().isMissing() && allowStubModel) {
return build(null, createStubModelSource(artifact));
}
throw new ProjectBuildingException(
Expand Down Expand Up @@ -594,12 +614,11 @@ private void initProject(MavenProject project, ModelBuilderResult result) {
Build build = project.getBuild().getDelegate();
List<org.apache.maven.api.model.Source> sources = build.getSources();
Path baseDir = project.getBaseDirectory();
InternalSession s = InternalSession.from(session);
boolean hasScript = false;
boolean hasMain = false;
boolean hasTest = false;
for (var source : sources) {
var src = new DefaultSourceRoot(s, baseDir, source);
var src = new DefaultSourceRoot(session, baseDir, source);
project.addSourceRoot(src);
Language language = src.language();
if (Language.JAVA_FAMILY.equals(language)) {
Expand Down Expand Up @@ -828,8 +847,7 @@ private void initParent(MavenProject project, ModelBuilderResult result) {
private ModelBuilderRequest.ModelBuilderRequestBuilder getModelBuildingRequest() {
ModelBuilderRequest.ModelBuilderRequestBuilder modelBuildingRequest = ModelBuilderRequest.builder();

InternalSession internalSession = InternalSession.from(session);
modelBuildingRequest.session(internalSession);
modelBuildingRequest.session(session);
modelBuildingRequest.requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT);
modelBuildingRequest.profiles(
request.getProfiles() != null
Expand All @@ -844,14 +862,15 @@ private ModelBuilderRequest.ModelBuilderRequestBuilder getModelBuildingRequest()
modelBuildingRequest.repositoryMerging(ModelBuilderRequest.RepositoryMerging.valueOf(
request.getRepositoryMerging().name()));
modelBuildingRequest.repositories(request.getRemoteRepositories().stream()
.map(r -> internalSession.getRemoteRepository(RepositoryUtils.toRepo(r)))
.map(r -> session.getRemoteRepository(RepositoryUtils.toRepo(r)))
.toList());
return modelBuildingRequest;
}

private DependencyResolutionResult resolveDependencies(MavenProject project) {
DependencyResolutionResult resolutionResult;

RepositorySystemSession session = this.session.getSession();
try {
DefaultDependencyResolutionRequest resolution =
new DefaultDependencyResolutionRequest(project, session);
Expand All @@ -872,9 +891,8 @@ private DependencyResolutionResult resolveDependencies(MavenProject project) {
LocalRepositoryManager lrm = session.getLocalRepositoryManager();
for (Artifact artifact : artifacts) {
if (!artifact.isResolved()) {
String path = lrm.getPathForLocalArtifact(RepositoryUtils.toArtifact(artifact));
artifact.setFile(
lrm.getRepository().getBasePath().resolve(path).toFile());
Path path = lrm.getAbsolutePathForLocalArtifact(RepositoryUtils.toArtifact(artifact));
artifact.setFile(path.toFile());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
import java.nio.file.StandardCopyOption;
import java.util.List;

import org.apache.maven.api.SessionData;
import org.apache.maven.api.services.model.ModelCache;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.impl.InternalSession;
Expand Down Expand Up @@ -338,12 +336,6 @@ void rereadPom_mng7063() throws Exception {
projectBuilder.build(pom.toFile(), buildingRequest).getProject();
assertThat(project.getName(), is("aid")); // inherited from artifactId

// clear the cache
InternalSession.from(buildingRequest.getRepositorySession())
.getData()
.get(SessionData.key(ModelCache.class))
.clear();

try (InputStream pomResource =
DefaultMavenProjectBuilderTest.class.getResourceAsStream("/projects/reread/pom2.xml")) {
Files.copy(pomResource, pom, StandardCopyOption.REPLACE_EXISTING);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.maven.AbstractCoreMavenComponentTestCase;
import org.apache.maven.api.SessionData;
import org.apache.maven.api.services.model.ModelCache;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.model.InputLocation;
Expand Down Expand Up @@ -179,12 +177,6 @@ void testReadModifiedPoms(@TempDir Path tempDir) throws Exception {
File child = new File(tempDir.toFile(), "child/pom.xml");
// build project once
projectBuilder.build(child, configuration);
// clear the cache
mavenSession
.getSession()
.getData()
.get(SessionData.key(ModelCache.class))
.clear();
// modify parent
File parent = new File(tempDir.toFile(), "pom.xml");
String parentContent = new String(Files.readAllBytes(parent.toPath()), StandardCharsets.UTF_8);
Expand Down

This file was deleted.

Loading

0 comments on commit ccc05dc

Please sign in to comment.