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.eclipse.aether.supplier;
20  
21  import java.util.Arrays;
22  import java.util.Locale;
23  import java.util.Objects;
24  import java.util.function.Supplier;
25  
26  import org.apache.maven.api.DependencyScope;
27  import org.apache.maven.repository.internal.artifact.FatArtifactTraverser;
28  import org.apache.maven.repository.internal.scopes.Maven4ScopeManagerConfiguration;
29  import org.apache.maven.repository.internal.type.DefaultTypeProvider;
30  import org.apache.maven.utils.Os;
31  import org.eclipse.aether.RepositorySystem;
32  import org.eclipse.aether.RepositorySystemSession;
33  import org.eclipse.aether.RepositorySystemSession.CloseableSession;
34  import org.eclipse.aether.RepositorySystemSession.SessionBuilder;
35  import org.eclipse.aether.artifact.ArtifactTypeRegistry;
36  import org.eclipse.aether.collection.DependencyGraphTransformer;
37  import org.eclipse.aether.collection.DependencyManager;
38  import org.eclipse.aether.collection.DependencySelector;
39  import org.eclipse.aether.collection.DependencyTraverser;
40  import org.eclipse.aether.impl.scope.InternalScopeManager;
41  import org.eclipse.aether.internal.impl.scope.ManagedDependencyContextRefiner;
42  import org.eclipse.aether.internal.impl.scope.ManagedScopeDeriver;
43  import org.eclipse.aether.internal.impl.scope.ManagedScopeSelector;
44  import org.eclipse.aether.internal.impl.scope.OptionalDependencySelector;
45  import org.eclipse.aether.internal.impl.scope.ScopeDependencySelector;
46  import org.eclipse.aether.internal.impl.scope.ScopeManagerImpl;
47  import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
48  import org.eclipse.aether.util.artifact.DefaultArtifactTypeRegistry;
49  import org.eclipse.aether.util.graph.manager.ClassicDependencyManager;
50  import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager;
51  import org.eclipse.aether.util.graph.selector.AndDependencySelector;
52  import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
53  import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer;
54  import org.eclipse.aether.util.graph.transformer.ConfigurableVersionSelector;
55  import org.eclipse.aether.util.graph.transformer.ConflictResolver;
56  import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector;
57  import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy;
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 2.0.0
67   */
68  public class SessionBuilderSupplier {
69      protected final RepositorySystem repositorySystem;
70      protected final InternalScopeManager scopeManager;
71  
72      public SessionBuilderSupplier(RepositorySystem repositorySystem) {
73          this.repositorySystem = Objects.requireNonNull(repositorySystem);
74          this.scopeManager = new ScopeManagerImpl(Maven4ScopeManagerConfiguration.INSTANCE);
75      }
76  
77      /** @deprecated */
78      @Deprecated
79      public SessionBuilderSupplier() {
80          this.repositorySystem = null;
81          this.scopeManager = new ScopeManagerImpl(Maven4ScopeManagerConfiguration.INSTANCE);
82      }
83  
84      protected InternalScopeManager getScopeManager() {
85          return this.scopeManager;
86      }
87  
88      protected DependencyTraverser getDependencyTraverser() {
89          return new FatArtifactTraverser();
90      }
91  
92      protected DependencyManager getDependencyManager() {
93          return this.getDependencyManager(true);
94      }
95  
96      public DependencyManager getDependencyManager(boolean transitive) {
97          return transitive
98                  ? new TransitiveDependencyManager(this.getScopeManager())
99                  : new ClassicDependencyManager(this.scopeManager);
100     }
101 
102     protected DependencySelector getDependencySelector() {
103         return new AndDependencySelector(new DependencySelector[] {
104             ScopeDependencySelector.legacy(
105                     null, Arrays.asList(DependencyScope.TEST.id(), DependencyScope.PROVIDED.id())),
106             OptionalDependencySelector.fromDirect(),
107             new ExclusionDependencySelector()
108         });
109     }
110 
111     protected DependencyGraphTransformer getDependencyGraphTransformer() {
112         return new ChainedDependencyGraphTransformer(
113                 new ConflictResolver(
114                         new ConfigurableVersionSelector(),
115                         new ManagedScopeSelector(this.getScopeManager()),
116                         new SimpleOptionalitySelector(),
117                         new ManagedScopeDeriver(this.getScopeManager())),
118                 new ManagedDependencyContextRefiner(this.getScopeManager()));
119     }
120 
121     protected ArtifactTypeRegistry getArtifactTypeRegistry() {
122         DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry();
123         new DefaultTypeProvider().types().forEach(stereotypes::add);
124         return stereotypes;
125     }
126 
127     protected ArtifactDescriptorPolicy getArtifactDescriptorPolicy() {
128         return new SimpleArtifactDescriptorPolicy(true, true);
129     }
130 
131     protected void configureSessionBuilder(RepositorySystemSession.SessionBuilder session) {
132         session.setDependencyTraverser(this.getDependencyTraverser());
133         session.setDependencyManager(this.getDependencyManager());
134         session.setDependencySelector(this.getDependencySelector());
135         session.setDependencyGraphTransformer(this.getDependencyGraphTransformer());
136         session.setArtifactTypeRegistry(this.getArtifactTypeRegistry());
137         session.setArtifactDescriptorPolicy(this.getArtifactDescriptorPolicy());
138         session.setScopeManager(this.getScopeManager());
139 
140         session.setSystemProperties(System.getProperties());
141         boolean caseSensitive = !Os.IS_WINDOWS;
142         System.getenv().forEach((key, value) -> {
143             key = "env." + (caseSensitive ? key : key.toUpperCase(Locale.ENGLISH));
144             session.setSystemProperty(key, value);
145         });
146     }
147 
148     public RepositorySystemSession.SessionBuilder get() {
149         Objects.requireNonNull(this.repositorySystem, "repositorySystem");
150         RepositorySystemSession.SessionBuilder builder = this.repositorySystem.createSessionBuilder();
151         this.configureSessionBuilder(builder);
152         return builder;
153     }
154 }