View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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  }