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.cli.configuration;
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.io.FileNotFoundException;
27  import java.util.List;
28  
29  import org.apache.commons.cli.CommandLine;
30  import org.apache.maven.artifact.InvalidRepositoryException;
31  import org.apache.maven.bridge.MavenRepositorySystem;
32  import org.apache.maven.building.Source;
33  import org.apache.maven.cli.CLIManager;
34  import org.apache.maven.cli.CliRequest;
35  import org.apache.maven.execution.MavenExecutionRequest;
36  import org.apache.maven.execution.MavenExecutionRequestPopulationException;
37  import org.apache.maven.settings.Mirror;
38  import org.apache.maven.settings.Proxy;
39  import org.apache.maven.settings.Repository;
40  import org.apache.maven.settings.Server;
41  import org.apache.maven.settings.Settings;
42  import org.apache.maven.settings.SettingsUtils;
43  import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
44  import org.apache.maven.settings.building.SettingsBuilder;
45  import org.apache.maven.settings.building.SettingsBuildingRequest;
46  import org.apache.maven.settings.building.SettingsBuildingResult;
47  import org.apache.maven.settings.building.SettingsProblem;
48  import org.apache.maven.settings.crypto.SettingsDecrypter;
49  import org.slf4j.Logger;
50  import org.slf4j.LoggerFactory;
51  
52  import static org.apache.maven.cli.ResolveFile.resolveFile;
53  
54  /**
55   * SettingsXmlConfigurationProcessor
56   */
57  @Named(SettingsXmlConfigurationProcessor.HINT)
58  @Singleton
59  public class SettingsXmlConfigurationProcessor implements ConfigurationProcessor {
60      public static final String HINT = "settings";
61  
62      public static final String USER_HOME = System.getProperty("user.home");
63  
64      public static final File USER_MAVEN_CONFIGURATION_HOME = new File(USER_HOME, ".m2");
65  
66      public static final File DEFAULT_USER_SETTINGS_FILE = new File(USER_MAVEN_CONFIGURATION_HOME, "settings.xml");
67  
68      public static final File DEFAULT_GLOBAL_SETTINGS_FILE = new File(System.getProperty("maven.conf"), "settings.xml");
69  
70      private final Logger logger = LoggerFactory.getLogger(SettingsXmlConfigurationProcessor.class);
71  
72      @Inject
73      private SettingsBuilder settingsBuilder;
74  
75      @Inject
76      private SettingsDecrypter settingsDecrypter;
77  
78      @Inject
79      private MavenRepositorySystem mavenRepositorySystem;
80  
81      @Override
82      public void process(CliRequest cliRequest) throws Exception {
83          CommandLine commandLine = cliRequest.getCommandLine();
84          String workingDirectory = cliRequest.getWorkingDirectory();
85          MavenExecutionRequest request = cliRequest.getRequest();
86  
87          File userSettingsFile;
88  
89          if (commandLine.hasOption(CLIManager.ALTERNATE_USER_SETTINGS)) {
90              userSettingsFile = new File(commandLine.getOptionValue(CLIManager.ALTERNATE_USER_SETTINGS));
91              userSettingsFile = resolveFile(userSettingsFile, workingDirectory);
92  
93              if (!userSettingsFile.isFile()) {
94                  throw new FileNotFoundException("The specified user settings file does not exist: " + userSettingsFile);
95              }
96          } else {
97              userSettingsFile = DEFAULT_USER_SETTINGS_FILE;
98          }
99  
100         File globalSettingsFile;
101 
102         if (commandLine.hasOption(CLIManager.ALTERNATE_GLOBAL_SETTINGS)) {
103             globalSettingsFile = new File(commandLine.getOptionValue(CLIManager.ALTERNATE_GLOBAL_SETTINGS));
104             globalSettingsFile = resolveFile(globalSettingsFile, workingDirectory);
105 
106             if (!globalSettingsFile.isFile()) {
107                 throw new FileNotFoundException(
108                         "The specified global settings file does not exist: " + globalSettingsFile);
109             }
110         } else {
111             globalSettingsFile = DEFAULT_GLOBAL_SETTINGS_FILE;
112         }
113 
114         request.setGlobalSettingsFile(globalSettingsFile);
115         request.setUserSettingsFile(userSettingsFile);
116 
117         SettingsBuildingRequest settingsRequest = new DefaultSettingsBuildingRequest();
118         settingsRequest.setGlobalSettingsFile(globalSettingsFile);
119         settingsRequest.setUserSettingsFile(userSettingsFile);
120         settingsRequest.setSystemProperties(cliRequest.getSystemProperties());
121         settingsRequest.setUserProperties(cliRequest.getUserProperties());
122 
123         if (request.getEventSpyDispatcher() != null) {
124             request.getEventSpyDispatcher().onEvent(settingsRequest);
125         }
126 
127         logger.debug(
128                 "Reading global settings from {}",
129                 getLocation(settingsRequest.getGlobalSettingsSource(), settingsRequest.getGlobalSettingsFile()));
130         logger.debug(
131                 "Reading user settings from {}",
132                 getLocation(settingsRequest.getUserSettingsSource(), settingsRequest.getUserSettingsFile()));
133 
134         SettingsBuildingResult settingsResult = settingsBuilder.build(settingsRequest);
135 
136         if (request.getEventSpyDispatcher() != null) {
137             request.getEventSpyDispatcher().onEvent(settingsResult);
138         }
139 
140         populateFromSettings(request, settingsResult.getEffectiveSettings());
141 
142         if (!settingsResult.getProblems().isEmpty() && logger.isWarnEnabled()) {
143             logger.warn("");
144             logger.warn("Some problems were encountered while building the effective settings");
145 
146             for (SettingsProblem problem : settingsResult.getProblems()) {
147                 logger.warn("{} @ {}", problem.getMessage(), problem.getLocation());
148             }
149             logger.warn("");
150         }
151     }
152 
153     private MavenExecutionRequest populateFromSettings(MavenExecutionRequest request, Settings settings)
154             throws MavenExecutionRequestPopulationException {
155         if (settings == null) {
156             return request;
157         }
158 
159         request.setOffline(settings.isOffline());
160 
161         request.setInteractiveMode(settings.isInteractiveMode());
162 
163         request.setPluginGroups(settings.getPluginGroups());
164 
165         request.setLocalRepositoryPath(settings.getLocalRepository());
166 
167         for (Server server : settings.getServers()) {
168             server = server.clone();
169 
170             request.addServer(server);
171         }
172 
173         //  <proxies>
174         //    <proxy>
175         //      <active>true</active>
176         //      <protocol>http</protocol>
177         //      <host>proxy.somewhere.com</host>
178         //      <port>8080</port>
179         //      <username>proxyuser</username>
180         //      <password>somepassword</password>
181         //      <nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts>
182         //    </proxy>
183         //  </proxies>
184 
185         for (Proxy proxy : settings.getProxies()) {
186             if (!proxy.isActive()) {
187                 continue;
188             }
189 
190             proxy = proxy.clone();
191 
192             request.addProxy(proxy);
193         }
194 
195         // <mirrors>
196         //   <mirror>
197         //     <id>nexus</id>
198         //     <mirrorOf>*</mirrorOf>
199         //     <url>http://repository.sonatype.org/content/groups/public</url>
200         //   </mirror>
201         // </mirrors>
202 
203         for (Mirror mirror : settings.getMirrors()) {
204             mirror = mirror.clone();
205 
206             request.addMirror(mirror);
207         }
208 
209         request.setActiveProfiles(settings.getActiveProfiles());
210 
211         for (org.apache.maven.settings.Profile rawProfile : settings.getProfiles()) {
212             request.addProfile(SettingsUtils.convertFromSettingsProfile(rawProfile));
213 
214             if (settings.getActiveProfiles().contains(rawProfile.getId())) {
215                 List<Repository> remoteRepositories = rawProfile.getRepositories();
216                 for (Repository remoteRepository : remoteRepositories) {
217                     try {
218                         request.addRemoteRepository(
219                                 mavenRepositorySystem.buildArtifactRepositoryFromRepo(remoteRepository));
220                     } catch (InvalidRepositoryException e) {
221                         // do nothing for now
222                     }
223                 }
224 
225                 List<Repository> pluginRepositories = rawProfile.getPluginRepositories();
226                 for (Repository pluginRepository : pluginRepositories) {
227                     try {
228                         request.addPluginArtifactRepository(
229                                 mavenRepositorySystem.buildArtifactRepositoryFromRepo(pluginRepository));
230                     } catch (InvalidRepositoryException e) {
231                         // do nothing for now
232                     }
233                 }
234             }
235         }
236         return request;
237     }
238 
239     private Object getLocation(Source source, File defaultLocation) {
240         if (source != null) {
241             return source.getLocation();
242         }
243         return defaultLocation;
244     }
245 }