View Javadoc
1   package org.apache.maven.shared.artifact.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.List;
23  
24  import org.apache.maven.RepositoryUtils;
25  import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
26  import org.apache.maven.project.ProjectBuildingRequest;
27  import org.apache.maven.shared.artifact.ArtifactCoordinate;
28  import org.apache.maven.shared.artifact.resolve.ArtifactResolver;
29  import org.apache.maven.shared.artifact.resolve.ArtifactResolverException;
30  import org.codehaus.plexus.component.annotations.Component;
31  import org.codehaus.plexus.component.annotations.Requirement;
32  import org.eclipse.aether.RepositorySystem;
33  import org.eclipse.aether.RepositorySystemSession;
34  import org.eclipse.aether.artifact.Artifact;
35  import org.eclipse.aether.artifact.DefaultArtifact;
36  import org.eclipse.aether.repository.RemoteRepository;
37  import org.eclipse.aether.resolution.ArtifactDescriptorException;
38  import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
39  import org.eclipse.aether.resolution.ArtifactDescriptorResult;
40  import org.eclipse.aether.resolution.ArtifactRequest;
41  import org.eclipse.aether.resolution.ArtifactResolutionException;
42  
43  /**
44   * 
45   */
46  @Component( role = ArtifactResolver.class, hint = "maven31" )
47  public class Maven31ArtifactResolver
48      implements ArtifactResolver
49  {
50      @Requirement
51      private RepositorySystem repositorySystem;
52  
53      @Requirement
54      private ArtifactHandlerManager artifactHandlerManager;
55  
56      @Override
57      // CHECKSTYLE_OFF: LineLength
58      public org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
59                                                                                      org.apache.maven.artifact.Artifact mavenArtifact )
60                                                                                          throws ArtifactResolverException
61      // CHECKSTYLE_ON: LineLength
62      {
63          Artifact aetherArtifact = (Artifact) Invoker.invoke( RepositoryUtils.class, "toArtifact",
64                                                               org.apache.maven.artifact.Artifact.class, mavenArtifact );
65  
66          return resolveArtifact( buildingRequest, aetherArtifact );
67      }
68  
69      @Override
70      // CHECKSTYLE_OFF: LineLength
71      public org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
72                                                                                      ArtifactCoordinate coordinate )
73                                                                                          throws ArtifactResolverException
74      // CHECKSTYLE_ON: LineLength
75      {
76          Artifact aetherArtifact =
77              new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(),
78                                   coordinate.getExtension(), coordinate.getVersion() );
79  
80          return resolveArtifact( buildingRequest, aetherArtifact );
81      }
82  
83      // CHECKSTYLE_OFF: LineLength
84      private org.apache.maven.shared.artifact.resolve.ArtifactResult resolveArtifact( ProjectBuildingRequest buildingRequest,
85                                                                                       Artifact aetherArtifact )
86                                                                                           throws ArtifactResolverException
87      // CHECKSTYLE_ON: LineLength
88      {
89          @SuppressWarnings( "unchecked" )
90          List<RemoteRepository> aetherRepositories =
91              (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
92                                                       buildingRequest.getRemoteRepositories() );
93  
94          RepositorySystemSession session =
95              (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
96  
97          try
98          {
99              // use descriptor to respect relocation
100             ArtifactDescriptorRequest descriptorRequest =
101                 new ArtifactDescriptorRequest( aetherArtifact, aetherRepositories, null );
102 
103             ArtifactDescriptorResult descriptorResult =
104                 repositorySystem.readArtifactDescriptor( session, descriptorRequest );
105 
106             ArtifactRequest request = new ArtifactRequest( descriptorResult.getArtifact(), aetherRepositories, null );
107 
108             return new Maven31ArtifactResult( repositorySystem.resolveArtifact( session, request ) );
109         }
110         catch ( ArtifactDescriptorException e )
111         {
112             throw new ArtifactResolverException( e.getMessage(), e );
113         }
114         catch ( ArtifactResolutionException e )
115         {
116             throw new ArtifactResolverException( e.getMessage(), e );
117         }
118     }
119 
120 //    @Override
121 //    // CHECKSTYLE_OFF: LineLength
122 //    public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
123 //                                                                                                  ArtifactCoordinate coordinate,
124 //                                                                                                  TransformableFilter dependencyFilter )
125 //                                                                                                      throws ArtifactResolverException
126 //    // CHECKSTYLE_ON: LineLength
127 //    {
128 //        ArtifactTypeRegistry typeRegistry =
129 //            (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
130 //                                                   ArtifactHandlerManager.class, artifactHandlerManager );
131 //
132 //        Dependency aetherRoot = toDependency( coordinate, typeRegistry );
133 //
134 //        @SuppressWarnings( "unchecked" )
135 //        List<RemoteRepository> aetherRepositories =
136 //            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
137 //                                                     buildingRequest.getRemoteRepositories() );
138 //
139 //        CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
140 //
141 //        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
142 //    }
143 //
144 //    @Override
145 //    // CHECKSTYLE_OFF: LineLength
146 //    public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
147 //                                                                                                  Collection<org.apache.maven.model.Dependency> mavenDependencies,
148 //                                                                                                  Collection<org.apache.maven.model.Dependency> managedMavenDependencies,
149 //                                                                                                  TransformableFilter filter )
150 //                                                                                                      throws ArtifactResolverException
151 //    // CHECKSTYLE_ON: LineLength
152 //    {
153 //        ArtifactTypeRegistry typeRegistry =
154 //            (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
155 //                                                   ArtifactHandlerManager.class, artifactHandlerManager );
156 //
157 //        List<Dependency> aetherDeps = new ArrayList<Dependency>( mavenDependencies.size() );
158 //
159 //        final Class<?>[] argClasses =
160 //            new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class };
161 //
162 //        for ( org.apache.maven.model.Dependency mavenDependency : mavenDependencies )
163 //        {
164 //            Object[] args = new Object[] { mavenDependency, typeRegistry };
165 //
166 //            Dependency aetherDependency =
167 //                (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
168 //
169 //            aetherDeps.add( aetherDependency );
170 //        }
171 //
172 //        List<Dependency> aetherManagedDeps = new ArrayList<Dependency>( managedMavenDependencies.size() );
173 //
174 //        for ( org.apache.maven.model.Dependency mavenDependency : managedMavenDependencies )
175 //        {
176 //            Object[] args = new Object[] { mavenDependency, typeRegistry };
177 //
178 //            Dependency aetherDependency =
179 //                (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
180 //
181 //            aetherManagedDeps.add( aetherDependency );
182 //        }
183 //
184 //        @SuppressWarnings( "unchecked" )
185 //        List<RemoteRepository> aetherRepos =
186 //            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
187 //                                                     buildingRequest.getRemoteRepositories() );
188 //
189 //        CollectRequest request = new CollectRequest( aetherDeps, aetherManagedDeps, aetherRepos );
190 //
191 //        return resolveDependencies( buildingRequest, aetherRepos, filter, request );
192 //    }
193 
194 //    // CHECKSTYLE_OFF: LineLength
195 //    private Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
196 //                                                                                                   List<RemoteRepository> aetherRepositories,
197 //                                                                                                   TransformableFilter dependencyFilter,
198 //                                                                                                   CollectRequest request )
199 //                                                                                                       throws ArtifactResolverException
200 //    // CHECKSTYLE_ON: LineLength
201 //    {
202 //        try
203 //        {
204 //            DependencyFilter depFilter = null;
205 //            if ( dependencyFilter != null )
206 //            {
207 //                depFilter = dependencyFilter.transform( new EclipseAetherFilterTransformer() );
208 //            }
209 //
210 //            DependencyRequest depRequest = new DependencyRequest( request, depFilter );
211 //
212 //            RepositorySystemSession session =
213 //                (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
214 //
215 //            DependencyResult dependencyResults = repositorySystem.resolveDependencies( session, depRequest );
216 //
217 //            Collection<ArtifactRequest> artifactRequests =
218 //                new ArrayList<ArtifactRequest>( dependencyResults.getArtifactResults().size() );
219 //
220 //            for ( ArtifactResult artifactResult : dependencyResults.getArtifactResults() )
221 //            {
222 //                artifactRequests.add( new ArtifactRequest( artifactResult.getArtifact(), aetherRepositories, null ) );
223 //            }
224 //
225 //         final List<ArtifactResult> artifactResults = repositorySystem.resolveArtifacts( session, artifactRequests );
226 //
227 //            // Keep it lazy! Often artifactsResults aren't used, so transforming up front is too expensive
228 //            return new Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult>()
229 //            {
230 //                @Override
231 //                public Iterator<org.apache.maven.shared.artifact.resolve.ArtifactResult> iterator()
232 //                {
233 //                    // CHECKSTYLE_OFF: LineLength
234 //                    Collection<org.apache.maven.shared.artifact.resolve.ArtifactResult> artResults =
235 //                    new ArrayList<org.apache.maven.shared.artifact.resolve.ArtifactResult>( artifactResults.size() );
236 //                    // CHECKSTYLE_ON: LineLength
237 //
238 //                    for ( ArtifactResult artifactResult : artifactResults )
239 //                    {
240 //                        artResults.add( new Maven31ArtifactResult( artifactResult ) );
241 //                    }
242 //
243 //                    return artResults.iterator();
244 //                }
245 //            };
246 //        }
247 //        catch ( ArtifactResolutionException e )
248 //        {
249 //            throw new ArtifactResolverException( e.getMessage(), e );
250 //        }
251 //        catch ( DependencyResolutionException e )
252 //        {
253 //            throw new ArtifactResolverException( e.getMessage(), e );
254 //        }
255 //    }
256 
257 //    /**
258 //     * Based on RepositoryUtils#toDependency(org.apache.maven.model.Dependency, ArtifactTypeRegistry)
259 //     * 
260 //     * @param coordinate {@link ArtifactCoordinate}
261 //     * @param stereotypes {@link ArtifactTypeRegistry
262 //     * @return as Aether Dependency
263 //     */
264 //    private static Dependency toDependency( ArtifactCoordinate coordinate, ArtifactTypeRegistry stereotypes )
265 //    {
266 //        ArtifactType stereotype = stereotypes.get( coordinate.getExtension() );
267 //        if ( stereotype == null )
268 //        {
269 //            stereotype = new DefaultArtifactType( coordinate.getExtension() );
270 //        }
271 //
272 //        Artifact artifact =
273 //          new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(), null,
274 //                                 coordinate.getVersion(), null, stereotype );
275 //
276 //        return new Dependency( artifact, null );
277 //    }
278 }