From 290edf95275f82e674952b21d27b9f485f5a2418 Mon Sep 17 00:00:00 2001 From: Roel Spilker Date: Fri, 17 Jan 2020 01:17:37 +0100 Subject: Config import: add to trace --- .../core/configuration/ConfigurationApp.java | 69 ++++++++++++++-------- .../core/configuration/ConfigurationFile.java | 5 +- 2 files changed, 47 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/core/lombok/core/configuration/ConfigurationApp.java b/src/core/lombok/core/configuration/ConfigurationApp.java index 46711178..0b9ba078 100644 --- a/src/core/lombok/core/configuration/ConfigurationApp.java +++ b/src/core/lombok/core/configuration/ConfigurationApp.java @@ -25,11 +25,13 @@ import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.net.URI; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.Deque; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -221,8 +223,8 @@ public class ConfigurationApp extends LombokApp { } if (!problems.isEmpty()) { - out.printf("%nProblems in the configuration files: %n"); - for (String problem : problems) out.printf("- %s%n", problem); + err.printf("Problems in the configuration files:%n"); + for (String problem : problems) err.printf("- %s%n", problem); } return 0; @@ -253,33 +255,42 @@ public class ConfigurationApp extends LombokApp { Set> used = new HashSet>(); boolean stopBubbling = false; - String previousDescription = null; - for (File currentDirectory = new File(directory); currentDirectory != null && !stopBubbling; currentDirectory = currentDirectory.getParentFile()) { - ConfigurationFile context = ConfigurationFile.forDirectory(currentDirectory); + Collection visited = new HashSet(); + for (ConfigurationFile context = ConfigurationFile.forDirectory(new File(directory)); context != null && !stopBubbling; context = context.parent()) { if (!context.exists()) continue; - Map, List> traces = trace(context, keys); + Deque round = new ArrayDeque(); + round.push(new Source(context, context.description())); - stopBubbling = stopBubbling(traces.get(ConfigurationKeys.STOP_BUBBLING)); - for (ConfigurationKey key : keys) { - List modifications = traces.get(key); - if (modifications == null) { - modifications = new ArrayList(); - modifications.add(" <'" + key.getKeyName() + "' not mentioned>"); - } else { - used.add(key); - } - if (previousDescription != null) { - modifications.add(""); - modifications.add(previousDescription + ":"); + while (!round.isEmpty()) { + Source current = round.pop(); + if (current == null || !visited.add(current.file) || !current.file.exists()) continue; + + Map, List> traces = trace(current.file, keys, round); + + stopBubbling = stopBubbling(traces.get(ConfigurationKeys.STOP_BUBBLING)); + for (ConfigurationKey key : keys) { + List modifications = traces.get(key); + if (modifications == null) { + modifications = new ArrayList(); + modifications.add(" <'" + key.getKeyName() + "' not mentioned>"); + } else { + used.add(key); + } + modifications.add(0, current.description + ":"); + modifications.add(0, ""); + result.get(key).addAll(0, modifications); } - result.get(key).addAll(0, modifications); } - previousDescription = context.description(); } for (ConfigurationKey key : keys) { if (used.contains(key)) { - result.get(key).add(0, previousDescription + (stopBubbling ? " (stopped bubbling):" : ":")); + List modifications = result.get(key); + modifications.remove(0); + if (stopBubbling) { + String mostRecent = modifications.get(0); + modifications.set(0, mostRecent.substring(0, mostRecent.length() - 1) + " (stopped bubbling):"); + } } else { result.put(key, Collections.emptyList()); } @@ -287,12 +298,22 @@ public class ConfigurationApp extends LombokApp { return result; } - private Map, List> trace(ConfigurationFile context, final Collection> keys) throws IOException { + private static final class Source { + final ConfigurationFile file; + final String description; + + Source(ConfigurationFile file, String description) { + this.file = file; + this.description = description; + } + } + + private Map, List> trace(ConfigurationFile context, final Collection> keys, final Deque round) throws IOException { final Map, List> result = new HashMap, List>(); Collector collector = new Collector() { @Override public void addImport(ConfigurationFile importFile, ConfigurationFile context, int lineNumber) { - // nothing to display here + round.push(new Source(importFile, importFile.description() + " (imported from " + context.description() + ":" + lineNumber + ")")); } @Override public void clear(ConfigurationKey key, ConfigurationFile context, int lineNumber) { trace(key, "clear " + key.getKeyName(), lineNumber); @@ -311,7 +332,7 @@ public class ConfigurationApp extends LombokApp { } private void trace(ConfigurationKey key, String message, int lineNumber) { - if (!keys.contains(key)) return; + if (!keys.contains(key) && key != ConfigurationKeys.STOP_BUBBLING) return; List traces = result.get(key); if (traces == null) { traces = new ArrayList(); diff --git a/src/core/lombok/core/configuration/ConfigurationFile.java b/src/core/lombok/core/configuration/ConfigurationFile.java index 021c3c97..218fa73b 100644 --- a/src/core/lombok/core/configuration/ConfigurationFile.java +++ b/src/core/lombok/core/configuration/ConfigurationFile.java @@ -35,14 +35,13 @@ public abstract class ConfigurationFile { return new byte[65536]; } }; - + private final String identifier; public static ConfigurationFile forFile(File file) { return new RegularConfigurationFile(file); } - public static ConfigurationFile forDirectory(File directory) { return ConfigurationFile.forFile(new File(directory, LOMBOK_CONFIG_FILENAME)); } @@ -82,7 +81,7 @@ public abstract class ConfigurationFile { private static boolean fileExists(File file) { return file.exists() && file.isFile(); } - + private static String read(InputStream is) throws IOException { byte[] b = buffers.get(); try { -- cgit