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.cling.invoker.mvn;
20  
21  import java.util.Arrays;
22  import java.util.List;
23  import java.util.Optional;
24  
25  import org.apache.commons.cli.CommandLine;
26  import org.apache.commons.cli.Option;
27  import org.apache.commons.cli.ParseException;
28  import org.apache.maven.api.cli.mvn.MavenOptions;
29  import org.apache.maven.cling.invoker.CommonsCliOptions;
30  
31  public class CommonsCliMavenOptions extends CommonsCliOptions implements MavenOptions {
32      public static CommonsCliMavenOptions parse(String source, String[] args) throws ParseException {
33          CLIManager cliManager = new CLIManager();
34          return new CommonsCliMavenOptions(source, cliManager, cliManager.parse(args));
35      }
36  
37      protected CommonsCliMavenOptions(String source, CLIManager cliManager, CommandLine commandLine) {
38          super(source, cliManager, commandLine);
39      }
40  
41      @Override
42      public Optional<String> alternatePomFile() {
43          if (commandLine.hasOption(CLIManager.ALTERNATE_POM_FILE)) {
44              return Optional.of(commandLine.getOptionValue(CLIManager.ALTERNATE_POM_FILE));
45          }
46          return Optional.empty();
47      }
48  
49      @Override
50      public Optional<Boolean> nonRecursive() {
51          if (commandLine.hasOption(CLIManager.NON_RECURSIVE)) {
52              return Optional.of(Boolean.TRUE);
53          }
54          return Optional.empty();
55      }
56  
57      @Override
58      public Optional<Boolean> updateSnapshots() {
59          if (commandLine.hasOption(CLIManager.UPDATE_SNAPSHOTS)) {
60              return Optional.of(Boolean.TRUE);
61          }
62          return Optional.empty();
63      }
64  
65      @Override
66      public Optional<List<String>> activatedProfiles() {
67          if (commandLine.hasOption(CLIManager.ACTIVATE_PROFILES)) {
68              return Optional.of(Arrays.asList(commandLine.getOptionValues(CLIManager.ACTIVATE_PROFILES)));
69          }
70          return Optional.empty();
71      }
72  
73      @Override
74      public Optional<Boolean> suppressSnapshotUpdates() {
75          if (commandLine.hasOption(CLIManager.SUPPRESS_SNAPSHOT_UPDATES)) {
76              return Optional.of(Boolean.TRUE);
77          }
78          return Optional.empty();
79      }
80  
81      @Override
82      public Optional<Boolean> strictChecksums() {
83          if (commandLine.hasOption(CLIManager.CHECKSUM_FAILURE_POLICY)) {
84              return Optional.of(Boolean.TRUE);
85          }
86          return Optional.empty();
87      }
88  
89      @Override
90      public Optional<Boolean> relaxedChecksums() {
91          if (commandLine.hasOption(CLIManager.CHECKSUM_WARNING_POLICY)) {
92              return Optional.of(Boolean.TRUE);
93          }
94          return Optional.empty();
95      }
96  
97      @Override
98      public Optional<Boolean> failFast() {
99          if (commandLine.hasOption(CLIManager.FAIL_FAST)) {
100             return Optional.of(Boolean.TRUE);
101         }
102         return Optional.empty();
103     }
104 
105     @Override
106     public Optional<Boolean> failAtEnd() {
107         if (commandLine.hasOption(CLIManager.FAIL_AT_END)) {
108             return Optional.of(Boolean.TRUE);
109         }
110         return Optional.empty();
111     }
112 
113     @Override
114     public Optional<Boolean> failNever() {
115         if (commandLine.hasOption(CLIManager.FAIL_NEVER)) {
116             return Optional.of(Boolean.TRUE);
117         }
118         return Optional.empty();
119     }
120 
121     @Override
122     public Optional<Boolean> resume() {
123         if (commandLine.hasOption(CLIManager.RESUME)) {
124             return Optional.of(Boolean.TRUE);
125         }
126         return Optional.empty();
127     }
128 
129     @Override
130     public Optional<String> resumeFrom() {
131         if (commandLine.hasOption(CLIManager.RESUME_FROM)) {
132             return Optional.of(commandLine.getOptionValue(CLIManager.RESUME_FROM));
133         }
134         return Optional.empty();
135     }
136 
137     @Override
138     public Optional<List<String>> projects() {
139         if (commandLine.hasOption(CLIManager.PROJECT_LIST)) {
140             return Optional.of(Arrays.asList(commandLine.getOptionValues(CLIManager.PROJECT_LIST)));
141         }
142         return Optional.empty();
143     }
144 
145     @Override
146     public Optional<Boolean> alsoMake() {
147         if (commandLine.hasOption(CLIManager.ALSO_MAKE)) {
148             return Optional.of(Boolean.TRUE);
149         }
150         return Optional.empty();
151     }
152 
153     @Override
154     public Optional<Boolean> alsoMakeDependents() {
155         if (commandLine.hasOption(CLIManager.ALSO_MAKE_DEPENDENTS)) {
156             return Optional.of(Boolean.TRUE);
157         }
158         return Optional.empty();
159     }
160 
161     @Override
162     public Optional<String> threads() {
163         if (commandLine.hasOption(CLIManager.THREADS)) {
164             return Optional.of(commandLine.getOptionValue(CLIManager.THREADS));
165         }
166         return Optional.empty();
167     }
168 
169     @Override
170     public Optional<String> builder() {
171         if (commandLine.hasOption(CLIManager.BUILDER)) {
172             return Optional.of(commandLine.getOptionValue(CLIManager.BUILDER));
173         }
174         return Optional.empty();
175     }
176 
177     @Override
178     public Optional<Boolean> noTransferProgress() {
179         if (commandLine.hasOption(CLIManager.NO_TRANSFER_PROGRESS)) {
180             return Optional.of(Boolean.TRUE);
181         }
182         return Optional.empty();
183     }
184 
185     @Override
186     public Optional<Boolean> cacheArtifactNotFound() {
187         if (commandLine.hasOption(CLIManager.CACHE_ARTIFACT_NOT_FOUND)) {
188             return Optional.of(Boolean.parseBoolean(commandLine.getOptionValue(CLIManager.CACHE_ARTIFACT_NOT_FOUND)));
189         }
190         return Optional.empty();
191     }
192 
193     @Override
194     public Optional<Boolean> strictArtifactDescriptorPolicy() {
195         if (commandLine.hasOption(CLIManager.STRICT_ARTIFACT_DESCRIPTOR_POLICY)) {
196             return Optional.of(
197                     Boolean.parseBoolean(commandLine.getOptionValue(CLIManager.STRICT_ARTIFACT_DESCRIPTOR_POLICY)));
198         }
199         return Optional.empty();
200     }
201 
202     @Override
203     public Optional<Boolean> ignoreTransitiveRepositories() {
204         if (commandLine.hasOption(CLIManager.IGNORE_TRANSITIVE_REPOSITORIES)) {
205             return Optional.of(Boolean.TRUE);
206         }
207         return Optional.empty();
208     }
209 
210     @Override
211     public Optional<String> atFile() {
212         if (commandLine.hasOption(CLIManager.AT_FILE)) {
213             return Optional.of(commandLine.getOptionValue(CLIManager.AT_FILE));
214         }
215         return Optional.empty();
216     }
217 
218     @Override
219     public Optional<List<String>> goals() {
220         if (!commandLine.getArgList().isEmpty()) {
221             return Optional.of(commandLine.getArgList());
222         }
223         return Optional.empty();
224     }
225 
226     @Override
227     protected CommonsCliMavenOptions copy(
228             String source, CommonsCliOptions.CLIManager cliManager, CommandLine commandLine) {
229         return new CommonsCliMavenOptions(source, (CLIManager) cliManager, commandLine);
230     }
231 
232     protected static class CLIManager extends CommonsCliOptions.CLIManager {
233         public static final String ALTERNATE_POM_FILE = "f";
234         public static final String NON_RECURSIVE = "N";
235         public static final String UPDATE_SNAPSHOTS = "U";
236         public static final String ACTIVATE_PROFILES = "P";
237         public static final String SUPPRESS_SNAPSHOT_UPDATES = "nsu";
238         public static final String CHECKSUM_FAILURE_POLICY = "C";
239         public static final String CHECKSUM_WARNING_POLICY = "c";
240         public static final String FAIL_FAST = "ff";
241         public static final String FAIL_AT_END = "fae";
242         public static final String FAIL_NEVER = "fn";
243         public static final String RESUME = "r";
244         public static final String RESUME_FROM = "rf";
245         public static final String PROJECT_LIST = "pl";
246         public static final String ALSO_MAKE = "am";
247         public static final String ALSO_MAKE_DEPENDENTS = "amd";
248         public static final String THREADS = "T";
249         public static final String BUILDER = "b";
250         public static final String NO_TRANSFER_PROGRESS = "ntp";
251         public static final String CACHE_ARTIFACT_NOT_FOUND = "canf";
252         public static final String STRICT_ARTIFACT_DESCRIPTOR_POLICY = "sadp";
253         public static final String IGNORE_TRANSITIVE_REPOSITORIES = "itr";
254         public static final String AT_FILE = "af";
255 
256         @Override
257         protected void prepareOptions(org.apache.commons.cli.Options options) {
258             super.prepareOptions(options);
259             options.addOption(Option.builder(ALTERNATE_POM_FILE)
260                     .longOpt("file")
261                     .hasArg()
262                     .desc("Force the use of an alternate POM file (or directory with pom.xml)")
263                     .build());
264             options.addOption(Option.builder(NON_RECURSIVE)
265                     .longOpt("non-recursive")
266                     .desc(
267                             "Do not recurse into sub-projects. When used together with -pl, do not recurse into sub-projects of selected aggregators")
268                     .build());
269             options.addOption(Option.builder(UPDATE_SNAPSHOTS)
270                     .longOpt("update-snapshots")
271                     .desc("Forces a check for missing releases and updated snapshots on remote repositories")
272                     .build());
273             options.addOption(Option.builder(ACTIVATE_PROFILES)
274                     .longOpt("activate-profiles")
275                     .desc(
276                             "Comma-delimited list of profiles to activate. Prefixing a profile with ! excludes it, and ? marks it as optional")
277                     .hasArg()
278                     .build());
279             options.addOption(Option.builder(SUPPRESS_SNAPSHOT_UPDATES)
280                     .longOpt("no-snapshot-updates")
281                     .desc("Suppress SNAPSHOT updates")
282                     .build());
283             options.addOption(Option.builder(CHECKSUM_FAILURE_POLICY)
284                     .longOpt("strict-checksums")
285                     .desc("Fail the build if checksums don't match")
286                     .build());
287             options.addOption(Option.builder(CHECKSUM_WARNING_POLICY)
288                     .longOpt("lax-checksums")
289                     .desc("Warn if checksums don't match")
290                     .build());
291             options.addOption(Option.builder(FAIL_FAST)
292                     .longOpt("fail-fast")
293                     .desc("Stop at first failure in reactorized builds")
294                     .build());
295             options.addOption(Option.builder(FAIL_AT_END)
296                     .longOpt("fail-at-end")
297                     .desc("Only fail the build afterwards; allow all non-impacted builds to continue")
298                     .build());
299             options.addOption(Option.builder(FAIL_NEVER)
300                     .longOpt("fail-never")
301                     .desc("NEVER fail the build, regardless of project result")
302                     .build());
303             options.addOption(Option.builder(RESUME)
304                     .longOpt("resume")
305                     .desc(
306                             "Resume reactor from the last failed project, using the resume.properties file in the build directory")
307                     .build());
308             options.addOption(Option.builder(RESUME_FROM)
309                     .longOpt("resume-from")
310                     .hasArg()
311                     .desc("Resume reactor from specified project")
312                     .build());
313             options.addOption(Option.builder(PROJECT_LIST)
314                     .longOpt("projects")
315                     .desc(
316                             "Comma-delimited list of specified reactor projects to build instead of all projects. A project can be specified by [groupId]:artifactId or by its relative path. Prefixing a project with ! excludes it, and ? marks it as optional")
317                     .hasArg()
318                     .build());
319             options.addOption(Option.builder(ALSO_MAKE)
320                     .longOpt("also-make")
321                     .desc("If project list is specified, also build projects required by the list")
322                     .build());
323             options.addOption(Option.builder(ALSO_MAKE_DEPENDENTS)
324                     .longOpt("also-make-dependents")
325                     .desc("If project list is specified, also build projects that depend on projects on the list")
326                     .build());
327             options.addOption(Option.builder(THREADS)
328                     .longOpt("threads")
329                     .hasArg()
330                     .desc("Thread count, for instance 4 (int) or 2C/2.5C (int/float) where C is core multiplied")
331                     .build());
332             options.addOption(Option.builder(BUILDER)
333                     .longOpt("builder")
334                     .hasArg()
335                     .desc("The id of the build strategy to use")
336                     .build());
337             options.addOption(Option.builder(NO_TRANSFER_PROGRESS)
338                     .longOpt("no-transfer-progress")
339                     .desc("Do not display transfer progress when downloading or uploading")
340                     .build());
341             options.addOption(Option.builder(CACHE_ARTIFACT_NOT_FOUND)
342                     .longOpt("cache-artifact-not-found")
343                     .hasArg()
344                     .desc(
345                             "Defines caching behaviour for 'not found' artifacts. Supported values are 'true' (default), 'false'.")
346                     .build());
347             options.addOption(Option.builder(STRICT_ARTIFACT_DESCRIPTOR_POLICY)
348                     .longOpt("strict-artifact-descriptor-policy")
349                     .hasArg()
350                     .desc(
351                             "Defines 'strict' artifact descriptor policy. Supported values are 'true', 'false' (default).")
352                     .build());
353             options.addOption(Option.builder(IGNORE_TRANSITIVE_REPOSITORIES)
354                     .longOpt("ignore-transitive-repositories")
355                     .desc("If set, Maven will ignore remote repositories introduced by transitive dependencies.")
356                     .build());
357             options.addOption(Option.builder(AT_FILE)
358                     .longOpt("at-file")
359                     .hasArg()
360                     .desc(
361                             "If set, Maven will load command line options from the specified file and merge with CLI specified ones.")
362                     .build());
363         }
364     }
365 }