001package org.eclipse.aether.impl.guice; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import java.util.Collections; 023import java.util.HashMap; 024import java.util.HashSet; 025import java.util.Map; 026import java.util.Set; 027 028import javax.inject.Named; 029import javax.inject.Singleton; 030 031import org.eclipse.aether.RepositoryListener; 032import org.eclipse.aether.RepositorySystem; 033import org.eclipse.aether.impl.ArtifactResolver; 034import org.eclipse.aether.impl.DependencyCollector; 035import org.eclipse.aether.impl.Deployer; 036import org.eclipse.aether.impl.Installer; 037import org.eclipse.aether.impl.LocalRepositoryProvider; 038import org.eclipse.aether.impl.MetadataResolver; 039import org.eclipse.aether.impl.OfflineController; 040import org.eclipse.aether.impl.RemoteRepositoryManager; 041import org.eclipse.aether.impl.RepositoryConnectorProvider; 042import org.eclipse.aether.impl.RepositoryEventDispatcher; 043import org.eclipse.aether.internal.impl.DefaultLocalPathPrefixComposerFactory; 044import org.eclipse.aether.internal.impl.LocalPathComposer; 045import org.eclipse.aether.internal.impl.DefaultLocalPathComposer; 046import org.eclipse.aether.internal.impl.DefaultTrackingFileManager; 047import org.eclipse.aether.internal.impl.LocalPathPrefixComposerFactory; 048import org.eclipse.aether.internal.impl.FileProvidedChecksumsSource; 049import org.eclipse.aether.internal.impl.TrackingFileManager; 050import org.eclipse.aether.internal.impl.checksum.Md5ChecksumAlgorithmFactory; 051import org.eclipse.aether.internal.impl.checksum.Sha1ChecksumAlgorithmFactory; 052import org.eclipse.aether.internal.impl.checksum.Sha256ChecksumAlgorithmFactory; 053import org.eclipse.aether.internal.impl.checksum.Sha512ChecksumAlgorithmFactory; 054import org.eclipse.aether.internal.impl.checksum.DefaultChecksumAlgorithmFactorySelector; 055import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegate; 056import org.eclipse.aether.internal.impl.collect.bf.BfDependencyCollector; 057import org.eclipse.aether.internal.impl.collect.df.DfDependencyCollector; 058import org.eclipse.aether.internal.impl.synccontext.DefaultSyncContextFactory; 059import org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactorySelector; 060import org.eclipse.aether.internal.impl.synccontext.named.SimpleNamedLockFactorySelector; 061import org.eclipse.aether.internal.impl.synccontext.named.GAVNameMapper; 062import org.eclipse.aether.internal.impl.synccontext.named.DiscriminatingNameMapper; 063import org.eclipse.aether.internal.impl.synccontext.named.NameMapper; 064import org.eclipse.aether.internal.impl.synccontext.named.StaticNameMapper; 065import org.eclipse.aether.internal.impl.synccontext.named.FileGAVNameMapper; 066import org.eclipse.aether.named.NamedLockFactory; 067import org.eclipse.aether.named.providers.FileLockNamedLockFactory; 068import org.eclipse.aether.named.providers.LocalReadWriteLockNamedLockFactory; 069import org.eclipse.aether.named.providers.LocalSemaphoreNamedLockFactory; 070import org.eclipse.aether.impl.UpdateCheckManager; 071import org.eclipse.aether.impl.UpdatePolicyAnalyzer; 072import org.eclipse.aether.internal.impl.DefaultArtifactResolver; 073import org.eclipse.aether.internal.impl.DefaultChecksumPolicyProvider; 074import org.eclipse.aether.internal.impl.collect.DefaultDependencyCollector; 075import org.eclipse.aether.internal.impl.DefaultDeployer; 076import org.eclipse.aether.internal.impl.DefaultFileProcessor; 077import org.eclipse.aether.internal.impl.DefaultInstaller; 078import org.eclipse.aether.internal.impl.DefaultLocalRepositoryProvider; 079import org.eclipse.aether.internal.impl.DefaultMetadataResolver; 080import org.eclipse.aether.internal.impl.DefaultOfflineController; 081import org.eclipse.aether.internal.impl.DefaultRemoteRepositoryManager; 082import org.eclipse.aether.internal.impl.DefaultRepositoryConnectorProvider; 083import org.eclipse.aether.internal.impl.DefaultRepositoryEventDispatcher; 084import org.eclipse.aether.internal.impl.DefaultRepositoryLayoutProvider; 085import org.eclipse.aether.internal.impl.DefaultRepositorySystem; 086import org.eclipse.aether.internal.impl.DefaultTransporterProvider; 087import org.eclipse.aether.internal.impl.DefaultUpdateCheckManager; 088import org.eclipse.aether.internal.impl.DefaultUpdatePolicyAnalyzer; 089import org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManagerFactory; 090import org.eclipse.aether.internal.impl.Maven2RepositoryLayoutFactory; 091import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory; 092import org.eclipse.aether.internal.impl.slf4j.Slf4jLoggerFactory; 093import org.eclipse.aether.named.providers.NoopNamedLockFactory; 094import org.eclipse.aether.spi.connector.checksum.ProvidedChecksumsSource; 095import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactorySelector; 096import org.eclipse.aether.spi.connector.checksum.ChecksumPolicyProvider; 097import org.eclipse.aether.spi.connector.checksum.ChecksumAlgorithmFactory; 098import org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory; 099import org.eclipse.aether.spi.connector.layout.RepositoryLayoutProvider; 100import org.eclipse.aether.spi.connector.transport.TransporterProvider; 101import org.eclipse.aether.spi.io.FileProcessor; 102import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory; 103import org.eclipse.aether.spi.log.LoggerFactory; 104import org.eclipse.aether.spi.synccontext.SyncContextFactory; 105import org.slf4j.ILoggerFactory; 106 107import com.google.inject.AbstractModule; 108import com.google.inject.Provides; 109import com.google.inject.name.Names; 110 111/** 112 * A ready-made <a href="https://github.com/google/guice" target="_blank">Guice</a> module that sets up bindings 113 * for all components from this library. To acquire a complete repository system, clients need to bind an artifact 114 * descriptor reader, a version resolver, a version range resolver, zero or more metadata generator factories, some 115 * repository connector and transporter factories to access remote repositories. 116 * 117 * @noextend This class must not be extended by clients and will eventually be marked {@code final} without prior 118 * notice. 119 */ 120public class AetherModule 121 extends AbstractModule 122{ 123 124 /** 125 * Creates a new instance of this Guice module, typically for invoking 126 * {@link com.google.inject.Binder#install(com.google.inject.Module)}. 127 */ 128 public AetherModule() 129 { 130 } 131 132 /** 133 * Configures Guice with bindings for Aether components provided by this library. 134 */ 135 @Override 136 protected void configure() 137 { 138 bind( RepositorySystem.class ) // 139 .to( DefaultRepositorySystem.class ).in( Singleton.class ); 140 bind( ArtifactResolver.class ) // 141 .to( DefaultArtifactResolver.class ).in( Singleton.class ); 142 143 bind( DependencyCollector.class ) // 144 .to( DefaultDependencyCollector.class ).in( Singleton.class ); 145 bind( DependencyCollectorDelegate.class ).annotatedWith( Names.named( BfDependencyCollector.NAME ) ) 146 .to( BfDependencyCollector.class ).in( Singleton.class ); 147 bind( DependencyCollectorDelegate.class ).annotatedWith( Names.named( DfDependencyCollector.NAME ) ) 148 .to( DfDependencyCollector.class ).in( Singleton.class ); 149 150 bind( Deployer.class ) // 151 .to( DefaultDeployer.class ).in( Singleton.class ); 152 bind( Installer.class ) // 153 .to( DefaultInstaller.class ).in( Singleton.class ); 154 bind( MetadataResolver.class ) // 155 .to( DefaultMetadataResolver.class ).in( Singleton.class ); 156 bind( RepositoryLayoutProvider.class ) // 157 .to( DefaultRepositoryLayoutProvider.class ).in( Singleton.class ); 158 bind( RepositoryLayoutFactory.class ).annotatedWith( Names.named( "maven2" ) ) // 159 .to( Maven2RepositoryLayoutFactory.class ).in( Singleton.class ); 160 bind( TransporterProvider.class ) // 161 .to( DefaultTransporterProvider.class ).in( Singleton.class ); 162 bind( ChecksumPolicyProvider.class ) // 163 .to( DefaultChecksumPolicyProvider.class ).in( Singleton.class ); 164 bind( RepositoryConnectorProvider.class ) // 165 .to( DefaultRepositoryConnectorProvider.class ).in( Singleton.class ); 166 bind( RemoteRepositoryManager.class ) // 167 .to( DefaultRemoteRepositoryManager.class ).in( Singleton.class ); 168 bind( UpdateCheckManager.class ) // 169 .to( DefaultUpdateCheckManager.class ).in( Singleton.class ); 170 bind( UpdatePolicyAnalyzer.class ) // 171 .to( DefaultUpdatePolicyAnalyzer.class ).in( Singleton.class ); 172 bind( FileProcessor.class ) // 173 .to( DefaultFileProcessor.class ).in( Singleton.class ); 174 bind( RepositoryEventDispatcher.class ) // 175 .to( DefaultRepositoryEventDispatcher.class ).in( Singleton.class ); 176 bind( OfflineController.class ) // 177 .to( DefaultOfflineController.class ).in( Singleton.class ); 178 179 bind( LocalPathComposer.class ) 180 .to( DefaultLocalPathComposer.class ).in( Singleton.class ); 181 bind( LocalPathPrefixComposerFactory.class ) 182 .to( DefaultLocalPathPrefixComposerFactory.class ).in( Singleton.class ); 183 184 bind( LocalRepositoryProvider.class ) // 185 .to( DefaultLocalRepositoryProvider.class ).in( Singleton.class ); 186 bind( LocalRepositoryManagerFactory.class ).annotatedWith( Names.named( "simple" ) ) // 187 .to( SimpleLocalRepositoryManagerFactory.class ).in( Singleton.class ); 188 bind( LocalRepositoryManagerFactory.class ).annotatedWith( Names.named( "enhanced" ) ) // 189 .to( EnhancedLocalRepositoryManagerFactory.class ).in( Singleton.class ); 190 bind( TrackingFileManager.class ).to( DefaultTrackingFileManager.class ).in( Singleton.class ); 191 192 bind( ProvidedChecksumsSource.class ).annotatedWith( Names.named( FileProvidedChecksumsSource.NAME ) ) // 193 .to( FileProvidedChecksumsSource.class ).in( Singleton.class ); 194 195 bind( ChecksumAlgorithmFactory.class ).annotatedWith( Names.named( Md5ChecksumAlgorithmFactory.NAME ) ) 196 .to( Md5ChecksumAlgorithmFactory.class ); 197 bind( ChecksumAlgorithmFactory.class ).annotatedWith( Names.named( Sha1ChecksumAlgorithmFactory.NAME ) ) 198 .to( Sha1ChecksumAlgorithmFactory.class ); 199 bind( ChecksumAlgorithmFactory.class ).annotatedWith( Names.named( Sha256ChecksumAlgorithmFactory.NAME ) ) 200 .to( Sha256ChecksumAlgorithmFactory.class ); 201 bind( ChecksumAlgorithmFactory.class ).annotatedWith( Names.named( Sha512ChecksumAlgorithmFactory.NAME ) ) 202 .to( Sha512ChecksumAlgorithmFactory.class ); 203 bind( ChecksumAlgorithmFactorySelector.class ) 204 .to( DefaultChecksumAlgorithmFactorySelector.class ).in ( Singleton.class ); 205 206 bind( NamedLockFactorySelector.class ).to( SimpleNamedLockFactorySelector.class ).in( Singleton.class ); 207 bind( SyncContextFactory.class ).to( DefaultSyncContextFactory.class ).in( Singleton.class ); 208 bind( org.eclipse.aether.impl.SyncContextFactory.class ) 209 .to( org.eclipse.aether.internal.impl.synccontext.legacy.DefaultSyncContextFactory.class ) 210 .in( Singleton.class ); 211 212 bind( NameMapper.class ).annotatedWith( Names.named( StaticNameMapper.NAME ) ) 213 .to( StaticNameMapper.class ).in( Singleton.class ); 214 bind( NameMapper.class ).annotatedWith( Names.named( GAVNameMapper.NAME ) ) 215 .to( GAVNameMapper.class ).in( Singleton.class ); 216 bind( NameMapper.class ).annotatedWith( Names.named( DiscriminatingNameMapper.NAME ) ) 217 .to( DiscriminatingNameMapper.class ).in( Singleton.class ); 218 bind( NameMapper.class ).annotatedWith( Names.named( FileGAVNameMapper.NAME ) ) 219 .to( FileGAVNameMapper.class ).in( Singleton.class ); 220 221 bind( NamedLockFactory.class ).annotatedWith( Names.named( NoopNamedLockFactory.NAME ) ) 222 .to( NoopNamedLockFactory.class ).in( Singleton.class ); 223 bind( NamedLockFactory.class ).annotatedWith( Names.named( LocalReadWriteLockNamedLockFactory.NAME ) ) 224 .to( LocalReadWriteLockNamedLockFactory.class ).in( Singleton.class ); 225 bind( NamedLockFactory.class ).annotatedWith( Names.named( LocalSemaphoreNamedLockFactory.NAME ) ) 226 .to( LocalSemaphoreNamedLockFactory.class ).in( Singleton.class ); 227 bind( NamedLockFactory.class ).annotatedWith( Names.named( FileLockNamedLockFactory.NAME ) ) 228 .to( FileLockNamedLockFactory.class ).in( Singleton.class ); 229 230 install( new Slf4jModule() ); 231 232 } 233 234 @Provides 235 @Singleton 236 Map<String, DependencyCollectorDelegate> dependencyCollectorDelegates( 237 @Named( BfDependencyCollector.NAME ) DependencyCollectorDelegate bf, 238 @Named( DfDependencyCollector.NAME ) DependencyCollectorDelegate df 239 ) 240 { 241 Map<String, DependencyCollectorDelegate> dependencyCollectorDelegates = new HashMap<>(); 242 dependencyCollectorDelegates.put( BfDependencyCollector.NAME, bf ); 243 dependencyCollectorDelegates.put( DfDependencyCollector.NAME, df ); 244 return dependencyCollectorDelegates; 245 } 246 247 @Provides 248 @Singleton 249 Map<String, ProvidedChecksumsSource> provideChecksumSources( 250 @Named( FileProvidedChecksumsSource.NAME ) ProvidedChecksumsSource fileProvidedChecksumSource 251 ) 252 { 253 Map<String, ProvidedChecksumsSource> providedChecksumsSource = new HashMap<>(); 254 providedChecksumsSource.put( FileProvidedChecksumsSource.NAME, fileProvidedChecksumSource ); 255 return providedChecksumsSource; 256 } 257 258 @Provides 259 @Singleton 260 Map<String, ChecksumAlgorithmFactory> provideChecksumTypes( 261 @Named( Sha512ChecksumAlgorithmFactory.NAME ) ChecksumAlgorithmFactory sha512, 262 @Named( Sha256ChecksumAlgorithmFactory.NAME ) ChecksumAlgorithmFactory sha256, 263 @Named( Sha1ChecksumAlgorithmFactory.NAME ) ChecksumAlgorithmFactory sha1, 264 @Named( Md5ChecksumAlgorithmFactory.NAME ) ChecksumAlgorithmFactory md5 ) 265 { 266 Map<String, ChecksumAlgorithmFactory> checksumTypes = new HashMap<>(); 267 checksumTypes.put( Sha512ChecksumAlgorithmFactory.NAME, sha512 ); 268 checksumTypes.put( Sha256ChecksumAlgorithmFactory.NAME, sha256 ); 269 checksumTypes.put( Sha1ChecksumAlgorithmFactory.NAME, sha1 ); 270 checksumTypes.put( Md5ChecksumAlgorithmFactory.NAME, md5 ); 271 return Collections.unmodifiableMap( checksumTypes ); 272 } 273 274 @Provides 275 @Singleton 276 Map<String, NameMapper> provideNameMappers( 277 @Named( StaticNameMapper.NAME ) NameMapper staticNameMapper, 278 @Named( GAVNameMapper.NAME ) NameMapper gavNameMapper, 279 @Named( DiscriminatingNameMapper.NAME ) NameMapper discriminatingNameMapper, 280 @Named( FileGAVNameMapper.NAME ) NameMapper fileGavNameMapper ) 281 { 282 Map<String, NameMapper> nameMappers = new HashMap<>(); 283 nameMappers.put( StaticNameMapper.NAME, staticNameMapper ); 284 nameMappers.put( GAVNameMapper.NAME, gavNameMapper ); 285 nameMappers.put( DiscriminatingNameMapper.NAME, discriminatingNameMapper ); 286 nameMappers.put( FileGAVNameMapper.NAME, fileGavNameMapper ); 287 return Collections.unmodifiableMap( nameMappers ); 288 } 289 290 @Provides 291 @Singleton 292 Map<String, NamedLockFactory> provideNamedLockFactories( 293 @Named( LocalReadWriteLockNamedLockFactory.NAME ) NamedLockFactory localRwLock, 294 @Named( LocalSemaphoreNamedLockFactory.NAME ) NamedLockFactory localSemaphore, 295 @Named( FileLockNamedLockFactory.NAME ) NamedLockFactory fileLockFactory ) 296 { 297 Map<String, NamedLockFactory> factories = new HashMap<>(); 298 factories.put( LocalReadWriteLockNamedLockFactory.NAME, localRwLock ); 299 factories.put( LocalSemaphoreNamedLockFactory.NAME, localSemaphore ); 300 factories.put( FileLockNamedLockFactory.NAME, fileLockFactory ); 301 return Collections.unmodifiableMap( factories ); 302 } 303 304 @Provides 305 @Singleton 306 Set<LocalRepositoryManagerFactory> provideLocalRepositoryManagerFactories( 307 @Named( "simple" ) LocalRepositoryManagerFactory simple, 308 @Named( "enhanced" ) LocalRepositoryManagerFactory enhanced ) 309 { 310 Set<LocalRepositoryManagerFactory> factories = new HashSet<>(); 311 factories.add( simple ); 312 factories.add( enhanced ); 313 return Collections.unmodifiableSet( factories ); 314 } 315 316 @Provides 317 @Singleton 318 Set<RepositoryLayoutFactory> provideRepositoryLayoutFactories( @Named( "maven2" ) RepositoryLayoutFactory maven2 ) 319 { 320 Set<RepositoryLayoutFactory> factories = new HashSet<>(); 321 factories.add( maven2 ); 322 return Collections.unmodifiableSet( factories ); 323 } 324 325 @Provides 326 @Singleton 327 Set<RepositoryListener> providesRepositoryListeners() 328 { 329 return Collections.emptySet(); 330 } 331 332 private static class Slf4jModule 333 extends AbstractModule 334 { 335 336 @Override 337 protected void configure() 338 { 339 bind( LoggerFactory.class ) // 340 .to( Slf4jLoggerFactory.class ); 341 } 342 343 @Provides 344 @Singleton 345 ILoggerFactory getLoggerFactory() 346 { 347 return org.slf4j.LoggerFactory.getILoggerFactory(); 348 } 349 350 } 351 352}