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.repository.internal;
20  
21  import java.util.Arrays;
22  import java.util.function.Supplier;
23  
24  import org.apache.maven.api.DependencyScope;
25  import org.apache.maven.repository.internal.artifact.FatArtifactTraverser;
26  import org.apache.maven.repository.internal.scopes.Maven4ScopeManagerConfiguration;
27  import org.apache.maven.repository.internal.type.DefaultTypeProvider;
28  import org.apache.maven.repository.internal.type.TypeCollector;
29  import org.apache.maven.repository.internal.type.TypeDeriver;
30  import org.eclipse.aether.RepositorySystem;
31  import org.eclipse.aether.RepositorySystemSession.CloseableSession;
32  import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
33  import org.eclipse.aether.artifact.ArtifactTypeRegistry;
34  import org.eclipse.aether.collection.DependencyGraphTransformer;
35  import org.eclipse.aether.collection.DependencyManager;
36  import org.eclipse.aether.collection.DependencySelector;
37  import org.eclipse.aether.collection.DependencyTraverser;
38  import org.eclipse.aether.impl.scope.InternalScopeManager;
39  import org.eclipse.aether.internal.impl.scope.ManagedDependencyContextRefiner;
40  import org.eclipse.aether.internal.impl.scope.ManagedScopeDeriver;
41  import org.eclipse.aether.internal.impl.scope.ManagedScopeSelector;
42  import org.eclipse.aether.internal.impl.scope.OptionalDependencySelector;
43  import org.eclipse.aether.internal.impl.scope.ScopeDependencySelector;
44  import org.eclipse.aether.internal.impl.scope.ScopeManagerImpl;
45  import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
46  import org.eclipse.aether.util.artifact.DefaultArtifactTypeRegistry;
47  import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
48  import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager;
49  import org.eclipse.aether.util.graph.selector.AndDependencySelector;
50  import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
51  import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
52  import org.eclipse.aether.util.graph.transformer.ConfigurableVersionSelector;
53  import org.eclipse.aether.util.graph.transformer.ConflictResolver;
54  import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
55  import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;
56  
57  import static java.util.Objects.requireNonNull;
58  
59  /**
60   * A simple {@link Supplier} of {@link SessionBuilder} instances, that on each call supplies newly
61   * constructed instance. To create session out of builder, use {@link SessionBuilder#build()}. For proper closing
62   * of sessions, use {@link CloseableSession#close()} method on built instance(s).
63   * <p>
64   * Extend this class and override methods to customize, if needed.
65   *
66   * @since 4.0.0
67   * @deprecated since 4.0.0, use {@code maven-api-impl} jar instead
68   */
69  @Deprecated(since = "4.0.0")
70  public class MavenSessionBuilderSupplier implements Supplier<SessionBuilder> {
71      protected final RepositorySystem repositorySystem;
72      protected final InternalScopeManager scopeManager;
73  
74      public MavenSessionBuilderSupplier(RepositorySystem repositorySystem) {
75          this.repositorySystem = requireNonNull(repositorySystem);
76          this.scopeManager = new ScopeManagerImpl(Maven4ScopeManagerConfiguration.INSTANCE);
77      }
78  
79      /**
80       * Package protected constructor, only for use with {@link MavenRepositorySystemUtils}.
81       */
82      @Deprecated
83      MavenSessionBuilderSupplier() {
84          this.repositorySystem = null;
85          this.scopeManager = new ScopeManagerImpl(Maven4ScopeManagerConfiguration.INSTANCE);
86      }
87  
88      protected InternalScopeManager getScopeManager() {
89          return scopeManager;
90      }
91  
92      protected DependencyTraverser getDependencyTraverser() {
93          return new FatArtifactTraverser();
94      }
95  
96      protected DependencyManager getDependencyManager() {
97          return getDependencyManager(true); // same default as in Maven4
98      }
99  
100     public DependencyManager getDependencyManager(boolean transitive) {
101         return transitive
102                 ? new TransitiveDependencyManager(getScopeManager())
103                 : new ClassicDependencyManager(getScopeManager());
104     }
105 
106     protected DependencySelector getDependencySelector() {
107         return new AndDependencySelector(
108                 ScopeDependencySelector.legacy(
109                         null, Arrays.asList(DependencyScope.TEST.id(), DependencyScope.PROVIDED.id())),
110                 OptionalDependencySelector.fromDirect(),
111                 new ExclusionDependencySelector());
112     }
113 
114     protected DependencyGraphTransformer getDependencyGraphTransformer() {
115         return new ChainedDependencyGraphTransformer(
116                 new TypeCollector(),
117                 new ConflictResolver(
118                         new ConfigurableVersionSelector(), new ManagedScopeSelector(getScopeManager()),
119                         new SimpleOptionalitySelector(), new ManagedScopeDeriver(getScopeManager())),
120                 new ManagedDependencyContextRefiner(getScopeManager()),
121                 new TypeDeriver());
122     }
123 
124     /**
125      * This method produces "surrogate" type registry that is static: it aims users that want to use
126      * Maven-Resolver without involving Maven Core and related things.
127      * <p>
128      * This type registry is NOT used by Maven Core: Maven replaces it during Session creation with a type registry
129      * that supports extending it (i.e. via Maven Extensions).
130      * <p>
131      * Important: this "static" list of types should be in-sync with core provided types.
132      */
133     protected ArtifactTypeRegistry getArtifactTypeRegistry() {
134         DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry();
135         new DefaultTypeProvider().types().forEach(t -> stereotypes.add(t.toArtifactType()));
136         return stereotypes;
137     }
138 
139     protected ArtifactDescriptorPolicy getArtifactDescriptorPolicy() {
140         return new SimpleArtifactDescriptorPolicy(true, true);
141     }
142 
143     protected void configureSessionBuilder(SessionBuilder session) {
144         session.setDependencyTraverser(getDependencyTraverser());
145         session.setDependencyManager(getDependencyManager());
146         session.setDependencySelector(getDependencySelector());
147         session.setDependencyGraphTransformer(getDependencyGraphTransformer());
148         session.setArtifactTypeRegistry(getArtifactTypeRegistry());
149         session.setArtifactDescriptorPolicy(getArtifactDescriptorPolicy());
150         session.setScopeManager(getScopeManager());
151     }
152 
153     /**
154      * Creates a new Maven-like repository system session by initializing the session with values typical for
155      * Maven-based resolution. In more detail, this method configures settings relevant for the processing of dependency
156      * graphs, most other settings remain at their generic default value. Use the various setters to further configure
157      * the session with authentication, mirror, proxy and other information required for your environment. At least,
158      * local repository manager needs to be configured to make session be able to create session instance.
159      *
160      * @return SessionBuilder configured with minimally required things for "Maven-based resolution". At least LRM must
161      * be set on builder to make it able to create session instances.
162      */
163     @Override
164     public SessionBuilder get() {
165         requireNonNull(repositorySystem, "repositorySystem");
166         SessionBuilder builder = repositorySystem.createSessionBuilder();
167         configureSessionBuilder(builder);
168         return builder;
169     }
170 }