From 04b48ce39eb76620589e6fbf63e6045b4c1f740a Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Tue, 14 Sep 2021 13:51:57 -0400 Subject: [PATCH] Fixed poorly formatted error message containing stack trace info --- .../java/docking/DockingErrorDisplay.java | 17 +++++++-- .../framework/plugintool/PluginManager.java | 38 ++++++++++--------- .../framework/plugintool/PluginTool.java | 2 +- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/Ghidra/Framework/Docking/src/main/java/docking/DockingErrorDisplay.java b/Ghidra/Framework/Docking/src/main/java/docking/DockingErrorDisplay.java index f649a7301a..7e1a62686f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/DockingErrorDisplay.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/DockingErrorDisplay.java @@ -66,7 +66,13 @@ public class DockingErrorDisplay implements ErrorDisplay { private static String wrap(String text) { StringBuilder buffy = new StringBuilder(); - List lines = HtmlLineSplitter.split(text, 100, true); + + // Wrap any poorly formatted text that gets displayed in the label; 80-100 chars is + // a reasonable line length based on historical print margins. + // Update: increased the limit to handle long messages containing stack trace elements, + // which look odd when wrapped + int limit = 120; + List lines = HtmlLineSplitter.split(text, limit, true); String newline = "\n"; for (String line : lines) { @@ -80,9 +86,12 @@ public class DockingErrorDisplay implements ErrorDisplay { continue; } - // wrap any poorly formatted text that gets displayed in the label; 80-100 chars is - // a reasonable line length based on historical print margins - String wrapped = WordUtils.wrap(line, 100, null, true); + String wrapped = line; + if (line.length() > limit) { + // this method will trim leading spaces; only call if the line is too long + wrapped = WordUtils.wrap(line, limit, null, true); + } + buffy.append(wrapped); } return buffy.toString(); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginManager.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginManager.java index d5e0c5ed98..44e01da30c 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginManager.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginManager.java @@ -496,34 +496,38 @@ class PluginManager { } private void initConfigStates(Map map) throws PluginException { - StringBuffer errMsg = new StringBuffer(); + StringBuilder errMsg = new StringBuilder(); Iterator it = pluginList.iterator(); while (it.hasNext()) { Plugin p = it.next(); - configure(p, map, errMsg); + readSaveState(p, map, errMsg); } if (errMsg.length() > 0) { throw new PluginException(errMsg.toString()); } } - private void configure(Plugin p, Map map, StringBuffer errMsg) { + private void readSaveState(Plugin p, Map map, StringBuilder errMsg) { SaveState ss = map.get(p.getClass().getName()); - if (ss != null) { - try { - p.readConfigState(ss); - } - catch (Exception e) { - errMsg.append("Problem restoring plugin state for: " + p.getName()).append("\n\n"); - errMsg.append(e.getClass().getName()).append(": ").append(e.getMessage()).append( - '\n'); - StackTraceElement[] st = e.getStackTrace(); - int depth = Math.min(5, st.length); // only show the important stuff (magic guess) - for (int j = 0; j < depth; j++) { - errMsg.append(" ").append(st[j].toString()).append('\n'); - } - errMsg.append('\n'); // extra break between this and future messages + if (ss == null) { + return; + } + + try { + p.readConfigState(ss); + } + catch (Exception e) { + errMsg.append("Problem restoring plugin state for: " + p.getName()).append("\n\n"); + errMsg.append(e.getClass().getName()) + .append(": ") + .append(e.getMessage()) + .append('\n'); + StackTraceElement[] st = e.getStackTrace(); + int depth = Math.min(5, st.length); // only show the important stuff (magic guess) + for (int j = 0; j < depth; j++) { + errMsg.append(" ").append(st[j].toString()).append('\n'); } + errMsg.append('\n'); // extra break between this and future messages } } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java index a1abf45f6b..62c7bd7c6e 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/PluginTool.java @@ -562,7 +562,7 @@ public abstract class PluginTool extends AbstractDockingTool { } catch (PluginException e) { hasErrors = true; - Msg.showError(this, getToolFrame(), "Error Restoring Plugins", e.getMessage()); + Msg.showError(this, getToolFrame(), "Error Restoring Plugins", e.getMessage(), e); } winMgr.restoreWindowDataFromXml(root);