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