diff --git a/core/java/src/net/i2p/util/LogConsoleBuffer.java b/core/java/src/net/i2p/util/LogConsoleBuffer.java index 18d7cfdf81..527db98a1b 100644 --- a/core/java/src/net/i2p/util/LogConsoleBuffer.java +++ b/core/java/src/net/i2p/util/LogConsoleBuffer.java @@ -12,8 +12,8 @@ import net.i2p.I2PAppContext; */ public class LogConsoleBuffer { private final int lim; - private final LinkedBlockingQueue _buffer; - private final LinkedBlockingQueue _critBuffer; + private final UIMessages _buffer; + private final UIMessages _critBuffer; /** * Uses default limit from LogManager. @@ -36,14 +36,12 @@ public class LogConsoleBuffer { lim = Math.max(limit, 4); // Add some extra room to minimize the chance of losing a message, // since we are doing offer() below. - _buffer = new LinkedBlockingQueue(lim + 4); - _critBuffer = new LinkedBlockingQueue(lim + 4); + _buffer = new UIMessages(lim + 4); + _critBuffer = new UIMessages(lim + 4); } void add(String msg) { - while (_buffer.size() >= lim) - _buffer.poll(); - _buffer.offer(msg); + _buffer.addMessageNoEscape(msg); } /** @@ -51,9 +49,7 @@ public class LogConsoleBuffer { * */ void addCritical(String msg) { - while (_critBuffer.size() >= lim) - _critBuffer.poll(); - _critBuffer.offer(msg); + _critBuffer.addMessageNoEscape(msg); } /** @@ -64,7 +60,7 @@ public class LogConsoleBuffer { * @return oldest first */ public List getMostRecentMessages() { - return new ArrayList(_buffer); + return _buffer.getMessageStrings(); } /** @@ -75,7 +71,31 @@ public class LogConsoleBuffer { * @return oldest first */ public List getMostRecentCriticalMessages() { - return new ArrayList(_critBuffer); + return _critBuffer.getMessageStrings(); + } + + /** + * Retrieve the currently buffered messages, earlier values were generated... + * earlier. All values are strings with no formatting (as they are written + * in the logs) + * + * @return oldest first + * @since 0.9.46 + */ + public UIMessages getUIMessages() { + return _buffer; + } + + /** + * Retrieve the currently buffered critical messages, earlier values were generated... + * earlier. All values are strings with no formatting (as they are written + * in the logs) + * + * @return oldest first + * @since 0.9.46 + */ + public UIMessages getCriticalUIMessages() { + return _critBuffer; } /** diff --git a/core/java/src/net/i2p/util/UIMessages.java b/core/java/src/net/i2p/util/UIMessages.java index 214e50371d..69dff7768b 100644 --- a/core/java/src/net/i2p/util/UIMessages.java +++ b/core/java/src/net/i2p/util/UIMessages.java @@ -69,11 +69,26 @@ public class UIMessages { * @return a copy */ public synchronized List getMessages() { - if (_messages.isEmpty()) + if (_messages.peekLast() == null) return Collections.emptyList(); return new ArrayList(_messages); } + /** + * Newest last, or empty list. + * @return a copy + * @since 0.9.46 + */ + public synchronized List getMessageStrings() { + if (_messages.peekLast() == null) + return Collections.emptyList(); + List rv = new ArrayList(_messages.size()); + for (Message m : _messages) { + rv.add(m.message); + } + return rv; + } + /** clear all */ public synchronized void clear() { _messages.clear(); @@ -96,6 +111,13 @@ public class UIMessages { } } } + + /** + * @since 0.9.46 + */ + public synchronized boolean isEmpty() { + return _messages.peekLast() == null; + } public static class Message { public final int id;