From 78effe14adba91efa45822b98eab2904b193532a Mon Sep 17 00:00:00 2001 From: zzz Date: Tue, 5 May 2020 12:51:41 +0000 Subject: [PATCH] Console: Fix log clearing without wrapper (ticket #2449) Use ABQ as buffer when reading --- .../i2p/router/web/helpers/LogsHelper.java | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/LogsHelper.java index 378ebec15d..b9d8bcb223 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/LogsHelper.java @@ -6,8 +6,9 @@ import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.IOException; import java.lang.reflect.Method; -import java.util.LinkedList; import java.util.List; +import java.util.Queue; +import java.util.concurrent.ArrayBlockingQueue; import java.util.jar.Attributes; import net.i2p.I2PAppContext; @@ -17,7 +18,6 @@ import net.i2p.router.web.ConfigServiceHandler; import net.i2p.router.web.CSSHelper; import net.i2p.router.web.HelperBase; import net.i2p.router.web.RouterConsoleRunner; -import net.i2p.util.FileUtil; import net.i2p.util.Translate; import net.i2p.util.UIMessages; @@ -165,19 +165,15 @@ public class LogsHelper extends HelperBase { if (lastMod > 0 && flastMod <= lastMod) { str = ""; toSkip = -1; - } else if (_context.hasWrapper()) { - // platform encoding + } else { + // platform encoding or UTF8 + boolean utf8 = !_context.hasWrapper(); StringBuilder buf = new StringBuilder(MAX_WRAPPER_LINES * 80); - toSkip = readTextFile(f, MAX_WRAPPER_LINES, toSkip, buf); + toSkip = readTextFile(f, utf8, MAX_WRAPPER_LINES, toSkip, buf); if (toSkip >= 0) str = buf.toString(); else str = null; - } else { - // UTF-8 - // no skipping - str = FileUtil.readTextFile(f.getAbsolutePath(), MAX_WRAPPER_LINES, false); - toSkip = 0; } String loc = DataHelper.escapeHTML(f.getAbsolutePath()); if (str == null) { @@ -288,30 +284,36 @@ public class LogsHelper extends HelperBase { * so don't make it too big. * Warning - converts \r\n to \n * + * @param utf8 true for utf-8, false for system locale * @param maxNumLines max number of lines (greater than zero) * @param skipLines number of lines to skip, or zero * @param buf out parameter * @return -1 on failure, or number of lines in the file. Does not throw IOException. * @since 0.9.11 modded from FileUtil.readTextFile() */ - private static long readTextFile(File f, int maxNumLines, long skipLines, StringBuilder buf) { + private static long readTextFile(File f, boolean utf8, int maxNumLines, long skipLines, StringBuilder buf) { if (!f.exists()) return -1; BufferedReader in = null; try { - in = new BufferedReader(new InputStreamReader(new FileInputStream(f))); - LinkedList lines = new LinkedList(); + if (utf8) + in = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8")); + else + in = new BufferedReader(new InputStreamReader(new FileInputStream(f))); + Queue lines = new ArrayBlockingQueue(maxNumLines); long i = 0; - String line = null; - while ( (line = in.readLine()) != null) { - if (i++ < skipLines) - continue; - lines.add(line); - if (lines.size() >= maxNumLines) - lines.removeFirst(); - } - for (String ln : lines) { - buf.append(ln).append('\n'); + synchronized(lines) { + String line = null; + while ( (line = in.readLine()) != null) { + if (i++ < skipLines) + continue; + if (lines.size() >= maxNumLines) + lines.poll(); + lines.offer(line); + } + for (String ln : lines) { + buf.append(ln).append('\n'); + } } return i; } catch (IOException ioe) {