001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.eclipse.aether.supplier; 020 021import java.util.Arrays; 022import java.util.Locale; 023import java.util.Objects; 024import java.util.function.Supplier; 025 026import org.apache.maven.api.DependencyScope; 027import org.apache.maven.repository.internal.artifact.FatArtifactTraverser; 028import org.apache.maven.repository.internal.scopes.Maven4ScopeManagerConfiguration; 029import org.apache.maven.repository.internal.type.DefaultTypeProvider; 030import org.apache.maven.utils.Os; 031import org.eclipse.aether.RepositorySystem; 032import org.eclipse.aether.RepositorySystemSession; 033import org.eclipse.aether.RepositorySystemSession.CloseableSession; 034import org.eclipse.aether.RepositorySystemSession.SessionBuilder; 035import org.eclipse.aether.artifact.ArtifactTypeRegistry; 036import org.eclipse.aether.collection.DependencyGraphTransformer; 037import org.eclipse.aether.collection.DependencyManager; 038import org.eclipse.aether.collection.DependencySelector; 039import org.eclipse.aether.collection.DependencyTraverser; 040import org.eclipse.aether.impl.scope.InternalScopeManager; 041import org.eclipse.aether.internal.impl.scope.ManagedDependencyContextRefiner; 042import org.eclipse.aether.internal.impl.scope.ManagedScopeDeriver; 043import org.eclipse.aether.internal.impl.scope.ManagedScopeSelector; 044import org.eclipse.aether.internal.impl.scope.OptionalDependencySelector; 045import org.eclipse.aether.internal.impl.scope.ScopeDependencySelector; 046import org.eclipse.aether.internal.impl.scope.ScopeManagerImpl; 047import org.eclipse.aether.resolution.ArtifactDescriptorPolicy; 048import org.eclipse.aether.util.artifact.DefaultArtifactTypeRegistry; 049import org.eclipse.aether.util.graph.manager.ClassicDependencyManager; 050import org.eclipse.aether.util.graph.selector.AndDependencySelector; 051import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; 052import org.eclipse.aether.util.graph.transformer.ChainedDependencyGraphTransformer; 053import org.eclipse.aether.util.graph.transformer.ConfigurableVersionSelector; 054import org.eclipse.aether.util.graph.transformer.ConflictResolver; 055import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector; 056import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy; 057 058/** 059 * A simple {@link Supplier} of {@link SessionBuilder} instances, that on each call supplies newly 060 * constructed instance. To create session out of builder, use {@link SessionBuilder#build()}. For proper closing 061 * of sessions, use {@link CloseableSession#close()} method on built instance(s). 062 * <p> 063 * Extend this class and override methods to customize, if needed. 064 * 065 * @since 2.0.0 066 */ 067public class SessionBuilderSupplier { 068 protected final RepositorySystem repositorySystem; 069 protected final InternalScopeManager scopeManager; 070 071 public SessionBuilderSupplier(RepositorySystem repositorySystem) { 072 this.repositorySystem = (RepositorySystem) Objects.requireNonNull(repositorySystem); 073 this.scopeManager = new ScopeManagerImpl(Maven4ScopeManagerConfiguration.INSTANCE); 074 } 075 076 /** @deprecated */ 077 @Deprecated 078 public SessionBuilderSupplier() { 079 this.repositorySystem = null; 080 this.scopeManager = new ScopeManagerImpl(Maven4ScopeManagerConfiguration.INSTANCE); 081 } 082 083 protected InternalScopeManager getScopeManager() { 084 return this.scopeManager; 085 } 086 087 protected DependencyTraverser getDependencyTraverser() { 088 return new FatArtifactTraverser(); 089 } 090 091 protected DependencyManager getDependencyManager() { 092 return this.getDependencyManager(true); 093 } 094 095 public DependencyManager getDependencyManager(boolean transitive) { 096 return new ClassicDependencyManager(transitive, this.getScopeManager()); 097 } 098 099 protected DependencySelector getDependencySelector() { 100 return new AndDependencySelector(new DependencySelector[] { 101 ScopeDependencySelector.legacy( 102 null, Arrays.asList(DependencyScope.TEST.id(), DependencyScope.PROVIDED.id())), 103 OptionalDependencySelector.fromDirect(), 104 new ExclusionDependencySelector() 105 }); 106 } 107 108 protected DependencyGraphTransformer getDependencyGraphTransformer() { 109 return new ChainedDependencyGraphTransformer( 110 new ConflictResolver( 111 new ConfigurableVersionSelector(), 112 new ManagedScopeSelector(this.getScopeManager()), 113 new SimpleOptionalitySelector(), 114 new ManagedScopeDeriver(this.getScopeManager())), 115 new ManagedDependencyContextRefiner(this.getScopeManager())); 116 } 117 118 protected ArtifactTypeRegistry getArtifactTypeRegistry() { 119 DefaultArtifactTypeRegistry stereotypes = new DefaultArtifactTypeRegistry(); 120 new DefaultTypeProvider().types().forEach(stereotypes::add); 121 return stereotypes; 122 } 123 124 protected ArtifactDescriptorPolicy getArtifactDescriptorPolicy() { 125 return new SimpleArtifactDescriptorPolicy(true, true); 126 } 127 128 protected void configureSessionBuilder(RepositorySystemSession.SessionBuilder session) { 129 session.setDependencyTraverser(this.getDependencyTraverser()); 130 session.setDependencyManager(this.getDependencyManager()); 131 session.setDependencySelector(this.getDependencySelector()); 132 session.setDependencyGraphTransformer(this.getDependencyGraphTransformer()); 133 session.setArtifactTypeRegistry(this.getArtifactTypeRegistry()); 134 session.setArtifactDescriptorPolicy(this.getArtifactDescriptorPolicy()); 135 session.setScopeManager(this.getScopeManager()); 136 137 session.setSystemProperties(System.getProperties()); 138 boolean caseSensitive = !Os.IS_WINDOWS; 139 System.getenv().forEach((key, value) -> { 140 key = "env." + (caseSensitive ? key : key.toUpperCase(Locale.ENGLISH)); 141 session.setSystemProperty(key, value); 142 }); 143 } 144 145 public RepositorySystemSession.SessionBuilder get() { 146 Objects.requireNonNull(this.repositorySystem, "repositorySystem"); 147 RepositorySystemSession.SessionBuilder builder = this.repositorySystem.createSessionBuilder(); 148 this.configureSessionBuilder(builder); 149 return builder; 150 } 151}