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.impl.guice;
020
021import javax.inject.Named;
022import javax.inject.Singleton;
023
024import java.util.Collections;
025import java.util.HashMap;
026import java.util.HashSet;
027import java.util.Map;
028import java.util.Set;
029
030import com.google.inject.AbstractModule;
031import com.google.inject.Provides;
032import com.google.inject.name.Names;
033import org.eclipse.aether.RepositoryListener;
034import org.eclipse.aether.RepositorySystem;
035import org.eclipse.aether.impl.ArtifactResolver;
036import org.eclipse.aether.impl.DependencyCollector;
037import org.eclipse.aether.impl.Deployer;
038import org.eclipse.aether.impl.Installer;
039import org.eclipse.aether.impl.LocalRepositoryProvider;
040import org.eclipse.aether.impl.MetadataResolver;
041import org.eclipse.aether.impl.OfflineController;
042import org.eclipse.aether.impl.RemoteRepositoryFilterManager;
043import org.eclipse.aether.impl.RemoteRepositoryManager;
044import org.eclipse.aether.impl.RepositoryConnectorProvider;
045import org.eclipse.aether.impl.RepositoryEventDispatcher;
046import org.eclipse.aether.impl.RepositorySystemLifecycle;
047import org.eclipse.aether.impl.UpdateCheckManager;
048import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
049import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
050import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
051import org.eclipse.aether.internal.impl.DefaultDeployer;
052import org.eclipse.aether.internal.impl.DefaultFileProcessor;
053import org.eclipse.aether.internal.impl.DefaultInstaller;
054import org.eclipse.aether.internal.impl.DefaultLocalPathComposer;
055import org.eclipse.aether.internal.impl.DefaultLocalPathPrefixComposerFactory;
056import org.eclipse.aether.internal.impl.DefaultLocalRepositoryProvider;
057import org.eclipse.aether.internal.impl.DefaultMetadataResolver;
058import org.eclipse.aether.internal.impl.DefaultOfflineController;
059import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
060import org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider;
061import org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher;
062import org.eclipse.aether.internal.impl.DefaultRepositoryLayoutProvider;
063import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
064import org.eclipse.aether.internal.impl.DefaultRepositorySystemLifecycle;
065import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
066import org.eclipse.aether.internal.impl.DefaultTransporterProvider;
067import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager;
068import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
069import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
070import org.eclipse.aether.internal.impl.LocalPathComposer;
071import org.eclipse.aether.internal.impl.LocalPathPrefixComposerFactory;
072import org.eclipse.aether.internal.impl.Maven2RepositoryLayoutFactory;
073import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
074import org.eclipse.aether.internal.impl.TrackingFileManager;
075import org.eclipse.aether.internal.impl.checksum.DefaultChecksumAlgorithmFactorySelector;
076import org.eclipse.aether.internal.impl.checksum.Md5ChecksumAlgorithmFactory;
077import org.eclipse.aether.internal.impl.checksum.Sha1ChecksumAlgorithmFactory;
078import org.eclipse.aether.internal.impl.checksum.Sha256ChecksumAlgorithmFactory;
079import org.eclipse.aether.internal.impl.checksum.Sha512ChecksumAlgorithmFactory;
080import org.eclipse.aether.internal.impl.checksum.SparseDirectoryTrustedChecksumsSource;
081import org.eclipse.aether.internal.impl.checksum.SummaryFileTrustedChecksumsSource;
082import org.eclipse.aether.internal.impl.checksum.TrustedToProvidedChecksumsSourceAdapter;
083import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector;
084import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate;
085import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector;
086import org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector;
087import org.eclipse.aether.internal.impl.filter.DefaultRemoteRepositoryFilterManager;
088import org.eclipse.aether.internal.impl.filter.GroupIdRemoteRepositoryFilterSource;
089import org.eclipse.aether.internal.impl.filter.PrefixesRemoteRepositoryFilterSource;
090import org.eclipse.aether.internal.impl.resolution.TrustedChecksumsArtifactResolverPostProcessor;
091import org.eclipse.aether.internal.impl.slf4j.Slf4jLoggerFactory;
092import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory;
093import org.eclipse.aether.internal.impl.synccontext.named.NameMapper;
094import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
095import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactory;
096import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactoryImpl;
097import org.eclipse.aether.internal.impl.synccontext.named.providers.DiscriminatingNameMapperProvider;
098import org.eclipse.aether.internal.impl.synccontext.named.providers.FileGAECVNameMapperProvider;
099import org.eclipse.aether.internal.impl.synccontext.named.providers.FileGAVNameMapperProvider;
100import org.eclipse.aether.internal.impl.synccontext.named.providers.FileHashingGAECVNameMapperProvider;
101import org.eclipse.aether.internal.impl.synccontext.named.providers.FileHashingGAVNameMapperProvider;
102import org.eclipse.aether.internal.impl.synccontext.named.providers.GAECVNameMapperProvider;
103import org.eclipse.aether.internal.impl.synccontext.named.providers.GAVNameMapperProvider;
104import org.eclipse.aether.internal.impl.synccontext.named.providers.StaticNameMapperProvider;
105import org.eclipse.aether.named.NamedLockFactory;
106import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
107import org.eclipse.aether.named.providers.LocalReadWriteLockNamedLockFactory;
108import org.eclipse.aether.named.providers.LocalSemaphoreNamedLockFactory;
109import org.eclipse.aether.named.providers.NoopNamedLockFactory;
110import org.eclipse.aether.spi.checksums.ProvidedChecksumsSource;
111import org.eclipse.aether.spi.checksums.TrustedChecksumsSource;
112import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
113import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector;
114import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
115import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilterSource;
116import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
117import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
118import org.eclipse.aether.spi.connector.transport.TransporterProvider;
119import org.eclipse.aether.spi.io.FileProcessor;
120import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
121import org.eclipse.aether.spi.log.LoggerFactory;
122import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor;
123import org.eclipse.aether.spi.synccontext.SyncContextFactory;
124import org.slf4j.ILoggerFactory;
125
126/**
127 * A ready-made <a href="https://github.com/google/guice" target="_blank">Guice</a> module that sets up bindings
128 * for all components from this library. To acquire a complete repository system, clients need to bind an artifact
129 * descriptor reader, a version resolver, a version range resolver, zero or more metadata generator factories, some
130 * repository connector and transporter factories to access remote repositories.
131 *
132 * @noextend This class must not be extended by clients and will eventually be marked {@code final} without prior
133 * notice.
134 * @deprecated This class is about to be dropped in 2.0.0 release. Use SISU or use maven-resolver-supplier to
135 * get Resolver instances.
136 */
137@Deprecated
138public class AetherModule extends AbstractModule {
139
140    /**
141     * Creates a new instance of this Guice module, typically for invoking
142     * {@link com.google.inject.Binder#install(com.google.inject.Module)}.
143     */
144    public AetherModule() {}
145
146    /**
147     * Configures Guice with bindings for Aether components provided by this library.
148     */
149    // CHECKSTYLE_OFF: MethodLength
150    @Override
151    protected void configure() {
152        bind(RepositorySystem.class) //
153                .to(DefaultRepositorySystem.class)
154                .in(Singleton.class);
155        bind(ArtifactResolver.class) //
156                .to(DefaultArtifactResolver.class)
157                .in(Singleton.class);
158
159        bind(DependencyCollector.class) //
160                .to(DefaultDependencyCollector.class)
161                .in(Singleton.class);
162        bind(DependencyCollectorDelegate.class)
163                .annotatedWith(Names.named(BfDependencyCollector.NAME))
164                .to(BfDependencyCollector.class)
165                .in(Singleton.class);
166        bind(DependencyCollectorDelegate.class)
167                .annotatedWith(Names.named(DfDependencyCollector.NAME))
168                .to(DfDependencyCollector.class)
169                .in(Singleton.class);
170
171        bind(Deployer.class) //
172                .to(DefaultDeployer.class)
173                .in(Singleton.class);
174        bind(Installer.class) //
175                .to(DefaultInstaller.class)
176                .in(Singleton.class);
177        bind(MetadataResolver.class) //
178                .to(DefaultMetadataResolver.class)
179                .in(Singleton.class);
180        bind(RepositoryLayoutProvider.class) //
181                .to(DefaultRepositoryLayoutProvider.class)
182                .in(Singleton.class);
183        bind(RepositoryLayoutFactory.class)
184                .annotatedWith(Names.named("maven2")) //
185                .to(Maven2RepositoryLayoutFactory.class)
186                .in(Singleton.class);
187        bind(TransporterProvider.class) //
188                .to(DefaultTransporterProvider.class)
189                .in(Singleton.class);
190        bind(ChecksumPolicyProvider.class) //
191                .to(DefaultChecksumPolicyProvider.class)
192                .in(Singleton.class);
193        bind(RepositoryConnectorProvider.class) //
194                .to(DefaultRepositoryConnectorProvider.class)
195                .in(Singleton.class);
196        bind(RemoteRepositoryManager.class) //
197                .to(DefaultRemoteRepositoryManager.class)
198                .in(Singleton.class);
199        bind(UpdateCheckManager.class) //
200                .to(DefaultUpdateCheckManager.class)
201                .in(Singleton.class);
202        bind(UpdatePolicyAnalyzer.class) //
203                .to(DefaultUpdatePolicyAnalyzer.class)
204                .in(Singleton.class);
205        bind(FileProcessor.class) //
206                .to(DefaultFileProcessor.class)
207                .in(Singleton.class);
208        bind(RepositoryEventDispatcher.class) //
209                .to(DefaultRepositoryEventDispatcher.class)
210                .in(Singleton.class);
211        bind(OfflineController.class) //
212                .to(DefaultOfflineController.class)
213                .in(Singleton.class);
214
215        bind(LocalPathComposer.class).to(DefaultLocalPathComposer.class).in(Singleton.class);
216        bind(LocalPathPrefixComposerFactory.class)
217                .to(DefaultLocalPathPrefixComposerFactory.class)
218                .in(Singleton.class);
219
220        bind(LocalRepositoryProvider.class) //
221                .to(DefaultLocalRepositoryProvider.class)
222                .in(Singleton.class);
223        bind(LocalRepositoryManagerFactory.class)
224                .annotatedWith(Names.named("simple")) //
225                .to(SimpleLocalRepositoryManagerFactory.class)
226                .in(Singleton.class);
227        bind(LocalRepositoryManagerFactory.class)
228                .annotatedWith(Names.named("enhanced")) //
229                .to(EnhancedLocalRepositoryManagerFactory.class)
230                .in(Singleton.class);
231        bind(TrackingFileManager.class).to(DefaultTrackingFileManager.class).in(Singleton.class);
232
233        bind(ProvidedChecksumsSource.class)
234                .annotatedWith(Names.named(TrustedToProvidedChecksumsSourceAdapter.NAME))
235                .to(TrustedToProvidedChecksumsSourceAdapter.class)
236                .in(Singleton.class);
237
238        bind(TrustedChecksumsSource.class)
239                .annotatedWith(Names.named(SparseDirectoryTrustedChecksumsSource.NAME))
240                .to(SparseDirectoryTrustedChecksumsSource.class)
241                .in(Singleton.class);
242        bind(TrustedChecksumsSource.class)
243                .annotatedWith(Names.named(SummaryFileTrustedChecksumsSource.NAME))
244                .to(SummaryFileTrustedChecksumsSource.class)
245                .in(Singleton.class);
246
247        bind(ArtifactResolverPostProcessor.class)
248                .annotatedWith(Names.named(TrustedChecksumsArtifactResolverPostProcessor.NAME))
249                .to(TrustedChecksumsArtifactResolverPostProcessor.class)
250                .in(Singleton.class);
251
252        bind(ChecksumAlgorithmFactory.class)
253                .annotatedWith(Names.named(Md5ChecksumAlgorithmFactory.NAME))
254                .to(Md5ChecksumAlgorithmFactory.class);
255        bind(ChecksumAlgorithmFactory.class)
256                .annotatedWith(Names.named(Sha1ChecksumAlgorithmFactory.NAME))
257                .to(Sha1ChecksumAlgorithmFactory.class);
258        bind(ChecksumAlgorithmFactory.class)
259                .annotatedWith(Names.named(Sha256ChecksumAlgorithmFactory.NAME))
260                .to(Sha256ChecksumAlgorithmFactory.class);
261        bind(ChecksumAlgorithmFactory.class)
262                .annotatedWith(Names.named(Sha512ChecksumAlgorithmFactory.NAME))
263                .to(Sha512ChecksumAlgorithmFactory.class);
264        bind(ChecksumAlgorithmFactorySelector.class)
265                .to(DefaultChecksumAlgorithmFactorySelector.class)
266                .in(Singleton.class);
267
268        bind(RepositorySystemLifecycle.class)
269                .to(DefaultRepositorySystemLifecycle.class)
270                .in(Singleton.class);
271
272        bind(NamedLockFactoryAdapterFactory.class)
273                .to(NamedLockFactoryAdapterFactoryImpl.class)
274                .in(Singleton.class);
275        bind(SyncContextFactory.class).to(DefaultSyncContextFactory.class).in(Singleton.class);
276        bind(org.eclipse.aether.impl.SyncContextFactory.class)
277                .to(org.eclipse.aether.internal.impl.synccontext.legacy.DefaultSyncContextFactory.class)
278                .in(Singleton.class);
279
280        bind(NameMapper.class)
281                .annotatedWith(Names.named(NameMappers.STATIC_NAME))
282                .toProvider(StaticNameMapperProvider.class)
283                .in(Singleton.class);
284        bind(NameMapper.class)
285                .annotatedWith(Names.named(NameMappers.GAV_NAME))
286                .toProvider(GAVNameMapperProvider.class)
287                .in(Singleton.class);
288        bind(NameMapper.class)
289                .annotatedWith(Names.named(NameMappers.GAECV_NAME))
290                .toProvider(GAECVNameMapperProvider.class)
291                .in(Singleton.class);
292        bind(NameMapper.class)
293                .annotatedWith(Names.named(NameMappers.DISCRIMINATING_NAME))
294                .toProvider(DiscriminatingNameMapperProvider.class)
295                .in(Singleton.class);
296        bind(NameMapper.class)
297                .annotatedWith(Names.named(NameMappers.FILE_GAV_NAME))
298                .toProvider(FileGAVNameMapperProvider.class)
299                .in(Singleton.class);
300        bind(NameMapper.class)
301                .annotatedWith(Names.named(NameMappers.FILE_GAECV_NAME))
302                .toProvider(FileGAECVNameMapperProvider.class)
303                .in(Singleton.class);
304        bind(NameMapper.class)
305                .annotatedWith(Names.named(NameMappers.FILE_HGAV_NAME))
306                .toProvider(FileHashingGAVNameMapperProvider.class)
307                .in(Singleton.class);
308        bind(NameMapper.class)
309                .annotatedWith(Names.named(NameMappers.FILE_HGAECV_NAME))
310                .toProvider(FileHashingGAECVNameMapperProvider.class)
311                .in(Singleton.class);
312
313        bind(NamedLockFactory.class)
314                .annotatedWith(Names.named(NoopNamedLockFactory.NAME))
315                .to(NoopNamedLockFactory.class)
316                .in(Singleton.class);
317        bind(NamedLockFactory.class)
318                .annotatedWith(Names.named(LocalReadWriteLockNamedLockFactory.NAME))
319                .to(LocalReadWriteLockNamedLockFactory.class)
320                .in(Singleton.class);
321        bind(NamedLockFactory.class)
322                .annotatedWith(Names.named(LocalSemaphoreNamedLockFactory.NAME))
323                .to(LocalSemaphoreNamedLockFactory.class)
324                .in(Singleton.class);
325        bind(NamedLockFactory.class)
326                .annotatedWith(Names.named(FileLockNamedLockFactory.NAME))
327                .to(FileLockNamedLockFactory.class)
328                .in(Singleton.class);
329
330        bind(RemoteRepositoryFilterManager.class)
331                .to(DefaultRemoteRepositoryFilterManager.class)
332                .in(Singleton.class);
333        bind(RemoteRepositoryFilterSource.class)
334                .annotatedWith(Names.named(GroupIdRemoteRepositoryFilterSource.NAME))
335                .to(GroupIdRemoteRepositoryFilterSource.class)
336                .in(Singleton.class);
337        bind(RemoteRepositoryFilterSource.class)
338                .annotatedWith(Names.named(PrefixesRemoteRepositoryFilterSource.NAME))
339                .to(PrefixesRemoteRepositoryFilterSource.class)
340                .in(Singleton.class);
341
342        install(new Slf4jModule());
343    }
344
345    @Provides
346    @Singleton
347    Map<String, RemoteRepositoryFilterSource> remoteRepositoryFilterSources(
348            @Named(GroupIdRemoteRepositoryFilterSource.NAME) RemoteRepositoryFilterSource groupId,
349            @Named(PrefixesRemoteRepositoryFilterSource.NAME) RemoteRepositoryFilterSource prefixes) {
350        Map<String, RemoteRepositoryFilterSource> result = new HashMap<>();
351        result.put(GroupIdRemoteRepositoryFilterSource.NAME, groupId);
352        result.put(PrefixesRemoteRepositoryFilterSource.NAME, prefixes);
353        return Collections.unmodifiableMap(result);
354    }
355
356    @Provides
357    @Singleton
358    Map<String, ArtifactResolverPostProcessor> artifactResolverProcessors(
359            @Named(TrustedChecksumsArtifactResolverPostProcessor.NAME) ArtifactResolverPostProcessor trustedChecksums) {
360        Map<String, ArtifactResolverPostProcessor> result = new HashMap<>();
361        result.put(TrustedChecksumsArtifactResolverPostProcessor.NAME, trustedChecksums);
362        return Collections.unmodifiableMap(result);
363    }
364
365    @Provides
366    @Singleton
367    Map<String, DependencyCollectorDelegate> dependencyCollectorDelegates(
368            @Named(BfDependencyCollector.NAME) DependencyCollectorDelegate bf,
369            @Named(DfDependencyCollector.NAME) DependencyCollectorDelegate df) {
370        Map<String, DependencyCollectorDelegate> result = new HashMap<>();
371        result.put(BfDependencyCollector.NAME, bf);
372        result.put(DfDependencyCollector.NAME, df);
373        return Collections.unmodifiableMap(result);
374    }
375
376    @Provides
377    @Singleton
378    Map<String, ProvidedChecksumsSource> providedChecksumSources(
379            @Named(TrustedToProvidedChecksumsSourceAdapter.NAME) ProvidedChecksumsSource adapter) {
380        Map<String, ProvidedChecksumsSource> result = new HashMap<>();
381        result.put(TrustedToProvidedChecksumsSourceAdapter.NAME, adapter);
382        return Collections.unmodifiableMap(result);
383    }
384
385    @Provides
386    @Singleton
387    Map<String, TrustedChecksumsSource> trustedChecksumSources(
388            @Named(SparseDirectoryTrustedChecksumsSource.NAME) TrustedChecksumsSource sparse,
389            @Named(SummaryFileTrustedChecksumsSource.NAME) TrustedChecksumsSource compact) {
390        Map<String, TrustedChecksumsSource> result = new HashMap<>();
391        result.put(SparseDirectoryTrustedChecksumsSource.NAME, sparse);
392        result.put(SummaryFileTrustedChecksumsSource.NAME, compact);
393        return Collections.unmodifiableMap(result);
394    }
395
396    @Provides
397    @Singleton
398    Map<String, ChecksumAlgorithmFactory> provideChecksumTypes(
399            @Named(Sha512ChecksumAlgorithmFactory.NAME) ChecksumAlgorithmFactory sha512,
400            @Named(Sha256ChecksumAlgorithmFactory.NAME) ChecksumAlgorithmFactory sha256,
401            @Named(Sha1ChecksumAlgorithmFactory.NAME) ChecksumAlgorithmFactory sha1,
402            @Named(Md5ChecksumAlgorithmFactory.NAME) ChecksumAlgorithmFactory md5) {
403        Map<String, ChecksumAlgorithmFactory> result = new HashMap<>();
404        result.put(Sha512ChecksumAlgorithmFactory.NAME, sha512);
405        result.put(Sha256ChecksumAlgorithmFactory.NAME, sha256);
406        result.put(Sha1ChecksumAlgorithmFactory.NAME, sha1);
407        result.put(Md5ChecksumAlgorithmFactory.NAME, md5);
408        return Collections.unmodifiableMap(result);
409    }
410
411    @SuppressWarnings("checkstyle:parameternumber")
412    @Provides
413    @Singleton
414    Map<String, NameMapper> provideNameMappers(
415            @Named(NameMappers.STATIC_NAME) NameMapper staticNameMapper,
416            @Named(NameMappers.GAV_NAME) NameMapper gavNameMapper,
417            @Named(NameMappers.GAECV_NAME) NameMapper gaecvNameMapper,
418            @Named(NameMappers.DISCRIMINATING_NAME) NameMapper discriminatingNameMapper,
419            @Named(NameMappers.FILE_GAV_NAME) NameMapper fileGavNameMapper,
420            @Named(NameMappers.FILE_GAECV_NAME) NameMapper fileGaecvNameMapper,
421            @Named(NameMappers.FILE_HGAV_NAME) NameMapper fileHashingGavNameMapper,
422            @Named(NameMappers.FILE_HGAECV_NAME) NameMapper fileHashingGaecvNameMapper) {
423        Map<String, NameMapper> result = new HashMap<>();
424        result.put(NameMappers.STATIC_NAME, staticNameMapper);
425        result.put(NameMappers.GAV_NAME, gavNameMapper);
426        result.put(NameMappers.GAECV_NAME, gaecvNameMapper);
427        result.put(NameMappers.DISCRIMINATING_NAME, discriminatingNameMapper);
428        result.put(NameMappers.FILE_GAV_NAME, fileGavNameMapper);
429        result.put(NameMappers.FILE_GAECV_NAME, fileGaecvNameMapper);
430        result.put(NameMappers.FILE_HGAV_NAME, fileHashingGavNameMapper);
431        result.put(NameMappers.FILE_HGAECV_NAME, fileHashingGaecvNameMapper);
432        return Collections.unmodifiableMap(result);
433    }
434
435    @Provides
436    @Singleton
437    Map<String, NamedLockFactory> provideNamedLockFactories(
438            @Named(LocalReadWriteLockNamedLockFactory.NAME) NamedLockFactory localRwLock,
439            @Named(LocalSemaphoreNamedLockFactory.NAME) NamedLockFactory localSemaphore,
440            @Named(FileLockNamedLockFactory.NAME) NamedLockFactory fileLockFactory) {
441        Map<String, NamedLockFactory> result = new HashMap<>();
442        result.put(LocalReadWriteLockNamedLockFactory.NAME, localRwLock);
443        result.put(LocalSemaphoreNamedLockFactory.NAME, localSemaphore);
444        result.put(FileLockNamedLockFactory.NAME, fileLockFactory);
445        return Collections.unmodifiableMap(result);
446    }
447
448    @Provides
449    @Singleton
450    Set<LocalRepositoryManagerFactory> provideLocalRepositoryManagerFactories(
451            @Named("simple") LocalRepositoryManagerFactory simple,
452            @Named("enhanced") LocalRepositoryManagerFactory enhanced) {
453        Set<LocalRepositoryManagerFactory> result = new HashSet<>();
454        result.add(simple);
455        result.add(enhanced);
456        return Collections.unmodifiableSet(result);
457    }
458
459    @Provides
460    @Singleton
461    Set<RepositoryLayoutFactory> provideRepositoryLayoutFactories(@Named("maven2") RepositoryLayoutFactory maven2) {
462        Set<RepositoryLayoutFactory> result = new HashSet<>();
463        result.add(maven2);
464        return Collections.unmodifiableSet(result);
465    }
466
467    @Provides
468    @Singleton
469    Set<RepositoryListener> providesRepositoryListeners() {
470        return Collections.emptySet();
471    }
472
473    private static class Slf4jModule extends AbstractModule {
474
475        @Override
476        protected void configure() {
477            bind(LoggerFactory.class) //
478                    .to(Slf4jLoggerFactory.class);
479        }
480
481        @Provides
482        @Singleton
483        ILoggerFactory getLoggerFactory() {
484            return org.slf4j.LoggerFactory.getILoggerFactory();
485        }
486    }
487}