View Javadoc
1   package org.apache.maven.execution;
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 java.io.File;
23  import java.util.ArrayList;
24  import java.util.HashMap;
25  import java.util.List;
26  import java.util.Map;
27  import java.util.Set;
28  
29  import javax.inject.Inject;
30  import javax.inject.Named;
31  import javax.inject.Singleton;
32  
33  import org.apache.maven.artifact.InvalidRepositoryException;
34  import org.apache.maven.artifact.repository.ArtifactRepository;
35  import org.apache.maven.bridge.MavenRepositorySystem;
36  import org.apache.maven.repository.RepositorySystem;
37  //
38  // All of this needs to go away and be couched in terms of the execution request
39  //
40  import org.apache.maven.settings.Mirror;
41  import org.apache.maven.settings.Proxy;
42  import org.apache.maven.settings.Repository;
43  import org.apache.maven.settings.Server;
44  import org.apache.maven.settings.Settings;
45  import org.apache.maven.settings.SettingsUtils;
46  //
47  // Settings in core
48  //
49  import org.apache.maven.toolchain.model.PersistedToolchains;
50  import org.apache.maven.toolchain.model.ToolchainModel;
51  import org.codehaus.plexus.util.StringUtils;
52  
53  /**
54   * Assists in populating an execution request for invocation of Maven.
55   */
56  @Named
57  @Singleton
58  public class DefaultMavenExecutionRequestPopulator
59      implements MavenExecutionRequestPopulator
60  {
61  
62      private final MavenRepositorySystem repositorySystem;
63  
64      @Inject
65      public DefaultMavenExecutionRequestPopulator( MavenRepositorySystem repositorySystem )
66      {
67          this.repositorySystem = repositorySystem;
68      }
69  
70  
71      @Override
72      public MavenExecutionRequest populateFromToolchains( MavenExecutionRequest request, PersistedToolchains toolchains )
73          throws MavenExecutionRequestPopulationException
74      {
75          if ( toolchains != null )
76          {
77              Map<String, List<ToolchainModel>> groupedToolchains = new HashMap<>( 2 );
78  
79              for ( ToolchainModel model : toolchains.getToolchains() )
80              {
81                  if ( !groupedToolchains.containsKey( model.getType() ) )
82                  {
83                      groupedToolchains.put( model.getType(), new ArrayList<>() );
84                  }
85  
86                  groupedToolchains.get( model.getType() ).add( model );
87              }
88  
89              request.setToolchains( groupedToolchains );
90          }
91          return request;
92      }
93  
94      @Override
95      public MavenExecutionRequest populateDefaults( MavenExecutionRequest request )
96          throws MavenExecutionRequestPopulationException
97      {
98          baseDirectory( request );
99  
100         localRepository( request );
101 
102         populateDefaultPluginGroups( request );
103 
104         injectDefaultRepositories( request );
105 
106         injectDefaultPluginRepositories( request );
107 
108         return request;
109     }
110 
111     //
112     //
113     //
114 
115     private void populateDefaultPluginGroups( MavenExecutionRequest request )
116     {
117         request.addPluginGroup( "org.apache.maven.plugins" );
118         request.addPluginGroup( "org.codehaus.mojo" );
119     }
120 
121     private void injectDefaultRepositories( MavenExecutionRequest request )
122         throws MavenExecutionRequestPopulationException
123     {
124         Set<String> definedRepositories = repositorySystem.getRepoIds( request.getRemoteRepositories() );
125 
126         if ( !definedRepositories.contains( RepositorySystem.DEFAULT_REMOTE_REPO_ID ) )
127         {
128             try
129             {
130                 request.addRemoteRepository( repositorySystem.createDefaultRemoteRepository( request ) );
131             }
132             catch ( Exception e )
133             {
134                 throw new MavenExecutionRequestPopulationException( "Cannot create default remote repository.", e );
135             }
136         }
137     }
138 
139     private void injectDefaultPluginRepositories( MavenExecutionRequest request )
140         throws MavenExecutionRequestPopulationException
141     {
142         Set<String> definedRepositories = repositorySystem.getRepoIds( request.getPluginArtifactRepositories() );
143 
144         if ( !definedRepositories.contains( RepositorySystem.DEFAULT_REMOTE_REPO_ID ) )
145         {
146             try
147             {
148                 request.addPluginArtifactRepository( repositorySystem.createDefaultRemoteRepository( request ) );
149             }
150             catch ( Exception e )
151             {
152                 throw new MavenExecutionRequestPopulationException( "Cannot create default remote repository.", e );
153             }
154         }
155     }
156 
157     private void localRepository( MavenExecutionRequest request )
158         throws MavenExecutionRequestPopulationException
159     {
160         // ------------------------------------------------------------------------
161         // Local Repository
162         //
163         // 1. Use a value has been passed in via the configuration
164         // 2. Use value in the resultant settings
165         // 3. Use default value
166         // ------------------------------------------------------------------------
167 
168         if ( request.getLocalRepository() == null )
169         {
170             request.setLocalRepository( createLocalRepository( request ) );
171         }
172 
173         if ( request.getLocalRepositoryPath() == null )
174         {
175             request.setLocalRepositoryPath( new File( request.getLocalRepository().getBasedir() ).getAbsoluteFile() );
176         }
177     }
178 
179     // ------------------------------------------------------------------------
180     // Artifact Transfer Mechanism
181     // ------------------------------------------------------------------------
182 
183     private ArtifactRepository createLocalRepository( MavenExecutionRequest request )
184         throws MavenExecutionRequestPopulationException
185     {
186         String localRepositoryPath = null;
187 
188         if ( request.getLocalRepositoryPath() != null )
189         {
190             localRepositoryPath = request.getLocalRepositoryPath().getAbsolutePath();
191         }
192 
193         if ( StringUtils.isEmpty( localRepositoryPath ) )
194         {
195             localRepositoryPath = RepositorySystem.defaultUserLocalRepository.getAbsolutePath();
196         }
197 
198         try
199         {
200             return repositorySystem.createLocalRepository( request, new File( localRepositoryPath ) );
201         }
202         catch ( Exception e )
203         {
204             throw new MavenExecutionRequestPopulationException( "Cannot create local repository.", e );
205         }
206     }
207 
208     private void baseDirectory( MavenExecutionRequest request )
209     {
210         if ( request.getBaseDirectory() == null && request.getPom() != null )
211         {
212             request.setBaseDirectory( request.getPom().getAbsoluteFile().getParentFile() );
213         }
214     }
215 
216     /*if_not[MAVEN4]*/
217 
218     @Override
219     @Deprecated
220     public MavenExecutionRequest populateFromSettings( MavenExecutionRequest request, Settings settings )
221         throws MavenExecutionRequestPopulationException
222     {
223         if ( settings == null )
224         {
225             return request;
226         }
227 
228         request.setOffline( settings.isOffline() );
229 
230         request.setInteractiveMode( settings.isInteractiveMode() );
231 
232         request.setPluginGroups( settings.getPluginGroups() );
233 
234         request.setLocalRepositoryPath( settings.getLocalRepository() );
235 
236         for ( Server server : settings.getServers() )
237         {
238             server = server.clone();
239 
240             request.addServer( server );
241         }
242 
243         //  <proxies>
244         //    <proxy>
245         //      <active>true</active>
246         //      <protocol>http</protocol>
247         //      <host>proxy.somewhere.com</host>
248         //      <port>8080</port>
249         //      <username>proxyuser</username>
250         //      <password>somepassword</password>
251         //      <nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts>
252         //    </proxy>
253         //  </proxies>
254 
255         for ( Proxy proxy : settings.getProxies() )
256         {
257             if ( !proxy.isActive() )
258             {
259                 continue;
260             }
261 
262             proxy = proxy.clone();
263 
264             request.addProxy( proxy );
265         }
266 
267         // <mirrors>
268         //   <mirror>
269         //     <id>nexus</id>
270         //     <mirrorOf>*</mirrorOf>
271         //     <url>http://repository.sonatype.org/content/groups/public</url>
272         //   </mirror>
273         // </mirrors>
274 
275         for ( Mirror mirror : settings.getMirrors() )
276         {
277             mirror = mirror.clone();
278 
279             request.addMirror( mirror );
280         }
281 
282         request.setActiveProfiles( settings.getActiveProfiles() );
283 
284         for ( org.apache.maven.settings.Profile rawProfile : settings.getProfiles() )
285         {
286             request.addProfile( SettingsUtils.convertFromSettingsProfile( rawProfile.getDelegate() ) );
287 
288             if ( settings.getActiveProfiles().contains( rawProfile.getId() ) )
289             {
290                 List<Repository> remoteRepositories = rawProfile.getRepositories();
291                 for ( Repository remoteRepository : remoteRepositories )
292                 {
293                     try
294                     {
295                         request.addRemoteRepository(
296                                 MavenRepositorySystem.buildArtifactRepository( remoteRepository ) );
297                     }
298                     catch ( InvalidRepositoryException e )
299                     {
300                         // do nothing for now
301                     }
302                 }
303 
304                 List<Repository> pluginRepositories = rawProfile.getPluginRepositories();
305                 for ( Repository pluginRepo : pluginRepositories )
306                 {
307                     try
308                     {
309                         request.addPluginArtifactRepository(
310                                 MavenRepositorySystem.buildArtifactRepository( pluginRepo ) );
311                     }
312                     catch ( InvalidRepositoryException e )
313                     {
314                         // do nothing for now
315                     }
316                 }
317             }
318         }
319 
320         return request;
321     }
322 
323     /*end[MAVEN4]*/
324 
325 }