1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.cling.invoker;
20
21 import java.util.ArrayList;
22 import java.util.HashMap;
23 import java.util.List;
24 import java.util.Map;
25 import java.util.Optional;
26 import java.util.function.Consumer;
27 import java.util.function.Function;
28
29 import org.apache.maven.api.cli.Options;
30 import org.apache.maven.api.cli.ParserRequest;
31
32
33
34
35
36
37 public abstract class LayeredOptions<O extends Options> implements Options {
38 protected final List<O> options;
39
40 protected LayeredOptions(List<O> options) {
41 this.options = new ArrayList<>(options);
42 }
43
44 @Override
45 public Optional<Map<String, String>> userProperties() {
46 return collectMapIfPresentOrEmpty(Options::userProperties);
47 }
48
49 @Override
50 public String source() {
51 return String.format(
52 "layered(%s)", options.stream().map(Options::source).toList());
53 }
54
55 @Override
56 public Optional<Boolean> showVersionAndExit() {
57 return returnFirstPresentOrEmpty(Options::showVersionAndExit);
58 }
59
60 @Override
61 public Optional<Boolean> showVersion() {
62 return returnFirstPresentOrEmpty(Options::showVersion);
63 }
64
65 @Override
66 public Optional<Boolean> quiet() {
67 return returnFirstPresentOrEmpty(Options::quiet);
68 }
69
70 @Override
71 public Optional<Boolean> verbose() {
72 return returnFirstPresentOrEmpty(Options::verbose);
73 }
74
75 @Override
76 public Optional<Boolean> showErrors() {
77 return returnFirstPresentOrEmpty(Options::showErrors);
78 }
79
80 @Override
81 public Optional<String> failOnSeverity() {
82 return returnFirstPresentOrEmpty(Options::failOnSeverity);
83 }
84
85 @Override
86 public Optional<Boolean> nonInteractive() {
87 return returnFirstPresentOrEmpty(Options::nonInteractive);
88 }
89
90 @Override
91 public Optional<Boolean> forceInteractive() {
92 return returnFirstPresentOrEmpty(Options::forceInteractive);
93 }
94
95 @Override
96 public Optional<String> altUserSettings() {
97 return returnFirstPresentOrEmpty(Options::altUserSettings);
98 }
99
100 @Override
101 public Optional<String> altProjectSettings() {
102 return returnFirstPresentOrEmpty(Options::altProjectSettings);
103 }
104
105 @Override
106 public Optional<String> altInstallationSettings() {
107 return returnFirstPresentOrEmpty(Options::altInstallationSettings);
108 }
109
110 @Override
111 public Optional<String> altUserToolchains() {
112 return returnFirstPresentOrEmpty(Options::altUserToolchains);
113 }
114
115 @Override
116 public Optional<String> altInstallationToolchains() {
117 return returnFirstPresentOrEmpty(Options::altInstallationToolchains);
118 }
119
120 @Override
121 public Optional<String> logFile() {
122 return returnFirstPresentOrEmpty(Options::logFile);
123 }
124
125 @Override
126 public Optional<Boolean> rawStreams() {
127 return returnFirstPresentOrEmpty(Options::rawStreams);
128 }
129
130 @Override
131 public Optional<String> color() {
132 return returnFirstPresentOrEmpty(Options::color);
133 }
134
135 @Override
136 public Optional<Boolean> offline() {
137 return returnFirstPresentOrEmpty(Options::offline);
138 }
139
140 @Override
141 public Optional<Boolean> help() {
142 return returnFirstPresentOrEmpty(Options::help);
143 }
144
145 @Override
146 public void warnAboutDeprecatedOptions(ParserRequest request, Consumer<String> printWriter) {}
147
148 @Override
149 public void displayHelp(ParserRequest request, Consumer<String> printWriter) {
150 options.get(0).displayHelp(request, printWriter);
151 }
152
153 protected <T> Optional<T> returnFirstPresentOrEmpty(Function<O, Optional<T>> getter) {
154 for (O option : options) {
155 Optional<T> o = getter.apply(option);
156 if (o.isPresent()) {
157 return o;
158 }
159 }
160 return Optional.empty();
161 }
162
163 protected Optional<List<String>> collectListIfPresentOrEmpty(Function<O, Optional<List<String>>> getter) {
164 int had = 0;
165 ArrayList<String> items = new ArrayList<>();
166 for (O option : options) {
167 Optional<List<String>> o = getter.apply(option);
168 if (o.isPresent()) {
169 had++;
170 items.addAll(o.get());
171 }
172 }
173 return had == 0 ? Optional.empty() : Optional.of(List.copyOf(items));
174 }
175
176 protected Optional<Map<String, String>> collectMapIfPresentOrEmpty(
177 Function<O, Optional<Map<String, String>>> getter) {
178 int had = 0;
179 HashMap<String, String> items = new HashMap<>();
180 for (O option : options) {
181 Optional<Map<String, String>> up = getter.apply(option);
182 if (up.isPresent()) {
183 had++;
184 for (Map.Entry<String, String> entry : up.get().entrySet()) {
185 items.putIfAbsent(entry.getKey(), entry.getValue());
186 }
187 }
188 }
189 return had == 0 ? Optional.empty() : Optional.of(Map.copyOf(items));
190 }
191 }