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