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