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