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