1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.rat.ui;
20
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.HashMap;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Objects;
27 import java.util.Optional;
28 import java.util.function.BiConsumer;
29
30 import org.apache.commons.cli.Option;
31 import org.apache.commons.lang3.StringUtils;
32 import org.apache.rat.commandline.Arg;
33 import org.apache.rat.utils.CasedString;
34 import org.apache.rat.utils.DefaultLog;
35 import org.apache.rat.utils.Log;
36
37
38
39
40
41 public final class ArgumentTracker {
42
43
44
45
46 private final Map<String, String> deprecatedArgs = new HashMap<>();
47
48
49
50
51 private final Map<String, List<String>> args = new HashMap<>();
52
53
54
55
56
57 public ArgumentTracker(final UIOptionCollection<?> optionCollection) {
58 for (UIOption<?> abstractOption : optionCollection.getMappedOptions().toList()) {
59 if (abstractOption.isDeprecated()) {
60 deprecatedArgs.put(abstractOption.getName(),
61 String.format("Use of deprecated option '%s'. %s", abstractOption.getName(), abstractOption.getDeprecated()));
62 }
63 }
64 }
65
66
67
68
69
70
71
72 public static String extractKey(final Option option) {
73 return StringUtils.defaultIfBlank(option.getLongOpt(), option.getOpt());
74 }
75
76
77
78
79
80
81 public static CasedString extractName(final Option option) {
82 return new CasedString(CasedString.StringCase.KEBAB, ArgumentTracker.extractKey(option));
83 }
84
85
86
87
88
89 public List<String> args() {
90 final List<String> result = new ArrayList<>();
91 for (Map.Entry<String, List<String>> entry : args.entrySet()) {
92 result.add("--" + entry.getKey());
93 result.addAll(entry.getValue().stream().filter(Objects::nonNull).toList());
94 }
95 return result;
96 }
97
98
99
100
101 public void apply(final BiConsumer<String, List<String>> consumer) {
102 args.forEach((key, value) -> consumer.accept(key, new ArrayList<>(value)));
103 }
104
105
106
107
108
109
110
111 private boolean validateSet(final String key) {
112 final Arg arg = Arg.findArg(key);
113 if (arg != null) {
114 final Option opt = arg.find(key);
115 final Option main = arg.option();
116 if (opt.isDeprecated()) {
117 args.remove(extractKey(main));
118
119 return true;
120 }
121
122 for (Option o : arg.group().getOptions()) {
123 if (!o.equals(main) && args.containsKey(extractKey(o))) {
124 return false;
125 }
126 }
127 return true;
128 }
129 return false;
130 }
131
132
133
134
135
136
137
138 public void setArg(final UIOption<?> key, final String value) {
139 setArg(key.keyValue(), value);
140 }
141
142
143
144
145
146
147
148 public void setArg(final String trackerKey, final String value) {
149 if (value == null || StringUtils.isNotBlank(value)) {
150 if (validateSet(trackerKey)) {
151 Option ratOption = Arg.findArg(trackerKey).find(trackerKey);
152 if (ratOption.hasArg()) {
153 List<String> values = new ArrayList<>();
154 if (DefaultLog.getInstance().isEnabled(Log.Level.DEBUG)) {
155 DefaultLog.getInstance().debug(String.format("Setting %s to '%s'", trackerKey, value));
156 }
157 values.add(value);
158 args.put(trackerKey, values);
159 } else {
160 DefaultLog.getInstance().warn(String.format("Key '%s' does not accept arguments.", trackerKey));
161 }
162 } else {
163 DefaultLog.getInstance().warn(String.format("Key '%s' is unknown", trackerKey));
164 }
165 }
166 }
167
168
169
170
171
172
173 public Optional<List<String>> getArg(final String key) {
174 return Optional.ofNullable(args.get(key));
175 }
176
177
178
179
180
181
182
183
184 public void addArg(final UIOption<?> option, final String... value) {
185 addArg(option.keyValue(), value);
186 }
187
188
189
190
191
192
193
194
195 public void addArg(final String trackerKey, final String... value) {
196 List<String> newValues = Arrays.stream(value).filter(StringUtils::isNotBlank).toList();
197 if (newValues.isEmpty()) {
198 return;
199 }
200 if (!validateSet(trackerKey)) {
201 DefaultLog.getInstance().warn(String.format("Key '%s' is unknown", trackerKey));
202 return;
203 }
204 Option ratOption = Arg.findArg(trackerKey).find(trackerKey);
205 if (!ratOption.hasArgs()) {
206 DefaultLog.getInstance().warn(String.format("Key '%s' does not accept %sarguments.", trackerKey,
207 ratOption.hasArg() ? "more that one " : ""));
208 }
209 if (DefaultLog.getInstance().isEnabled(Log.Level.DEBUG)) {
210 DefaultLog.getInstance().debug(String.format("Adding [%s] to %s", String.join(", ", Arrays.asList(value)), trackerKey));
211 }
212 List<String> values = args.computeIfAbsent(trackerKey, k -> new ArrayList<>());
213 values.addAll(newValues);
214 }
215
216
217
218
219
220 public void removeArg(final UIOption<?> option) {
221 args.remove(option.keyValue());
222 }
223
224
225
226
227
228 public void removeArg(final String trackerKey) {
229 args.remove(trackerKey);
230 }
231 }