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 java.util.List;
22 import java.util.Optional;
23
24 import org.apache.maven.api.Repository;
25 import org.apache.maven.api.Version;
26 import org.apache.maven.api.di.Inject;
27 import org.apache.maven.api.di.Named;
28 import org.apache.maven.api.di.Singleton;
29 import org.apache.maven.api.services.VersionResolver;
30 import org.apache.maven.api.services.VersionResolverException;
31 import org.apache.maven.api.services.VersionResolverRequest;
32 import org.apache.maven.api.services.VersionResolverResult;
33 import org.eclipse.aether.RepositorySystem;
34 import org.eclipse.aether.resolution.VersionRequest;
35 import org.eclipse.aether.resolution.VersionResolutionException;
36 import org.eclipse.aether.resolution.VersionResult;
37
38 import static org.apache.maven.internal.impl.Utils.nonNull;
39
40 @Named
41 @Singleton
42 public class DefaultVersionResolver implements VersionResolver {
43
44 private final RepositorySystem repositorySystem;
45
46 @Inject
47 public DefaultVersionResolver(RepositorySystem repositorySystem) {
48 this.repositorySystem = repositorySystem;
49 }
50
51 @Override
52 public VersionResolverResult resolve(VersionResolverRequest request) throws VersionResolverException {
53 nonNull(request, "request");
54 InternalSession session = InternalSession.from(request.getSession());
55
56 try {
57 VersionResult res = repositorySystem.resolveVersion(
58 session.getSession(),
59 new VersionRequest(
60 session.toArtifact(request.getArtifactCoordinates()),
61 session.toRepositories(
62 request.getRepositories() != null
63 ? request.getRepositories()
64 : session.getRemoteRepositories()),
65 null));
66
67 return new VersionResolverResult() {
68 @Override
69 public List<Exception> getExceptions() {
70 return res.getExceptions();
71 }
72
73 @Override
74 public Version getVersion() {
75 return session.parseVersion(res.getVersion());
76 }
77
78 @Override
79 public Optional<Repository> getRepository() {
80 if (res.getRepository() instanceof org.eclipse.aether.repository.LocalRepository) {
81 return Optional.of(new DefaultLocalRepository(
82 (org.eclipse.aether.repository.LocalRepository) res.getRepository()));
83 } else if (res.getRepository() instanceof org.eclipse.aether.repository.RemoteRepository) {
84 return Optional.of(new DefaultRemoteRepository(
85 (org.eclipse.aether.repository.RemoteRepository) res.getRepository()));
86 } else {
87 return Optional.empty();
88 }
89 }
90 };
91 } catch (VersionResolutionException e) {
92 throw new VersionResolverException("Unable to resolve version", e);
93 }
94 }
95 }