View Javadoc
1   package org.apache.maven.shared.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  
24  import org.apache.maven.model.Dependency;
25  import org.apache.maven.model.Model;
26  import org.apache.maven.project.ProjectBuildingRequest;
27  import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
28  import org.apache.maven.shared.artifact.resolve.ArtifactResult;
29  import org.apache.maven.shared.dependencies.DependableCoordinate;
30  import org.apache.maven.shared.dependencies.resolve.DependencyResolver;
31  import org.apache.maven.shared.dependencies.resolve.DependencyResolverException;
32  import org.codehaus.plexus.PlexusConstants;
33  import org.codehaus.plexus.PlexusContainer;
34  import org.codehaus.plexus.component.annotations.Component;
35  import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
36  import org.codehaus.plexus.context.Context;
37  import org.codehaus.plexus.context.ContextException;
38  import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
39  
40  /**
41   * 
42   */
43  @Component( role = DependencyResolver.class, hint = "default" )
44  public class DefaultDependencyResolver
45      implements DependencyResolver, Contextualizable
46  {
47      private PlexusContainer container;
48  
49      @Override
50      public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
51                                                           Collection<Dependency> coordinates,
52                                                           Collection<Dependency> managedDependencies,
53                                                           TransformableFilter filter )
54                                                               throws DependencyResolverException
55      {
56          try
57          {
58              String hint = isMaven31() ? "maven31" : "maven3";
59  
60              DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
61  
62              return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinates, null, filter );
63          }
64          catch ( ComponentLookupException e )
65          {
66              throw new DependencyResolverException( e.getMessage(), e );
67          }
68      }
69  
70      @Override
71      public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
72                                                           DependableCoordinate coordinate, TransformableFilter filter )
73                                                               throws DependencyResolverException
74      {
75          try
76          {
77              String hint = isMaven31() ? "maven31" : "maven3";
78  
79              DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
80  
81              return effectiveArtifactResolver.resolveDependencies( buildingRequest, coordinate, filter );
82          }
83          catch ( ComponentLookupException e )
84          {
85              throw new DependencyResolverException( e.getMessage(), e );
86          }
87      }
88      
89      @Override
90      public Iterable<ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
91                                                           Model model, TransformableFilter filter )
92          throws DependencyResolverException
93      {
94          try
95          {
96              String hint = isMaven31() ? "maven31" : "maven3";
97  
98              DependencyResolver effectiveArtifactResolver = container.lookup( DependencyResolver.class, hint );
99  
100             return effectiveArtifactResolver.resolveDependencies( buildingRequest, model, filter );
101         }
102         catch ( ComponentLookupException e )
103         {
104             throw new DependencyResolverException( e.getMessage(), e );
105         }
106     }
107 
108     /**
109      * @return true if the current Maven version is Maven 3.1.
110      */
111     protected static boolean isMaven31()
112     {
113         return canFindCoreClass( "org.eclipse.aether.artifact.Artifact" ); // Maven 3.1 specific
114     }
115 
116     private static boolean canFindCoreClass( String className )
117     {
118         try
119         {
120             Thread.currentThread().getContextClassLoader().loadClass( className );
121 
122             return true;
123         }
124         catch ( ClassNotFoundException e )
125         {
126             return false;
127         }
128     }
129 
130     /**
131      * Injects the Plexus content.
132      *
133      * @param context Plexus context to inject.
134      * @throws ContextException if the PlexusContainer could not be located.
135      */
136     public void contextualize( Context context )
137         throws ContextException
138     {
139         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
140     }
141 }