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.repository.ArtifactRepository;
37 import org.eclipse.aether.resolution.VersionRangeRequest;
38 import org.eclipse.aether.resolution.VersionRangeResolutionException;
39 import org.eclipse.aether.resolution.VersionRangeResult;
40
41 import static java.util.Objects.requireNonNull;
42 import static org.apache.maven.impl.Utils.map;
43
44 @Named
45 @Singleton
46 public class DefaultVersionRangeResolver implements VersionRangeResolver {
47
48 private final RepositorySystem repositorySystem;
49
50 @Inject
51 public DefaultVersionRangeResolver(RepositorySystem repositorySystem) {
52 this.repositorySystem = repositorySystem;
53 }
54
55 @Override
56 public VersionRangeResolverResult resolve(VersionRangeResolverRequest request)
57 throws VersionRangeResolverException {
58 requireNonNull(request, "request");
59 InternalSession session = InternalSession.from(request.getSession());
60 return session.request(request, this::doResolve);
61 }
62
63 public VersionRangeResolverResult doResolve(VersionRangeResolverRequest request)
64 throws VersionRangeResolverException {
65 InternalSession session = InternalSession.from(request.getSession());
66 RequestTraceHelper.ResolverTrace trace = RequestTraceHelper.enter(session, request);
67 try {
68 VersionRangeResult res = repositorySystem.resolveVersionRange(
69 session.getSession(),
70 new VersionRangeRequest(
71 session.toArtifact(request.getArtifactCoordinates()),
72 session.toRepositories(
73 request.getRepositories() != null
74 ? request.getRepositories()
75 : session.getRemoteRepositories()),
76 trace.context())
77 .setTrace(trace.trace()));
78
79 Map<String, ArtifactRepository> repos = res.getVersions().stream()
80 .filter(v -> res.getRepository(v) != null)
81 .collect(Collectors.toMap(v -> v.toString(), res::getRepository));
82
83 return new VersionRangeResolverResult() {
84 @Override
85 public VersionRangeResolverRequest getRequest() {
86 return request;
87 }
88
89 @Override
90 public List<Exception> getExceptions() {
91 return res.getExceptions();
92 }
93
94 @Override
95 public List<Version> getVersions() {
96 return map(res.getVersions(), v -> session.parseVersion(v.toString()));
97 }
98
99 @Override
100 public Optional<Repository> getRepository(Version version) {
101 ArtifactRepository repo = repos.get(version.toString());
102 if (repo instanceof org.eclipse.aether.repository.LocalRepository localRepository) {
103 return Optional.of(new DefaultLocalRepository(localRepository));
104 } else if (repo instanceof org.eclipse.aether.repository.RemoteRepository remoteRepository) {
105 return Optional.of(new DefaultRemoteRepository(remoteRepository));
106 } else {
107 return Optional.empty();
108 }
109 }
110 };
111 } catch (VersionRangeResolutionException e) {
112 throw new VersionRangeResolverException("Unable to resolve version range", e);
113 } finally {
114 RequestTraceHelper.exit(trace);
115 }
116 }
117 }