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