1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.internal.impl;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23 import javax.inject.Singleton;
24
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Optional;
28 import java.util.stream.Collectors;
29
30 import org.apache.maven.api.Repository;
31 import org.apache.maven.api.Version;
32 import org.apache.maven.api.services.VersionRangeResolver;
33 import org.apache.maven.api.services.VersionRangeResolverException;
34 import org.apache.maven.api.services.VersionRangeResolverRequest;
35 import org.apache.maven.api.services.VersionRangeResolverResult;
36 import org.eclipse.aether.RepositorySystem;
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 org.apache.maven.internal.impl.Utils.map;
43 import static org.apache.maven.internal.impl.Utils.nonNull;
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 nonNull(request, "request");
60 InternalSession session = InternalSession.from(request.getSession());
61
62 try {
63 VersionRangeResult res = repositorySystem.resolveVersionRange(
64 session.getSession(),
65 new VersionRangeRequest(
66 session.toArtifact(request.getArtifactCoordinate()),
67 session.toRepositories(session.getRemoteRepositories()),
68 null));
69
70 Map<String, ArtifactRepository> repos =
71 res.getVersions().stream().collect(Collectors.toMap(v -> v.toString(), res::getRepository));
72
73 return new VersionRangeResolverResult() {
74 @Override
75 public List<Exception> getExceptions() {
76 return res.getExceptions();
77 }
78
79 @Override
80 public List<Version> getVersions() {
81 return map(res.getVersions(), v -> session.parseVersion(v.toString()));
82 }
83
84 @Override
85 public Optional<Repository> getRepository(Version version) {
86 ArtifactRepository repo = repos.get(version.toString());
87 if (repo instanceof org.eclipse.aether.repository.LocalRepository) {
88 return Optional.of(
89 new DefaultLocalRepository((org.eclipse.aether.repository.LocalRepository) repo));
90 } else if (repo instanceof org.eclipse.aether.repository.RemoteRepository) {
91 return Optional.of(
92 new DefaultRemoteRepository((org.eclipse.aether.repository.RemoteRepository) repo));
93 } else {
94 return Optional.empty();
95 }
96 }
97 };
98 } catch (VersionRangeResolutionException e) {
99 throw new VersionRangeResolverException("Unable to resolve version range", e);
100 }
101 }
102 }