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