|
23 | 23 | import com.cognifide.apm.api.scripts.Script;
|
24 | 24 | import com.cognifide.apm.api.services.ScriptFinder;
|
25 | 25 | import com.cognifide.apm.api.status.Status;
|
26 |
| -import com.cognifide.apm.core.grammar.ApmType.ApmEmpty; |
27 | 26 | import com.cognifide.apm.core.grammar.ApmType.ApmList;
|
28 |
| -import com.cognifide.apm.core.grammar.ApmType.ApmMap; |
| 27 | +import com.cognifide.apm.core.grammar.ApmType.ApmPair; |
29 | 28 | import com.cognifide.apm.core.grammar.ApmType.ApmString;
|
30 | 29 | import com.cognifide.apm.core.grammar.antlr.ApmLangBaseVisitor;
|
31 | 30 | import com.cognifide.apm.core.grammar.antlr.ApmLangParser.AllowDenyCommandContext;
|
|
49 | 48 | import com.cognifide.apm.core.logger.Position;
|
50 | 49 | import com.cognifide.apm.core.logger.Progress;
|
51 | 50 | import com.google.common.collect.ImmutableList;
|
52 |
| -import com.google.common.collect.ImmutableMap; |
53 | 51 | import java.util.ArrayList;
|
54 | 52 | import java.util.Collections;
|
55 | 53 | import java.util.List;
|
@@ -148,25 +146,25 @@ public Status visitRequireVariable(RequireVariableContext ctx) {
|
148 | 146 |
|
149 | 147 | @Override
|
150 | 148 | public Status visitForEach(ForEachContext ctx) {
|
151 |
| - List<Map<String, ApmType>> values = readValues(ctx); |
152 |
| - ListIterator<Map<String, ApmType>> iterator = values.listIterator(); |
| 149 | + List<ApmPair> values = readValues(ctx); |
| 150 | + ListIterator<ApmPair> iterator = values.listIterator(); |
153 | 151 | if (!iterator.hasNext() && shouldVisitNextChild()) {
|
154 | 152 | String key = ctx.IDENTIFIER().toString();
|
155 | 153 | progress(ctx, Status.SKIPPED, "for-each", String.format("%s is always empty", key));
|
156 | 154 | }
|
157 | 155 | while (iterator.hasNext() && shouldVisitNextChild()) {
|
158 | 156 | try {
|
159 | 157 | int index = iterator.nextIndex();
|
160 |
| - Map<String, ApmType> value = iterator.next(); |
161 |
| - executionContext.createLocalContext(); |
162 |
| - String valueStr = value.entrySet() |
163 |
| - .stream() |
164 |
| - .map(entry -> String.format("%s=%s", entry.getKey(), entry.getValue())) |
165 |
| - .collect(Collectors.joining("\n")); |
166 |
| - progress(ctx, Status.SUCCESS, "for-each", String.format("%d. Begin: %s", index, valueStr)); |
167 |
| - value.forEach(executionContext::setVariable); |
168 |
| - visit(ctx.body()); |
169 |
| - progress(ctx, Status.SUCCESS, "for-each", String.format("%d. End", index)); |
| 158 | + ApmPair value = iterator.next(); |
| 159 | + if (value.isEmpty()) { |
| 160 | + progress(ctx, Status.SKIPPED, "for-each", String.format("%d. %s is empty", index, value.getKey())); |
| 161 | + } else { |
| 162 | + executionContext.createLocalContext(); |
| 163 | + progress(ctx, Status.SUCCESS, "for-each", String.format("%d. Begin: %s=%s", index, value.getKey(), value.getValue())); |
| 164 | + executionContext.setVariable(value.getKey(), value.getValue()); |
| 165 | + visit(ctx.body()); |
| 166 | + progress(ctx, Status.SUCCESS, "for-each", String.format("%d. End", index)); |
| 167 | + } |
170 | 168 | } finally {
|
171 | 169 | executionContext.removeLocalContext();
|
172 | 170 | }
|
@@ -278,21 +276,19 @@ public Status visitImportScript(ImportScriptContext ctx) {
|
278 | 276 | return Status.SUCCESS;
|
279 | 277 | }
|
280 | 278 |
|
281 |
| - private List<Map<String, ApmType>> readValues(ForEachContext ctx) { |
| 279 | + private List<ApmPair> readValues(ForEachContext ctx) { |
282 | 280 | String key = ctx.IDENTIFIER().toString();
|
283 | 281 | ApmType variableValue = executionContext.resolveArgument(ctx.argument());
|
284 | 282 | List<ApmType> values;
|
285 |
| - if (variableValue instanceof ApmList) { |
286 |
| - values = variableValue.getList(); |
287 |
| - } else if (variableValue instanceof ApmEmpty) { |
288 |
| - values = Collections.emptyList(); |
289 |
| - } else if (variableValue instanceof ApmMap && variableValue.getMap().isEmpty()) { |
| 283 | + if (variableValue.isEmpty()) { |
290 | 284 | values = Collections.emptyList();
|
| 285 | + } else if (variableValue instanceof ApmList) { |
| 286 | + values = variableValue.getList(); |
291 | 287 | } else {
|
292 | 288 | values = ImmutableList.of(variableValue);
|
293 | 289 | }
|
294 | 290 | return values.stream()
|
295 |
| - .map(value -> ImmutableMap.of(key, value)) |
| 291 | + .map(value -> new ApmPair(key, value)) |
296 | 292 | .collect(Collectors.toList());
|
297 | 293 | }
|
298 | 294 |
|
|
0 commit comments