1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.impl;
20
21 import java.util.List;
22 import java.util.Map;
23 import java.util.Optional;
24 import java.util.stream.Collectors;
25
26 import org.apache.maven.api.Repository;
27 import org.apache.maven.api.Version;
28 import org.apache.maven.api.di.Inject;
29 import org.apache.maven.api.di.Named;
30 import org.apache.maven.api.di.Singleton;
31 import org.apache.maven.api.services.VersionRangeResolver;
32 import org.apache.maven.api.services.VersionRangeResolverException;
33 import org.apache.maven.api.services.VersionRangeResolverRequest;
34 import org.apache.maven.api.services.VersionRangeResolverResult;
35 import org.eclipse.aether.RepositorySystem;
36 import org.eclipse.aether.metadata.Metadata;
37 import org.eclipse.aether.repository.ArtifactRepository;
38 import org.eclipse.aether.resolution.VersionRangeRequest;
39 import org.eclipse.aether.resolution.VersionRangeResolutionException;
40 import org.eclipse.aether.resolution.VersionRangeResult;
41
42 import static java.util.Objects.requireNonNull;
43 import static org.apache.maven.impl.ImplUtils.map;
44
45 @Named
46 @Singleton
47 public class DefaultVersionRangeResolver implements VersionRangeResolver {
48
49 private final RepositorySystem repositorySystem;
50
51 @Inject
52 public DefaultVersionRangeResolver(RepositorySystem repositorySystem) {
53 this.repositorySystem = repositorySystem;
54 }
55
56 @Override
57 public VersionRangeResolverResult resolve(VersionRangeResolverRequest request)
58 throws VersionRangeResolverException {
59 requireNonNull(request, "request");
60 InternalSession session = InternalSession.from(request.getSession());
61 return session.request(request, this::doResolve);
62 }
63
64 public VersionRangeResolverResult doResolve(VersionRangeResolverRequest request)
65 throws VersionRangeResolverException {
66 InternalSession session = InternalSession.from(request.getSession());
67 RequestTraceHelper.ResolverTrace trace = RequestTraceHelper.enter(session, request);
68 try {
69 VersionRangeResult res = repositorySystem.resolveVersionRange(
70 session.getSession(),
71 new VersionRangeRequest(
72 session.toArtifact(request.getArtifactCoordinates()),
73 session.toResolvingRepositories(
74 request.getRepositories() != null
75 ? request.getRepositories()
76 : session.getRemoteRepositories()),
77 toResolver(request.getNature()),
78 trace.context())
79 .setTrace(trace.trace()));
80
81 Map<String, ArtifactRepository> repos = res.getVersions().stream()
82 .filter(v -> res.getRepository(v) != null)
83 .collect(Collectors.toMap(v -> v.toString(), res::getRepository));
84
85 return new VersionRangeResolverResult() {
86 @Override
87 public VersionRangeResolverRequest getRequest() {
88 return request;
89 }
90
91 @Override
92 public List<Exception> getExceptions() {
93 return res.getExceptions();
94 }
95
96 @Override
97 public List<Version> getVersions() {
98 return map(res.getVersions(), v -> session.parseVersion(v.toString()));
99 }
100
101 @Override
102 public Optional<Repository> getRepository(Version version) {
103 ArtifactRepository repo = repos.get(version.toString());
104 if (repo instanceof org.eclipse.aether.repository.LocalRepository localRepository) {
105 return Optional.of(new DefaultLocalRepository(localRepository));
106 } else if (repo instanceof org.eclipse.aether.repository.RemoteRepository remoteRepository) {
107 return Optional.of(new DefaultRemoteRepository(remoteRepository));
108 } else {
109 return Optional.empty();
110 }
111 }
112 };
113 } catch (VersionRangeResolutionException e) {
114 throw new VersionRangeResolverException("Unable to resolve version range", e);
115 } finally {
116 RequestTraceHelper.exit(trace);
117 }
118 }
119
120 private Metadata.Nature toResolver(VersionRangeResolverRequest.Nature nature) {
121 return switch (nature) {
122 case RELEASE_OR_SNAPSHOT -> Metadata.Nature.RELEASE_OR_SNAPSHOT;
123 case SNAPSHOT -> Metadata.Nature.SNAPSHOT;
124 case RELEASE -> Metadata.Nature.RELEASE;
125 };
126 }
127 }