001package org.eclipse.aether.internal.impl; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import java.util.ArrayList; 023import java.util.Collection; 024import java.util.List; 025import static java.util.Objects.requireNonNull; 026 027import javax.inject.Inject; 028import javax.inject.Named; 029 030import org.eclipse.aether.RepositorySystem; 031import org.eclipse.aether.RepositorySystemSession; 032import org.eclipse.aether.RequestTrace; 033import org.eclipse.aether.SyncContext; 034import org.eclipse.aether.artifact.Artifact; 035import org.eclipse.aether.collection.CollectRequest; 036import org.eclipse.aether.collection.CollectResult; 037import org.eclipse.aether.collection.DependencyCollectionException; 038import org.eclipse.aether.deployment.DeployRequest; 039import org.eclipse.aether.deployment.DeployResult; 040import org.eclipse.aether.deployment.DeploymentException; 041import org.eclipse.aether.graph.DependencyFilter; 042import org.eclipse.aether.graph.DependencyVisitor; 043import org.eclipse.aether.impl.ArtifactDescriptorReader; 044import org.eclipse.aether.impl.ArtifactResolver; 045import org.eclipse.aether.impl.DependencyCollector; 046import org.eclipse.aether.impl.Deployer; 047import org.eclipse.aether.impl.Installer; 048import org.eclipse.aether.impl.LocalRepositoryProvider; 049import org.eclipse.aether.impl.MetadataResolver; 050import org.eclipse.aether.impl.RemoteRepositoryManager; 051import org.eclipse.aether.impl.SyncContextFactory; 052import org.eclipse.aether.impl.VersionRangeResolver; 053import org.eclipse.aether.impl.VersionResolver; 054import org.eclipse.aether.installation.InstallRequest; 055import org.eclipse.aether.installation.InstallResult; 056import org.eclipse.aether.installation.InstallationException; 057import org.eclipse.aether.repository.Authentication; 058import org.eclipse.aether.repository.LocalRepository; 059import org.eclipse.aether.repository.LocalRepositoryManager; 060import org.eclipse.aether.repository.NoLocalRepositoryManagerException; 061import org.eclipse.aether.repository.Proxy; 062import org.eclipse.aether.repository.RemoteRepository; 063import org.eclipse.aether.resolution.ArtifactDescriptorException; 064import org.eclipse.aether.resolution.ArtifactDescriptorRequest; 065import org.eclipse.aether.resolution.ArtifactDescriptorResult; 066import org.eclipse.aether.resolution.ArtifactRequest; 067import org.eclipse.aether.resolution.ArtifactResolutionException; 068import org.eclipse.aether.resolution.ArtifactResult; 069import org.eclipse.aether.resolution.DependencyRequest; 070import org.eclipse.aether.resolution.DependencyResolutionException; 071import org.eclipse.aether.resolution.DependencyResult; 072import org.eclipse.aether.resolution.MetadataRequest; 073import org.eclipse.aether.resolution.MetadataResult; 074import org.eclipse.aether.resolution.VersionRangeRequest; 075import org.eclipse.aether.resolution.VersionRangeResolutionException; 076import org.eclipse.aether.resolution.VersionRangeResult; 077import org.eclipse.aether.resolution.VersionRequest; 078import org.eclipse.aether.resolution.VersionResolutionException; 079import org.eclipse.aether.resolution.VersionResult; 080import org.eclipse.aether.spi.locator.Service; 081import org.eclipse.aether.spi.locator.ServiceLocator; 082import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor; 083import org.eclipse.aether.util.graph.visitor.TreeDependencyVisitor; 084 085/** 086 */ 087@Named 088public class DefaultRepositorySystem 089 implements RepositorySystem, Service 090{ 091 092 private VersionResolver versionResolver; 093 094 private VersionRangeResolver versionRangeResolver; 095 096 private ArtifactResolver artifactResolver; 097 098 private MetadataResolver metadataResolver; 099 100 private ArtifactDescriptorReader artifactDescriptorReader; 101 102 private DependencyCollector dependencyCollector; 103 104 private Installer installer; 105 106 private Deployer deployer; 107 108 private LocalRepositoryProvider localRepositoryProvider; 109 110 private SyncContextFactory syncContextFactory; 111 112 private RemoteRepositoryManager remoteRepositoryManager; 113 114 public DefaultRepositorySystem() 115 { 116 // enables default constructor 117 } 118 119 @Inject 120 DefaultRepositorySystem( VersionResolver versionResolver, VersionRangeResolver versionRangeResolver, 121 ArtifactResolver artifactResolver, MetadataResolver metadataResolver, 122 ArtifactDescriptorReader artifactDescriptorReader, 123 DependencyCollector dependencyCollector, Installer installer, Deployer deployer, 124 LocalRepositoryProvider localRepositoryProvider, SyncContextFactory syncContextFactory, 125 RemoteRepositoryManager remoteRepositoryManager ) 126 { 127 setVersionResolver( versionResolver ); 128 setVersionRangeResolver( versionRangeResolver ); 129 setArtifactResolver( artifactResolver ); 130 setMetadataResolver( metadataResolver ); 131 setArtifactDescriptorReader( artifactDescriptorReader ); 132 setDependencyCollector( dependencyCollector ); 133 setInstaller( installer ); 134 setDeployer( deployer ); 135 setLocalRepositoryProvider( localRepositoryProvider ); 136 setSyncContextFactory( syncContextFactory ); 137 setRemoteRepositoryManager( remoteRepositoryManager ); 138 } 139 140 public void initService( ServiceLocator locator ) 141 { 142 setVersionResolver( locator.getService( VersionResolver.class ) ); 143 setVersionRangeResolver( locator.getService( VersionRangeResolver.class ) ); 144 setArtifactResolver( locator.getService( ArtifactResolver.class ) ); 145 setMetadataResolver( locator.getService( MetadataResolver.class ) ); 146 setArtifactDescriptorReader( locator.getService( ArtifactDescriptorReader.class ) ); 147 setDependencyCollector( locator.getService( DependencyCollector.class ) ); 148 setInstaller( locator.getService( Installer.class ) ); 149 setDeployer( locator.getService( Deployer.class ) ); 150 setLocalRepositoryProvider( locator.getService( LocalRepositoryProvider.class ) ); 151 setRemoteRepositoryManager( locator.getService( RemoteRepositoryManager.class ) ); 152 setSyncContextFactory( locator.getService( SyncContextFactory.class ) ); 153 } 154 155 public DefaultRepositorySystem setVersionResolver( VersionResolver versionResolver ) 156 { 157 this.versionResolver = requireNonNull( versionResolver, "version resolver cannot be null" ); 158 return this; 159 } 160 161 public DefaultRepositorySystem setVersionRangeResolver( VersionRangeResolver versionRangeResolver ) 162 { 163 this.versionRangeResolver = requireNonNull( versionRangeResolver, "version range resolver cannot be null" ); 164 return this; 165 } 166 167 public DefaultRepositorySystem setArtifactResolver( ArtifactResolver artifactResolver ) 168 { 169 this.artifactResolver = requireNonNull( artifactResolver, "artifact resolver cannot be null" ); 170 return this; 171 } 172 173 public DefaultRepositorySystem setMetadataResolver( MetadataResolver metadataResolver ) 174 { 175 this.metadataResolver = requireNonNull( metadataResolver, "metadata resolver cannot be null" ); 176 return this; 177 } 178 179 public DefaultRepositorySystem setArtifactDescriptorReader( ArtifactDescriptorReader artifactDescriptorReader ) 180 { 181 this.artifactDescriptorReader = requireNonNull( artifactDescriptorReader, "artifact descriptor reader cannot be null" ); 182 return this; 183 } 184 185 public DefaultRepositorySystem setDependencyCollector( DependencyCollector dependencyCollector ) 186 { 187 this.dependencyCollector = requireNonNull( dependencyCollector, "dependency collector cannot be null" ); 188 return this; 189 } 190 191 public DefaultRepositorySystem setInstaller( Installer installer ) 192 { 193 this.installer = requireNonNull( installer, "installer cannot be null" ); 194 return this; 195 } 196 197 public DefaultRepositorySystem setDeployer( Deployer deployer ) 198 { 199 this.deployer = requireNonNull( deployer, "deployer cannot be null" ); 200 return this; 201 } 202 203 public DefaultRepositorySystem setLocalRepositoryProvider( LocalRepositoryProvider localRepositoryProvider ) 204 { 205 this.localRepositoryProvider = requireNonNull( localRepositoryProvider, "local repository provider cannot be null" ); 206 return this; 207 } 208 209 public DefaultRepositorySystem setSyncContextFactory( SyncContextFactory syncContextFactory ) 210 { 211 this.syncContextFactory = requireNonNull( syncContextFactory, "sync context factory cannot be null" ); 212 return this; 213 } 214 215 public DefaultRepositorySystem setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager ) 216 { 217 this.remoteRepositoryManager = requireNonNull( remoteRepositoryManager, "remote repository provider cannot be null" ); 218 return this; 219 } 220 221 public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request ) 222 throws VersionResolutionException 223 { 224 validateSession( session ); 225 return versionResolver.resolveVersion( session, request ); 226 } 227 228 public VersionRangeResult resolveVersionRange( RepositorySystemSession session, VersionRangeRequest request ) 229 throws VersionRangeResolutionException 230 { 231 validateSession( session ); 232 return versionRangeResolver.resolveVersionRange( session, request ); 233 } 234 235 public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session, 236 ArtifactDescriptorRequest request ) 237 throws ArtifactDescriptorException 238 { 239 validateSession( session ); 240 return artifactDescriptorReader.readArtifactDescriptor( session, request ); 241 } 242 243 public ArtifactResult resolveArtifact( RepositorySystemSession session, ArtifactRequest request ) 244 throws ArtifactResolutionException 245 { 246 validateSession( session ); 247 return artifactResolver.resolveArtifact( session, request ); 248 } 249 250 public List<ArtifactResult> resolveArtifacts( RepositorySystemSession session, 251 Collection<? extends ArtifactRequest> requests ) 252 throws ArtifactResolutionException 253 { 254 validateSession( session ); 255 return artifactResolver.resolveArtifacts( session, requests ); 256 } 257 258 public List<MetadataResult> resolveMetadata( RepositorySystemSession session, 259 Collection<? extends MetadataRequest> requests ) 260 { 261 validateSession( session ); 262 return metadataResolver.resolveMetadata( session, requests ); 263 } 264 265 public CollectResult collectDependencies( RepositorySystemSession session, CollectRequest request ) 266 throws DependencyCollectionException 267 { 268 validateSession( session ); 269 return dependencyCollector.collectDependencies( session, request ); 270 } 271 272 public DependencyResult resolveDependencies( RepositorySystemSession session, DependencyRequest request ) 273 throws DependencyResolutionException 274 { 275 validateSession( session ); 276 277 RequestTrace trace = RequestTrace.newChild( request.getTrace(), request ); 278 279 DependencyResult result = new DependencyResult( request ); 280 281 DependencyCollectionException dce = null; 282 ArtifactResolutionException are = null; 283 284 if ( request.getRoot() != null ) 285 { 286 result.setRoot( request.getRoot() ); 287 } 288 else if ( request.getCollectRequest() != null ) 289 { 290 CollectResult collectResult; 291 try 292 { 293 request.getCollectRequest().setTrace( trace ); 294 collectResult = dependencyCollector.collectDependencies( session, request.getCollectRequest() ); 295 } 296 catch ( DependencyCollectionException e ) 297 { 298 dce = e; 299 collectResult = e.getResult(); 300 } 301 result.setRoot( collectResult.getRoot() ); 302 result.setCycles( collectResult.getCycles() ); 303 result.setCollectExceptions( collectResult.getExceptions() ); 304 } 305 else 306 { 307 throw new NullPointerException( "dependency node and collect request cannot be null" ); 308 } 309 310 ArtifactRequestBuilder builder = new ArtifactRequestBuilder( trace ); 311 DependencyFilter filter = request.getFilter(); 312 DependencyVisitor visitor = ( filter != null ) ? new FilteringDependencyVisitor( builder, filter ) : builder; 313 visitor = new TreeDependencyVisitor( visitor ); 314 315 if ( result.getRoot() != null ) 316 { 317 result.getRoot().accept( visitor ); 318 } 319 320 List<ArtifactRequest> requests = builder.getRequests(); 321 322 List<ArtifactResult> results; 323 try 324 { 325 results = artifactResolver.resolveArtifacts( session, requests ); 326 } 327 catch ( ArtifactResolutionException e ) 328 { 329 are = e; 330 results = e.getResults(); 331 } 332 result.setArtifactResults( results ); 333 334 updateNodesWithResolvedArtifacts( results ); 335 336 if ( dce != null ) 337 { 338 throw new DependencyResolutionException( result, dce ); 339 } 340 else if ( are != null ) 341 { 342 throw new DependencyResolutionException( result, are ); 343 } 344 345 return result; 346 } 347 348 private void updateNodesWithResolvedArtifacts( List<ArtifactResult> results ) 349 { 350 for ( ArtifactResult result : results ) 351 { 352 Artifact artifact = result.getArtifact(); 353 if ( artifact != null ) 354 { 355 result.getRequest().getDependencyNode().setArtifact( artifact ); 356 } 357 } 358 } 359 360 public InstallResult install( RepositorySystemSession session, InstallRequest request ) 361 throws InstallationException 362 { 363 validateSession( session ); 364 return installer.install( session, request ); 365 } 366 367 public DeployResult deploy( RepositorySystemSession session, DeployRequest request ) 368 throws DeploymentException 369 { 370 validateSession( session ); 371 return deployer.deploy( session, request ); 372 } 373 374 public LocalRepositoryManager newLocalRepositoryManager( RepositorySystemSession session, 375 LocalRepository localRepository ) 376 { 377 try 378 { 379 return localRepositoryProvider.newLocalRepositoryManager( session, localRepository ); 380 } 381 catch ( NoLocalRepositoryManagerException e ) 382 { 383 throw new IllegalArgumentException( e.getMessage(), e ); 384 } 385 } 386 387 public SyncContext newSyncContext( RepositorySystemSession session, boolean shared ) 388 { 389 validateSession( session ); 390 return syncContextFactory.newInstance( session, shared ); 391 } 392 393 public List<RemoteRepository> newResolutionRepositories( RepositorySystemSession session, 394 List<RemoteRepository> repositories ) 395 { 396 validateSession( session ); 397 repositories = 398 remoteRepositoryManager.aggregateRepositories( session, new ArrayList<RemoteRepository>(), repositories, 399 true ); 400 return repositories; 401 } 402 403 public RemoteRepository newDeploymentRepository( RepositorySystemSession session, RemoteRepository repository ) 404 { 405 validateSession( session ); 406 RemoteRepository.Builder builder = new RemoteRepository.Builder( repository ); 407 Authentication auth = session.getAuthenticationSelector().getAuthentication( repository ); 408 builder.setAuthentication( auth ); 409 Proxy proxy = session.getProxySelector().getProxy( repository ); 410 builder.setProxy( proxy ); 411 return builder.build(); 412 } 413 414 private void validateSession( RepositorySystemSession session ) 415 { 416 requireNonNull( session, "repository system session cannot be null" ); 417 invalidSession( session.getLocalRepositoryManager(), "local repository manager" ); 418 invalidSession( session.getSystemProperties(), "system properties" ); 419 invalidSession( session.getUserProperties(), "user properties" ); 420 invalidSession( session.getConfigProperties(), "config properties" ); 421 invalidSession( session.getMirrorSelector(), "mirror selector" ); 422 invalidSession( session.getProxySelector(), "proxy selector" ); 423 invalidSession( session.getAuthenticationSelector(), "authentication selector" ); 424 invalidSession( session.getArtifactTypeRegistry(), "artifact type registry" ); 425 invalidSession( session.getData(), "data" ); 426 } 427 428 private void invalidSession( Object obj, String name ) 429 { 430 requireNonNull( obj, "repository system session's " + name + " cannot be null" ); 431 } 432 433}