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