View Javadoc
1   package org.apache.maven.shared.transfer.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.transfer.artifact.ArtifactCoordinate;
28  import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolver;
29  import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException;
30  import org.codehaus.plexus.component.annotations.Component;
31  import org.codehaus.plexus.component.annotations.Requirement;
32  import org.sonatype.aether.RepositorySystem;
33  import org.sonatype.aether.RepositorySystemSession;
34  import org.sonatype.aether.artifact.Artifact;
35  import org.sonatype.aether.repository.RemoteRepository;
36  import org.sonatype.aether.resolution.ArtifactDescriptorException;
37  import org.sonatype.aether.resolution.ArtifactDescriptorRequest;
38  import org.sonatype.aether.resolution.ArtifactDescriptorResult;
39  import org.sonatype.aether.resolution.ArtifactRequest;
40  import org.sonatype.aether.resolution.ArtifactResolutionException;
41  import org.sonatype.aether.util.artifact.DefaultArtifact;
42  
43  /**
44   * 
45   */
46  @Component( role = ArtifactResolver.class, hint = "maven3" )
47  class Maven30ArtifactResolver
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.transfer.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.transfer.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.transfer.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 Maven30ArtifactResult( 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 //                                                                                                      // CHECKSTYLE_ON:
126 //                                                                                                      // LineLength
127 //                                                                                                      throws ArtifactResolverException
128 //    {
129 //        ArtifactTypeRegistry typeRegistry =
130 //            (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
131 //                                                   ArtifactHandlerManager.class, artifactHandlerManager );
132 //
133 //        Dependency aetherRoot = toDependency( coordinate, typeRegistry );
134 //
135 //        @SuppressWarnings( "unchecked" )
136 //        List<RemoteRepository> aetherRepositories =
137 //            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
138 //                                                     buildingRequest.getRemoteRepositories() );
139 //
140 //        CollectRequest request = new CollectRequest( aetherRoot, aetherRepositories );
141 //
142 //        return resolveDependencies( buildingRequest, aetherRepositories, dependencyFilter, request );
143 //    }
144 //
145 //    @Override
146 //    // CHECKSTYLE_OFF: LineLength
147 //    public Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
148 //                                                                                                  Collection<org.apache.maven.model.Dependency> mavenDependencies,
149 //                                                                                                  Collection<org.apache.maven.model.Dependency> managedMavenDependencies,
150 //                                                                                                  TransformableFilter filter )
151 //                                                                                                      // CHECKSTYLE_ON:
152 //                                                                                                      // LineLength
153 //                                                                                                      throws ArtifactResolverException
154 //    {
155 //        ArtifactTypeRegistry typeRegistry =
156 //            (ArtifactTypeRegistry) Invoker.invoke( RepositoryUtils.class, "newArtifactTypeRegistry",
157 //                                                   ArtifactHandlerManager.class, artifactHandlerManager );
158 //
159 //        List<Dependency> aetherDependencies = new ArrayList<Dependency>( mavenDependencies.size() );
160 //
161 //        final Class<?>[] argClasses =
162 //            new Class<?>[] { org.apache.maven.model.Dependency.class, ArtifactTypeRegistry.class };
163 //
164 //        for ( org.apache.maven.model.Dependency mavenDependency : mavenDependencies )
165 //        {
166 //            Object[] args = new Object[] { mavenDependency, typeRegistry };
167 //
168 //            Dependency aetherDependency =
169 //                (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
170 //
171 //            aetherDependencies.add( aetherDependency );
172 //        }
173 //
174 //        List<Dependency> aetherManagedDependencies = new ArrayList<Dependency>( managedMavenDependencies.size() );
175 //
176 //        for ( org.apache.maven.model.Dependency mavenDependency : managedMavenDependencies )
177 //        {
178 //            Object[] args = new Object[] { mavenDependency, typeRegistry };
179 //
180 //            Dependency aetherDependency =
181 //                (Dependency) Invoker.invoke( RepositoryUtils.class, "toDependency", argClasses, args );
182 //
183 //            aetherManagedDependencies.add( aetherDependency );
184 //        }
185 //
186 //        @SuppressWarnings( "unchecked" )
187 //        List<RemoteRepository> aetherRepositories =
188 //            (List<RemoteRepository>) Invoker.invoke( RepositoryUtils.class, "toRepos", List.class,
189 //                                                     buildingRequest.getRemoteRepositories() );
190 //
191 //        CollectRequest request =
192 //            new CollectRequest( aetherDependencies, aetherManagedDependencies, aetherRepositories );
193 //
194 //        return resolveDependencies( buildingRequest, aetherRepositories, filter, request );
195 //    }
196 
197 //    // CHECKSTYLE_OFF: LineLength
198 //    private Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult> resolveDependencies( ProjectBuildingRequest buildingRequest,
199 //                                                                                                   List<RemoteRepository> aetherRepositories,
200 //                                                                                                   TransformableFilter dependencyFilter,
201 //                                                                                                   CollectRequest request )
202 //                                                                                                       throws ArtifactResolverException
203 //    // CHECKSTYLE_ON :LineLength
204 //    {
205 //        try
206 //        {
207 //            DependencyFilter depFilter = null;
208 //            if ( dependencyFilter != null )
209 //            {
210 //                depFilter = dependencyFilter.transform( new SonatypeAetherFilterTransformer() );
211 //            }
212 //
213 //            RepositorySystemSession session =
214 //                (RepositorySystemSession) Invoker.invoke( buildingRequest, "getRepositorySession" );
215 //
216 //            List<ArtifactResult> dependencyResults =
217 //                repositorySystem.resolveDependencies( session, request, depFilter );
218 //
219 //            Collection<ArtifactRequest> artifactRequests = new ArrayList<ArtifactRequest>( dependencyResults.size() );
220 //
221 //            for ( ArtifactResult artifactResult : dependencyResults )
222 //            {
223 //                artifactRequests.add( new ArtifactRequest( artifactResult.getArtifact(), aetherRepositories, null ) );
224 //            }
225 //
226 //            final List<ArtifactResult> artifactResults = repositorySystem.resolveArtifacts( session, artifactRequests );
227 //
228 //            // Keep it lazy! Often artifactsResults aren't used, so transforming up front is too expensive
229 //            return new Iterable<org.apache.maven.shared.artifact.resolve.ArtifactResult>()
230 //            {
231 //                @Override
232 //                public Iterator<org.apache.maven.shared.artifact.resolve.ArtifactResult> iterator()
233 //                {
234 //                    Collection<org.apache.maven.shared.artifact.resolve.ArtifactResult> artResults =
235 //                        new ArrayList<org.apache.maven.shared.artifact.resolve.ArtifactResult>( artifactResults.size() );
236 //
237 //                    for ( ArtifactResult artifactResult : artifactResults )
238 //                    {
239 //                        artResults.add( new Maven30ArtifactResult( artifactResult ) );
240 //                    }
241 //
242 //                    return artResults.iterator();
243 //                }
244 //            };
245 //        }
246 //        catch ( ArtifactResolutionException e )
247 //        {
248 //            throw new ArtifactResolverException( e.getMessage(), e );
249 //        }
250 //        catch ( DependencyCollectionException e )
251 //        {
252 //            throw new ArtifactResolverException( e.getMessage(), e );
253 //        }
254 //    }
255 
256 //    /**
257 //     * Based on RepositoryUtils#toDependency(org.apache.maven.model.Dependency, ArtifactTypeRegistry)
258 //     * 
259 //     * @param coordinate
260 //     * @param stereotypes
261 //     * @return as Aether Dependency
262 //     */
263 //    private static Dependency toDependency( ArtifactCoordinate coordinate, ArtifactTypeRegistry stereotypes )
264 //    {
265 //        ArtifactType stereotype = stereotypes.get( coordinate.getExtension() );
266 //        if ( stereotype == null )
267 //        {
268 //            stereotype = new DefaultArtifactType( coordinate.getExtension() );
269 //        }
270 //
271 //        Artifact artifact =
272 //            new DefaultArtifact( coordinate.getGroupId(), coordinate.getArtifactId(), coordinate.getClassifier(), null,
273 //                                 coordinate.getVersion(), null, stereotype );
274 //
275 //        return new Dependency( artifact, null );
276 //    }
277 }