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