View Javadoc
1   package org.apache.maven.shared.transfer.dependencies.resolve.internal;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.Collection;
23  import java.util.List;
24  
25  import org.apache.maven.RepositoryUtils;
26  import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
27  import org.apache.maven.model.Dependency;
28  import org.apache.maven.model.Model;
29  import org.apache.maven.project.ProjectBuildingRequest;
30  import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
31  import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult;
32  import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
33  import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolver;
34  import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverException;
35  import org.codehaus.plexus.PlexusConstants;
36  import org.codehaus.plexus.PlexusContainer;
37  import org.codehaus.plexus.component.annotations.Component;
38  import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
39  import org.codehaus.plexus.context.Context;
40  import org.codehaus.plexus.context.ContextException;
41  import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
42  
43  /**
44   *
45   */
46  @Component( role = DependencyResolver.class, hint = "default" )
47  class DefaultDependencyResolver implements DependencyResolver, Contextualizable
48  {
49      private PlexusContainer container;
50  
51      @Override
52      public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
53              Collection<Dependency> coordinates, Collection<Dependency> managedDependencies, TransformableFilter filter )
54              throws DependencyResolverException
55      {
56          validateBuildingRequest( buildingRequest );
57  
58          try
59          {
60              return getMavenDependencyResolver( buildingRequest ).resolveDependencies( coordinates, managedDependencies,
61                      filter );
62          }
63          catch ( ComponentLookupException e )
64          {
65              throw new DependencyResolverException( e.getMessage(), e );
66          }
67      }
68  
69      @Override
70      public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
71              DependableCoordinate coordinate, TransformableFilter filter ) throws DependencyResolverException
72      {
73          validateParameters( buildingRequest, coordinate );
74          try
75          {
76              return getMavenDependencyResolver( buildingRequest ).resolveDependencies( coordinate, filter );
77          }
78          catch ( ComponentLookupException e )
79          {
80              throw new DependencyResolverException( e.getMessage(), e );
81          }
82      }
83  
84      @Override
85      public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest, Model model,
86              TransformableFilter filter ) throws DependencyResolverException
87      {
88          validateParameters( buildingRequest, model );
89          try
90          {
91              return getMavenDependencyResolver( buildingRequest ).resolveDependencies( model, filter );
92          }
93          catch ( ComponentLookupException e )
94          {
95              throw new DependencyResolverException( e.getMessage(), e );
96          }
97      }
98  
99      /**
100      * @return true if the current Maven version is Maven 3.1.
101      */
102     private boolean isMaven31()
103     {
104         try
105         {
106             // Maven 3.1 specific
107             Thread.currentThread().getContextClassLoader().loadClass( "org.eclipse.aether.artifact.Artifact" );
108             return true;
109         }
110         catch ( ClassNotFoundException e )
111         {
112             return false;
113         }
114     }
115 
116     /**
117      * Injects the Plexus content.
118      *
119      * @param context Plexus context to inject.
120      * @throws ContextException if the PlexusContainer could not be located.
121      */
122     public void contextualize( Context context ) throws ContextException
123     {
124         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
125     }
126 
127     private void validateParameters( ProjectBuildingRequest buildingRequest, DependableCoordinate coordinate )
128     {
129         validateBuildingRequest( buildingRequest );
130         if ( coordinate == null )
131         {
132             throw new IllegalArgumentException( "The parameter coordinate is not allowed to be null." );
133         }
134     }
135 
136     private void validateParameters( ProjectBuildingRequest buildingRequest, Model model )
137     {
138         validateBuildingRequest( buildingRequest );
139         if ( model == null )
140         {
141             throw new IllegalArgumentException( "The parameter model is not allowed to be null." );
142         }
143 
144     }
145 
146     private MavenDependencyResolver getMavenDependencyResolver( ProjectBuildingRequest buildingRequest )
147             throws ComponentLookupException, DependencyResolverException
148     {
149         ArtifactHandlerManager artifactHandlerManager = container.lookup( ArtifactHandlerManager.class );
150 
151         if ( isMaven31() )
152         {
153             org.eclipse.aether.RepositorySystem m31RepositorySystem = container.lookup(
154                     org.eclipse.aether.RepositorySystem.class );
155 
156             org.eclipse.aether.RepositorySystemSession session = Invoker.invoke( buildingRequest,
157                     "getRepositorySession" );
158 
159             List<org.eclipse.aether.repository.RemoteRepository> aetherRepositories = Invoker.invoke(
160                     RepositoryUtils.class, "toRepos", List.class, buildingRequest.getRemoteRepositories() );
161 
162             return new Maven31DependencyResolver( m31RepositorySystem, artifactHandlerManager, session,
163                     aetherRepositories );
164         }
165         else
166         {
167             org.sonatype.aether.RepositorySystem m30RepositorySystem = container.lookup(
168                     org.sonatype.aether.RepositorySystem.class );
169 
170             org.sonatype.aether.RepositorySystemSession session = Invoker.invoke( buildingRequest,
171                     "getRepositorySession" );
172 
173             List<org.sonatype.aether.repository.RemoteRepository> aetherRepositories = Invoker.invoke(
174                     RepositoryUtils.class, "toRepos", List.class, buildingRequest.getRemoteRepositories() );
175 
176             return new Maven30DependencyResolver( m30RepositorySystem, artifactHandlerManager, session,
177                     aetherRepositories );
178 
179         }
180     }
181 
182     private void validateBuildingRequest( ProjectBuildingRequest buildingRequest )
183     {
184         if ( buildingRequest == null )
185         {
186             throw new IllegalArgumentException( "The parameter buildingRequest is not allowed to be null." );
187         }
188     }
189 
190 }