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 }