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