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