View Javadoc
1   package org.apache.maven.shared.transfer.dependencies.collect.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 org.apache.maven.model.Dependency;
23  import org.apache.maven.model.Model;
24  import org.apache.maven.project.ProjectBuildingRequest;
25  import org.apache.maven.shared.transfer.dependencies.DependableCoordinate;
26  import org.apache.maven.shared.transfer.dependencies.collect.CollectorResult;
27  import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollector;
28  import org.apache.maven.shared.transfer.dependencies.collect.DependencyCollectorException;
29  import org.codehaus.plexus.PlexusConstants;
30  import org.codehaus.plexus.PlexusContainer;
31  import org.codehaus.plexus.component.annotations.Component;
32  import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
33  import org.codehaus.plexus.context.Context;
34  import org.codehaus.plexus.context.ContextException;
35  import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
36  
37  /**
38   * This DependencyCollector passes the request to the proper Maven 3.x implementation
39   * 
40   * @author Robert Scholte
41   */
42  @Component( role = DependencyCollector.class, hint = "default" )
43  class DefaultDependencyCollector implements DependencyCollector, Contextualizable 
44  {
45      private PlexusContainer container;
46  
47      @Override
48      public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Dependency root )
49          throws DependencyCollectorException
50      {
51          validateParameters( buildingRequest, root );
52  
53          try
54          {
55              String hint = isMaven31() ? "maven31" : "maven3";
56  
57              DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint );
58  
59              return effectiveDependencyCollector.collectDependencies( buildingRequest, root );
60          }
61          catch ( ComponentLookupException e )
62          {
63              throw new DependencyCollectorException( e.getMessage(), e );
64          }
65      }
66  
67      @Override
68      public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, DependableCoordinate root )
69          throws DependencyCollectorException
70      {
71          validateParameters( buildingRequest, root );
72  
73          try
74          {
75              String hint = isMaven31() ? "maven31" : "maven3";
76  
77              DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint );
78  
79              return effectiveDependencyCollector.collectDependencies( buildingRequest, root );
80          }
81          catch ( ComponentLookupException e )
82          {
83              throw new DependencyCollectorException( e.getMessage(), e );
84          }
85      }
86  
87      @Override
88      public CollectorResult collectDependencies( ProjectBuildingRequest buildingRequest, Model root )
89          throws DependencyCollectorException
90      {
91          validateParameters( buildingRequest, root );
92  
93          try
94          {
95              String hint = isMaven31() ? "maven31" : "maven3";
96  
97              DependencyCollector effectiveDependencyCollector = container.lookup( DependencyCollector.class, hint );
98  
99              return effectiveDependencyCollector.collectDependencies( buildingRequest, root );
100         }
101         catch ( ComponentLookupException e )
102         {
103             throw new DependencyCollectorException( e.getMessage(), e );
104         }
105     }
106 
107     private void validateParameters( ProjectBuildingRequest buildingRequest, DependableCoordinate root )
108     {
109         validateBuildingRequest( buildingRequest );
110         if ( root == null )
111         {
112             throw new IllegalArgumentException( "The parameter root is not allowed to be null." );
113         }
114     }
115 
116     private void validateParameters( ProjectBuildingRequest buildingRequest, Dependency root )
117     {
118         validateBuildingRequest( buildingRequest );
119         if ( root == null )
120         {
121             throw new IllegalArgumentException( "The parameter root is not allowed to be null." );
122         }
123     }
124 
125     private void validateParameters( ProjectBuildingRequest buildingRequest, Model root )
126     {
127         validateBuildingRequest( buildingRequest );
128         if ( root == null )
129         {
130             throw new IllegalArgumentException( "The parameter root is not allowed to be null." );
131         }
132     }
133 
134     private void validateBuildingRequest( ProjectBuildingRequest buildingRequest )
135     {
136         if ( buildingRequest == null )
137         {
138             throw new IllegalArgumentException( "The parameter buildingRequest is not allowed to be null." );
139         }
140     }
141 
142     /**
143      * @return true if the current Maven version is Maven 3.1.
144      */
145     protected static boolean isMaven31()
146     {
147         return canFindCoreClass( "org.eclipse.aether.artifact.Artifact" ); // Maven 3.1 specific
148     }
149 
150     private static boolean canFindCoreClass( String className )
151     {
152         try
153         {
154             Thread.currentThread().getContextClassLoader().loadClass( className );
155 
156             return true;
157         }
158         catch ( ClassNotFoundException e )
159         {
160             return false;
161         }
162     }
163 
164     /**
165      * Injects the Plexus content.
166      *
167      * @param context Plexus context to inject.
168      * @throws ContextException if the PlexusContainer could not be located.
169      */
170     public void contextualize( Context context )
171         throws ContextException
172     {
173         container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
174     }
175 
176 }