1 package org.eclipse.aether.internal.impl;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.List;
25
26 import javax.inject.Inject;
27 import javax.inject.Named;
28
29 import org.eclipse.aether.RepositorySystem;
30 import org.eclipse.aether.RepositorySystemSession;
31 import org.eclipse.aether.RequestTrace;
32 import org.eclipse.aether.SyncContext;
33 import org.eclipse.aether.artifact.Artifact;
34 import org.eclipse.aether.collection.CollectRequest;
35 import org.eclipse.aether.collection.CollectResult;
36 import org.eclipse.aether.collection.DependencyCollectionException;
37 import org.eclipse.aether.deployment.DeployRequest;
38 import org.eclipse.aether.deployment.DeployResult;
39 import org.eclipse.aether.deployment.DeploymentException;
40 import org.eclipse.aether.graph.DependencyFilter;
41 import org.eclipse.aether.graph.DependencyVisitor;
42 import org.eclipse.aether.impl.ArtifactDescriptorReader;
43 import org.eclipse.aether.impl.ArtifactResolver;
44 import org.eclipse.aether.impl.DependencyCollector;
45 import org.eclipse.aether.impl.Deployer;
46 import org.eclipse.aether.impl.Installer;
47 import org.eclipse.aether.impl.LocalRepositoryProvider;
48 import org.eclipse.aether.impl.MetadataResolver;
49 import org.eclipse.aether.impl.RemoteRepositoryManager;
50 import org.eclipse.aether.impl.SyncContextFactory;
51 import org.eclipse.aether.impl.VersionRangeResolver;
52 import org.eclipse.aether.impl.VersionResolver;
53 import org.eclipse.aether.installation.InstallRequest;
54 import org.eclipse.aether.installation.InstallResult;
55 import org.eclipse.aether.installation.InstallationException;
56 import org.eclipse.aether.repository.Authentication;
57 import org.eclipse.aether.repository.LocalRepository;
58 import org.eclipse.aether.repository.LocalRepositoryManager;
59 import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
60 import org.eclipse.aether.repository.Proxy;
61 import org.eclipse.aether.repository.RemoteRepository;
62 import org.eclipse.aether.resolution.ArtifactDescriptorException;
63 import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
64 import org.eclipse.aether.resolution.ArtifactDescriptorResult;
65 import org.eclipse.aether.resolution.ArtifactRequest;
66 import org.eclipse.aether.resolution.ArtifactResolutionException;
67 import org.eclipse.aether.resolution.ArtifactResult;
68 import org.eclipse.aether.resolution.DependencyRequest;
69 import org.eclipse.aether.resolution.DependencyResolutionException;
70 import org.eclipse.aether.resolution.DependencyResult;
71 import org.eclipse.aether.resolution.MetadataRequest;
72 import org.eclipse.aether.resolution.MetadataResult;
73 import org.eclipse.aether.resolution.VersionRangeRequest;
74 import org.eclipse.aether.resolution.VersionRangeResolutionException;
75 import org.eclipse.aether.resolution.VersionRangeResult;
76 import org.eclipse.aether.resolution.VersionRequest;
77 import org.eclipse.aether.resolution.VersionResolutionException;
78 import org.eclipse.aether.resolution.VersionResult;
79 import org.eclipse.aether.spi.locator.Service;
80 import org.eclipse.aether.spi.locator.ServiceLocator;
81 import org.eclipse.aether.spi.log.Logger;
82 import org.eclipse.aether.spi.log.LoggerFactory;
83 import org.eclipse.aether.spi.log.NullLoggerFactory;
84 import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor;
85 import org.eclipse.aether.util.graph.visitor.TreeDependencyVisitor;
86
87
88
89 @Named
90 public class DefaultRepositorySystem
91 implements RepositorySystem, Service
92 {
93
94 private Logger logger = NullLoggerFactory.LOGGER;
95
96 private VersionResolver versionResolver;
97
98 private VersionRangeResolver versionRangeResolver;
99
100 private ArtifactResolver artifactResolver;
101
102 private MetadataResolver metadataResolver;
103
104 private ArtifactDescriptorReader artifactDescriptorReader;
105
106 private DependencyCollector dependencyCollector;
107
108 private Installer installer;
109
110 private Deployer deployer;
111
112 private LocalRepositoryProvider localRepositoryProvider;
113
114 private SyncContextFactory syncContextFactory;
115
116 private RemoteRepositoryManager remoteRepositoryManager;
117
118 public DefaultRepositorySystem()
119 {
120
121 }
122
123 @Inject
124 DefaultRepositorySystem( VersionResolver versionResolver, VersionRangeResolver versionRangeResolver,
125 ArtifactResolver artifactResolver, MetadataResolver metadataResolver,
126 ArtifactDescriptorReader artifactDescriptorReader,
127 DependencyCollector dependencyCollector, Installer installer, Deployer deployer,
128 LocalRepositoryProvider localRepositoryProvider, SyncContextFactory syncContextFactory,
129 RemoteRepositoryManager remoteRepositoryManager, LoggerFactory loggerFactory )
130 {
131 setVersionResolver( versionResolver );
132 setVersionRangeResolver( versionRangeResolver );
133 setArtifactResolver( artifactResolver );
134 setMetadataResolver( metadataResolver );
135 setArtifactDescriptorReader( artifactDescriptorReader );
136 setDependencyCollector( dependencyCollector );
137 setInstaller( installer );
138 setDeployer( deployer );
139 setLocalRepositoryProvider( localRepositoryProvider );
140 setSyncContextFactory( syncContextFactory );
141 setRemoteRepositoryManager( remoteRepositoryManager );
142 setLoggerFactory( loggerFactory );
143 }
144
145 public void initService( ServiceLocator locator )
146 {
147 setLoggerFactory( locator.getService( LoggerFactory.class ) );
148 setVersionResolver( locator.getService( VersionResolver.class ) );
149 setVersionRangeResolver( locator.getService( VersionRangeResolver.class ) );
150 setArtifactResolver( locator.getService( ArtifactResolver.class ) );
151 setMetadataResolver( locator.getService( MetadataResolver.class ) );
152 setArtifactDescriptorReader( locator.getService( ArtifactDescriptorReader.class ) );
153 setDependencyCollector( locator.getService( DependencyCollector.class ) );
154 setInstaller( locator.getService( Installer.class ) );
155 setDeployer( locator.getService( Deployer.class ) );
156 setLocalRepositoryProvider( locator.getService( LocalRepositoryProvider.class ) );
157 setRemoteRepositoryManager( locator.getService( RemoteRepositoryManager.class ) );
158 setSyncContextFactory( locator.getService( SyncContextFactory.class ) );
159 }
160
161 public DefaultRepositorySystem setLoggerFactory( LoggerFactory loggerFactory )
162 {
163 this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, getClass() );
164 return this;
165 }
166
167 public DefaultRepositorySystem setVersionResolver( VersionResolver versionResolver )
168 {
169 if ( versionResolver == null )
170 {
171 throw new IllegalArgumentException( "version resolver has not been specified" );
172 }
173 this.versionResolver = versionResolver;
174 return this;
175 }
176
177 public DefaultRepositorySystem setVersionRangeResolver( VersionRangeResolver versionRangeResolver )
178 {
179 if ( versionRangeResolver == null )
180 {
181 throw new IllegalArgumentException( "version range resolver has not been specified" );
182 }
183 this.versionRangeResolver = versionRangeResolver;
184 return this;
185 }
186
187 public DefaultRepositorySystem setArtifactResolver( ArtifactResolver artifactResolver )
188 {
189 if ( artifactResolver == null )
190 {
191 throw new IllegalArgumentException( "artifact resolver has not been specified" );
192 }
193 this.artifactResolver = artifactResolver;
194 return this;
195 }
196
197 public DefaultRepositorySystem setMetadataResolver( MetadataResolver metadataResolver )
198 {
199 if ( metadataResolver == null )
200 {
201 throw new IllegalArgumentException( "metadata resolver has not been specified" );
202 }
203 this.metadataResolver = metadataResolver;
204 return this;
205 }
206
207 public DefaultRepositorySystem setArtifactDescriptorReader( ArtifactDescriptorReader artifactDescriptorReader )
208 {
209 if ( artifactDescriptorReader == null )
210 {
211 throw new IllegalArgumentException( "artifact descriptor reader has not been specified" );
212 }
213 this.artifactDescriptorReader = artifactDescriptorReader;
214 return this;
215 }
216
217 public DefaultRepositorySystem setDependencyCollector( DependencyCollector dependencyCollector )
218 {
219 if ( dependencyCollector == null )
220 {
221 throw new IllegalArgumentException( "dependency collector has not been specified" );
222 }
223 this.dependencyCollector = dependencyCollector;
224 return this;
225 }
226
227 public DefaultRepositorySystem setInstaller( Installer installer )
228 {
229 if ( installer == null )
230 {
231 throw new IllegalArgumentException( "installer has not been specified" );
232 }
233 this.installer = installer;
234 return this;
235 }
236
237 public DefaultRepositorySystem setDeployer( Deployer deployer )
238 {
239 if ( deployer == null )
240 {
241 throw new IllegalArgumentException( "deployer has not been specified" );
242 }
243 this.deployer = deployer;
244 return this;
245 }
246
247 public DefaultRepositorySystem setLocalRepositoryProvider( LocalRepositoryProvider localRepositoryProvider )
248 {
249 if ( localRepositoryProvider == null )
250 {
251 throw new IllegalArgumentException( "local repository provider has not been specified" );
252 }
253 this.localRepositoryProvider = localRepositoryProvider;
254 return this;
255 }
256
257 public DefaultRepositorySystem setSyncContextFactory( SyncContextFactory syncContextFactory )
258 {
259 if ( syncContextFactory == null )
260 {
261 throw new IllegalArgumentException( "sync context factory has not been specified" );
262 }
263 this.syncContextFactory = syncContextFactory;
264 return this;
265 }
266
267 public DefaultRepositorySystem setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
268 {
269 if ( remoteRepositoryManager == null )
270 {
271 throw new IllegalArgumentException( "remote repository manager has not been specified" );
272 }
273 this.remoteRepositoryManager = remoteRepositoryManager;
274 return this;
275 }
276
277 public VersionResult resolveVersion( RepositorySystemSession session, VersionRequest request )
278 throws VersionResolutionException
279 {
280 validateSession( session );
281 return versionResolver.resolveVersion( session, request );
282 }
283
284 public VersionRangeResult resolveVersionRange( RepositorySystemSession session, VersionRangeRequest request )
285 throws VersionRangeResolutionException
286 {
287 validateSession( session );
288 return versionRangeResolver.resolveVersionRange( session, request );
289 }
290
291 public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session,
292 ArtifactDescriptorRequest request )
293 throws ArtifactDescriptorException
294 {
295 validateSession( session );
296 return artifactDescriptorReader.readArtifactDescriptor( session, request );
297 }
298
299 public ArtifactResult resolveArtifact( RepositorySystemSession session, ArtifactRequest request )
300 throws ArtifactResolutionException
301 {
302 validateSession( session );
303 return artifactResolver.resolveArtifact( session, request );
304 }
305
306 public List<ArtifactResult> resolveArtifacts( RepositorySystemSession session,
307 Collection<? extends ArtifactRequest> requests )
308 throws ArtifactResolutionException
309 {
310 validateSession( session );
311 return artifactResolver.resolveArtifacts( session, requests );
312 }
313
314 public List<MetadataResult> resolveMetadata( RepositorySystemSession session,
315 Collection<? extends MetadataRequest> requests )
316 {
317 validateSession( session );
318 return metadataResolver.resolveMetadata( session, requests );
319 }
320
321 public CollectResult collectDependencies( RepositorySystemSession session, CollectRequest request )
322 throws DependencyCollectionException
323 {
324 validateSession( session );
325 return dependencyCollector.collectDependencies( session, request );
326 }
327
328 public DependencyResult resolveDependencies( RepositorySystemSession session, DependencyRequest request )
329 throws DependencyResolutionException
330 {
331 validateSession( session );
332
333 RequestTrace trace = RequestTrace.newChild( request.getTrace(), request );
334
335 DependencyResult result = new DependencyResult( request );
336
337 DependencyCollectionException dce = null;
338 ArtifactResolutionException are = null;
339
340 if ( request.getRoot() != null )
341 {
342 result.setRoot( request.getRoot() );
343 }
344 else if ( request.getCollectRequest() != null )
345 {
346 CollectResult collectResult;
347 try
348 {
349 request.getCollectRequest().setTrace( trace );
350 collectResult = dependencyCollector.collectDependencies( session, request.getCollectRequest() );
351 }
352 catch ( DependencyCollectionException e )
353 {
354 dce = e;
355 collectResult = e.getResult();
356 }
357 result.setRoot( collectResult.getRoot() );
358 result.setCycles( collectResult.getCycles() );
359 result.setCollectExceptions( collectResult.getExceptions() );
360 }
361 else
362 {
363 throw new IllegalArgumentException( "dependency node or collect request missing" );
364 }
365
366 ArtifactRequestBuilder builder = new ArtifactRequestBuilder( trace );
367 DependencyFilter filter = request.getFilter();
368 DependencyVisitor visitor = ( filter != null ) ? new FilteringDependencyVisitor( builder, filter ) : builder;
369 visitor = new TreeDependencyVisitor( visitor );
370 result.getRoot().accept( visitor );
371 List<ArtifactRequest> requests = builder.getRequests();
372
373 List<ArtifactResult> results;
374 try
375 {
376 results = artifactResolver.resolveArtifacts( session, requests );
377 }
378 catch ( ArtifactResolutionException e )
379 {
380 are = e;
381 results = e.getResults();
382 }
383 result.setArtifactResults( results );
384
385 updateNodesWithResolvedArtifacts( results );
386
387 if ( dce != null )
388 {
389 throw new DependencyResolutionException( result, dce );
390 }
391 else if ( are != null )
392 {
393 throw new DependencyResolutionException( result, are );
394 }
395
396 return result;
397 }
398
399 private void updateNodesWithResolvedArtifacts( List<ArtifactResult> results )
400 {
401 for ( ArtifactResult result : results )
402 {
403 Artifact artifact = result.getArtifact();
404 if ( artifact != null )
405 {
406 result.getRequest().getDependencyNode().setArtifact( artifact );
407 }
408 }
409 }
410
411 public InstallResult install( RepositorySystemSession session, InstallRequest request )
412 throws InstallationException
413 {
414 validateSession( session );
415 return installer.install( session, request );
416 }
417
418 public DeployResult deploy( RepositorySystemSession session, DeployRequest request )
419 throws DeploymentException
420 {
421 validateSession( session );
422 return deployer.deploy( session, request );
423 }
424
425 public LocalRepositoryManager newLocalRepositoryManager( RepositorySystemSession session,
426 LocalRepository localRepository )
427 {
428 try
429 {
430 return localRepositoryProvider.newLocalRepositoryManager( session, localRepository );
431 }
432 catch ( NoLocalRepositoryManagerException e )
433 {
434 throw new IllegalArgumentException( e.getMessage(), e );
435 }
436 }
437
438 public SyncContext newSyncContext( RepositorySystemSession session, boolean shared )
439 {
440 validateSession( session );
441 return syncContextFactory.newInstance( session, shared );
442 }
443
444 public List<RemoteRepository> newResolutionRepositories( RepositorySystemSession session,
445 List<RemoteRepository> repositories )
446 {
447 validateSession( session );
448 repositories =
449 remoteRepositoryManager.aggregateRepositories( session, new ArrayList<RemoteRepository>(), repositories,
450 true );
451 return repositories;
452 }
453
454 public RemoteRepository newDeploymentRepository( RepositorySystemSession session, RemoteRepository repository )
455 {
456 validateSession( session );
457 RemoteRepository.Builder builder = new RemoteRepository.Builder( repository );
458 Authentication auth = session.getAuthenticationSelector().getAuthentication( repository );
459 builder.setAuthentication( auth );
460 Proxy proxy = session.getProxySelector().getProxy( repository );
461 builder.setProxy( proxy );
462 return builder.build();
463 }
464
465 private void validateSession( RepositorySystemSession session )
466 {
467 if ( session == null )
468 {
469 throw new IllegalArgumentException( "Invalid repository system session: the session may not be null." );
470 }
471 if ( session.getLocalRepositoryManager() == null )
472 {
473 invalidSession( "LocalRepositoryManager" );
474 }
475 if ( session.getSystemProperties() == null )
476 {
477 invalidSession( "SystemProperties" );
478 }
479 if ( session.getUserProperties() == null )
480 {
481 invalidSession( "UserProperties" );
482 }
483 if ( session.getConfigProperties() == null )
484 {
485 invalidSession( "ConfigProperties" );
486 }
487 if ( session.getMirrorSelector() == null )
488 {
489 invalidSession( "MirrorSelector" );
490 }
491 if ( session.getProxySelector() == null )
492 {
493 invalidSession( "ProxySelector" );
494 }
495 if ( session.getAuthenticationSelector() == null )
496 {
497 invalidSession( "AuthenticationSelector" );
498 }
499 if ( session.getArtifactTypeRegistry() == null )
500 {
501 invalidSession( "ArtifactTypeRegistry" );
502 }
503 if ( session.getData() == null )
504 {
505 invalidSession( "Data" );
506 }
507 }
508
509 private void invalidSession( String name )
510 {
511 throw new IllegalArgumentException( "Invalid repository system session: " + name + " is not set." );
512 }
513
514 }