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