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}