View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether.impl.guice;
20  
21  import javax.inject.Named;
22  import javax.inject.Singleton;
23  
24  import java.util.Collections;
25  import java.util.HashMap;
26  import java.util.HashSet;
27  import java.util.Map;
28  import java.util.Set;
29  
30  import com.google.inject.AbstractModule;
31  import com.google.inject.Provides;
32  import com.google.inject.name.Names;
33  import org.eclipse.aether.RepositoryListener;
34  import org.eclipse.aether.RepositorySystem;
35  import org.eclipse.aether.impl.ArtifactResolver;
36  import org.eclipse.aether.impl.DependencyCollector;
37  import org.eclipse.aether.impl.Deployer;
38  import org.eclipse.aether.impl.Installer;
39  import org.eclipse.aether.impl.LocalRepositoryProvider;
40  import org.eclipse.aether.impl.MetadataResolver;
41  import org.eclipse.aether.impl.OfflineController;
42  import org.eclipse.aether.impl.RemoteRepositoryFilterManager;
43  import org.eclipse.aether.impl.RemoteRepositoryManager;
44  import org.eclipse.aether.impl.RepositoryConnectorProvider;
45  import org.eclipse.aether.impl.RepositoryEventDispatcher;
46  import org.eclipse.aether.impl.RepositorySystemLifecycle;
47  import org.eclipse.aether.impl.UpdateCheckManager;
48  import org.eclipse.aether.impl.UpdatePolicyAnalyzer;
49  import org.eclipse.aether.internal.impl.DefaultArtifactResolver;
50  import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider;
51  import org.eclipse.aether.internal.impl.DefaultDeployer;
52  import org.eclipse.aether.internal.impl.DefaultFileProcessor;
53  import org.eclipse.aether.internal.impl.DefaultInstaller;
54  import org.eclipse.aether.internal.impl.DefaultLocalPathComposer;
55  import org.eclipse.aether.internal.impl.DefaultLocalPathPrefixComposerFactory;
56  import org.eclipse.aether.internal.impl.DefaultLocalRepositoryProvider;
57  import org.eclipse.aether.internal.impl.DefaultMetadataResolver;
58  import org.eclipse.aether.internal.impl.DefaultOfflineController;
59  import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager;
60  import org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider;
61  import org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher;
62  import org.eclipse.aether.internal.impl.DefaultRepositoryLayoutProvider;
63  import org.eclipse.aether.internal.impl.DefaultRepositorySystem;
64  import org.eclipse.aether.internal.impl.DefaultRepositorySystemLifecycle;
65  import org.eclipse.aether.internal.impl.DefaultTrackingFileManager;
66  import org.eclipse.aether.internal.impl.DefaultTransporterProvider;
67  import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager;
68  import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer;
69  import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory;
70  import org.eclipse.aether.internal.impl.LocalPathComposer;
71  import org.eclipse.aether.internal.impl.LocalPathPrefixComposerFactory;
72  import org.eclipse.aether.internal.impl.Maven2RepositoryLayoutFactory;
73  import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
74  import org.eclipse.aether.internal.impl.TrackingFileManager;
75  import org.eclipse.aether.internal.impl.checksum.DefaultChecksumAlgorithmFactorySelector;
76  import org.eclipse.aether.internal.impl.checksum.Md5ChecksumAlgorithmFactory;
77  import org.eclipse.aether.internal.impl.checksum.Sha1ChecksumAlgorithmFactory;
78  import org.eclipse.aether.internal.impl.checksum.Sha256ChecksumAlgorithmFactory;
79  import org.eclipse.aether.internal.impl.checksum.Sha512ChecksumAlgorithmFactory;
80  import org.eclipse.aether.internal.impl.checksum.SparseDirectoryTrustedChecksumsSource;
81  import org.eclipse.aether.internal.impl.checksum.SummaryFileTrustedChecksumsSource;
82  import org.eclipse.aether.internal.impl.checksum.TrustedToProvidedChecksumsSourceAdapter;
83  import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector;
84  import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate;
85  import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector;
86  import org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector;
87  import org.eclipse.aether.internal.impl.filter.DefaultRemoteRepositoryFilterManager;
88  import org.eclipse.aether.internal.impl.filter.GroupIdRemoteRepositoryFilterSource;
89  import org.eclipse.aether.internal.impl.filter.PrefixesRemoteRepositoryFilterSource;
90  import org.eclipse.aether.internal.impl.resolution.TrustedChecksumsArtifactResolverPostProcessor;
91  import org.eclipse.aether.internal.impl.slf4j.Slf4jLoggerFactory;
92  import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory;
93  import org.eclipse.aether.internal.impl.synccontext.named.NameMapper;
94  import org.eclipse.aether.internal.impl.synccontext.named.NameMappers;
95  import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactory;
96  import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapterFactoryImpl;
97  import org.eclipse.aether.internal.impl.synccontext.named.providers.DiscriminatingNameMapperProvider;
98  import org.eclipse.aether.internal.impl.synccontext.named.providers.FileGAECVNameMapperProvider;
99  import org.eclipse.aether.internal.impl.synccontext.named.providers.FileGAVNameMapperProvider;
100 import org.eclipse.aether.internal.impl.synccontext.named.providers.FileHashingGAECVNameMapperProvider;
101 import org.eclipse.aether.internal.impl.synccontext.named.providers.FileHashingGAVNameMapperProvider;
102 import org.eclipse.aether.internal.impl.synccontext.named.providers.GAECVNameMapperProvider;
103 import org.eclipse.aether.internal.impl.synccontext.named.providers.GAVNameMapperProvider;
104 import org.eclipse.aether.internal.impl.synccontext.named.providers.StaticNameMapperProvider;
105 import org.eclipse.aether.named.NamedLockFactory;
106 import org.eclipse.aether.named.providers.FileLockNamedLockFactory;
107 import org.eclipse.aether.named.providers.LocalReadWriteLockNamedLockFactory;
108 import org.eclipse.aether.named.providers.LocalSemaphoreNamedLockFactory;
109 import org.eclipse.aether.named.providers.NoopNamedLockFactory;
110 import org.eclipse.aether.spi.checksums.ProvidedChecksumsSource;
111 import org.eclipse.aether.spi.checksums.TrustedChecksumsSource;
112 import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory;
113 import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector;
114 import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider;
115 import org.eclipse.aether.spi.connector.filter.RemoteRepositoryFilterSource;
116 import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory;
117 import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider;
118 import org.eclipse.aether.spi.connector.transport.TransporterProvider;
119 import org.eclipse.aether.spi.io.FileProcessor;
120 import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
121 import org.eclipse.aether.spi.log.LoggerFactory;
122 import org.eclipse.aether.spi.resolution.ArtifactResolverPostProcessor;
123 import org.eclipse.aether.spi.synccontext.SyncContextFactory;
124 import 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
138 public 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 }