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 }