View Javadoc
1   package org.apache.maven.internal.aether;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.RepositoryUtils;
23  import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
24  import org.apache.maven.bridge.MavenRepositorySystem;
25  import org.apache.maven.eventspy.internal.EventSpyDispatcher;
26  import org.apache.maven.execution.MavenExecutionRequest;
27  import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
28  import org.apache.maven.settings.Mirror;
29  import org.apache.maven.settings.Proxy;
30  import org.apache.maven.settings.Server;
31  import org.apache.maven.settings.building.SettingsProblem;
32  import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
33  import org.apache.maven.settings.crypto.SettingsDecrypter;
34  import org.apache.maven.settings.crypto.SettingsDecryptionResult;
35  import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
36  import org.codehaus.plexus.logging.Logger;
37  import org.codehaus.plexus.util.xml.Xpp3Dom;
38  import org.eclipse.aether.ConfigurationProperties;
39  import org.eclipse.aether.DefaultRepositorySystemSession;
40  import org.eclipse.aether.RepositorySystem;
41  import org.eclipse.aether.repository.LocalRepository;
42  import org.eclipse.aether.repository.NoLocalRepositoryManagerException;
43  import org.eclipse.aether.repository.RepositoryPolicy;
44  import org.eclipse.aether.repository.WorkspaceReader;
45  import org.eclipse.aether.resolution.ResolutionErrorPolicy;
46  import org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory;
47  import org.eclipse.aether.util.repository.AuthenticationBuilder;
48  import org.eclipse.aether.util.repository.DefaultAuthenticationSelector;
49  import org.eclipse.aether.util.repository.DefaultMirrorSelector;
50  import org.eclipse.aether.util.repository.DefaultProxySelector;
51  import org.eclipse.aether.util.repository.SimpleResolutionErrorPolicy;
52  import org.eclipse.sisu.Nullable;
53  
54  import javax.inject.Inject;
55  import javax.inject.Named;
56  import java.io.IOException;
57  import java.io.InputStream;
58  import java.util.LinkedHashMap;
59  import java.util.Map;
60  import java.util.Properties;
61  
62  /**
63   * @since 3.3.0
64   */
65  @Named
66  public class DefaultRepositorySystemSessionFactory
67  {
68      @Inject
69      private Logger logger;
70  
71      @Inject
72      private ArtifactHandlerManager artifactHandlerManager;
73  
74      @Inject
75      private RepositorySystem repoSystem;
76  
77      @Inject
78      @Nullable
79      @Named( "simple" )
80      private LocalRepositoryManagerFactory simpleLocalRepoMgrFactory;
81  
82      @Inject
83      @Nullable
84      @Named( "ide" )
85      private WorkspaceReader workspaceRepository;
86  
87      @Inject
88      private SettingsDecrypter settingsDecrypter;
89  
90      @Inject
91      private EventSpyDispatcher eventSpyDispatcher;
92  
93      @Inject
94      MavenRepositorySystem mavenRepositorySystem;
95  
96      public DefaultRepositorySystemSession newRepositorySession( MavenExecutionRequest request )
97      {
98          DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
99  
100         session.setCache( request.getRepositoryCache() );
101 
102         Map<Object, Object> configProps = new LinkedHashMap<>();
103         configProps.put( ConfigurationProperties.USER_AGENT, getUserAgent() );
104         configProps.put( ConfigurationProperties.INTERACTIVE, request.isInteractiveMode() );
105         configProps.put( "maven.startTime", request.getStartTime() );
106         configProps.putAll( request.getSystemProperties() );
107         configProps.putAll( request.getUserProperties() );
108 
109         session.setOffline( request.isOffline() );
110         session.setChecksumPolicy( request.getGlobalChecksumPolicy() );
111         if ( request.isNoSnapshotUpdates() )
112         {
113             session.setUpdatePolicy( RepositoryPolicy.UPDATE_POLICY_NEVER );
114         }
115         else if ( request.isUpdateSnapshots() )
116         {
117             session.setUpdatePolicy( RepositoryPolicy.UPDATE_POLICY_ALWAYS );
118         }
119         else
120         {
121             session.setUpdatePolicy( null );
122         }
123 
124         int errorPolicy = 0;
125         errorPolicy |= request.isCacheNotFound() ? ResolutionErrorPolicy.CACHE_NOT_FOUND
126             : ResolutionErrorPolicy.CACHE_DISABLED;
127         errorPolicy |= request.isCacheTransferError() ? ResolutionErrorPolicy.CACHE_TRANSFER_ERROR
128             : ResolutionErrorPolicy.CACHE_DISABLED;
129         session.setResolutionErrorPolicy(
130             new SimpleResolutionErrorPolicy( errorPolicy, errorPolicy | ResolutionErrorPolicy.CACHE_NOT_FOUND ) );
131 
132         session.setArtifactTypeRegistry( RepositoryUtils.newArtifactTypeRegistry( artifactHandlerManager ) );
133 
134         LocalRepository localRepo = new LocalRepository( request.getLocalRepository().getBasedir() );
135 
136         if ( request.isUseLegacyLocalRepository() )
137         {
138             try
139             {
140                 session.setLocalRepositoryManager( simpleLocalRepoMgrFactory.newInstance( session, localRepo ) );
141                 logger.info( "Disabling enhanced local repository: using legacy is strongly discouraged to ensure"
142                                  + " build reproducibility." );
143 
144             }
145             catch ( NoLocalRepositoryManagerException e )
146             {
147                 logger.error( "Failed to configure legacy local repository: falling back to default" );
148                 session.setLocalRepositoryManager( repoSystem.newLocalRepositoryManager( session, localRepo ) );
149             }
150         }
151         else
152         {
153             session.setLocalRepositoryManager( repoSystem.newLocalRepositoryManager( session, localRepo ) );
154         }
155 
156         if ( request.getWorkspaceReader() != null )
157         {
158             session.setWorkspaceReader( request.getWorkspaceReader() );
159         }
160         else
161         {
162             session.setWorkspaceReader( workspaceRepository );
163         }
164 
165         DefaultSettingsDecryptionRequest decrypt = new DefaultSettingsDecryptionRequest();
166         decrypt.setProxies( request.getProxies() );
167         decrypt.setServers( request.getServers() );
168         SettingsDecryptionResult decrypted = settingsDecrypter.decrypt( decrypt );
169 
170         if ( logger.isDebugEnabled() )
171         {
172             for ( SettingsProblem problem : decrypted.getProblems() )
173             {
174                 logger.debug( problem.getMessage(), problem.getException() );
175             }
176         }
177 
178         DefaultMirrorSelector mirrorSelector = new DefaultMirrorSelector();
179         for ( Mirror mirror : request.getMirrors() )
180         {
181             mirrorSelector.add( mirror.getId(), mirror.getUrl(), mirror.getLayout(), false, mirror.isBlocked(),
182                                 mirror.getMirrorOf(), mirror.getMirrorOfLayouts() );
183         }
184         session.setMirrorSelector( mirrorSelector );
185 
186         DefaultProxySelector proxySelector = new DefaultProxySelector();
187         for ( Proxy proxy : decrypted.getProxies() )
188         {
189             AuthenticationBuilder authBuilder = new AuthenticationBuilder();
190             authBuilder.addUsername( proxy.getUsername() ).addPassword( proxy.getPassword() );
191             proxySelector.add(
192                 new org.eclipse.aether.repository.Proxy( proxy.getProtocol(), proxy.getHost(), proxy.getPort(),
193                                                          authBuilder.build() ), proxy.getNonProxyHosts() );
194         }
195         session.setProxySelector( proxySelector );
196 
197         DefaultAuthenticationSelector authSelector = new DefaultAuthenticationSelector();
198         for ( Server server : decrypted.getServers() )
199         {
200             AuthenticationBuilder authBuilder = new AuthenticationBuilder();
201             authBuilder.addUsername( server.getUsername() ).addPassword( server.getPassword() );
202             authBuilder.addPrivateKey( server.getPrivateKey(), server.getPassphrase() );
203             authSelector.add( server.getId(), authBuilder.build() );
204 
205             if ( server.getConfiguration() != null )
206             {
207                 Xpp3Dom dom = (Xpp3Dom) server.getConfiguration();
208                 for ( int i = dom.getChildCount() - 1; i >= 0; i-- )
209                 {
210                     Xpp3Dom child = dom.getChild( i );
211                     if ( "wagonProvider".equals( child.getName() ) )
212                     {
213                         dom.removeChild( i );
214                     }
215                 }
216 
217                 XmlPlexusConfiguration config = new XmlPlexusConfiguration( dom );
218                 configProps.put( "aether.connector.wagon.config." + server.getId(), config );
219             }
220 
221             configProps.put( "aether.connector.perms.fileMode." + server.getId(), server.getFilePermissions() );
222             configProps.put( "aether.connector.perms.dirMode." + server.getId(), server.getDirectoryPermissions() );
223         }
224         session.setAuthenticationSelector( authSelector );
225 
226         session.setTransferListener( request.getTransferListener() );
227 
228         session.setRepositoryListener( eventSpyDispatcher.chainListener( new LoggingRepositoryListener( logger ) ) );
229 
230         session.setUserProperties( request.getUserProperties() );
231         session.setSystemProperties( request.getSystemProperties() );
232         session.setConfigProperties( configProps );
233 
234         mavenRepositorySystem.injectMirror( request.getRemoteRepositories(), request.getMirrors() );
235         mavenRepositorySystem.injectProxy( session, request.getRemoteRepositories() );
236         mavenRepositorySystem.injectAuthentication( session, request.getRemoteRepositories() );
237 
238         mavenRepositorySystem.injectMirror( request.getPluginArtifactRepositories(), request.getMirrors() );
239         mavenRepositorySystem.injectProxy( session, request.getPluginArtifactRepositories() );
240         mavenRepositorySystem.injectAuthentication( session, request.getPluginArtifactRepositories() );
241 
242         return session;
243     }
244 
245     private String getUserAgent()
246     {
247         return "Apache-Maven/" + getMavenVersion() + " (Java " + System.getProperty( "java.version" ) + "; "
248             + System.getProperty( "os.name" ) + " " + System.getProperty( "os.version" ) + ")";
249     }
250 
251     private String getMavenVersion()
252     {
253         Properties props = new Properties();
254 
255         try ( InputStream is = getClass().getResourceAsStream(
256             "/META-INF/maven/org.apache.maven/maven-core/pom.properties" ) )
257         {
258             if ( is != null )
259             {
260                 props.load( is );
261             }
262         }
263         catch ( IOException e )
264         {
265             logger.debug( "Failed to read Maven version", e );
266         }
267 
268         return props.getProperty( "version", "unknown-version" );
269     }
270 
271 }