View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.supplier;
20  
21  import java.util.ArrayList;
22  import java.util.HashMap;
23  import java.util.List;
24  import java.util.Map;
25  import java.util.concurrent.atomic.AtomicBoolean;
26  import java.util.function.Supplier;
27  
28  import org.apache.maven.model.building.DefaultModelBuilderFactory;
29  import org.apache.maven.model.building.ModelBuilder;
30  import org.apache.maven.repository.internal.DefaultArtifactDescriptorReader;
31  import org.apache.maven.repository.internal.DefaultModelCacheFactory;
32  import org.apache.maven.repository.internal.DefaultVersionRangeResolver;
33  import org.apache.maven.repository.internal.DefaultVersionResolver;
34  import org.apache.maven.repository.internal.ModelCacheFactory;
35  import org.apache.maven.repository.internal.PluginsMetadataGeneratorFactory;
36  import org.apache.maven.repository.internal.SnapshotMetadataGeneratorFactory;
37  import org.apache.maven.repository.internal.VersionsMetadataGeneratorFactory;
38  import org.eclipse.aether.RepositoryListener;
39  import org.eclipse.aether.RepositorySystem;
40  import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
41  import org.eclipse.aether.impl.ArtifactDescriptorReader;
42  import org.eclipse.aether.impl.ArtifactResolver;
43  import org.eclipse.aether.impl.DependencyCollector;
44  import org.eclipse.aether.impl.Deployer;
45  import org.eclipse.aether.impl.Installer;
46  import org.eclipse.aether.impl.LocalRepositoryProvider;
47  import org.eclipse.aether.impl.MetadataGeneratorFactory;
48  import org.eclipse.aether.impl.MetadataResolver;
49  import org.eclipse.aether.impl.OfflineController;
50  import org.eclipse.aether.impl.RemoteRepositoryFilterManager;
51  import org.eclipse.aether.impl.RemoteRepositoryManager;
52  import org.eclipse.aether.impl.RepositoryConnectorProvider;
53  import org.eclipse.aether.impl.RepositoryEventDispatcher;
54  import org.eclipse.aether.impl.RepositorySystemLifecycle;
55  import org.eclipse.aether.impl.RepositorySystemValidator;
56  import org.eclipse.aether.impl.UpdateCheckManager;
57  import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
58  import org.eclipse.aether.impl.VersionRangeResolver;
59  import org.eclipse.aether.impl.VersionResolver;
60  import org.eclipse.aether.internal.impl.DefaultArtifactPredicateFactory;
61  import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
62  import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
63  import org.eclipse.aether.internal.impl.DefaultChecksumProcessor;
64  import org.eclipse.aether.internal.impl.DefaultDeployer;
65  import org.eclipse.aether.internal.impl.DefaultInstaller;
66  import org.eclipse.aether.internal.impl.DefaultLocalPathComposer;
67  import org.eclipse.aether.internal.impl.DefaultLocalPathPrefixComposerFactory;
68  import org.eclipse.aether.internal.impl.DefaultLocalRepositoryProvider;
69  import org.eclipse.aether.internal.impl.DefaultMetadataResolver;
70  import org.eclipse.aether.internal.impl.DefaultOfflineController;
71  import org.eclipse.aether.internal.impl.DefaultPathProcessor;
72  import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
73  import org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider;
74  import org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher;
75  import org.eclipse.aether.internal.impl.DefaultRepositoryLayoutProvider;
76  import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
77  import org.eclipse.aether.internal.impl.DefaultRepositorySystemLifecycle;
78  import org.eclipse.aether.internal.impl.DefaultRepositorySystemValidator;
79  import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
80  import org.eclipse.aether.internal.impl.DefaultTransporterProvider;
81  import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager;
82  import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
83  import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
84  import org.eclipse.aether.internal.impl.LocalPathComposer;
85  import org.eclipse.aether.internal.impl.LocalPathPrefixComposerFactory;
86  import org.eclipse.aether.internal.impl.Maven2RepositoryLayoutFactory;
87  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
88  import org.eclipse.aether.internal.impl.TrackingFileManager;
89  import org.eclipse.aether.internal.impl.checksum.DefaultChecksumAlgorithmFactorySelector;
90  import org.eclipse.aether.internal.impl.checksum.Md5ChecksumAlgorithmFactory;
91  import org.eclipse.aether.internal.impl.checksum.Sha1ChecksumAlgorithmFactory;
92  import org.eclipse.aether.internal.impl.checksum.Sha256ChecksumAlgorithmFactory;
93  import org.eclipse.aether.internal.impl.checksum.Sha512ChecksumAlgorithmFactory;
94  import org.eclipse.aether.internal.impl.checksum.SparseDirectoryTrustedChecksumsSource;
95  import org.eclipse.aether.internal.impl.checksum.SummaryFileTrustedChecksumsSource;
96  import org.eclipse.aether.internal.impl.checksum.TrustedToProvidedChecksumsSourceAdapter;
97  import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector;
98  import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate;
99  import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector;
100 import org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector;
101 import org.eclipse.aether.internal.impl.filter.DefaultRemoteRepositoryFilterManager;
102 import org.eclipse.aether.internal.impl.filter.FilteringPipelineRepositoryConnectorFactory;
103 import org.eclipse.aether.internal.impl.filter.GroupIdRemoteRepositoryFilterSource;
104 import org.eclipse.aether.internal.impl.filter.PrefixesRemoteRepositoryFilterSource;
105 import org.eclipse.aether.internal.impl.offline.OfflinePipelineRepositoryConnectorFactory;
106 import org.eclipse.aether.internal.impl.resolution.TrustedChecksumsArtifactResolverPostProcessor;
107 import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory;
108 import org.eclipse.aether.internal.impl.synccontext.named.NameMapper;
109 import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
110 import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactory;
111 import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactoryImpl;
112 import org.eclipse.aether.internal.impl.transport.http.DefaultChecksumExtractor;
113 import org.eclipse.aether.internal.impl.transport.http.Nx2ChecksumExtractor;
114 import org.eclipse.aether.internal.impl.transport.http.XChecksumExtractor;
115 import org.eclipse.aether.named.NamedLockFactory;
116 import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
117 import org.eclipse.aether.named.providers.LocalReadWriteLockNamedLockFactory;
118 import org.eclipse.aether.named.providers.LocalSemaphoreNamedLockFactory;
119 import org.eclipse.aether.named.providers.NoopNamedLockFactory;
120 import org.eclipse.aether.spi.artifact.ArtifactPredicateFactory;
121 import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory;
122 import org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory;
123 import org.eclipse.aether.spi.artifact.transformer.ArtifactTransformer;
124 import org.eclipse.aether.spi.checksums.ProvidedChecksumsSource;
125 import org.eclipse.aether.spi.checksums.TrustedChecksumsSource;
126 import org.eclipse.aether.spi.connector.PipelineRepositoryConnectorFactory;
127 import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
128 import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
129 import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector;
130 import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
131 import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilterSource;
132 import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
133 import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
134 import org.eclipse.aether.spi.connector.transport.TransporterFactory;
135 import org.eclipse.aether.spi.connector.transport.TransporterProvider;
136 import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractor;
137 import org.eclipse.aether.spi.connector.transport.http.ChecksumExtractorStrategy;
138 import org.eclipse.aether.spi.io.ChecksumProcessor;
139 import org.eclipse.aether.spi.io.PathProcessor;
140 import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
141 import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor;
142 import org.eclipse.aether.spi.synccontext.SyncContextFactory;
143 import org.eclipse.aether.spi.validator.ValidatorFactory;
144 import org.eclipse.aether.transport.apache.ApacheTransporterFactory;
145 import org.eclipse.aether.transport.file.FileTransporterFactory;
146 import org.eclipse.aether.util.version.GenericVersionScheme;
147 import org.eclipse.aether.version.VersionScheme;
148 
149 /**
150  * A simple memorizing {@link Supplier} of {@link org.eclipse.aether.RepositorySystem} instance, that on first call
151  * supplies lazily constructed instance, and on each subsequent call same instance. Hence, this instance should be
152  * thrown away immediately once repository system was created and there is no need for more instances. If new
153  * repository system instance needed, new instance of this class must be created. For proper shut down of returned
154  * repository system instance(s) use {@link RepositorySystem#shutdown()} method on supplied instance(s).
155  * <p>
156  * Since Resolver 2.0 this class offers access to various components via public getters, and allows even partial object
157  * graph construction.
158  * <p>
159  * Extend this class {@code createXXX()} methods and override to customize, if needed. The contract of this class makes
160  * sure that these (potentially overridden) methods are invoked only once, and instance created by those methods are
161  * memorized and kept as long as supplier instance is kept open.
162  * <p>
163  * This class is not thread safe and must be used from one thread only, while the constructed {@link RepositorySystem}
164  * is thread safe.
165  * <p>
166  * Important: Given the instance of supplier memorizes the supplier {@link RepositorySystem} instance it supplies,
167  * their lifecycle is shared as well: once supplied repository system is shut-down, this instance becomes closed as
168  * well. Any subsequent {@code getXXX} method invocation attempt will fail with {@link IllegalStateException}.
169  *
170  * @since 1.9.15
171  */
172 public class RepositorySystemSupplier implements Supplier<RepositorySystem> {
173     private final AtomicBoolean closed = new AtomicBoolean(false);
174 
175     public RepositorySystemSupplier() {}
176 
177     private void checkClosed() {
178         if (closed.get()) {
179             throw new IllegalStateException("Supplier is closed");
180         }
181     }
182 
183     private PathProcessor pathProcessor;
184 
185     public final PathProcessor getPathProcessor() {
186         checkClosed();
187         if (pathProcessor == null) {
188             pathProcessor = createPathProcessor();
189         }
190         return pathProcessor;
191     }
192 
193     protected PathProcessor createPathProcessor() {
194         return new DefaultPathProcessor();
195     }
196 
197     private ChecksumProcessor checksumProcessor;
198 
199     public final ChecksumProcessor getChecksumProcessor() {
200         checkClosed();
201         if (checksumProcessor == null) {
202             checksumProcessor = createChecksumProcessor();
203         }
204         return checksumProcessor;
205     }
206 
207     protected ChecksumProcessor createChecksumProcessor() {
208         return new DefaultChecksumProcessor(getPathProcessor());
209     }
210 
211     private TrackingFileManager trackingFileManager;
212 
213     public final TrackingFileManager getTrackingFileManager() {
214         checkClosed();
215         if (trackingFileManager == null) {
216             trackingFileManager = createTrackingFileManager();
217         }
218         return trackingFileManager;
219     }
220 
221     protected TrackingFileManager createTrackingFileManager() {
222         return new DefaultTrackingFileManager();
223     }
224 
225     private LocalPathComposer localPathComposer;
226 
227     public final LocalPathComposer getLocalPathComposer() {
228         checkClosed();
229         if (localPathComposer == null) {
230             localPathComposer = createLocalPathComposer();
231         }
232         return localPathComposer;
233     }
234 
235     protected LocalPathComposer createLocalPathComposer() {
236         return new DefaultLocalPathComposer();
237     }
238 
239     private LocalPathPrefixComposerFactory localPathPrefixComposerFactory;
240 
241     public final LocalPathPrefixComposerFactory getLocalPathPrefixComposerFactory() {
242         checkClosed();
243         if (localPathPrefixComposerFactory == null) {
244             localPathPrefixComposerFactory = createLocalPathPrefixComposerFactory();
245         }
246         return localPathPrefixComposerFactory;
247     }
248 
249     protected LocalPathPrefixComposerFactory createLocalPathPrefixComposerFactory() {
250         return new DefaultLocalPathPrefixComposerFactory();
251     }
252 
253     private RepositorySystemLifecycle repositorySystemLifecycle;
254 
255     public final RepositorySystemLifecycle getRepositorySystemLifecycle() {
256         checkClosed();
257         if (repositorySystemLifecycle == null) {
258             repositorySystemLifecycle = createRepositorySystemLifecycle();
259             repositorySystemLifecycle.addOnSystemEndedHandler(() -> closed.set(true));
260         }
261         return repositorySystemLifecycle;
262     }
263 
264     protected RepositorySystemLifecycle createRepositorySystemLifecycle() {
265         return new DefaultRepositorySystemLifecycle();
266     }
267 
268     private OfflineController offlineController;
269 
270     public final OfflineController getOfflineController() {
271         checkClosed();
272         if (offlineController == null) {
273             offlineController = createOfflineController();
274         }
275         return offlineController;
276     }
277 
278     protected OfflineController createOfflineController() {
279         return new DefaultOfflineController();
280     }
281 
282     private UpdatePolicyAnalyzer updatePolicyAnalyzer;
283 
284     public final UpdatePolicyAnalyzer getUpdatePolicyAnalyzer() {
285         checkClosed();
286         if (updatePolicyAnalyzer == null) {
287             updatePolicyAnalyzer = createUpdatePolicyAnalyzer();
288         }
289         return updatePolicyAnalyzer;
290     }
291 
292     protected UpdatePolicyAnalyzer createUpdatePolicyAnalyzer() {
293         return new DefaultUpdatePolicyAnalyzer();
294     }
295 
296     private ChecksumPolicyProvider checksumPolicyProvider;
297 
298     public final ChecksumPolicyProvider getChecksumPolicyProvider() {
299         checkClosed();
300         if (checksumPolicyProvider == null) {
301             checksumPolicyProvider = createChecksumPolicyProvider();
302         }
303         return checksumPolicyProvider;
304     }
305 
306     protected ChecksumPolicyProvider createChecksumPolicyProvider() {
307         return new DefaultChecksumPolicyProvider();
308     }
309 
310     private UpdateCheckManager updateCheckManager;
311 
312     public final UpdateCheckManager getUpdateCheckManager() {
313         checkClosed();
314         if (updateCheckManager == null) {
315             updateCheckManager = createUpdateCheckManager();
316         }
317         return updateCheckManager;
318     }
319 
320     protected UpdateCheckManager createUpdateCheckManager() {
321         return new DefaultUpdateCheckManager(getTrackingFileManager(), getUpdatePolicyAnalyzer(), getPathProcessor());
322     }
323 
324     private Map<String, NamedLockFactory> namedLockFactories;
325 
326     public final Map<String, NamedLockFactory> getNamedLockFactories() {
327         checkClosed();
328         if (namedLockFactories == null) {
329             namedLockFactories = createNamedLockFactories();
330         }
331         return namedLockFactories;
332     }
333 
334     protected Map<String, NamedLockFactory> createNamedLockFactories() {
335         HashMap<String, NamedLockFactory> result = new HashMap<>();
336         result.put(NoopNamedLockFactory.NAME, new NoopNamedLockFactory());
337         result.put(LocalReadWriteLockNamedLockFactory.NAME, new LocalReadWriteLockNamedLockFactory());
338         result.put(LocalSemaphoreNamedLockFactory.NAME, new LocalSemaphoreNamedLockFactory());
339         result.put(FileLockNamedLockFactory.NAME, new FileLockNamedLockFactory());
340         return result;
341     }
342 
343     private Map<String, NameMapper> nameMappers;
344 
345     public final Map<String, NameMapper> getNameMappers() {
346         checkClosed();
347         if (nameMappers == null) {
348             nameMappers = createNameMappers();
349         }
350         return nameMappers;
351     }
352 
353     protected Map<String, NameMapper> createNameMappers() {
354         HashMap<String, NameMapper> result = new HashMap<>();
355         result.put(NameMappers.STATIC_NAME, NameMappers.staticNameMapper());
356         result.put(NameMappers.GAV_NAME, NameMappers.gavNameMapper());
357         result.put(NameMappers.DISCRIMINATING_NAME, NameMappers.discriminatingNameMapper());
358         result.put(NameMappers.FILE_GAV_NAME, NameMappers.fileGavNameMapper());
359         result.put(NameMappers.FILE_HGAV_NAME, NameMappers.fileHashingGavNameMapper());
360         return result;
361     }
362 
363     private NamedLockFactoryAdapterFactory namedLockFactoryAdapterFactory;
364 
365     public final NamedLockFactoryAdapterFactory getNamedLockFactoryAdapterFactory() {
366         checkClosed();
367         if (namedLockFactoryAdapterFactory == null) {
368             namedLockFactoryAdapterFactory = createNamedLockFactoryAdapterFactory();
369         }
370         return namedLockFactoryAdapterFactory;
371     }
372 
373     protected NamedLockFactoryAdapterFactory createNamedLockFactoryAdapterFactory() {
374         return new NamedLockFactoryAdapterFactoryImpl(
375                 getNamedLockFactories(), getNameMappers(), getRepositorySystemLifecycle());
376     }
377 
378     private SyncContextFactory syncContextFactory;
379 
380     public final SyncContextFactory getSyncContextFactory() {
381         checkClosed();
382         if (syncContextFactory == null) {
383             syncContextFactory = createSyncContextFactory();
384         }
385         return syncContextFactory;
386     }
387 
388     protected SyncContextFactory createSyncContextFactory() {
389         return new DefaultSyncContextFactory(getNamedLockFactoryAdapterFactory());
390     }
391 
392     private Map<String, ChecksumAlgorithmFactory> checksumAlgorithmFactories;
393 
394     public final Map<String, ChecksumAlgorithmFactory> getChecksumAlgorithmFactories() {
395         checkClosed();
396         if (checksumAlgorithmFactories == null) {
397             checksumAlgorithmFactories = createChecksumAlgorithmFactories();
398         }
399         return checksumAlgorithmFactories;
400     }
401 
402     protected Map<String, ChecksumAlgorithmFactory> createChecksumAlgorithmFactories() {
403         HashMap<String, ChecksumAlgorithmFactory> result = new HashMap<>();
404         result.put(Sha512ChecksumAlgorithmFactory.NAME, new Sha512ChecksumAlgorithmFactory());
405         result.put(Sha256ChecksumAlgorithmFactory.NAME, new Sha256ChecksumAlgorithmFactory());
406         result.put(Sha1ChecksumAlgorithmFactory.NAME, new Sha1ChecksumAlgorithmFactory());
407         result.put(Md5ChecksumAlgorithmFactory.NAME, new Md5ChecksumAlgorithmFactory());
408         return result;
409     }
410 
411     private ChecksumAlgorithmFactorySelector checksumAlgorithmFactorySelector;
412 
413     public final ChecksumAlgorithmFactorySelector getChecksumAlgorithmFactorySelector() {
414         checkClosed();
415         if (checksumAlgorithmFactorySelector == null) {
416             checksumAlgorithmFactorySelector = createChecksumAlgorithmFactorySelector();
417         }
418         return checksumAlgorithmFactorySelector;
419     }
420 
421     protected ChecksumAlgorithmFactorySelector createChecksumAlgorithmFactorySelector() {
422         return new DefaultChecksumAlgorithmFactorySelector(getChecksumAlgorithmFactories());
423     }
424 
425     private ArtifactPredicateFactory artifactPredicateFactory;
426 
427     public final ArtifactPredicateFactory getArtifactPredicateFactory() {
428         checkClosed();
429         if (artifactPredicateFactory == null) {
430             artifactPredicateFactory = createArtifactPredicateFactory();
431         }
432         return artifactPredicateFactory;
433     }
434 
435     protected ArtifactPredicateFactory createArtifactPredicateFactory() {
436         return new DefaultArtifactPredicateFactory(getChecksumAlgorithmFactorySelector());
437     }
438 
439     private Map<String, RepositoryLayoutFactory> repositoryLayoutFactories;
440 
441     public final Map<String, RepositoryLayoutFactory> getRepositoryLayoutFactories() {
442         checkClosed();
443         if (repositoryLayoutFactories == null) {
444             repositoryLayoutFactories = createRepositoryLayoutFactories();
445         }
446         return repositoryLayoutFactories;
447     }
448 
449     protected Map<String, RepositoryLayoutFactory> createRepositoryLayoutFactories() {
450         HashMap<String, RepositoryLayoutFactory> result = new HashMap<>();
451         result.put(
452                 Maven2RepositoryLayoutFactory.NAME,
453                 new Maven2RepositoryLayoutFactory(
454                         getChecksumAlgorithmFactorySelector(), getArtifactPredicateFactory()));
455         return result;
456     }
457 
458     private RepositoryLayoutProvider repositoryLayoutProvider;
459 
460     public final RepositoryLayoutProvider getRepositoryLayoutProvider() {
461         checkClosed();
462         if (repositoryLayoutProvider == null) {
463             repositoryLayoutProvider = createRepositoryLayoutProvider();
464         }
465         return repositoryLayoutProvider;
466     }
467 
468     protected RepositoryLayoutProvider createRepositoryLayoutProvider() {
469         return new DefaultRepositoryLayoutProvider(getRepositoryLayoutFactories());
470     }
471 
472     private LocalRepositoryProvider localRepositoryProvider;
473 
474     public final LocalRepositoryProvider getLocalRepositoryProvider() {
475         checkClosed();
476         if (localRepositoryProvider == null) {
477             localRepositoryProvider = createLocalRepositoryProvider();
478         }
479         return localRepositoryProvider;
480     }
481 
482     protected LocalRepositoryProvider createLocalRepositoryProvider() {
483         LocalPathComposer localPathComposer = getLocalPathComposer();
484         HashMap<String, LocalRepositoryManagerFactory> localRepositoryProviders = new HashMap<>(2);
485         localRepositoryProviders.put(
486                 SimpleLocalRepositoryManagerFactory.NAME, new SimpleLocalRepositoryManagerFactory(localPathComposer));
487         localRepositoryProviders.put(
488                 EnhancedLocalRepositoryManagerFactory.NAME,
489                 new EnhancedLocalRepositoryManagerFactory(
490                         localPathComposer, getTrackingFileManager(), getLocalPathPrefixComposerFactory()));
491         return new DefaultLocalRepositoryProvider(localRepositoryProviders);
492     }
493 
494     private RemoteRepositoryManager remoteRepositoryManager;
495 
496     public final RemoteRepositoryManager getRemoteRepositoryManager() {
497         checkClosed();
498         if (remoteRepositoryManager == null) {
499             remoteRepositoryManager = createRemoteRepositoryManager();
500         }
501         return remoteRepositoryManager;
502     }
503 
504     protected RemoteRepositoryManager createRemoteRepositoryManager() {
505         return new DefaultRemoteRepositoryManager(getUpdatePolicyAnalyzer(), getChecksumPolicyProvider());
506     }
507 
508     private Map<String, RemoteRepositoryFilterSource> remoteRepositoryFilterSources;
509 
510     public final Map<String, RemoteRepositoryFilterSource> getRemoteRepositoryFilterSources() {
511         checkClosed();
512         if (remoteRepositoryFilterSources == null) {
513             remoteRepositoryFilterSources = createRemoteRepositoryFilterSources();
514         }
515         return remoteRepositoryFilterSources;
516     }
517 
518     protected Map<String, RemoteRepositoryFilterSource> createRemoteRepositoryFilterSources() {
519         HashMap<String, RemoteRepositoryFilterSource> result = new HashMap<>();
520         result.put(
521                 GroupIdRemoteRepositoryFilterSource.NAME,
522                 new GroupIdRemoteRepositoryFilterSource(getRepositorySystemLifecycle(), getPathProcessor()));
523         result.put(
524                 PrefixesRemoteRepositoryFilterSource.NAME,
525                 new PrefixesRemoteRepositoryFilterSource(
526                         this::getMetadataResolver, this::getRemoteRepositoryManager, getRepositoryLayoutProvider()));
527         return result;
528     }
529 
530     private RemoteRepositoryFilterManager remoteRepositoryFilterManager;
531 
532     public final RemoteRepositoryFilterManager getRemoteRepositoryFilterManager() {
533         checkClosed();
534         if (remoteRepositoryFilterManager == null) {
535             remoteRepositoryFilterManager = createRemoteRepositoryFilterManager();
536         }
537         return remoteRepositoryFilterManager;
538     }
539 
540     protected RemoteRepositoryFilterManager createRemoteRepositoryFilterManager() {
541         return new DefaultRemoteRepositoryFilterManager(getRemoteRepositoryFilterSources());
542     }
543 
544     private Map<String, RepositoryListener> repositoryListeners;
545 
546     public final Map<String, RepositoryListener> getRepositoryListeners() {
547         checkClosed();
548         if (repositoryListeners == null) {
549             repositoryListeners = createRepositoryListeners();
550         }
551         return repositoryListeners;
552     }
553 
554     protected Map<String, RepositoryListener> createRepositoryListeners() {
555         return new HashMap<>();
556     }
557 
558     private RepositoryEventDispatcher repositoryEventDispatcher;
559 
560     public final RepositoryEventDispatcher getRepositoryEventDispatcher() {
561         checkClosed();
562         if (repositoryEventDispatcher == null) {
563             repositoryEventDispatcher = createRepositoryEventDispatcher();
564         }
565         return repositoryEventDispatcher;
566     }
567 
568     protected RepositoryEventDispatcher createRepositoryEventDispatcher() {
569         return new DefaultRepositoryEventDispatcher(getRepositoryListeners());
570     }
571 
572     private Map<String, TrustedChecksumsSource> trustedChecksumsSources;
573 
574     public final Map<String, TrustedChecksumsSource> getTrustedChecksumsSources() {
575         checkClosed();
576         if (trustedChecksumsSources == null) {
577             trustedChecksumsSources = createTrustedChecksumsSources();
578         }
579         return trustedChecksumsSources;
580     }
581 
582     protected Map<String, TrustedChecksumsSource> createTrustedChecksumsSources() {
583         HashMap<String, TrustedChecksumsSource> result = new HashMap<>();
584         result.put(
585                 SparseDirectoryTrustedChecksumsSource.NAME,
586                 new SparseDirectoryTrustedChecksumsSource(getChecksumProcessor(), getLocalPathComposer()));
587         result.put(
588                 SummaryFileTrustedChecksumsSource.NAME,
589                 new SummaryFileTrustedChecksumsSource(
590                         getLocalPathComposer(), getRepositorySystemLifecycle(), getPathProcessor()));
591         return result;
592     }
593 
594     private Map<String, ProvidedChecksumsSource> providedChecksumsSources;
595 
596     public final Map<String, ProvidedChecksumsSource> getProvidedChecksumsSources() {
597         checkClosed();
598         if (providedChecksumsSources == null) {
599             providedChecksumsSources = createProvidedChecksumsSources();
600         }
601         return providedChecksumsSources;
602     }
603 
604     protected Map<String, ProvidedChecksumsSource> createProvidedChecksumsSources() {
605         HashMap<String, ProvidedChecksumsSource> result = new HashMap<>();
606         result.put(
607                 TrustedToProvidedChecksumsSourceAdapter.NAME,
608                 new TrustedToProvidedChecksumsSourceAdapter(getTrustedChecksumsSources()));
609         return result;
610     }
611 
612     private Map<String, ChecksumExtractorStrategy> checksumExtractorStrategies;
613 
614     public final Map<String, ChecksumExtractorStrategy> getChecksumExtractorStrategies() {
615         checkClosed();
616         if (checksumExtractorStrategies == null) {
617             checksumExtractorStrategies = createChecksumExtractorStrategies();
618         }
619         return checksumExtractorStrategies;
620     }
621 
622     protected Map<String, ChecksumExtractorStrategy> createChecksumExtractorStrategies() {
623         HashMap<String, ChecksumExtractorStrategy> result = new HashMap<>();
624         result.put(XChecksumExtractor.NAME, new XChecksumExtractor());
625         result.put(Nx2ChecksumExtractor.NAME, new Nx2ChecksumExtractor());
626         return result;
627     }
628 
629     private ChecksumExtractor checksumExtractor;
630 
631     public final ChecksumExtractor getChecksumExtractor() {
632         checkClosed();
633         if (checksumExtractor == null) {
634             checksumExtractor = createChecksumExtractor();
635         }
636         return checksumExtractor;
637     }
638 
639     protected ChecksumExtractor createChecksumExtractor() {
640         return new DefaultChecksumExtractor(getChecksumExtractorStrategies());
641     }
642 
643     private Map<String, TransporterFactory> transporterFactories;
644 
645     public final Map<String, TransporterFactory> getTransporterFactories() {
646         checkClosed();
647         if (transporterFactories == null) {
648             transporterFactories = createTransporterFactories();
649         }
650         return transporterFactories;
651     }
652 
653     protected Map<String, TransporterFactory> createTransporterFactories() {
654         HashMap<String, TransporterFactory> result = new HashMap<>();
655         result.put(FileTransporterFactory.NAME, new FileTransporterFactory());
656         result.put(
657                 ApacheTransporterFactory.NAME,
658                 new ApacheTransporterFactory(getChecksumExtractor(), getPathProcessor()));
659         return result;
660     }
661 
662     private TransporterProvider transporterProvider;
663 
664     public final TransporterProvider getTransporterProvider() {
665         checkClosed();
666         if (transporterProvider == null) {
667             transporterProvider = createTransporterProvider();
668         }
669         return transporterProvider;
670     }
671 
672     protected TransporterProvider createTransporterProvider() {
673         return new DefaultTransporterProvider(getTransporterFactories());
674     }
675 
676     private BasicRepositoryConnectorFactory basicRepositoryConnectorFactory;
677 
678     public final BasicRepositoryConnectorFactory getBasicRepositoryConnectorFactory() {
679         checkClosed();
680         if (basicRepositoryConnectorFactory == null) {
681             basicRepositoryConnectorFactory = createBasicRepositoryConnectorFactory();
682         }
683         return basicRepositoryConnectorFactory;
684     }
685 
686     protected BasicRepositoryConnectorFactory createBasicRepositoryConnectorFactory() {
687         return new BasicRepositoryConnectorFactory(
688                 getTransporterProvider(),
689                 getRepositoryLayoutProvider(),
690                 getChecksumPolicyProvider(),
691                 getPathProcessor(),
692                 getChecksumProcessor(),
693                 getProvidedChecksumsSources());
694     }
695 
696     private Map<String, RepositoryConnectorFactory> repositoryConnectorFactories;
697 
698     public final Map<String, RepositoryConnectorFactory> getRepositoryConnectorFactories() {
699         checkClosed();
700         if (repositoryConnectorFactories == null) {
701             repositoryConnectorFactories = createRepositoryConnectorFactories();
702         }
703         return repositoryConnectorFactories;
704     }
705 
706     protected Map<String, RepositoryConnectorFactory> createRepositoryConnectorFactories() {
707         HashMap<String, RepositoryConnectorFactory> result = new HashMap<>();
708         result.put(BasicRepositoryConnectorFactory.NAME, getBasicRepositoryConnectorFactory());
709         return result;
710     }
711 
712     private Map<String, PipelineRepositoryConnectorFactory> pipelineRepositoryConnectorFactories;
713 
714     public final Map<String, PipelineRepositoryConnectorFactory> getPipelineRepositoryConnectorFactories() {
715         checkClosed();
716         if (pipelineRepositoryConnectorFactories == null) {
717             pipelineRepositoryConnectorFactories = createPipelineRepositoryConnectorFactories();
718         }
719         return pipelineRepositoryConnectorFactories;
720     }
721 
722     protected Map<String, PipelineRepositoryConnectorFactory> createPipelineRepositoryConnectorFactories() {
723         HashMap<String, PipelineRepositoryConnectorFactory> result = new HashMap<>();
724         result.put(
725                 FilteringPipelineRepositoryConnectorFactory.NAME,
726                 new FilteringPipelineRepositoryConnectorFactory(getRemoteRepositoryFilterManager()));
727         result.put(
728                 OfflinePipelineRepositoryConnectorFactory.NAME,
729                 new OfflinePipelineRepositoryConnectorFactory(getOfflineController()));
730         return result;
731     }
732 
733     private RepositoryConnectorProvider repositoryConnectorProvider;
734 
735     public final RepositoryConnectorProvider getRepositoryConnectorProvider() {
736         checkClosed();
737         if (repositoryConnectorProvider == null) {
738             repositoryConnectorProvider = createRepositoryConnectorProvider();
739         }
740         return repositoryConnectorProvider;
741     }
742 
743     protected RepositoryConnectorProvider createRepositoryConnectorProvider() {
744         return new DefaultRepositoryConnectorProvider(
745                 getRepositoryConnectorFactories(), getPipelineRepositoryConnectorFactories());
746     }
747 
748     private Installer installer;
749 
750     public final Installer getInstaller() {
751         checkClosed();
752         if (installer == null) {
753             installer = createInstaller();
754         }
755         return installer;
756     }
757 
758     protected Installer createInstaller() {
759         return new DefaultInstaller(
760                 getPathProcessor(),
761                 getRepositoryEventDispatcher(),
762                 getArtifactGeneratorFactories(),
763                 getMetadataGeneratorFactories(),
764                 getArtifactTransformers(),
765                 getSyncContextFactory());
766     }
767 
768     private Deployer deployer;
769 
770     public final Deployer getDeployer() {
771         checkClosed();
772         if (deployer == null) {
773             deployer = createDeployer();
774         }
775         return deployer;
776     }
777 
778     protected Deployer createDeployer() {
779         return new DefaultDeployer(
780                 getPathProcessor(),
781                 getRepositoryEventDispatcher(),
782                 getRepositoryConnectorProvider(),
783                 getRemoteRepositoryManager(),
784                 getUpdateCheckManager(),
785                 getArtifactGeneratorFactories(),
786                 getMetadataGeneratorFactories(),
787                 getArtifactTransformers(),
788                 getSyncContextFactory(),
789                 getOfflineController());
790     }
791 
792     private Map<String, DependencyCollectorDelegate> dependencyCollectorDelegates;
793 
794     public final Map<String, DependencyCollectorDelegate> getDependencyCollectorDelegates() {
795         checkClosed();
796         if (dependencyCollectorDelegates == null) {
797             dependencyCollectorDelegates = createDependencyCollectorDelegates();
798         }
799         return dependencyCollectorDelegates;
800     }
801 
802     protected Map<String, DependencyCollectorDelegate> createDependencyCollectorDelegates() {
803         RemoteRepositoryManager remoteRepositoryManager = getRemoteRepositoryManager();
804         ArtifactDescriptorReader artifactDescriptorReader = getArtifactDescriptorReader();
805         VersionRangeResolver versionRangeResolver = getVersionRangeResolver();
806         HashMap<String, DependencyCollectorDelegate> result = new HashMap<>();
807         result.put(
808                 DfDependencyCollector.NAME,
809                 new DfDependencyCollector(
810                         remoteRepositoryManager,
811                         artifactDescriptorReader,
812                         versionRangeResolver,
813                         getArtifactDecoratorFactories()));
814         result.put(
815                 BfDependencyCollector.NAME,
816                 new BfDependencyCollector(
817                         remoteRepositoryManager,
818                         artifactDescriptorReader,
819                         versionRangeResolver,
820                         getArtifactDecoratorFactories()));
821         return result;
822     }
823 
824     private DependencyCollector dependencyCollector;
825 
826     public final DependencyCollector getDependencyCollector() {
827         checkClosed();
828         if (dependencyCollector == null) {
829             dependencyCollector = createDependencyCollector();
830         }
831         return dependencyCollector;
832     }
833 
834     protected DependencyCollector createDependencyCollector() {
835         return new DefaultDependencyCollector(getDependencyCollectorDelegates());
836     }
837 
838     private Map<String, ArtifactResolverPostProcessor> artifactResolverPostProcessors;
839 
840     public final Map<String, ArtifactResolverPostProcessor> getArtifactResolverPostProcessors() {
841         checkClosed();
842         if (artifactResolverPostProcessors == null) {
843             artifactResolverPostProcessors = createArtifactResolverPostProcessors();
844         }
845         return artifactResolverPostProcessors;
846     }
847 
848     protected Map<String, ArtifactResolverPostProcessor> createArtifactResolverPostProcessors() {
849         HashMap<String, ArtifactResolverPostProcessor> result = new HashMap<>();
850         result.put(
851                 TrustedChecksumsArtifactResolverPostProcessor.NAME,
852                 new TrustedChecksumsArtifactResolverPostProcessor(
853                         getChecksumAlgorithmFactorySelector(), getTrustedChecksumsSources()));
854         return result;
855     }
856 
857     private ArtifactResolver artifactResolver;
858 
859     public final ArtifactResolver getArtifactResolver() {
860         checkClosed();
861         if (artifactResolver == null) {
862             artifactResolver = createArtifactResolver();
863         }
864         return artifactResolver;
865     }
866 
867     protected ArtifactResolver createArtifactResolver() {
868         return new DefaultArtifactResolver(
869                 getPathProcessor(),
870                 getRepositoryEventDispatcher(),
871                 getVersionResolver(),
872                 getUpdateCheckManager(),
873                 getRepositoryConnectorProvider(),
874                 getRemoteRepositoryManager(),
875                 getSyncContextFactory(),
876                 getOfflineController(),
877                 getArtifactResolverPostProcessors(),
878                 getRemoteRepositoryFilterManager());
879     }
880 
881     private MetadataResolver metadataResolver;
882 
883     public final MetadataResolver getMetadataResolver() {
884         checkClosed();
885         if (metadataResolver == null) {
886             metadataResolver = createMetadataResolver();
887         }
888         return metadataResolver;
889     }
890 
891     protected MetadataResolver createMetadataResolver() {
892         return new DefaultMetadataResolver(
893                 getRepositoryEventDispatcher(),
894                 getUpdateCheckManager(),
895                 getRepositoryConnectorProvider(),
896                 getRemoteRepositoryManager(),
897                 getSyncContextFactory(),
898                 getOfflineController(),
899                 getRemoteRepositoryFilterManager(),
900                 getPathProcessor());
901     }
902 
903     private VersionScheme versionScheme;
904 
905     public final VersionScheme getVersionScheme() {
906         checkClosed();
907         if (versionScheme == null) {
908             versionScheme = createVersionScheme();
909         }
910         return versionScheme;
911     }
912 
913     protected VersionScheme createVersionScheme() {
914         return new GenericVersionScheme();
915     }
916 
917     private Map<String, ArtifactGeneratorFactory> artifactGeneratorFactories;
918 
919     public final Map<String, ArtifactGeneratorFactory> getArtifactGeneratorFactories() {
920         checkClosed();
921         if (artifactGeneratorFactories == null) {
922             artifactGeneratorFactories = createArtifactGeneratorFactories();
923         }
924         return artifactGeneratorFactories;
925     }
926 
927     protected Map<String, ArtifactGeneratorFactory> createArtifactGeneratorFactories() {
928         // by default none, this is extension point
929         return new HashMap<>();
930     }
931 
932     private Map<String, ArtifactDecoratorFactory> artifactDecoratorFactories;
933 
934     public final Map<String, ArtifactDecoratorFactory> getArtifactDecoratorFactories() {
935         checkClosed();
936         if (artifactDecoratorFactories == null) {
937             artifactDecoratorFactories = createArtifactDecoratorFactories();
938         }
939         return artifactDecoratorFactories;
940     }
941 
942     protected Map<String, ArtifactDecoratorFactory> createArtifactDecoratorFactories() {
943         // by default none, this is extension point
944         return new HashMap<>();
945     }
946 
947     // Maven provided
948 
949     private Map<String, ArtifactTransformer> artifactTransformers;
950 
951     public final Map<String, ArtifactTransformer> getArtifactTransformers() {
952         checkClosed();
953         if (artifactTransformers == null) {
954             artifactTransformers = createArtifactTransformers();
955         }
956         return artifactTransformers;
957     }
958 
959     protected Map<String, ArtifactTransformer> createArtifactTransformers() {
960         return new HashMap<>();
961     }
962 
963     private Map<String, MetadataGeneratorFactory> metadataGeneratorFactories;
964 
965     public final Map<String, MetadataGeneratorFactory> getMetadataGeneratorFactories() {
966         checkClosed();
967         if (metadataGeneratorFactories == null) {
968             metadataGeneratorFactories = createMetadataGeneratorFactories();
969         }
970         return metadataGeneratorFactories;
971     }
972 
973     protected Map<String, MetadataGeneratorFactory> createMetadataGeneratorFactories() {
974         // from maven-resolver-provider
975         HashMap<String, MetadataGeneratorFactory> result = new HashMap<>();
976         result.put(PluginsMetadataGeneratorFactory.NAME, new PluginsMetadataGeneratorFactory());
977         result.put(VersionsMetadataGeneratorFactory.NAME, new VersionsMetadataGeneratorFactory());
978         result.put(SnapshotMetadataGeneratorFactory.NAME, new SnapshotMetadataGeneratorFactory());
979         return result;
980     }
981 
982     private ArtifactDescriptorReader artifactDescriptorReader;
983 
984     public final ArtifactDescriptorReader getArtifactDescriptorReader() {
985         checkClosed();
986         if (artifactDescriptorReader == null) {
987             artifactDescriptorReader = createArtifactDescriptorReader();
988         }
989         return artifactDescriptorReader;
990     }
991 
992     protected ArtifactDescriptorReader createArtifactDescriptorReader() {
993         // from maven-resolver-provider
994         return new DefaultArtifactDescriptorReader(
995                 getRemoteRepositoryManager(),
996                 getVersionResolver(),
997                 getVersionRangeResolver(),
998                 getArtifactResolver(),
999                 getModelBuilder(),
1000                 getRepositoryEventDispatcher(),
1001                 getModelCacheFactory());
1002     }
1003 
1004     private VersionResolver versionResolver;
1005 
1006     public final VersionResolver getVersionResolver() {
1007         checkClosed();
1008         if (versionResolver == null) {
1009             versionResolver = createVersionResolver();
1010         }
1011         return versionResolver;
1012     }
1013 
1014     protected VersionResolver createVersionResolver() {
1015         // from maven-resolver-provider
1016         return new DefaultVersionResolver(
1017                 getMetadataResolver(), getSyncContextFactory(), getRepositoryEventDispatcher());
1018     }
1019 
1020     private VersionRangeResolver versionRangeResolver;
1021 
1022     public final VersionRangeResolver getVersionRangeResolver() {
1023         checkClosed();
1024         if (versionRangeResolver == null) {
1025             versionRangeResolver = createVersionRangeResolver();
1026         }
1027         return versionRangeResolver;
1028     }
1029 
1030     protected VersionRangeResolver createVersionRangeResolver() {
1031         // from maven-resolver-provider
1032         return new DefaultVersionRangeResolver(
1033                 getMetadataResolver(), getSyncContextFactory(), getRepositoryEventDispatcher());
1034     }
1035 
1036     private ModelBuilder modelBuilder;
1037 
1038     public final ModelBuilder getModelBuilder() {
1039         checkClosed();
1040         if (modelBuilder == null) {
1041             modelBuilder = createModelBuilder();
1042         }
1043         return modelBuilder;
1044     }
1045 
1046     protected ModelBuilder createModelBuilder() {
1047         // from maven-model-builder
1048         return new DefaultModelBuilderFactory().newInstance();
1049     }
1050 
1051     private ModelCacheFactory modelCacheFactory;
1052 
1053     public final ModelCacheFactory getModelCacheFactory() {
1054         checkClosed();
1055         if (modelCacheFactory == null) {
1056             modelCacheFactory = createModelCacheFactory();
1057         }
1058         return modelCacheFactory;
1059     }
1060 
1061     protected ModelCacheFactory createModelCacheFactory() {
1062         // from maven-resolver-provider
1063         return new DefaultModelCacheFactory();
1064     }
1065 
1066     private List<ValidatorFactory> validatorFactories;
1067 
1068     public final List<ValidatorFactory> getValidatorFactories() {
1069         checkClosed();
1070         if (validatorFactories == null) {
1071             validatorFactories = createValidatorFactories();
1072         }
1073         return validatorFactories;
1074     }
1075 
1076     protected List<ValidatorFactory> createValidatorFactories() {
1077         return new ArrayList<>();
1078     }
1079 
1080     private RepositorySystemValidator repositorySystemValidator;
1081 
1082     public final RepositorySystemValidator getRepositorySystemValidator() {
1083         checkClosed();
1084         if (repositorySystemValidator == null) {
1085             repositorySystemValidator = createRepositorySystemValidator();
1086         }
1087         return repositorySystemValidator;
1088     }
1089 
1090     protected RepositorySystemValidator createRepositorySystemValidator() {
1091         return new DefaultRepositorySystemValidator(getValidatorFactories());
1092     }
1093 
1094     private RepositorySystem repositorySystem;
1095 
1096     public final RepositorySystem getRepositorySystem() {
1097         checkClosed();
1098         if (repositorySystem == null) {
1099             repositorySystem = createRepositorySystem();
1100         }
1101         return repositorySystem;
1102     }
1103 
1104     protected RepositorySystem createRepositorySystem() {
1105         return new DefaultRepositorySystem(
1106                 getVersionResolver(),
1107                 getVersionRangeResolver(),
1108                 getArtifactResolver(),
1109                 getMetadataResolver(),
1110                 getArtifactDescriptorReader(),
1111                 getDependencyCollector(),
1112                 getInstaller(),
1113                 getDeployer(),
1114                 getLocalRepositoryProvider(),
1115                 getSyncContextFactory(),
1116                 getRemoteRepositoryManager(),
1117                 getRepositorySystemLifecycle(),
1118                 getArtifactDecoratorFactories(),
1119                 getRepositorySystemValidator());
1120     }
1121 
1122     @Override
1123     public RepositorySystem get() {
1124         return getRepositorySystem();
1125     }
1126 }