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.apache.maven.resolver.examples.guice;
20  
21  import javax.inject.Named;
22  import javax.inject.Singleton;
23  
24  import java.util.Collections;
25  import java.util.HashSet;
26  import java.util.Map;
27  import java.util.Set;
28  
29  import com.google.inject.AbstractModule;
30  import com.google.inject.Provides;
31  import com.google.inject.name.Names;
32  import org.apache.maven.model.building.DefaultModelBuilderFactory;
33  import org.apache.maven.model.building.ModelBuilder;
34  import org.apache.maven.repository.internal.DefaultArtifactDescriptorReader;
35  import org.apache.maven.repository.internal.DefaultVersionRangeResolver;
36  import org.apache.maven.repository.internal.DefaultVersionResolver;
37  import org.apache.maven.repository.internal.SnapshotMetadataGeneratorFactory;
38  import org.apache.maven.repository.internal.VersionsMetadataGeneratorFactory;
39  import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
40  import org.eclipse.aether.impl.ArtifactDescriptorReader;
41  import org.eclipse.aether.impl.MetadataGeneratorFactory;
42  import org.eclipse.aether.impl.VersionRangeResolver;
43  import org.eclipse.aether.impl.VersionResolver;
44  import org.eclipse.aether.impl.guice.AetherModule;
45  import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
46  import org.eclipse.aether.spi.connector.transport.TransporterFactory;
47  import org.eclipse.aether.transport.file.FileTransporterFactory;
48  import org.eclipse.aether.transport.http.ChecksumExtractor;
49  import org.eclipse.aether.transport.http.HttpTransporterFactory;
50  
51  /**
52   * Guice module for Demo Resolver snippets.
53   *
54   * Here, we assemble "complete" module by using {@link AetherModule} (see it's Javadoc) and adding bits from
55   * Maven itself (binding those components that completes repository system).
56   */
57  class DemoResolverModule extends AbstractModule {
58  
59      @Override
60      protected void configure() {
61          // NOTE: see org.eclipse.aether.impl.guice.AetherModule Javadoc:
62          // AetherModule alone is "ready-made" but incomplete. To have a complete resolver, we
63          // actually need to bind the missing components making module complete.
64          install(new AetherModule());
65  
66          // make module "complete" by binding things not bound by AetherModule
67          bind(ArtifactDescriptorReader.class)
68                  .to(DefaultArtifactDescriptorReader.class)
69                  .in(Singleton.class);
70          bind(VersionResolver.class).to(DefaultVersionResolver.class).in(Singleton.class);
71          bind(VersionRangeResolver.class).to(DefaultVersionRangeResolver.class).in(Singleton.class);
72          bind(MetadataGeneratorFactory.class)
73                  .annotatedWith(Names.named("snapshot"))
74                  .to(SnapshotMetadataGeneratorFactory.class)
75                  .in(Singleton.class);
76  
77          bind(MetadataGeneratorFactory.class)
78                  .annotatedWith(Names.named("versions"))
79                  .to(VersionsMetadataGeneratorFactory.class)
80                  .in(Singleton.class);
81  
82          bind(RepositoryConnectorFactory.class)
83                  .annotatedWith(Names.named("basic"))
84                  .to(BasicRepositoryConnectorFactory.class);
85          bind(TransporterFactory.class).annotatedWith(Names.named("file")).to(FileTransporterFactory.class);
86          bind(TransporterFactory.class).annotatedWith(Names.named("http")).to(HttpTransporterFactory.class);
87      }
88  
89      /**
90       * Checksum extractors (none).
91       */
92      @Provides
93      @Singleton
94      Map<String, ChecksumExtractor> provideChecksumExtractors() {
95          return Collections.emptyMap();
96      }
97  
98      /**
99       * Repository system connectors (needed for remote transport).
100      */
101     @Provides
102     @Singleton
103     Set<RepositoryConnectorFactory> provideRepositoryConnectorFactories(
104             @Named("basic") RepositoryConnectorFactory basic) {
105         Set<RepositoryConnectorFactory> factories = new HashSet<>();
106         factories.add(basic);
107         return Collections.unmodifiableSet(factories);
108     }
109 
110     /**
111      * Repository system transporters (needed for remote transport).
112      */
113     @Provides
114     @Singleton
115     Set<TransporterFactory> provideTransporterFactories(
116             @Named("file") TransporterFactory file, @Named("http") TransporterFactory http) {
117         Set<TransporterFactory> factories = new HashSet<>();
118         factories.add(file);
119         factories.add(http);
120         return Collections.unmodifiableSet(factories);
121     }
122 
123     /**
124      * Repository metadata generators (needed for remote transport).
125      */
126     @Provides
127     @Singleton
128     Set<MetadataGeneratorFactory> provideMetadataGeneratorFactories(
129             @Named("snapshot") MetadataGeneratorFactory snapshot,
130             @Named("versions") MetadataGeneratorFactory versions) {
131         Set<MetadataGeneratorFactory> factories = new HashSet<>(2);
132         factories.add(snapshot);
133         factories.add(versions);
134         return Collections.unmodifiableSet(factories);
135     }
136 
137     /**
138      * Simple instance provider for model builder factory. Note: Maven 3.8.1 {@link ModelBuilder} is annotated
139      * and would require much more.
140      */
141     @Provides
142     ModelBuilder provideModelBuilder() {
143         return new DefaultModelBuilderFactory().newInstance();
144     }
145 }