From 3bd48e841ad3a7f9da4fd76ef0d43503bbd0e746 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Thu, 8 Sep 2016 12:19:49 -0400 Subject: [PATCH 01/41] https://github.com/jcabi/jcabi-log/issues/87 --- .../java/com/jcabi/log/VerboseProcess.java | 83 +++++++++++++++---- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 2fe764d7..447e9c93 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -44,6 +44,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.logging.Level; + import lombok.EqualsAndHashCode; import lombok.ToString; @@ -106,10 +107,15 @@ public final class VerboseProcess implements Closeable { */ private transient boolean closed; - /** - * Public ctor. - * @param prc The process to work with - */ + /** + * Maximum number of log lines for a stack trace + */ + public volatile static int maxStackLength = 1000; + + /** + * Public ctor. + * @param prc The process to work with + */ public VerboseProcess(final Process prc) { this(prc, Level.INFO, Level.WARNING); } @@ -281,7 +287,7 @@ private String stdout(final boolean check) { this.process, result.code(), result.stdout().length(), System.currentTimeMillis() - start ); - if (check && result.code() != 0) { + if (check && (result.code() != 0)) { throw new IllegalArgumentException( Logger.format( "Non-zero exit code %d: %[text]s", @@ -389,9 +395,14 @@ private static void close(final Closeable res) { * Stream monitor. */ private static final class Monitor implements Callable { - /** - * Stream to read. - */ + + private static final String PREFIX_AT = "at "; + private static final String PREFIX_CB = "Caused by"; + private static final String PREFIX_DOTS = "... "; + + /** + * Stream to read. + */ private final transient InputStream input; /** * Latch to count down when done. @@ -420,7 +431,25 @@ private static final class Monitor implements Callable { this.output = out; this.level = lvl; } - @Override + + private static boolean shouldAppend(final String string) { + final String leftStrip = stripStart(string); + return leftStrip.startsWith(PREFIX_AT) || leftStrip.startsWith(PREFIX_CB) || leftStrip.startsWith(PREFIX_DOTS); + } + + private static String stripStart(final String string) { + if ((string == null) || string.isEmpty()) { + return null; + } + final int stringLength = string.length(); + int start = 0; + while ((start != stringLength) && Character.isWhitespace(string.charAt(start))) { + start++; + } + return string.substring(start); + } + + @Override public Void call() throws Exception { final BufferedReader reader = new BufferedReader( Channels.newReader( @@ -433,6 +462,9 @@ public Void call() throws Exception { new OutputStreamWriter(this.output, VerboseProcess.UTF_8) ); try { + StringBuilder sb = new StringBuilder(); + String previousLine = null; + int lineCount = 0; while (true) { if (Thread.interrupted()) { Logger.debug( @@ -441,16 +473,33 @@ public Void call() throws Exception { ); break; } - final String line = reader.readLine(); + if (previousLine != null) { + sb.append(previousLine).append(System.getProperty("line.separator")); + previousLine = null; + } + + final String line = reader.readLine(); if (line == null) { + if (sb.length() > 0) { + final String logText = sb.toString(); + Logger.log(this.level, VerboseProcess.class, ">> %s", logText); + writer.write(logText); + } break; } - Logger.log( - this.level, VerboseProcess.class, - ">> %s", line - ); - writer.write(line); - writer.newLine(); + + if (shouldAppend(line) && (++lineCount < maxStackLength)) { + sb.append(line).append(System.getProperty("line.separator")); + } else { + if (sb.length() > 0) { + final String logText = sb.toString(); + Logger.log(this.level, VerboseProcess.class, ">> %s", logText); + writer.write(logText); + sb = new StringBuilder(); + } + lineCount = 1; + previousLine = line; + } } } catch (final ClosedByInterruptException ex) { Thread.interrupted(); @@ -531,4 +580,4 @@ public String stderr() { return this.err; } } -} +} \ No newline at end of file From a52948b7d2e20515c9b040b5d982f0e00573bc56 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Thu, 8 Sep 2016 14:03:17 -0400 Subject: [PATCH 02/41] Updating formatting standards --- .../java/com/jcabi/log/VerboseProcess.java | 143 ++++++++++-------- 1 file changed, 83 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 447e9c93..789a6fab 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -44,7 +44,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.logging.Level; - import lombok.EqualsAndHashCode; import lombok.ToString; @@ -107,15 +106,20 @@ public final class VerboseProcess implements Closeable { */ private transient boolean closed; - /** - * Maximum number of log lines for a stack trace - */ - public volatile static int maxStackLength = 1000; + /** + * Maximum number of log lines for a stack trace + */ + public static final int DEFUALT_MAX_LENGTH = 1000; - /** - * Public ctor. - * @param prc The process to work with - */ + /** + * Maximum number of log lines for a stack trace + */ + public static volatile int maxStackLength = DEFUALT_MAX_LENGTH; + + /** + * Public ctor. + * @param prc The process to work with + */ public VerboseProcess(final Process prc) { this(prc, Level.INFO, Level.WARNING); } @@ -287,7 +291,7 @@ private String stdout(final boolean check) { this.process, result.code(), result.stdout().length(), System.currentTimeMillis() - start ); - if (check && (result.code() != 0)) { + if (check && (result.code() != 0)) { throw new IllegalArgumentException( Logger.format( "Non-zero exit code %d: %[text]s", @@ -396,13 +400,22 @@ private static void close(final Closeable res) { */ private static final class Monitor implements Callable { - private static final String PREFIX_AT = "at "; - private static final String PREFIX_CB = "Caused by"; - private static final String PREFIX_DOTS = "... "; + /** + * Prefix "at " + */ + private static final String PREFIX_AT = "at "; + /** + * Prefix "Caused by" + */ + private static final String PREFIX_CB = "Caused by"; + /** + * Prefix "... " + */ + private static final String PREFIX_DOTS = "... "; - /** - * Stream to read. - */ + /** + * Stream to read. + */ private final transient InputStream input; /** * Latch to count down when done. @@ -432,24 +445,34 @@ private static final class Monitor implements Callable { this.level = lvl; } - private static boolean shouldAppend(final String string) { - final String leftStrip = stripStart(string); - return leftStrip.startsWith(PREFIX_AT) || leftStrip.startsWith(PREFIX_CB) || leftStrip.startsWith(PREFIX_DOTS); - } - - private static String stripStart(final String string) { - if ((string == null) || string.isEmpty()) { - return null; - } - final int stringLength = string.length(); - int start = 0; - while ((start != stringLength) && Character.isWhitespace(string.charAt(start))) { - start++; - } - return string.substring(start); - } - - @Override + /** + * Checks if line is part of a stack trace and should be appended. + * @param string String to check + * @return boolean result + */ + private static boolean shouldAppend(final String string) { + final String leftStrip = stripStart(string); + return leftStrip.startsWith(PREFIX_AT) || leftStrip.startsWith(PREFIX_CB) || leftStrip.startsWith(PREFIX_DOTS); + } + + /** + * Strips whitespace at beginning of String + * @param string String to strip + * @return string Stripped String + */ + private static String stripStart(final String string) { + if ((string == null) || string.isEmpty()) { + return null; + } + final int stringLength = string.length(); + int start = 0; + while ((start != stringLength) && Character.isWhitespace(string.charAt(start))) { + start++; + } + return string.substring(start); + } + + @Override public Void call() throws Exception { final BufferedReader reader = new BufferedReader( Channels.newReader( @@ -462,9 +485,9 @@ public Void call() throws Exception { new OutputStreamWriter(this.output, VerboseProcess.UTF_8) ); try { - StringBuilder sb = new StringBuilder(); - String previousLine = null; - int lineCount = 0; + StringBuilder sb = new StringBuilder(); + String previousLine = null; + int lineCount = 0; while (true) { if (Thread.interrupted()) { Logger.debug( @@ -473,33 +496,33 @@ public Void call() throws Exception { ); break; } - if (previousLine != null) { - sb.append(previousLine).append(System.getProperty("line.separator")); - previousLine = null; - } + if (previousLine != null) { + sb.append(previousLine).append(System.getProperty("line.separator")); + previousLine = null; + } - final String line = reader.readLine(); + final String line = reader.readLine(); if (line == null) { - if (sb.length() > 0) { - final String logText = sb.toString(); - Logger.log(this.level, VerboseProcess.class, ">> %s", logText); - writer.write(logText); - } + if (sb.length() > 0) { + final String logText = sb.toString(); + Logger.log(this.level, VerboseProcess.class, ">> %s", logText); + writer.write(logText); + } break; } - if (shouldAppend(line) && (++lineCount < maxStackLength)) { - sb.append(line).append(System.getProperty("line.separator")); - } else { - if (sb.length() > 0) { - final String logText = sb.toString(); - Logger.log(this.level, VerboseProcess.class, ">> %s", logText); - writer.write(logText); - sb = new StringBuilder(); - } - lineCount = 1; - previousLine = line; - } + if (shouldAppend(line) && (++lineCount < maxStackLength)) { + sb.append(line).append(System.getProperty("line.separator")); + } else { + if (sb.length() > 0) { + final String logText = sb.toString(); + Logger.log(this.level, VerboseProcess.class, ">> %s", logText); + writer.write(logText); + sb = new StringBuilder(); + } + lineCount = 1; + previousLine = line; + } } } catch (final ClosedByInterruptException ex) { Thread.interrupted(); @@ -580,4 +603,4 @@ public String stderr() { return this.err; } } -} \ No newline at end of file +} From 828ee4fe1cb2e418a84dec8a080683716cdc69c4 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Fri, 9 Sep 2016 23:03:46 -0400 Subject: [PATCH 03/41] Adding some styling changes and a new test --- .../java/com/jcabi/log/VerboseProcess.java | 64 +++++----- .../com/jcabi/log/VerboseProcessTest.java | 116 ++++++++++++++++++ 2 files changed, 149 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 789a6fab..e9687590 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -107,14 +107,14 @@ public final class VerboseProcess implements Closeable { private transient boolean closed; /** - * Maximum number of log lines for a stack trace + * Maximum number of log lines for a stack trace. */ - public static final int DEFUALT_MAX_LENGTH = 1000; + private static final int DEFUALT_MAX_LENGTH = 1000; /** - * Maximum number of log lines for a stack trace + * Maximum number of log lines for a stack trace. */ - public static volatile int maxStackLength = DEFUALT_MAX_LENGTH; + private static final int maxStackLength = DEFUALT_MAX_LENGTH; /** * Public ctor. @@ -291,7 +291,7 @@ private String stdout(final boolean check) { this.process, result.code(), result.stdout().length(), System.currentTimeMillis() - start ); - if (check && (result.code() != 0)) { + if (check && result.code() != 0) { throw new IllegalArgumentException( Logger.format( "Non-zero exit code %d: %[text]s", @@ -401,18 +401,25 @@ private static void close(final Closeable res) { private static final class Monitor implements Callable { /** - * Prefix "at " + * Prefix "at ". */ private static final String PREFIX_AT = "at "; /** - * Prefix "Caused by" + * Prefix "Caused by". */ private static final String PREFIX_CB = "Caused by"; /** - * Prefix "... " + * Prefix "... ". */ private static final String PREFIX_DOTS = "... "; - + /** + * Format string for log statements. + */ + private static final String LOG_FORMAT = ">> %s"; + /** + * Empty String. + */ + private static final String NULL_STRING = new String() + '\u0000'; /** * Stream to read. */ @@ -447,7 +454,7 @@ private static final class Monitor implements Callable { /** * Checks if line is part of a stack trace and should be appended. - * @param string String to check + * @param string string to check * @return boolean result */ private static boolean shouldAppend(final String string) { @@ -456,18 +463,15 @@ private static boolean shouldAppend(final String string) { } /** - * Strips whitespace at beginning of String + * Strips whitespace at beginning of String. * @param string String to strip - * @return string Stripped String + * @return string Stripped string */ private static String stripStart(final String string) { - if ((string == null) || string.isEmpty()) { - return null; - } final int stringLength = string.length(); int start = 0; while ((start != stringLength) && Character.isWhitespace(string.charAt(start))) { - start++; + ++start; } return string.substring(start); } @@ -485,8 +489,8 @@ public Void call() throws Exception { new OutputStreamWriter(this.output, VerboseProcess.UTF_8) ); try { - StringBuilder sb = new StringBuilder(); - String previousLine = null; + StringBuilder builder = new StringBuilder(); + String previousLine = NULL_STRING; int lineCount = 0; while (true) { if (Thread.interrupted()) { @@ -496,29 +500,27 @@ public Void call() throws Exception { ); break; } - if (previousLine != null) { - sb.append(previousLine).append(System.getProperty("line.separator")); - previousLine = null; + if (previousLine != NULL_STRING) { + builder.append(previousLine).append(System.getProperty("line.separator")); + previousLine = NULL_STRING; } - final String line = reader.readLine(); if (line == null) { - if (sb.length() > 0) { - final String logText = sb.toString(); - Logger.log(this.level, VerboseProcess.class, ">> %s", logText); + if (builder.length() > 0) { + final String logText = builder.toString(); + Logger.log(this.level, VerboseProcess.class, LOG_FORMAT, logText); writer.write(logText); } break; } - if (shouldAppend(line) && (++lineCount < maxStackLength)) { - sb.append(line).append(System.getProperty("line.separator")); + builder.append(line).append(System.getProperty("line.separator")); } else { - if (sb.length() > 0) { - final String logText = sb.toString(); - Logger.log(this.level, VerboseProcess.class, ">> %s", logText); + if (builder.length() > 0) { + final String logText = builder.toString(); + Logger.log(this.level, VerboseProcess.class, LOG_FORMAT, logText); writer.write(logText); - sb = new StringBuilder(); + builder = new StringBuilder(); } lineCount = 1; previousLine = line; diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index f9eb41b7..c03e9273 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -36,12 +36,15 @@ import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import org.apache.commons.lang3.SystemUtils; +import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.SimpleLayout; import org.apache.log4j.WriterAppender; import org.apache.log4j.spi.Filter; @@ -55,6 +58,7 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import org.slf4j.LoggerFactory; /** * Test case for {@link VerboseProcess}. @@ -477,4 +481,116 @@ public int decide(final LoggingEvent event) { return decision; } } + + /** + * Runs a java process which will throw a stack trace and makes sure it will group the stack trace. + */ + @Test + public void logCompleteStackTrace() { + final org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger(); + final TestAppender appender = new TestAppender(); + rootLogger.addAppender(appender); + final String[] commands = { getJavaExecLoc(), ("-cp"), System.getProperty("java.class.path"), + "com.jcabi.log.VerboseProcessExample" }; + final ProcessBuilder builder = new ProcessBuilder(commands); + VerboseProcess process = null; + RuntimeException thrownException = null; + try { + process = new VerboseProcess(builder, Level.INFO, Level.SEVERE); + process.stdout(); + } catch (final RuntimeException e) { + thrownException = e; + } finally { + rootLogger.removeAppender(appender); + if (process != null) { + process.close(); + } + } + Assert.assertNotNull(thrownException); + MatcherAssert.assertThat(thrownException.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_1)); + MatcherAssert.assertThat(thrownException.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_2)); + MatcherAssert.assertThat(thrownException.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_3)); + MatcherAssert.assertThat(thrownException.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_4)); + boolean foundCompleteStack = false; + for (final LoggingEvent event : appender.getLog()) { + final String message = (String) event.getMessage(); + if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { + final boolean containsCaughtException = message.contains(VerboseProcessExample.CAUGHT_ERR_MSG); + Assert.assertTrue(containsCaughtException); + foundCompleteStack = containsCaughtException; + } + } + Assert.assertTrue(foundCompleteStack); + } + + /** + * Gets the location of Java, whether on Linux of Windows. + * @return + */ + public static String getJavaExecLoc() { + String javaExec = null; + String sunLibPath = System.getProperty("java.home"); + javaExec = new String(); + if (SystemUtils.IS_OS_WINDOWS) { + // Windows + try { + final String sunLibPathNew = sunLibPath.replaceAll("\\\\", "\\\\\\\\"); + sunLibPath = sunLibPathNew; + javaExec = (sunLibPath + "\\bin\\java.exe"); + // Test Location + final File file1 = new File(javaExec); + if (file1.exists()) { + System.out.println("File [" + javaExec + "] exists."); + return javaExec; + } + } catch (final Exception e) { + throw new RuntimeException("Unable to get the Java Path. error = " + e.getMessage(), e); + } + } else { + // Unix + try { + javaExec = sunLibPath + "/bin/java"; + // Test Location + final File file1 = new File(javaExec); + if (file1.exists()) { + return javaExec; + } + } catch (final Exception e) { + throw new RuntimeException("Unable to get the Java Path. error = " + e.getMessage(), e); + } + } + throw new RuntimeException("Unable to get the Java Path."); + } + + /** + * Logger appender that compiles a list of all LoggingEvents. + * @author dean.e.clark + */ + class TestAppender extends AppenderSkeleton { + /** + * List of logging events. + */ + private final List log = new ArrayList(); + + @Override + public boolean requiresLayout() { + return false; + } + + @Override + protected void append(final LoggingEvent loggingEvent) { + log.add(loggingEvent); + } + + @Override + public void close() {} + + /** + * Provides all captured logging events. + * @return copy of log list + */ + public List getLog() { + return new ArrayList(log); + } + } } From 534bb5cf0d91deb43b4f3df9988186907ecbe3fe Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Fri, 9 Sep 2016 23:08:11 -0400 Subject: [PATCH 04/41] Adding missing class --- .../com/jcabi/log/VerboseProcessExample.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/test/java/com/jcabi/log/VerboseProcessExample.java diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java new file mode 100644 index 00000000..ef1ac574 --- /dev/null +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -0,0 +1,86 @@ +package com.jcabi.log; + +public class VerboseProcessExample { + + /** + * System output line 1. + */ + protected static final String SYSOUT_1 = "sysout line 1"; + /** + * System output line 2. + */ + protected static final String SYSOUT_2 = "sysout line 2"; + /** + * System output line 3. + */ + protected static final String SYSOUT_3 = "sysout line 3"; + /** + * System output line 4. + */ + protected static final String SYSOUT_4 = "sysout line 4"; + /** + * Error output line 1. + */ + protected static final String SYSERR_1 = "syserr line 1"; + /** + * Error output line 2. + */ + protected static final String SYSERR_2 = "syserr line 2"; + /** + * Error output line 3. + */ + protected static final String SYSERR_3 = "syserr line 3"; + /** + * Error output line 4. + */ + protected static final String SYSERR_4 = "syserr line 4"; + /** + * Exception to be thrown and caught. + */ + protected static final String CAUGHT_ERR_MSG = "this error gets thrown and caught"; + /** + * Exception to be thrown. + */ + protected static final String THROWN_ERR_MSG = "this error was caused by the other one"; + + /** + * Will log to standard output and error and then intentionally fail with a stack trace. + * @param args + */ + public static void main(final String[] args) { + System.out.println(SYSOUT_1); + System.err.println(SYSOUT_1); + System.out.println(SYSOUT_2); + System.err.println(SYSOUT_2); + System.out.println(SYSOUT_3); + System.err.println(SYSOUT_3); + System.out.println(SYSOUT_4); + System.err.println(SYSOUT_4); + catchAndThrow(20); + } + + /** + * Call a method which will throw an exception. Then catch and re-throw it. + * @param i Times to loop + */ + private static void catchAndThrow(final int i) { + try { + countdownAndThrow(i); + } catch (final Exception e) { + throw new RuntimeException(THROWN_ERR_MSG, e); + } + } + + /** + * Recursively loops i-times and then throws an exception. + * @param i Times to loop + * @throws Exception + */ + private static void countdownAndThrow(final int i) throws Exception { + if (i == 0) { + throw new Exception(CAUGHT_ERR_MSG); + } + countdownAndThrow(i - 1); + } + +} From fcb00076c67476c4e7208a3ca59919eac179d1ed Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Fri, 9 Sep 2016 23:22:54 -0400 Subject: [PATCH 05/41] Styling updates --- .../java/com/jcabi/log/VerboseProcess.java | 41 ++++++++------- .../com/jcabi/log/VerboseProcessExample.java | 50 ++++++++++++++++--- .../com/jcabi/log/VerboseProcessTest.java | 31 ++++++++---- 3 files changed, 86 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index e9687590..d7f60d85 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -106,16 +106,6 @@ public final class VerboseProcess implements Closeable { */ private transient boolean closed; - /** - * Maximum number of log lines for a stack trace. - */ - private static final int DEFUALT_MAX_LENGTH = 1000; - - /** - * Maximum number of log lines for a stack trace. - */ - private static final int maxStackLength = DEFUALT_MAX_LENGTH; - /** * Public ctor. * @param prc The process to work with @@ -400,6 +390,14 @@ private static void close(final Closeable res) { */ private static final class Monitor implements Callable { + /** + * Maximum number of log lines for a stack trace. + */ + private static final int DEFUALT_MAX_LENGTH = 1000; + /** + * Maximum number of log lines for a stack trace. + */ + private static final int maxStackLength = DEFUALT_MAX_LENGTH; /** * Prefix "at ". */ @@ -454,12 +452,14 @@ private static final class Monitor implements Callable { /** * Checks if line is part of a stack trace and should be appended. - * @param string string to check - * @return boolean result + * @param string String to check + * @return boolean Result */ private static boolean shouldAppend(final String string) { final String leftStrip = stripStart(string); - return leftStrip.startsWith(PREFIX_AT) || leftStrip.startsWith(PREFIX_CB) || leftStrip.startsWith(PREFIX_DOTS); + return leftStrip.startsWith(PREFIX_AT) || + leftStrip.startsWith(PREFIX_CB) || + leftStrip.startsWith(PREFIX_DOTS); } /** @@ -470,7 +470,8 @@ private static boolean shouldAppend(final String string) { private static String stripStart(final String string) { final int stringLength = string.length(); int start = 0; - while ((start != stringLength) && Character.isWhitespace(string.charAt(start))) { + while ((start != stringLength) && + Character.isWhitespace(string.charAt(start))) { ++start; } return string.substring(start); @@ -501,24 +502,28 @@ public Void call() throws Exception { break; } if (previousLine != NULL_STRING) { - builder.append(previousLine).append(System.getProperty("line.separator")); + builder.append(previousLine).append( + System.getProperty("line.separator")); previousLine = NULL_STRING; } final String line = reader.readLine(); if (line == null) { if (builder.length() > 0) { final String logText = builder.toString(); - Logger.log(this.level, VerboseProcess.class, LOG_FORMAT, logText); + Logger.log(this.level, VerboseProcess.class, + LOG_FORMAT, logText); writer.write(logText); } break; } if (shouldAppend(line) && (++lineCount < maxStackLength)) { - builder.append(line).append(System.getProperty("line.separator")); + builder.append(line).append( + System.getProperty("line.separator")); } else { if (builder.length() > 0) { final String logText = builder.toString(); - Logger.log(this.level, VerboseProcess.class, LOG_FORMAT, logText); + Logger.log(this.level, VerboseProcess.class, + LOG_FORMAT, logText); writer.write(logText); builder = new StringBuilder(); } diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index ef1ac574..2702cdcb 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -1,6 +1,39 @@ +/** + * Copyright (c) 2012-2015, jcabi.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: 1) Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. 2) Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. 3) Neither the name of the jcabi.com nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ package com.jcabi.log; -public class VerboseProcessExample { +/** + * Example application to help test {@link VerboseProcess}. + * @author Dean Clark (dean.clark@gmail.com) + */ + public class VerboseProcessExample { /** * System output line 1. @@ -37,14 +70,17 @@ public class VerboseProcessExample { /** * Exception to be thrown and caught. */ - protected static final String CAUGHT_ERR_MSG = "this error gets thrown and caught"; + protected static final String CAUGHT_ERR_MSG = "this error gets thrown" + + " and caught"; /** * Exception to be thrown. */ - protected static final String THROWN_ERR_MSG = "this error was caused by the other one"; + protected static final String THROWN_ERR_MSG = "this error was caused by" + + " the other one"; /** - * Will log to standard output and error and then intentionally fail with a stack trace. + * Will log to standard output and error and then intentionally fail with a + * stack trace. * @param args */ public static void main(final String[] args) { @@ -66,7 +102,7 @@ public static void main(final String[] args) { private static void catchAndThrow(final int i) { try { countdownAndThrow(i); - } catch (final Exception e) { + } catch (final RuntimeException e) { throw new RuntimeException(THROWN_ERR_MSG, e); } } @@ -76,9 +112,9 @@ private static void catchAndThrow(final int i) { * @param i Times to loop * @throws Exception */ - private static void countdownAndThrow(final int i) throws Exception { + private static void countdownAndThrow(final int i) throws RuntimeException { if (i == 0) { - throw new Exception(CAUGHT_ERR_MSG); + throw new RuntimeException(CAUGHT_ERR_MSG); } countdownAndThrow(i - 1); } diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index c03e9273..c2bc0d60 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -483,14 +483,17 @@ public int decide(final LoggingEvent event) { } /** - * Runs a java process which will throw a stack trace and makes sure it will group the stack trace. + * Runs a java process which will throw a stack trace and makes sure it + * will group the stack trace. */ @Test public void logCompleteStackTrace() { - final org.apache.log4j.Logger rootLogger = org.apache.log4j.Logger.getRootLogger(); + final org.apache.log4j.Logger rootLogger = + org.apache.log4j.Logger.getRootLogger(); final TestAppender appender = new TestAppender(); rootLogger.addAppender(appender); - final String[] commands = { getJavaExecLoc(), ("-cp"), System.getProperty("java.class.path"), + final String[] commands = { getJavaExecLoc(), ("-cp"), + System.getProperty("java.class.path"), "com.jcabi.log.VerboseProcessExample" }; final ProcessBuilder builder = new ProcessBuilder(commands); VerboseProcess process = null; @@ -507,15 +510,20 @@ public void logCompleteStackTrace() { } } Assert.assertNotNull(thrownException); - MatcherAssert.assertThat(thrownException.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_1)); - MatcherAssert.assertThat(thrownException.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_2)); - MatcherAssert.assertThat(thrownException.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_3)); - MatcherAssert.assertThat(thrownException.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_4)); + MatcherAssert.assertThat(thrownException.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_1)); + MatcherAssert.assertThat(thrownException.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_2)); + MatcherAssert.assertThat(thrownException.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_3)); + MatcherAssert.assertThat(thrownException.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_4)); boolean foundCompleteStack = false; for (final LoggingEvent event : appender.getLog()) { final String message = (String) event.getMessage(); if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { - final boolean containsCaughtException = message.contains(VerboseProcessExample.CAUGHT_ERR_MSG); + final boolean containsCaughtException = + message.contains(VerboseProcessExample.CAUGHT_ERR_MSG); Assert.assertTrue(containsCaughtException); foundCompleteStack = containsCaughtException; } @@ -534,7 +542,8 @@ public static String getJavaExecLoc() { if (SystemUtils.IS_OS_WINDOWS) { // Windows try { - final String sunLibPathNew = sunLibPath.replaceAll("\\\\", "\\\\\\\\"); + final String sunLibPathNew = + sunLibPath.replaceAll("\\\\", "\\\\\\\\"); sunLibPath = sunLibPathNew; javaExec = (sunLibPath + "\\bin\\java.exe"); // Test Location @@ -544,7 +553,7 @@ public static String getJavaExecLoc() { return javaExec; } } catch (final Exception e) { - throw new RuntimeException("Unable to get the Java Path. error = " + e.getMessage(), e); + throw new RuntimeException("Unable to get the Java Path", e); } } else { // Unix @@ -556,7 +565,7 @@ public static String getJavaExecLoc() { return javaExec; } } catch (final Exception e) { - throw new RuntimeException("Unable to get the Java Path. error = " + e.getMessage(), e); + throw new RuntimeException("Unable to get the Java Path", e); } } throw new RuntimeException("Unable to get the Java Path."); From 80df3b6633486521d56cbc32a6c66035f3540d0d Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 12:35:33 -0400 Subject: [PATCH 06/41] Adding more styling changes --- .../java/com/jcabi/log/VerboseProcess.java | 62 ++++----- .../com/jcabi/log/VerboseProcessExample.java | 79 ++++++------ .../com/jcabi/log/VerboseProcessTest.java | 121 +++++++++--------- 3 files changed, 127 insertions(+), 135 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index d7f60d85..81ba4aa2 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -393,11 +393,7 @@ private static final class Monitor implements Callable { /** * Maximum number of log lines for a stack trace. */ - private static final int DEFUALT_MAX_LENGTH = 1000; - /** - * Maximum number of log lines for a stack trace. - */ - private static final int maxStackLength = DEFUALT_MAX_LENGTH; + private static final int MAX_STACK_LENGTH = 1000; /** * Prefix "at ". */ @@ -418,6 +414,10 @@ private static final class Monitor implements Callable { * Empty String. */ private static final String NULL_STRING = new String() + '\u0000'; + /** + * Newline string. + */ + private static final String NEW_LINE = System.getProperty("line.separator"); /** * Stream to read. */ @@ -453,30 +453,39 @@ private static final class Monitor implements Callable { /** * Checks if line is part of a stack trace and should be appended. * @param string String to check - * @return boolean Result + * @return Result, true or false */ private static boolean shouldAppend(final String string) { final String leftStrip = stripStart(string); - return leftStrip.startsWith(PREFIX_AT) || - leftStrip.startsWith(PREFIX_CB) || - leftStrip.startsWith(PREFIX_DOTS); + return leftStrip.startsWith(PREFIX_AT) + || leftStrip.startsWith(PREFIX_CB) + || leftStrip.startsWith(PREFIX_DOTS); } /** * Strips whitespace at beginning of String. * @param string String to strip - * @return string Stripped string + * @return Stripped string */ private static String stripStart(final String string) { final int stringLength = string.length(); int start = 0; - while ((start != stringLength) && - Character.isWhitespace(string.charAt(start))) { + while ((start != stringLength) + && Character.isWhitespace(string.charAt(start))) { ++start; } return string.substring(start); } + private static void log(BufferedWriter writer, Level level, + StringBuilder builder) throws IOException { + if (builder.length() > 0) { + final String logText = builder.toString(); + Logger.log(level, VerboseProcess.class, LOG_FORMAT, logText); + writer.write(logText); + } + } + @Override public Void call() throws Exception { final BufferedReader reader = new BufferedReader( @@ -491,7 +500,7 @@ public Void call() throws Exception { ); try { StringBuilder builder = new StringBuilder(); - String previousLine = NULL_STRING; + String previous = NULL_STRING; int lineCount = 0; while (true) { if (Thread.interrupted()) { @@ -501,34 +510,25 @@ public Void call() throws Exception { ); break; } - if (previousLine != NULL_STRING) { - builder.append(previousLine).append( - System.getProperty("line.separator")); - previousLine = NULL_STRING; + if (previous != NULL_STRING) { + builder.append(previous).append(NEW_LINE); + previous = NULL_STRING; } final String line = reader.readLine(); if (line == null) { - if (builder.length() > 0) { - final String logText = builder.toString(); - Logger.log(this.level, VerboseProcess.class, - LOG_FORMAT, logText); - writer.write(logText); - } + log(writer, this.level, builder); break; } - if (shouldAppend(line) && (++lineCount < maxStackLength)) { - builder.append(line).append( - System.getProperty("line.separator")); + if (shouldAppend(line) + && (++lineCount < MAX_STACK_LENGTH)) { + builder.append(line).append(NEW_LINE); } else { if (builder.length() > 0) { - final String logText = builder.toString(); - Logger.log(this.level, VerboseProcess.class, - LOG_FORMAT, logText); - writer.write(logText); + log(writer, this.level, builder); builder = new StringBuilder(); } lineCount = 1; - previousLine = line; + previous = line; } } } catch (final ClosedByInterruptException ex) { diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 2702cdcb..03b59e9f 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -32,91 +32,88 @@ /** * Example application to help test {@link VerboseProcess}. * @author Dean Clark (dean.clark@gmail.com) + * @version $Id$ */ - public class VerboseProcessExample { +public class VerboseProcessExample { /** * System output line 1. */ - protected static final String SYSOUT_1 = "sysout line 1"; + static final String SYSOUT_1 = "sysout line 1"; + /** * System output line 2. */ - protected static final String SYSOUT_2 = "sysout line 2"; - /** - * System output line 3. - */ - protected static final String SYSOUT_3 = "sysout line 3"; - /** - * System output line 4. - */ - protected static final String SYSOUT_4 = "sysout line 4"; + static final String SYSOUT_2 = "sysout line 2"; + /** * Error output line 1. */ - protected static final String SYSERR_1 = "syserr line 1"; + static final String SYSERR_1 = "syserr line 1"; + /** * Error output line 2. */ - protected static final String SYSERR_2 = "syserr line 2"; + static final String SYSERR_2 = "syserr line 2"; + /** - * Error output line 3. + * Exception to be thrown and caught. */ - protected static final String SYSERR_3 = "syserr line 3"; + static final String CAUGHT_ERR_MSG = "throw/catch me"; + /** - * Error output line 4. + * Exception to be thrown. */ - protected static final String SYSERR_4 = "syserr line 4"; + static final String THROWN_ERR_MSG = "just throw me"; + /** - * Exception to be thrown and caught. + * Private constructor since class should not be instantiated. */ - protected static final String CAUGHT_ERR_MSG = "this error gets thrown" - + " and caught"; + private VerboseProcessExample() {} + /** - * Exception to be thrown. + * Instantiates instance of this class and calls primary method + * @param args Any args passed to main method */ - protected static final String THROWN_ERR_MSG = "this error was caused by" - + " the other one"; + public static void main(final String[] args) { + VerboseProcessExample instance = new VerboseProcessExample(); + instance.doWork(); + } /** - * Will log to standard output and error and then intentionally fail with a + * Will log to standard output and error and then intentionally fail with a * stack trace. - * @param args */ - public static void main(final String[] args) { + public void doWork() { System.out.println(SYSOUT_1); System.err.println(SYSOUT_1); System.out.println(SYSOUT_2); System.err.println(SYSOUT_2); - System.out.println(SYSOUT_3); - System.err.println(SYSOUT_3); - System.out.println(SYSOUT_4); - System.err.println(SYSOUT_4); - catchAndThrow(20); + catchAndThrow(); } /** * Call a method which will throw an exception. Then catch and re-throw it. - * @param i Times to loop + * @param loopCount Times to loop */ - private static void catchAndThrow(final int i) { + private static void catchAndThrow() { try { - countdownAndThrow(i); - } catch (final RuntimeException e) { - throw new RuntimeException(THROWN_ERR_MSG, e); + countdownAndThrow(2); + } catch (final IllegalStateException exception) { + throw new IllegalStateException(THROWN_ERR_MSG, exception); } } /** * Recursively loops i-times and then throws an exception. - * @param i Times to loop + * @param loopCount Times to loop * @throws Exception */ - private static void countdownAndThrow(final int i) throws RuntimeException { - if (i == 0) { - throw new RuntimeException(CAUGHT_ERR_MSG); + private static void countdownAndThrow(final int loopCount) throws RuntimeException { + if (loopCount == 0) { + throw new IllegalStateException(CAUGHT_ERR_MSG); } - countdownAndThrow(i - 1); + countdownAndThrow(loopCount - 1); } } diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index c2bc0d60..bffbebc0 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -483,43 +483,50 @@ public int decide(final LoggingEvent event) { } /** - * Runs a java process which will throw a stack trace and makes sure it + * Runs a java process which will throw a stack trace and makes sure it * will group the stack trace. */ @Test public void logCompleteStackTrace() { - final org.apache.log4j.Logger rootLogger = + final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getRootLogger(); final TestAppender appender = new TestAppender(); - rootLogger.addAppender(appender); - final String[] commands = { getJavaExecLoc(), ("-cp"), - System.getProperty("java.class.path"), - "com.jcabi.log.VerboseProcessExample" }; + logger.addAppender(appender); + final String[] commands = new String[] { retrieveJavaExecLocation(), + "-cp", System.getProperty("java.class.path"), + "com.jcabi.log.VerboseProcessExample" + }; final ProcessBuilder builder = new ProcessBuilder(commands); VerboseProcess process = null; - RuntimeException thrownException = null; + IllegalArgumentException caught = null; try { process = new VerboseProcess(builder, Level.INFO, Level.SEVERE); process.stdout(); - } catch (final RuntimeException e) { - thrownException = e; + } catch (final IllegalArgumentException e) { + caught = e; } finally { - rootLogger.removeAppender(appender); + logger.removeAppender(appender); if (process != null) { process.close(); } } - Assert.assertNotNull(thrownException); - MatcherAssert.assertThat(thrownException.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_1)); - MatcherAssert.assertThat(thrownException.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_2)); - MatcherAssert.assertThat(thrownException.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_3)); - MatcherAssert.assertThat(thrownException.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_4)); + Assert.assertNotNull(caught); + MatcherAssert.assertThat(caught.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_1) + ); + MatcherAssert.assertThat(caught.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_2) + ); + verifyLogs(appender); + } + + /** + * Checks appender to make sure expected log statements are present. + * @param appender Log appender + */ + private void verifyLogs(final TestAppender appender) { boolean foundCompleteStack = false; - for (final LoggingEvent event : appender.getLog()) { + for (final LoggingEvent event : appender.getLogs()) { final String message = (String) event.getMessage(); if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { final boolean containsCaughtException = @@ -533,42 +540,26 @@ public void logCompleteStackTrace() { /** * Gets the location of Java, whether on Linux of Windows. - * @return + * @return String with Java location */ - public static String getJavaExecLoc() { - String javaExec = null; - String sunLibPath = System.getProperty("java.home"); - javaExec = new String(); + public static String retrieveJavaExecLocation() { + String rootpath = System.getProperty("java.home"); if (SystemUtils.IS_OS_WINDOWS) { - // Windows - try { - final String sunLibPathNew = - sunLibPath.replaceAll("\\\\", "\\\\\\\\"); - sunLibPath = sunLibPathNew; - javaExec = (sunLibPath + "\\bin\\java.exe"); - // Test Location - final File file1 = new File(javaExec); - if (file1.exists()) { - System.out.println("File [" + javaExec + "] exists."); - return javaExec; - } - } catch (final Exception e) { - throw new RuntimeException("Unable to get the Java Path", e); + final String winpath = + rootpath.replaceAll("\\\\", "\\\\\\\\"); + final String finalpath = winpath + "\\bin\\java.exe"; + final File file = new File(finalpath); + if (file.exists()) { + return finalpath; } } else { - // Unix - try { - javaExec = sunLibPath + "/bin/java"; - // Test Location - final File file1 = new File(javaExec); - if (file1.exists()) { - return javaExec; - } - } catch (final Exception e) { - throw new RuntimeException("Unable to get the Java Path", e); + final String linuxpath = rootpath + "/bin/java"; + final File file = new File(linuxpath); + if (file.exists()) { + return linuxpath; } } - throw new RuntimeException("Unable to get the Java Path."); + throw new IllegalStateException("Unable to get the Java Path."); } /** @@ -579,7 +570,21 @@ class TestAppender extends AppenderSkeleton { /** * List of logging events. */ - private final List log = new ArrayList(); + private final List logs = new ArrayList(10); + + /** + * Provides all captured logging events. + * @return Copy of log list + */ + public List getLogs() { + return new ArrayList(this.logs); + } + + /** + * Nothing to to here but it must be implemented. + */ + @Override + public void close() {} @Override public boolean requiresLayout() { @@ -587,19 +592,9 @@ public boolean requiresLayout() { } @Override - protected void append(final LoggingEvent loggingEvent) { - log.add(loggingEvent); + protected void append(final LoggingEvent event) { + this.logs.add(event); } - @Override - public void close() {} - - /** - * Provides all captured logging events. - * @return copy of log list - */ - public List getLog() { - return new ArrayList(log); - } } } From 2975b0676f3e7f8d7307635c8f95bd64e1357adc Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 13:04:16 -0400 Subject: [PATCH 07/41] More styling updates --- .../java/com/jcabi/log/VerboseProcess.java | 14 +- .../com/jcabi/log/VerboseProcessExample.java | 237 +++++++++--------- .../com/jcabi/log/VerboseProcessTest.java | 27 +- 3 files changed, 143 insertions(+), 135 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 81ba4aa2..a9412ad8 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -417,7 +417,9 @@ private static final class Monitor implements Callable { /** * Newline string. */ - private static final String NEW_LINE = System.getProperty("line.separator"); + private static final String NEW_LINE = System.getProperty( + "line.separator" + ); /** * Stream to read. */ @@ -477,8 +479,14 @@ private static String stripStart(final String string) { return string.substring(start); } - private static void log(BufferedWriter writer, Level level, - StringBuilder builder) throws IOException { + /** + * Logs supplied StringBuilder to supplied Logger and Writer. + * @param writer Writer to use + * @param level Level to log at + * @param builder StringBuilder with log statment + */ + private static void log(final BufferedWriter writer, final Level level, + final StringBuilder builder) throws IOException { if (builder.length() > 0) { final String logText = builder.toString(); Logger.log(level, VerboseProcess.class, LOG_FORMAT, logText); diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 03b59e9f..5a12b1cf 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -1,119 +1,118 @@ -/** - * Copyright (c) 2012-2015, jcabi.com - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: 1) Redistributions of source code must retain the above - * copyright notice, this list of conditions and the following - * disclaimer. 2) Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. 3) Neither the name of the jcabi.com nor - * the names of its contributors may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT - * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package com.jcabi.log; - -/** - * Example application to help test {@link VerboseProcess}. - * @author Dean Clark (dean.clark@gmail.com) - * @version $Id$ - */ -public class VerboseProcessExample { - - /** - * System output line 1. - */ - static final String SYSOUT_1 = "sysout line 1"; - - /** - * System output line 2. - */ - static final String SYSOUT_2 = "sysout line 2"; - - /** - * Error output line 1. - */ - static final String SYSERR_1 = "syserr line 1"; - - /** - * Error output line 2. - */ - static final String SYSERR_2 = "syserr line 2"; - - /** - * Exception to be thrown and caught. - */ - static final String CAUGHT_ERR_MSG = "throw/catch me"; - - /** - * Exception to be thrown. - */ - static final String THROWN_ERR_MSG = "just throw me"; - - /** - * Private constructor since class should not be instantiated. - */ - private VerboseProcessExample() {} - - /** - * Instantiates instance of this class and calls primary method - * @param args Any args passed to main method - */ - public static void main(final String[] args) { - VerboseProcessExample instance = new VerboseProcessExample(); - instance.doWork(); - } - - /** - * Will log to standard output and error and then intentionally fail with a - * stack trace. - */ - public void doWork() { - System.out.println(SYSOUT_1); - System.err.println(SYSOUT_1); - System.out.println(SYSOUT_2); - System.err.println(SYSOUT_2); - catchAndThrow(); - } - - /** - * Call a method which will throw an exception. Then catch and re-throw it. - * @param loopCount Times to loop - */ - private static void catchAndThrow() { - try { - countdownAndThrow(2); - } catch (final IllegalStateException exception) { - throw new IllegalStateException(THROWN_ERR_MSG, exception); - } - } - - /** - * Recursively loops i-times and then throws an exception. - * @param loopCount Times to loop - * @throws Exception - */ - private static void countdownAndThrow(final int loopCount) throws RuntimeException { - if (loopCount == 0) { - throw new IllegalStateException(CAUGHT_ERR_MSG); - } - countdownAndThrow(loopCount - 1); - } - -} +/** + * Copyright (c) 2012-2015, jcabi.com + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: 1) Redistributions of source code must retain the above + * copyright notice, this list of conditions and the following + * disclaimer. 2) Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. 3) Neither the name of the jcabi.com nor + * the names of its contributors may be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.jcabi.log; + +/** + * Example application to help test {@link VerboseProcess}. + * @author Dean Clark (dean.clark@gmail.com) + * @version $Id$ + */ +public class VerboseProcessExample { + + /** + * System output line 1. + */ + static final String SYSOUT_1 = "sysout line 1"; + + /** + * System output line 2. + */ + static final String SYSOUT_2 = "sysout line 2"; + + /** + * Error output line 1. + */ + static final String SYSERR_1 = "syserr line 1"; + + /** + * Error output line 2. + */ + static final String SYSERR_2 = "syserr line 2"; + + /** + * Exception to be thrown and caught. + */ + static final String CAUGHT_ERR_MSG = "throw/catch me"; + + /** + * Exception to be thrown. + */ + static final String THROWN_ERR_MSG = "just throw me"; + + /** + * Private constructor since class should not be instantiated. + */ + private VerboseProcessExample() { } + + /** + * Instantiates instance of this class and calls primary method. + * @param args Any args passed to main method + */ + public static void main(final String[] args) { + VerboseProcessExample instance = new VerboseProcessExample(); + instance.doWork(); + } + + /** + * Will log to standard output and error and then intentionally fail with a + * stack trace. + */ + public void doWork() { + System.out.println(SYSOUT_1); + System.err.println(SYSOUT_1); + System.out.println(SYSOUT_2); + System.err.println(SYSOUT_2); + catchAndThrow(); + } + + /** + * Call a method which will throw an exception. Then catch and re-throw it. + */ + private static void catchAndThrow() { + try { + countdownAndThrow(2); + } catch (final IllegalStateException exception) { + throw new IllegalStateException(THROWN_ERR_MSG, exception); + } + } + + /** + * Recursively loops i-times and then throws an exception. + * @param loopCount Times to loop + * @throws Exception + */ + private static void countdownAndThrow(final int loopCount) throws RuntimeException { + if (loopCount == 0) { + throw new IllegalStateException(CAUGHT_ERR_MSG); + } + countdownAndThrow(loopCount - 1); + } + +} diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index bffbebc0..b8082e32 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -492,10 +492,11 @@ public void logCompleteStackTrace() { org.apache.log4j.Logger.getRootLogger(); final TestAppender appender = new TestAppender(); logger.addAppender(appender); - final String[] commands = new String[] { retrieveJavaExecLocation(), - "-cp", System.getProperty("java.class.path"), - "com.jcabi.log.VerboseProcessExample" - }; + final String[] commands = new String[] { + retrieveJavaExecLocation(), "-cp", + System.getProperty("java.class.path"), + "com.jcabi.log.VerboseProcessExample" + }; final ProcessBuilder builder = new ProcessBuilder(commands); VerboseProcess process = null; IllegalArgumentException caught = null; @@ -543,17 +544,20 @@ private void verifyLogs(final TestAppender appender) { * @return String with Java location */ public static String retrieveJavaExecLocation() { - String rootpath = System.getProperty("java.home"); + final String rootpath = System.getProperty("java.home"); if (SystemUtils.IS_OS_WINDOWS) { final String winpath = rootpath.replaceAll("\\\\", "\\\\\\\\"); - final String finalpath = winpath + "\\bin\\java.exe"; + final String finalpath = String.format("%s%s", winpath, + "\\bin\\java.exe" + ); final File file = new File(finalpath); if (file.exists()) { return finalpath; } } else { - final String linuxpath = rootpath + "/bin/java"; + final String linuxpath = String.format("%s%s", rootpath, + "/bin/java"); final File file = new File(linuxpath); if (file.exists()) { return linuxpath; @@ -577,14 +581,11 @@ class TestAppender extends AppenderSkeleton { * @return Copy of log list */ public List getLogs() { - return new ArrayList(this.logs); + return new ArrayList(this.logs); } - /** - * Nothing to to here but it must be implemented. - */ @Override - public void close() {} + public void close() { } @Override public boolean requiresLayout() { @@ -593,7 +594,7 @@ public boolean requiresLayout() { @Override protected void append(final LoggingEvent event) { - this.logs.add(event); + this.logs.add(event); } } From 1d487897a8e929a434e497dcb0f1b1810b060dd6 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 13:16:18 -0400 Subject: [PATCH 08/41] Hopefully final styling changes --- .../java/com/jcabi/log/VerboseProcess.java | 3 +- .../com/jcabi/log/VerboseProcessExample.java | 14 +- .../com/jcabi/log/VerboseProcessTest.java | 174 +++++++++--------- 3 files changed, 97 insertions(+), 94 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index a9412ad8..0f5436f7 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -483,7 +483,8 @@ private static String stripStart(final String string) { * Logs supplied StringBuilder to supplied Logger and Writer. * @param writer Writer to use * @param level Level to log at - * @param builder StringBuilder with log statment + * @param builder StringBuilder with log statement + * @throws IOException writer could throw this */ private static void log(final BufferedWriter writer, final Level level, final StringBuilder builder) throws IOException { diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 5a12b1cf..115e71f9 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -98,21 +98,21 @@ public void doWork() { private static void catchAndThrow() { try { countdownAndThrow(2); - } catch (final IllegalStateException exception) { - throw new IllegalStateException(THROWN_ERR_MSG, exception); + } catch (final IllegalStateException ex) { + throw new IllegalStateException(THROWN_ERR_MSG, ex); } } /** * Recursively loops i-times and then throws an exception. - * @param loopCount Times to loop - * @throws Exception + * @param loops Times to loop + * @throws IllegalStateException */ - private static void countdownAndThrow(final int loopCount) throws RuntimeException { - if (loopCount == 0) { + private static void countdownAndThrow(final int loops) throws IllegalStateException { + if (loops == 0) { throw new IllegalStateException(CAUGHT_ERR_MSG); } - countdownAndThrow(loopCount - 1); + countdownAndThrow(loops - 1); } } diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index b8082e32..682cafcc 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -58,7 +58,6 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -import org.slf4j.LoggerFactory; /** * Test case for {@link VerboseProcess}. @@ -313,6 +312,93 @@ public void terminatesMonitorsAndProcessIfClosedNormal() throws Exception { this.terminatesMonitorsAndProcessIfClosed(delay); } + /** + * Runs a java process which will throw a stack trace and makes sure it + * will group the stack trace. + */ + @Test + public void logCompleteStackTrace() { + final org.apache.log4j.Logger logger = + org.apache.log4j.Logger.getRootLogger(); + final TestAppender appender = new TestAppender(); + logger.addAppender(appender); + final String[] commands = new String[] { + retrieveJavaExecLocation(), "-cp", + System.getProperty("java.class.path"), + "com.jcabi.log.VerboseProcessExample" + }; + final ProcessBuilder builder = new ProcessBuilder(commands); + VerboseProcess process = null; + IllegalArgumentException caught = null; + try { + process = new VerboseProcess(builder, Level.INFO, Level.SEVERE); + process.stdout(); + } catch (final IllegalArgumentException ex) { + caught = ex; + } finally { + logger.removeAppender(appender); + if (process != null) { + process.close(); + } + } + Assert.assertNotNull(caught); + MatcherAssert.assertThat( + caught.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_1) + ); + MatcherAssert.assertThat( + caught.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_2) + ); + verifyLogs(appender); + } + + /** + * Checks appender to make sure expected log statements are present. + * @param appender Log appender + */ + private static void verifyLogs(final TestAppender appender) { + boolean foundCompleteStack = false; + for (final LoggingEvent event : appender.getLogs()) { + final String message = (String) event.getMessage(); + if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { + final boolean containsCaughtException = + message.contains(VerboseProcessExample.CAUGHT_ERR_MSG); + Assert.assertTrue(containsCaughtException); + foundCompleteStack = containsCaughtException; + } + } + Assert.assertTrue(foundCompleteStack); + } + + /** + * Gets the location of Java, whether on Linux of Windows. + * @return String with Java location + */ + public static String retrieveJavaExecLocation() { + final String rootpath = System.getProperty("java.home"); + if (SystemUtils.IS_OS_WINDOWS) { + final String winpath = + rootpath.replaceAll("\\\\", "\\\\\\\\"); + final String finalpath = String.format( + "%s%s", winpath, "\\bin\\java.exe" + ); + final File file = new File(finalpath); + if (file.exists()) { + return finalpath; + } + } else { + final String linuxpath = String.format( + "%s%s", rootpath, "/bin/java" + ); + final File file = new File(linuxpath); + if (file.exists()) { + return linuxpath; + } + } + throw new IllegalStateException("Unable to get the Java Path."); + } + /** * VerboseProcess can terminate its monitors and underlying Process if * closed after specified time since real usage. @@ -482,95 +568,11 @@ public int decide(final LoggingEvent event) { } } - /** - * Runs a java process which will throw a stack trace and makes sure it - * will group the stack trace. - */ - @Test - public void logCompleteStackTrace() { - final org.apache.log4j.Logger logger = - org.apache.log4j.Logger.getRootLogger(); - final TestAppender appender = new TestAppender(); - logger.addAppender(appender); - final String[] commands = new String[] { - retrieveJavaExecLocation(), "-cp", - System.getProperty("java.class.path"), - "com.jcabi.log.VerboseProcessExample" - }; - final ProcessBuilder builder = new ProcessBuilder(commands); - VerboseProcess process = null; - IllegalArgumentException caught = null; - try { - process = new VerboseProcess(builder, Level.INFO, Level.SEVERE); - process.stdout(); - } catch (final IllegalArgumentException e) { - caught = e; - } finally { - logger.removeAppender(appender); - if (process != null) { - process.close(); - } - } - Assert.assertNotNull(caught); - MatcherAssert.assertThat(caught.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_1) - ); - MatcherAssert.assertThat(caught.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_2) - ); - verifyLogs(appender); - } - - /** - * Checks appender to make sure expected log statements are present. - * @param appender Log appender - */ - private void verifyLogs(final TestAppender appender) { - boolean foundCompleteStack = false; - for (final LoggingEvent event : appender.getLogs()) { - final String message = (String) event.getMessage(); - if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { - final boolean containsCaughtException = - message.contains(VerboseProcessExample.CAUGHT_ERR_MSG); - Assert.assertTrue(containsCaughtException); - foundCompleteStack = containsCaughtException; - } - } - Assert.assertTrue(foundCompleteStack); - } - - /** - * Gets the location of Java, whether on Linux of Windows. - * @return String with Java location - */ - public static String retrieveJavaExecLocation() { - final String rootpath = System.getProperty("java.home"); - if (SystemUtils.IS_OS_WINDOWS) { - final String winpath = - rootpath.replaceAll("\\\\", "\\\\\\\\"); - final String finalpath = String.format("%s%s", winpath, - "\\bin\\java.exe" - ); - final File file = new File(finalpath); - if (file.exists()) { - return finalpath; - } - } else { - final String linuxpath = String.format("%s%s", rootpath, - "/bin/java"); - final File file = new File(linuxpath); - if (file.exists()) { - return linuxpath; - } - } - throw new IllegalStateException("Unable to get the Java Path."); - } - /** * Logger appender that compiles a list of all LoggingEvents. * @author dean.e.clark */ - class TestAppender extends AppenderSkeleton { + private class TestAppender extends AppenderSkeleton { /** * List of logging events. */ From fed0c7d830613b1cac2dbeee5c9be9b6d52afe0a Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 13:26:09 -0400 Subject: [PATCH 09/41] More styling changes --- .../java/com/jcabi/log/VerboseProcess.java | 32 ++++++------- .../com/jcabi/log/VerboseProcessTest.java | 46 +++++++++---------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 0f5436f7..b0759e2e 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -479,22 +479,6 @@ private static String stripStart(final String string) { return string.substring(start); } - /** - * Logs supplied StringBuilder to supplied Logger and Writer. - * @param writer Writer to use - * @param level Level to log at - * @param builder StringBuilder with log statement - * @throws IOException writer could throw this - */ - private static void log(final BufferedWriter writer, final Level level, - final StringBuilder builder) throws IOException { - if (builder.length() > 0) { - final String logText = builder.toString(); - Logger.log(level, VerboseProcess.class, LOG_FORMAT, logText); - writer.write(logText); - } - } - @Override public Void call() throws Exception { final BufferedReader reader = new BufferedReader( @@ -561,6 +545,22 @@ public Void call() throws Exception { } return null; } + + /** + * Logs supplied StringBuilder to supplied Logger and Writer. + * @param writer Writer to use + * @param level Level to log at + * @param builder StringBuilder with log statement + * @throws IOException writer could throw this + */ + private static void log(final BufferedWriter writer, final Level level, + final StringBuilder builder) throws IOException { + if (builder.length() > 0) { + final String logText = builder.toString(); + Logger.log(level, VerboseProcess.class, LOG_FORMAT, logText); + writer.write(logText); + } + } } /** diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 682cafcc..549fe59c 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -325,7 +325,7 @@ public void logCompleteStackTrace() { final String[] commands = new String[] { retrieveJavaExecLocation(), "-cp", System.getProperty("java.class.path"), - "com.jcabi.log.VerboseProcessExample" + "com.jcabi.log.VerboseProcessExample", }; final ProcessBuilder builder = new ProcessBuilder(commands); VerboseProcess process = null; @@ -343,34 +343,16 @@ public void logCompleteStackTrace() { } Assert.assertNotNull(caught); MatcherAssert.assertThat( - caught.getMessage(), + caught.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_1) ); MatcherAssert.assertThat( - caught.getMessage(), + caught.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_2) ); verifyLogs(appender); } - /** - * Checks appender to make sure expected log statements are present. - * @param appender Log appender - */ - private static void verifyLogs(final TestAppender appender) { - boolean foundCompleteStack = false; - for (final LoggingEvent event : appender.getLogs()) { - final String message = (String) event.getMessage(); - if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { - final boolean containsCaughtException = - message.contains(VerboseProcessExample.CAUGHT_ERR_MSG); - Assert.assertTrue(containsCaughtException); - foundCompleteStack = containsCaughtException; - } - } - Assert.assertTrue(foundCompleteStack); - } - /** * Gets the location of Java, whether on Linux of Windows. * @return String with Java location @@ -381,7 +363,7 @@ public static String retrieveJavaExecLocation() { final String winpath = rootpath.replaceAll("\\\\", "\\\\\\\\"); final String finalpath = String.format( - "%s%s", winpath, "\\bin\\java.exe" + "%s%s", winpath, "\\bin\\java.exe" ); final File file = new File(finalpath); if (file.exists()) { @@ -389,7 +371,7 @@ public static String retrieveJavaExecLocation() { } } else { final String linuxpath = String.format( - "%s%s", rootpath, "/bin/java" + "%s%s", rootpath, "/bin/java" ); final File file = new File(linuxpath); if (file.exists()) { @@ -399,6 +381,24 @@ public static String retrieveJavaExecLocation() { throw new IllegalStateException("Unable to get the Java Path."); } + /** + * Checks appender to make sure expected log statements are present. + * @param appender Log appender + */ + private static void verifyLogs(final TestAppender appender) { + boolean foundCompleteStack = false; + for (final LoggingEvent event : appender.getLogs()) { + final String message = (String) event.getMessage(); + if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { + final boolean containsCaughtException = + message.contains(VerboseProcessExample.CAUGHT_ERR_MSG); + Assert.assertTrue(containsCaughtException); + foundCompleteStack = containsCaughtException; + } + } + Assert.assertTrue(foundCompleteStack); + } + /** * VerboseProcess can terminate its monitors and underlying Process if * closed after specified time since real usage. From 256d4f38c163d78173247543d33004a04e3956c1 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 13:42:50 -0400 Subject: [PATCH 10/41] Light refactoring and some more styling changes --- .../java/com/jcabi/log/VerboseProcess.java | 130 +++++++++--------- .../com/jcabi/log/VerboseProcessExample.java | 5 +- 2 files changed, 70 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index b0759e2e..f104585c 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -452,39 +452,11 @@ private static final class Monitor implements Callable { this.level = lvl; } - /** - * Checks if line is part of a stack trace and should be appended. - * @param string String to check - * @return Result, true or false - */ - private static boolean shouldAppend(final String string) { - final String leftStrip = stripStart(string); - return leftStrip.startsWith(PREFIX_AT) - || leftStrip.startsWith(PREFIX_CB) - || leftStrip.startsWith(PREFIX_DOTS); - } - - /** - * Strips whitespace at beginning of String. - * @param string String to strip - * @return Stripped string - */ - private static String stripStart(final String string) { - final int stringLength = string.length(); - int start = 0; - while ((start != stringLength) - && Character.isWhitespace(string.charAt(start))) { - ++start; - } - return string.substring(start); - } - @Override public Void call() throws Exception { final BufferedReader reader = new BufferedReader( Channels.newReader( - Channels.newChannel(this.input), - VerboseProcess.UTF_8 + Channels.newChannel(this.input), VerboseProcess.UTF_8 ) ); try { @@ -492,38 +464,7 @@ public Void call() throws Exception { new OutputStreamWriter(this.output, VerboseProcess.UTF_8) ); try { - StringBuilder builder = new StringBuilder(); - String previous = NULL_STRING; - int lineCount = 0; - while (true) { - if (Thread.interrupted()) { - Logger.debug( - VerboseProcess.class, - "explicitly interrupting read from buffer" - ); - break; - } - if (previous != NULL_STRING) { - builder.append(previous).append(NEW_LINE); - previous = NULL_STRING; - } - final String line = reader.readLine(); - if (line == null) { - log(writer, this.level, builder); - break; - } - if (shouldAppend(line) - && (++lineCount < MAX_STACK_LENGTH)) { - builder.append(line).append(NEW_LINE); - } else { - if (builder.length() > 0) { - log(writer, this.level, builder); - builder = new StringBuilder(); - } - lineCount = 1; - previous = line; - } - } + logFromReader(reader, writer); } catch (final ClosedByInterruptException ex) { Thread.interrupted(); Logger.debug( @@ -545,6 +486,43 @@ public Void call() throws Exception { } return null; } + + private void logFromReader(final BufferedReader reader, + final BufferedWriter writer) throws IOException, + ClosedByInterruptException { + StringBuilder builder = new StringBuilder(); + String previous = NULL_STRING; + int lineCount = 0; + while (true) { + if (Thread.interrupted()) { + Logger.debug( + VerboseProcess.class, + "explicitly interrupting read from buffer" + ); + break; + } + if (previous != NULL_STRING) { + builder.append(previous).append(NEW_LINE); + previous = NULL_STRING; + } + final String line = reader.readLine(); + if (line == null) { + doLog(writer, this.level, builder); + break; + } + if (shouldAppend(line) + && (++lineCount < MAX_STACK_LENGTH)) { + builder.append(line).append(NEW_LINE); + } else { + if (builder.length() > 0) { + doLog(writer, this.level, builder); + builder = new StringBuilder(); + } + lineCount = 1; + previous = line; + } + } + } /** * Logs supplied StringBuilder to supplied Logger and Writer. @@ -553,7 +531,7 @@ public Void call() throws Exception { * @param builder StringBuilder with log statement * @throws IOException writer could throw this */ - private static void log(final BufferedWriter writer, final Level level, + private static void doLog(final BufferedWriter writer, final Level level, final StringBuilder builder) throws IOException { if (builder.length() > 0) { final String logText = builder.toString(); @@ -561,6 +539,34 @@ private static void log(final BufferedWriter writer, final Level level, writer.write(logText); } } + + /** + * Checks if line is part of a stack trace and should be appended. + * @param string String to check + * @return Result, true or false + */ + private static boolean shouldAppend(final String string) { + final String leftStrip = stripStart(string); + return leftStrip.startsWith(PREFIX_AT) + || leftStrip.startsWith(PREFIX_CB) + || leftStrip.startsWith(PREFIX_DOTS); + } + + /** + * Strips whitespace at beginning of String. + * @param string String to strip + * @return Stripped string + */ + private static String stripStart(final String string) { + final int stringLength = string.length(); + int start = 0; + while ((start != stringLength) + && Character.isWhitespace(string.charAt(start))) { + ++start; + } + return string.substring(start); + } + } /** diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 115e71f9..4982e25c 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -76,7 +76,7 @@ private VerboseProcessExample() { } * @param args Any args passed to main method */ public static void main(final String[] args) { - VerboseProcessExample instance = new VerboseProcessExample(); + final VerboseProcessExample instance = new VerboseProcessExample(); instance.doWork(); } @@ -106,9 +106,8 @@ private static void catchAndThrow() { /** * Recursively loops i-times and then throws an exception. * @param loops Times to loop - * @throws IllegalStateException */ - private static void countdownAndThrow(final int loops) throws IllegalStateException { + private static void countdownAndThrow(final int loops) { if (loops == 0) { throw new IllegalStateException(CAUGHT_ERR_MSG); } From 6e07c94f4edd4828d42b43ece682029bb102d166 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 15:02:47 -0400 Subject: [PATCH 11/41] More styling changes --- src/main/java/com/jcabi/log/VerboseProcess.java | 5 +++-- .../java/com/jcabi/log/VerboseProcessTest.java | 17 +++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index f104585c..6e37586c 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -531,8 +531,9 @@ private void logFromReader(final BufferedReader reader, * @param builder StringBuilder with log statement * @throws IOException writer could throw this */ - private static void doLog(final BufferedWriter writer, final Level level, - final StringBuilder builder) throws IOException { + private static void doLog(final BufferedWriter writer, + final Level level, final StringBuilder builder) + throws IOException { if (builder.length() > 0) { final String logText = builder.toString(); Logger.log(level, VerboseProcess.class, LOG_FORMAT, logText); diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 549fe59c..3f92b39d 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -328,20 +328,21 @@ public void logCompleteStackTrace() { "com.jcabi.log.VerboseProcessExample", }; final ProcessBuilder builder = new ProcessBuilder(commands); - VerboseProcess process = null; - IllegalArgumentException caught = null; + final VerboseProcess process = new VerboseProcess( + builder, Level.INFO, Level.SEVERE + ); + IllegalArgumentException caught = new IllegalArgumentException(); + boolean failed = false; try { - process = new VerboseProcess(builder, Level.INFO, Level.SEVERE); process.stdout(); } catch (final IllegalArgumentException ex) { caught = ex; + failed = true; } finally { logger.removeAppender(appender); - if (process != null) { - process.close(); - } + process.close(); } - Assert.assertNotNull(caught); + Assert.assertTrue("Process should have failed!", failed); MatcherAssert.assertThat( caught.getMessage(), Matchers.containsString(VerboseProcessExample.SYSOUT_1) @@ -357,7 +358,7 @@ public void logCompleteStackTrace() { * Gets the location of Java, whether on Linux of Windows. * @return String with Java location */ - public static String retrieveJavaExecLocation() { + private static String retrieveJavaExecLocation() { final String rootpath = System.getProperty("java.home"); if (SystemUtils.IS_OS_WINDOWS) { final String winpath = From a3bfd27e40bd0197f0e19032f2d1370a1dc95caf Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 15:06:42 -0400 Subject: [PATCH 12/41] Styling --- src/main/java/com/jcabi/log/VerboseProcess.java | 2 +- src/test/java/com/jcabi/log/VerboseProcessExample.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 6e37586c..b317d351 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -464,7 +464,7 @@ public Void call() throws Exception { new OutputStreamWriter(this.output, VerboseProcess.UTF_8) ); try { - logFromReader(reader, writer); + this.logFromReader(reader, writer); } catch (final ClosedByInterruptException ex) { Thread.interrupted(); Logger.debug( diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 4982e25c..b9d6e6b9 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -67,7 +67,7 @@ public class VerboseProcessExample { static final String THROWN_ERR_MSG = "just throw me"; /** - * Private constructor since class should not be instantiated. + * Private constructor. */ private VerboseProcessExample() { } @@ -104,7 +104,7 @@ private static void catchAndThrow() { } /** - * Recursively loops i-times and then throws an exception. + * Recursively loops and then throws an exception. * @param loops Times to loop */ private static void countdownAndThrow(final int loops) { From 12c800bf70805dd9b967b270ffafcf35b3b3b41f Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 15:15:35 -0400 Subject: [PATCH 13/41] More styling --- .../java/com/jcabi/log/VerboseProcess.java | 18 ++++++++++++++---- .../com/jcabi/log/VerboseProcessExample.java | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index b317d351..07c8e436 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -413,7 +413,9 @@ private static final class Monitor implements Callable { /** * Empty String. */ - private static final String NULL_STRING = new String() + '\u0000'; + private static final String NULL_STRING = String.format( + "%s%c", "", '\u0000' + ); /** * Newline string. */ @@ -486,9 +488,17 @@ public Void call() throws Exception { } return null; } - + + /** + * Logs supplied StringBuilder to supplied Logger and Writer. + * @param reader Reader to use + * @param writer Writer to use + * @param builder StringBuilder with log statement + * @throws IOException writer could throw this + * @throws ClosedByInterruptException thrown if interrupted + */ private void logFromReader(final BufferedReader reader, - final BufferedWriter writer) throws IOException, + final BufferedWriter writer) throws IOException, ClosedByInterruptException { StringBuilder builder = new StringBuilder(); String previous = NULL_STRING; @@ -531,7 +541,7 @@ private void logFromReader(final BufferedReader reader, * @param builder StringBuilder with log statement * @throws IOException writer could throw this */ - private static void doLog(final BufferedWriter writer, + private static void doLog(final BufferedWriter writer, final Level level, final StringBuilder builder) throws IOException { if (builder.length() > 0) { diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index b9d6e6b9..14059d9c 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -34,7 +34,7 @@ * @author Dean Clark (dean.clark@gmail.com) * @version $Id$ */ -public class VerboseProcessExample { +public final class VerboseProcessExample { /** * System output line 1. From 05162929a6635a3b6d174b7bd0a271da5574d53b Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 15:20:26 -0400 Subject: [PATCH 14/41] Even more styling --- .../java/com/jcabi/log/VerboseProcess.java | 24 +++++++++---------- .../com/jcabi/log/VerboseProcessTest.java | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 07c8e436..ec7d20c9 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -553,29 +553,29 @@ private static void doLog(final BufferedWriter writer, /** * Checks if line is part of a stack trace and should be appended. - * @param string String to check + * @param input String to check * @return Result, true or false */ - private static boolean shouldAppend(final String string) { - final String leftStrip = stripStart(string); - return leftStrip.startsWith(PREFIX_AT) - || leftStrip.startsWith(PREFIX_CB) - || leftStrip.startsWith(PREFIX_DOTS); + private static boolean shouldAppend(final String input) { + final String stripped = stripStart(input); + return stripped.startsWith(PREFIX_AT) + || stripped.startsWith(PREFIX_CB) + || stripped.startsWith(PREFIX_DOTS); } /** * Strips whitespace at beginning of String. - * @param string String to strip + * @param input String to strip * @return Stripped string */ - private static String stripStart(final String string) { - final int stringLength = string.length(); + private static String stripStart(final String input) { + final int length = input.length(); int start = 0; - while ((start != stringLength) - && Character.isWhitespace(string.charAt(start))) { + while ((start != length) + && Character.isWhitespace(input.charAt(start))) { ++start; } - return string.substring(start); + return input.substring(start); } } diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 3f92b39d..79cc20a4 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -313,8 +313,8 @@ public void terminatesMonitorsAndProcessIfClosedNormal() throws Exception { } /** - * Runs a java process which will throw a stack trace and makes sure it - * will group the stack trace. + * VerboseProcess can run a java process which will throw a stack trace and + * makes sure it will group the stack trace. */ @Test public void logCompleteStackTrace() { From cc2ab93d35ca35369ae5fc5a7c55d4fd36632b1d Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 15:26:40 -0400 Subject: [PATCH 15/41] Last styling? --- src/main/java/com/jcabi/log/VerboseProcess.java | 1 - src/test/java/com/jcabi/log/VerboseProcessExample.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index ec7d20c9..95eddcad 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -493,7 +493,6 @@ public Void call() throws Exception { * Logs supplied StringBuilder to supplied Logger and Writer. * @param reader Reader to use * @param writer Writer to use - * @param builder StringBuilder with log statement * @throws IOException writer could throw this * @throws ClosedByInterruptException thrown if interrupted */ diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 14059d9c..dd67257d 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -87,8 +87,8 @@ public static void main(final String[] args) { public void doWork() { System.out.println(SYSOUT_1); System.err.println(SYSOUT_1); - System.out.println(SYSOUT_2); - System.err.println(SYSOUT_2); + System.out.println(SYSERR_2); + System.err.println(SYSERR_2); catchAndThrow(); } From e2a9c1b1ee3441cf49b18ed2fb5f35008b540fa7 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Sat, 10 Sep 2016 15:31:24 -0400 Subject: [PATCH 16/41] Fixing typo to fix test --- src/test/java/com/jcabi/log/VerboseProcessExample.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index dd67257d..06491c80 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -86,8 +86,8 @@ public static void main(final String[] args) { */ public void doWork() { System.out.println(SYSOUT_1); - System.err.println(SYSOUT_1); - System.out.println(SYSERR_2); + System.err.println(SYSERR_1); + System.out.println(SYSOUT_2); System.err.println(SYSERR_2); catchAndThrow(); } From 0c0049094b5eb3312d8fb1c8eb97b58fea481ca4 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 12 Sep 2016 09:06:51 -0400 Subject: [PATCH 17/41] Further styling updates --- .../java/com/jcabi/log/VerboseProcess.java | 4 +- .../com/jcabi/log/VerboseProcessExample.java | 2 +- .../com/jcabi/log/VerboseProcessTest.java | 41 +++++++------------ 3 files changed, 17 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 95eddcad..902be018 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -413,9 +413,7 @@ private static final class Monitor implements Callable { /** * Empty String. */ - private static final String NULL_STRING = String.format( - "%s%c", "", '\u0000' - ); + private static final String NULL_STRING = String.valueOf('\u0000'); /** * Newline string. */ diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 06491c80..49412f17 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -84,7 +84,7 @@ public static void main(final String[] args) { * Will log to standard output and error and then intentionally fail with a * stack trace. */ - public void doWork() { + private void doWork() { System.out.println(SYSOUT_1); System.err.println(SYSERR_1); System.out.println(SYSOUT_2); diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 79cc20a4..26e1d560 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -331,26 +331,24 @@ public void logCompleteStackTrace() { final VerboseProcess process = new VerboseProcess( builder, Level.INFO, Level.SEVERE ); - IllegalArgumentException caught = new IllegalArgumentException(); boolean failed = false; try { process.stdout(); } catch (final IllegalArgumentException ex) { - caught = ex; failed = true; + MatcherAssert.assertThat( + ex.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_1) + ); + MatcherAssert.assertThat( + ex.getMessage(), + Matchers.containsString(VerboseProcessExample.SYSOUT_2) + ); } finally { logger.removeAppender(appender); process.close(); } Assert.assertTrue("Process should have failed!", failed); - MatcherAssert.assertThat( - caught.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_1) - ); - MatcherAssert.assertThat( - caught.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_2) - ); verifyLogs(appender); } @@ -360,24 +358,15 @@ public void logCompleteStackTrace() { */ private static String retrieveJavaExecLocation() { final String rootpath = System.getProperty("java.home"); + final String finalpath; if (SystemUtils.IS_OS_WINDOWS) { - final String winpath = - rootpath.replaceAll("\\\\", "\\\\\\\\"); - final String finalpath = String.format( - "%s%s", winpath, "\\bin\\java.exe" - ); - final File file = new File(finalpath); - if (file.exists()) { - return finalpath; - } + finalpath = String.format("%s%s", rootpath, "\\bin\\java.exe"); } else { - final String linuxpath = String.format( - "%s%s", rootpath, "/bin/java" - ); - final File file = new File(linuxpath); - if (file.exists()) { - return linuxpath; - } + finalpath = String.format("%s%s", rootpath, "/bin/java"); + } + final File file = new File(finalpath); + if (file.exists()) { + return finalpath; } throw new IllegalStateException("Unable to get the Java Path."); } From ed7a3543a3d6fb7afde4466178bc085e0ad41631 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 12 Sep 2016 09:09:26 -0400 Subject: [PATCH 18/41] Another styling tweak --- src/test/java/com/jcabi/log/VerboseProcessTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 26e1d560..e0a7fe77 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -322,7 +322,7 @@ public void logCompleteStackTrace() { org.apache.log4j.Logger.getRootLogger(); final TestAppender appender = new TestAppender(); logger.addAppender(appender); - final String[] commands = new String[] { + final String[] commands = { retrieveJavaExecLocation(), "-cp", System.getProperty("java.class.path"), "com.jcabi.log.VerboseProcessExample", @@ -562,7 +562,7 @@ public int decide(final LoggingEvent event) { * Logger appender that compiles a list of all LoggingEvents. * @author dean.e.clark */ - private class TestAppender extends AppenderSkeleton { + private final class TestAppender extends AppenderSkeleton { /** * List of logging events. */ From 5c92779d1180c78d48a9c201a653e5a7bc4c5e6c Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 12 Sep 2016 09:21:23 -0400 Subject: [PATCH 19/41] Styling and trying to fix test timing issue --- src/main/java/com/jcabi/log/VerboseProcess.java | 11 ++++++----- src/test/java/com/jcabi/log/SupplierLoggerTest.java | 13 +++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 902be018..fe333c38 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -391,7 +391,8 @@ private static void close(final Closeable res) { private static final class Monitor implements Callable { /** - * Maximum number of log lines for a stack trace. + * Maximum number of log lines for a stack trace. Set to 1000 + * to avoid storing too many lines in memory before flushing. */ private static final int MAX_STACK_LENGTH = 1000; /** @@ -499,7 +500,7 @@ private void logFromReader(final BufferedReader reader, ClosedByInterruptException { StringBuilder builder = new StringBuilder(); String previous = NULL_STRING; - int lineCount = 0; + int count = 0; while (true) { if (Thread.interrupted()) { Logger.debug( @@ -518,14 +519,14 @@ private void logFromReader(final BufferedReader reader, break; } if (shouldAppend(line) - && (++lineCount < MAX_STACK_LENGTH)) { + && ++count < MAX_STACK_LENGTH) { builder.append(line).append(NEW_LINE); } else { if (builder.length() > 0) { doLog(writer, this.level, builder); builder = new StringBuilder(); } - lineCount = 1; + count = 1; previous = line; } } @@ -568,7 +569,7 @@ private static boolean shouldAppend(final String input) { private static String stripStart(final String input) { final int length = input.length(); int start = 0; - while ((start != length) + while (start != length && Character.isWhitespace(input.charAt(start))) { ++start; } diff --git a/src/test/java/com/jcabi/log/SupplierLoggerTest.java b/src/test/java/com/jcabi/log/SupplierLoggerTest.java index 01391801..2c0b0be7 100644 --- a/src/test/java/com/jcabi/log/SupplierLoggerTest.java +++ b/src/test/java/com/jcabi/log/SupplierLoggerTest.java @@ -32,6 +32,7 @@ import org.apache.log4j.Level; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; +import org.junit.BeforeClass; import org.junit.Test; /** @@ -43,6 +44,18 @@ @SuppressWarnings("PMD.MoreThanOneLogger") public final class SupplierLoggerTest { + /** + * Logs before method to avoid timing issue where loggers were + * created "during the default configuration phase of the underlying + * logging system" and failing tests in Travis CI. + */ + @BeforeClass + public static void init() { + final org.apache.log4j.Logger logger = + org.apache.log4j.Logger.getRootLogger(); + logger.info("Logging here to avoid timing issue with Travis CI"); + } + /** * SupplierLogger can tell if debug is disabled and the message is not * logged enabled. From c2873ae0ec7c3a3d9739109ada2c6438e9b3e4d0 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 12 Sep 2016 09:31:16 -0400 Subject: [PATCH 20/41] More styling --- src/test/java/com/jcabi/log/SupplierLoggerTest.java | 6 +++--- src/test/java/com/jcabi/log/VerboseProcessTest.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/jcabi/log/SupplierLoggerTest.java b/src/test/java/com/jcabi/log/SupplierLoggerTest.java index 2c0b0be7..9451cb01 100644 --- a/src/test/java/com/jcabi/log/SupplierLoggerTest.java +++ b/src/test/java/com/jcabi/log/SupplierLoggerTest.java @@ -45,13 +45,13 @@ public final class SupplierLoggerTest { /** - * Logs before method to avoid timing issue where loggers were - * created "during the default configuration phase of the underlying + * Logs before method to avoid timing issue where loggers were + * created "during the default configuration phase of the underlying * logging system" and failing tests in Travis CI. */ @BeforeClass public static void init() { - final org.apache.log4j.Logger logger = + final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getRootLogger(); logger.info("Logging here to avoid timing issue with Travis CI"); } diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index e0a7fe77..0c1857e8 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -585,7 +585,7 @@ public boolean requiresLayout() { } @Override - protected void append(final LoggingEvent event) { + protected final void append(final LoggingEvent event) { this.logs.add(event); } From 9f257d7cb926de6f821b205c06978c611ca38145 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 12 Sep 2016 09:35:58 -0400 Subject: [PATCH 21/41] Styling changes to make Travis CI happy --- src/test/java/com/jcabi/log/VerboseProcessTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 0c1857e8..e538f759 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -562,7 +562,7 @@ public int decide(final LoggingEvent event) { * Logger appender that compiles a list of all LoggingEvents. * @author dean.e.clark */ - private final class TestAppender extends AppenderSkeleton { + private class TestAppender extends AppenderSkeleton { /** * List of logging events. */ @@ -585,7 +585,7 @@ public boolean requiresLayout() { } @Override - protected final void append(final LoggingEvent event) { + protected void append(final LoggingEvent event) { this.logs.add(event); } From 1ea04f2b30082bc015944c1dda52e63d7c56f72c Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 12 Sep 2016 09:42:50 -0400 Subject: [PATCH 22/41] Changing variable name --- src/main/java/com/jcabi/log/VerboseProcess.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index fe333c38..d2584b2b 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -543,9 +543,9 @@ private static void doLog(final BufferedWriter writer, final Level level, final StringBuilder builder) throws IOException { if (builder.length() > 0) { - final String logText = builder.toString(); - Logger.log(level, VerboseProcess.class, LOG_FORMAT, logText); - writer.write(logText); + final String text = builder.toString(); + Logger.log(level, VerboseProcess.class, LOG_FORMAT, text); + writer.write(text); } } From bbc143b22a35cdd41795060529549564f52566b3 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 12 Sep 2016 11:46:16 -0400 Subject: [PATCH 23/41] More styling changes to make Travis CI happy --- src/main/java/com/jcabi/log/VerboseProcess.java | 1 + src/test/java/com/jcabi/log/VerboseProcessExample.java | 3 +++ src/test/java/com/jcabi/log/VerboseProcessTest.java | 8 +++----- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index d2584b2b..4b0db3bb 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -495,6 +495,7 @@ public Void call() throws Exception { * @throws IOException writer could throw this * @throws ClosedByInterruptException thrown if interrupted */ + @SuppressWarnings("PMD.ConsecutiveLiteralAppends") private void logFromReader(final BufferedReader reader, final BufferedWriter writer) throws IOException, ClosedByInterruptException { diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 49412f17..f7f59e3e 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -34,6 +34,7 @@ * @author Dean Clark (dean.clark@gmail.com) * @version $Id$ */ +@SuppressWarnings("PMD.DefaultPackage") public final class VerboseProcessExample { /** @@ -69,6 +70,7 @@ public final class VerboseProcessExample { /** * Private constructor. */ + @SuppressWarnings("PMD.UncommentedEmptyMethodBody") private VerboseProcessExample() { } /** @@ -84,6 +86,7 @@ public static void main(final String[] args) { * Will log to standard output and error and then intentionally fail with a * stack trace. */ + @SuppressWarnings("PMD.SystemPrintln") private void doWork() { System.out.println(SYSOUT_1); System.err.println(SYSERR_1); diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index e538f759..3aa21021 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -376,17 +376,15 @@ private static String retrieveJavaExecLocation() { * @param appender Log appender */ private static void verifyLogs(final TestAppender appender) { - boolean foundCompleteStack = false; + boolean complete = false; for (final LoggingEvent event : appender.getLogs()) { final String message = (String) event.getMessage(); if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { - final boolean containsCaughtException = + complete = message.contains(VerboseProcessExample.CAUGHT_ERR_MSG); - Assert.assertTrue(containsCaughtException); - foundCompleteStack = containsCaughtException; } } - Assert.assertTrue(foundCompleteStack); + Assert.assertTrue(complete); } /** From 9ad8ac37ff405d4c50b2606f42a532c6c8db4316 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 10:20:14 -0400 Subject: [PATCH 24/41] More styling updates --- .../java/com/jcabi/log/VerboseProcess.java | 29 +++++++++++-------- .../com/jcabi/log/VerboseProcessExample.java | 5 ++-- .../com/jcabi/log/VerboseProcessTest.java | 13 ++++----- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 4b0db3bb..f14f521f 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -396,15 +396,15 @@ private static final class Monitor implements Callable { */ private static final int MAX_STACK_LENGTH = 1000; /** - * Prefix "at ". + * Prefix "at ". Needed to check if line is part of stack trace. */ private static final String PREFIX_AT = "at "; /** - * Prefix "Caused by". + * Prefix "Caused by". Needed to check if line is part of stack trace. */ private static final String PREFIX_CB = "Caused by"; /** - * Prefix "... ". + * Prefix "... ". Needed to check if line is part of stack trace. */ private static final String PREFIX_DOTS = "... "; /** @@ -414,7 +414,7 @@ private static final class Monitor implements Callable { /** * Empty String. */ - private static final String NULL_STRING = String.valueOf('\u0000'); + private static final String EMPTY_STRING = ""; /** * Newline string. */ @@ -495,12 +495,12 @@ public Void call() throws Exception { * @throws IOException writer could throw this * @throws ClosedByInterruptException thrown if interrupted */ - @SuppressWarnings("PMD.ConsecutiveLiteralAppends") private void logFromReader(final BufferedReader reader, final BufferedWriter writer) throws IOException, ClosedByInterruptException { StringBuilder builder = new StringBuilder(); - String previous = NULL_STRING; + String previous = EMPTY_STRING; + boolean addprevious = false; int count = 0; while (true) { if (Thread.interrupted()) { @@ -510,9 +510,11 @@ private void logFromReader(final BufferedReader reader, ); break; } - if (previous != NULL_STRING) { - builder.append(previous).append(NEW_LINE); - previous = NULL_STRING; + if (addprevious) { + builder.append(previous); + builder.append(NEW_LINE); + addprevious = false; + previous = EMPTY_STRING; } final String line = reader.readLine(); if (line == null) { @@ -520,15 +522,18 @@ private void logFromReader(final BufferedReader reader, break; } if (shouldAppend(line) - && ++count < MAX_STACK_LENGTH) { - builder.append(line).append(NEW_LINE); + && count < MAX_STACK_LENGTH) { + builder.append(line); + builder.append(NEW_LINE); + ++count; } else { if (builder.length() > 0) { doLog(writer, this.level, builder); - builder = new StringBuilder(); + builder.setLength(0); } count = 1; previous = line; + addprevious = true; } } } diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index f7f59e3e..b83466a2 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -68,16 +68,15 @@ public final class VerboseProcessExample { static final String THROWN_ERR_MSG = "just throw me"; /** - * Private constructor. + * Private constructor. Intentionally empty. */ - @SuppressWarnings("PMD.UncommentedEmptyMethodBody") private VerboseProcessExample() { } /** * Instantiates instance of this class and calls primary method. * @param args Any args passed to main method */ - public static void main(final String[] args) { + public static void main(final String... args) { final VerboseProcessExample instance = new VerboseProcessExample(); instance.doWork(); } diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 3aa21021..332886a8 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -320,7 +320,7 @@ public void terminatesMonitorsAndProcessIfClosedNormal() throws Exception { public void logCompleteStackTrace() { final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getRootLogger(); - final TestAppender appender = new TestAppender(); + final VerboseProcessTest.TestAppender appender = new VerboseProcessTest.TestAppender(); logger.addAppender(appender); final String[] commands = { retrieveJavaExecLocation(), "-cp", @@ -375,7 +375,7 @@ private static String retrieveJavaExecLocation() { * Checks appender to make sure expected log statements are present. * @param appender Log appender */ - private static void verifyLogs(final TestAppender appender) { + private static void verifyLogs(final VerboseProcessTest.TestAppender appender) { boolean complete = false; for (final LoggingEvent event : appender.getLogs()) { final String message = (String) event.getMessage(); @@ -558,7 +558,6 @@ public int decide(final LoggingEvent event) { /** * Logger appender that compiles a list of all LoggingEvents. - * @author dean.e.clark */ private class TestAppender extends AppenderSkeleton { /** @@ -570,20 +569,20 @@ private class TestAppender extends AppenderSkeleton { * Provides all captured logging events. * @return Copy of log list */ - public List getLogs() { + public final List getLogs() { return new ArrayList(this.logs); } @Override - public void close() { } + public final void close() { } @Override - public boolean requiresLayout() { + public final boolean requiresLayout() { return false; } @Override - protected void append(final LoggingEvent event) { + protected final void append(final LoggingEvent event) { this.logs.add(event); } From 74be2fa4fb2f2c3885f5106f4cc81678763cbb5b Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 10:35:44 -0400 Subject: [PATCH 25/41] Even more styling updates --- src/main/java/com/jcabi/log/VerboseProcess.java | 9 +++------ src/test/java/com/jcabi/log/VerboseProcessTest.java | 6 ++++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index f14f521f..4b9aad60 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -498,9 +498,8 @@ public Void call() throws Exception { private void logFromReader(final BufferedReader reader, final BufferedWriter writer) throws IOException, ClosedByInterruptException { - StringBuilder builder = new StringBuilder(); + final StringBuilder builder = new StringBuilder(); String previous = EMPTY_STRING; - boolean addprevious = false; int count = 0; while (true) { if (Thread.interrupted()) { @@ -510,11 +509,10 @@ private void logFromReader(final BufferedReader reader, ); break; } - if (addprevious) { + if (previous.length() > 0) { builder.append(previous); builder.append(NEW_LINE); - addprevious = false; - previous = EMPTY_STRING; + previous = EMPTY_STRING; } final String line = reader.readLine(); if (line == null) { @@ -533,7 +531,6 @@ private void logFromReader(final BufferedReader reader, } count = 1; previous = line; - addprevious = true; } } } diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 332886a8..ca156e7b 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -320,7 +320,8 @@ public void terminatesMonitorsAndProcessIfClosedNormal() throws Exception { public void logCompleteStackTrace() { final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getRootLogger(); - final VerboseProcessTest.TestAppender appender = new VerboseProcessTest.TestAppender(); + final VerboseProcessTest.TestAppender appender = + new VerboseProcessTest.TestAppender(); logger.addAppender(appender); final String[] commands = { retrieveJavaExecLocation(), "-cp", @@ -375,7 +376,8 @@ private static String retrieveJavaExecLocation() { * Checks appender to make sure expected log statements are present. * @param appender Log appender */ - private static void verifyLogs(final VerboseProcessTest.TestAppender appender) { + private static void verifyLogs( + final VerboseProcessTest.TestAppender appender) { boolean complete = false; for (final LoggingEvent event : appender.getLogs()) { final String message = (String) event.getMessage(); From 8a10cf97843b96148c9c60c3ba09d75bd711ed66 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 10:47:51 -0400 Subject: [PATCH 26/41] More styling updates --- src/main/java/com/jcabi/log/VerboseProcess.java | 17 ++++++++--------- .../java/com/jcabi/log/VerboseProcessTest.java | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 4b9aad60..9b01a9e7 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -510,24 +510,21 @@ private void logFromReader(final BufferedReader reader, break; } if (previous.length() > 0) { - builder.append(previous); - builder.append(NEW_LINE); + builder.append(String.format("%s%s", previous, NEW_LINE)); previous = EMPTY_STRING; } final String line = reader.readLine(); if (line == null) { - doLog(writer, this.level, builder); + logAndClear(writer, this.level, builder); break; } if (shouldAppend(line) && count < MAX_STACK_LENGTH) { - builder.append(line); - builder.append(NEW_LINE); + builder.append(String.format("%s%s", line, NEW_LINE)); ++count; } else { if (builder.length() > 0) { - doLog(writer, this.level, builder); - builder.setLength(0); + logAndClear(writer, this.level, builder); } count = 1; previous = line; @@ -536,13 +533,14 @@ private void logFromReader(final BufferedReader reader, } /** - * Logs supplied StringBuilder to supplied Logger and Writer. + * Logs StringBuilder to supplied Logger and Writer then clears out + * the builder. * @param writer Writer to use * @param level Level to log at * @param builder StringBuilder with log statement * @throws IOException writer could throw this */ - private static void doLog(final BufferedWriter writer, + private static void logAndClear(final BufferedWriter writer, final Level level, final StringBuilder builder) throws IOException { if (builder.length() > 0) { @@ -550,6 +548,7 @@ private static void doLog(final BufferedWriter writer, Logger.log(level, VerboseProcess.class, LOG_FORMAT, text); writer.write(text); } + builder.setLength(0); } /** diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index ca156e7b..aedfbc8f 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -320,7 +320,7 @@ public void terminatesMonitorsAndProcessIfClosedNormal() throws Exception { public void logCompleteStackTrace() { final org.apache.log4j.Logger logger = org.apache.log4j.Logger.getRootLogger(); - final VerboseProcessTest.TestAppender appender = + final VerboseProcessTest.TestAppender appender = new VerboseProcessTest.TestAppender(); logger.addAppender(appender); final String[] commands = { From 2a1b9ccfde3f194a83dd297421661ed29aa8d45e Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 10:55:35 -0400 Subject: [PATCH 27/41] Removing duplicate string --- src/main/java/com/jcabi/log/VerboseProcess.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 9b01a9e7..0f362336 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -510,7 +510,7 @@ private void logFromReader(final BufferedReader reader, break; } if (previous.length() > 0) { - builder.append(String.format("%s%s", previous, NEW_LINE)); + builder.append(previous + NEW_LINE); previous = EMPTY_STRING; } final String line = reader.readLine(); @@ -520,7 +520,7 @@ private void logFromReader(final BufferedReader reader, } if (shouldAppend(line) && count < MAX_STACK_LENGTH) { - builder.append(String.format("%s%s", line, NEW_LINE)); + builder.append(line + NEW_LINE); ++count; } else { if (builder.length() > 0) { @@ -548,7 +548,7 @@ private static void logAndClear(final BufferedWriter writer, Logger.log(level, VerboseProcess.class, LOG_FORMAT, text); writer.write(text); } - builder.setLength(0); + builder.setLength(0); } /** From 4a4a465feade5bd6aa401dc397ae87cb0ae3313b Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 10:59:41 -0400 Subject: [PATCH 28/41] Avoiding ConsecutiveLiteralAppends with String.format() --- src/main/java/com/jcabi/log/VerboseProcess.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 0f362336..31fbd943 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -407,6 +407,10 @@ private static final class Monitor implements Callable { * Prefix "... ". Needed to check if line is part of stack trace. */ private static final String PREFIX_DOTS = "... "; + /** + * Format string for appending to builder. + */ + private static final String APPEND_FORMAT = "%s%s"; /** * Format string for log statements. */ @@ -510,7 +514,9 @@ private void logFromReader(final BufferedReader reader, break; } if (previous.length() > 0) { - builder.append(previous + NEW_LINE); + builder.append( + String.format(APPEND_FORMAT, previous, NEW_LINE) + ); previous = EMPTY_STRING; } final String line = reader.readLine(); @@ -520,7 +526,9 @@ private void logFromReader(final BufferedReader reader, } if (shouldAppend(line) && count < MAX_STACK_LENGTH) { - builder.append(line + NEW_LINE); + builder.append( + String.format(APPEND_FORMAT, line, NEW_LINE) + ); ++count; } else { if (builder.length() > 0) { From 85cfd530c4635685e784ac388decc473daad0506 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 11:08:24 -0400 Subject: [PATCH 29/41] Refactored appending lines and fixed a PMD violation --- .../java/com/jcabi/log/VerboseProcess.java | 23 +++++++++++-------- .../com/jcabi/log/VerboseProcessTest.java | 3 +++ 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 31fbd943..e94a9c25 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -407,10 +407,6 @@ private static final class Monitor implements Callable { * Prefix "... ". Needed to check if line is part of stack trace. */ private static final String PREFIX_DOTS = "... "; - /** - * Format string for appending to builder. - */ - private static final String APPEND_FORMAT = "%s%s"; /** * Format string for log statements. */ @@ -514,9 +510,7 @@ private void logFromReader(final BufferedReader reader, break; } if (previous.length() > 0) { - builder.append( - String.format(APPEND_FORMAT, previous, NEW_LINE) - ); + appendLine(previous, builder); previous = EMPTY_STRING; } final String line = reader.readLine(); @@ -526,9 +520,7 @@ private void logFromReader(final BufferedReader reader, } if (shouldAppend(line) && count < MAX_STACK_LENGTH) { - builder.append( - String.format(APPEND_FORMAT, line, NEW_LINE) - ); + appendLine(line, builder); ++count; } else { if (builder.length() > 0) { @@ -540,6 +532,17 @@ private void logFromReader(final BufferedReader reader, } } + /** + * Appends a line and a newline character to the builder. + * @param line String to append + * @param builder StringBuilder with log statement + */ + private static void appendLine(final String line, + final StringBuilder builder) { + builder.append(line); + builder.append(NEW_LINE); + } + /** * Logs StringBuilder to supplied Logger and Writer then clears out * the builder. diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index aedfbc8f..8fa8ac85 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -575,6 +575,9 @@ public final List getLogs() { return new ArrayList(this.logs); } + /** + * Method must be implemented but is intentionally empty. + */ @Override public final void close() { } From 4dc1ca16456cc77f36de79fc4aec9485ea547f7f Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 11:21:38 -0400 Subject: [PATCH 30/41] Modifying javadoc to try to resolve PMD violation --- src/test/java/com/jcabi/log/VerboseProcessTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 8fa8ac85..f6175761 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -576,7 +576,8 @@ public final List getLogs() { } /** - * Method must be implemented but is intentionally empty. + * This method must be implemented per interface but is not needed in + * this case. Intentionally empty. */ @Override public final void close() { } From 6b8e6f49ff2ff92590c5fac02baa17c4e8ad6f59 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 11:33:19 -0400 Subject: [PATCH 31/41] Trying to get around false positive PMD issue --- src/test/java/com/jcabi/log/VerboseProcessTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index f6175761..dc94be9a 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -576,11 +576,13 @@ public final List getLogs() { } /** - * This method must be implemented per interface but is not needed in - * this case. Intentionally empty. + * I couldn't get PMB to stop triggering a `UncommentedEmptyMethodBody` + * error. I'm hoping a return statement makes it happy. */ @Override - public final void close() { } + public final void close() { + return; + } @Override public final boolean requiresLayout() { From 6deffec075d671a132eb751fd54f1c047a775bf4 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 16:09:35 -0400 Subject: [PATCH 32/41] Removing ClosedByInterruptException per Michal's request --- src/main/java/com/jcabi/log/VerboseProcess.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index e94a9c25..0d739c1d 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -466,12 +466,6 @@ public Void call() throws Exception { ); try { this.logFromReader(reader, writer); - } catch (final ClosedByInterruptException ex) { - Thread.interrupted(); - Logger.debug( - VerboseProcess.class, - "Monitor is interrupted in the expected way" - ); } catch (final IOException ex) { Logger.error( VerboseProcess.class, @@ -493,11 +487,9 @@ public Void call() throws Exception { * @param reader Reader to use * @param writer Writer to use * @throws IOException writer could throw this - * @throws ClosedByInterruptException thrown if interrupted */ private void logFromReader(final BufferedReader reader, - final BufferedWriter writer) throws IOException, - ClosedByInterruptException { + final BufferedWriter writer) throws IOException { final StringBuilder builder = new StringBuilder(); String previous = EMPTY_STRING; int count = 0; From c8c1efa63efc89d5bcb9b60ed2257f44064d8f18 Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Tue, 13 Sep 2016 19:32:16 -0400 Subject: [PATCH 33/41] Fixing typo, adding back catch statement, and other minor styling changes --- src/main/java/com/jcabi/log/VerboseProcess.java | 8 +++++++- src/test/java/com/jcabi/log/VerboseProcessTest.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 0d739c1d..cbdc5733 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -466,6 +466,12 @@ public Void call() throws Exception { ); try { this.logFromReader(reader, writer); + } catch (final ClosedByInterruptException ex) { + Thread.interrupted(); + Logger.debug( + VerboseProcess.class, + "Monitor is interrupted in the expected way" + ); } catch (final IOException ex) { Logger.error( VerboseProcess.class, @@ -501,7 +507,7 @@ private void logFromReader(final BufferedReader reader, ); break; } - if (previous.length() > 0) { + if (!previous.isEmpty()) { appendLine(previous, builder); previous = EMPTY_STRING; } diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index dc94be9a..9297b551 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -576,7 +576,7 @@ public final List getLogs() { } /** - * I couldn't get PMB to stop triggering a `UncommentedEmptyMethodBody` + * I couldn't get PMD to stop triggering a `UncommentedEmptyMethodBody` * error. I'm hoping a return statement makes it happy. */ @Override From df9445a63263a84b0cb1b9749272322ae5ff9b8f Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 19 Sep 2016 17:53:37 -0400 Subject: [PATCH 34/41] Making additional styling changes --- .../java/com/jcabi/log/VerboseProcess.java | 39 ++++++++----------- .../com/jcabi/log/VerboseProcessExample.java | 1 + .../com/jcabi/log/VerboseProcessTest.java | 7 ++-- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index cbdc5733..9780bd66 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -395,48 +395,59 @@ private static final class Monitor implements Callable { * to avoid storing too many lines in memory before flushing. */ private static final int MAX_STACK_LENGTH = 1000; + /** * Prefix "at ". Needed to check if line is part of stack trace. */ private static final String PREFIX_AT = "at "; + /** * Prefix "Caused by". Needed to check if line is part of stack trace. */ private static final String PREFIX_CB = "Caused by"; + /** * Prefix "... ". Needed to check if line is part of stack trace. */ private static final String PREFIX_DOTS = "... "; + /** * Format string for log statements. */ private static final String LOG_FORMAT = ">> %s"; + /** * Empty String. */ private static final String EMPTY_STRING = ""; + /** * Newline string. */ private static final String NEW_LINE = System.getProperty( "line.separator" ); + /** * Stream to read. */ private final transient InputStream input; + /** * Latch to count down when done. */ private final transient CountDownLatch done; + /** * Buffer to save output. */ private final transient OutputStream output; + /** * Log level. */ private final transient Level level; + /** * Ctor. * @param inp Stream to monitor @@ -489,7 +500,7 @@ public Void call() throws Exception { } /** - * Logs supplied StringBuilder to supplied Logger and Writer. + * Logs supplied BufferedReader to Logger and supplied Writer. * @param reader Reader to use * @param writer Writer to use * @throws IOException writer could throw this @@ -542,7 +553,7 @@ private static void appendLine(final String line, } /** - * Logs StringBuilder to supplied Logger and Writer then clears out + * Logs StringBuilder to Logger and supplied Writer then clears out * the builder. * @param writer Writer to use * @param level Level to log at @@ -566,27 +577,11 @@ private static void logAndClear(final BufferedWriter writer, * @return Result, true or false */ private static boolean shouldAppend(final String input) { - final String stripped = stripStart(input); - return stripped.startsWith(PREFIX_AT) - || stripped.startsWith(PREFIX_CB) - || stripped.startsWith(PREFIX_DOTS); - } - - /** - * Strips whitespace at beginning of String. - * @param input String to strip - * @return Stripped string - */ - private static String stripStart(final String input) { - final int length = input.length(); - int start = 0; - while (start != length - && Character.isWhitespace(input.charAt(start))) { - ++start; - } - return input.substring(start); + final String trimmed = input.trim(); + return trimmed.startsWith("at ") + || trimmed.startsWith("Caused by") + || trimmed.startsWith("... "); } - } /** diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index b83466a2..97615996 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -33,6 +33,7 @@ * Example application to help test {@link VerboseProcess}. * @author Dean Clark (dean.clark@gmail.com) * @version $Id$ + * @since 1.20.1 */ @SuppressWarnings("PMD.DefaultPackage") public final class VerboseProcessExample { diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 9297b551..8901a442 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -365,8 +365,7 @@ private static String retrieveJavaExecLocation() { } else { finalpath = String.format("%s%s", rootpath, "/bin/java"); } - final File file = new File(finalpath); - if (file.exists()) { + if (new File(finalpath).exists()) { return finalpath; } throw new IllegalStateException("Unable to get the Java Path."); @@ -379,7 +378,7 @@ private static String retrieveJavaExecLocation() { private static void verifyLogs( final VerboseProcessTest.TestAppender appender) { boolean complete = false; - for (final LoggingEvent event : appender.getLogs()) { + for (final LoggingEvent event : appender.listLogs()) { final String message = (String) event.getMessage(); if (message.contains(VerboseProcessExample.THROWN_ERR_MSG)) { complete = @@ -571,7 +570,7 @@ private class TestAppender extends AppenderSkeleton { * Provides all captured logging events. * @return Copy of log list */ - public final List getLogs() { + public final List listLogs() { return new ArrayList(this.logs); } From 63c19a25c059fd783d928e396165f3e28a818f0a Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 19 Sep 2016 17:58:14 -0400 Subject: [PATCH 35/41] Removing unused constants --- src/main/java/com/jcabi/log/VerboseProcess.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/main/java/com/jcabi/log/VerboseProcess.java b/src/main/java/com/jcabi/log/VerboseProcess.java index 9780bd66..c0416351 100644 --- a/src/main/java/com/jcabi/log/VerboseProcess.java +++ b/src/main/java/com/jcabi/log/VerboseProcess.java @@ -396,21 +396,6 @@ private static final class Monitor implements Callable { */ private static final int MAX_STACK_LENGTH = 1000; - /** - * Prefix "at ". Needed to check if line is part of stack trace. - */ - private static final String PREFIX_AT = "at "; - - /** - * Prefix "Caused by". Needed to check if line is part of stack trace. - */ - private static final String PREFIX_CB = "Caused by"; - - /** - * Prefix "... ". Needed to check if line is part of stack trace. - */ - private static final String PREFIX_DOTS = "... "; - /** * Format string for log statements. */ From 8e4a50fd63a6dba0838a82d1068dbfcb46c27e9a Mon Sep 17 00:00:00 2001 From: "Dean E. Clark" Date: Mon, 19 Sep 2016 18:07:55 -0400 Subject: [PATCH 36/41] PMD styling change --- src/test/java/com/jcabi/log/VerboseProcessTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 8901a442..c8f2308e 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -564,7 +564,8 @@ private class TestAppender extends AppenderSkeleton { /** * List of logging events. */ - private final List logs = new ArrayList(10); + private final transient List logs = + new ArrayList(10); /** * Provides all captured logging events. From d14e4dae703b22a36906a1efcf3d1c4bb87c3d8b Mon Sep 17 00:00:00 2001 From: Dean E Clark Date: Thu, 1 Dec 2016 09:27:12 -0500 Subject: [PATCH 37/41] Combining assertions in test and replacing boolean with Assert.fail() --- .../java/com/jcabi/log/VerboseProcessTest.java | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index c8f2308e..4cd3169b 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -332,24 +332,18 @@ public void logCompleteStackTrace() { final VerboseProcess process = new VerboseProcess( builder, Level.INFO, Level.SEVERE ); - boolean failed = false; try { process.stdout(); + Assert.fail(); } catch (final IllegalArgumentException ex) { - failed = true; - MatcherAssert.assertThat( - ex.getMessage(), - Matchers.containsString(VerboseProcessExample.SYSOUT_1) - ); - MatcherAssert.assertThat( - ex.getMessage(), + MatcherAssert.assertThat(ex.getMessage(), Matchers.allOf( + Matchers.containsString(VerboseProcessExample.SYSOUT_1), Matchers.containsString(VerboseProcessExample.SYSOUT_2) - ); + )); } finally { logger.removeAppender(appender); process.close(); } - Assert.assertTrue("Process should have failed!", failed); verifyLogs(appender); } From c4d4ac176bd8da7451a86f1e9c0f29da33062ab5 Mon Sep 17 00:00:00 2001 From: Dean E Clark Date: Thu, 1 Dec 2016 10:11:09 -0500 Subject: [PATCH 38/41] Styling changes --- src/test/java/com/jcabi/log/VerboseProcessExample.java | 4 ++-- src/test/java/com/jcabi/log/VerboseProcessTest.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessExample.java b/src/test/java/com/jcabi/log/VerboseProcessExample.java index 97615996..2a864842 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessExample.java +++ b/src/test/java/com/jcabi/log/VerboseProcessExample.java @@ -1,5 +1,5 @@ /** - * Copyright (c) 2012-2015, jcabi.com + * Copyright (c) 2012-2016, jcabi.com * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,7 +32,7 @@ /** * Example application to help test {@link VerboseProcess}. * @author Dean Clark (dean.clark@gmail.com) - * @version $Id$ + * @version $Id: 97615996e8472494c4561b6d9d5bca0e7f6992dc $ * @since 1.20.1 */ @SuppressWarnings("PMD.DefaultPackage") diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index fe45863e..b1f208b8 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -63,7 +63,7 @@ /** * Test case for {@link VerboseProcess}. * @author Yegor Bugayenko (yegor@teamed.io) - * @version $Id$ + * @version $Id: fe45863e43fce64be1e904eb401794c8cb60e543 $ * @checkstyle MultipleStringLiterals (500 lines) * @checkstyle ClassDataAbstractionCoupling (200 lines) * @todo #18 Locale/encoding problem in two test methods here. I'm not @@ -386,8 +386,8 @@ public void logCompleteStackTrace() { Assert.fail(); } catch (final IllegalArgumentException ex) { MatcherAssert.assertThat(ex.getMessage(), Matchers.allOf( - Matchers.containsString(VerboseProcessExample.SYSOUT_1), - Matchers.containsString(VerboseProcessExample.SYSOUT_2) + Matchers.containsString(VerboseProcessExample.SYSOUT_1), + Matchers.containsString(VerboseProcessExample.SYSOUT_2) )); } finally { logger.removeAppender(appender); From 0b0ebe6070303838a6508db5d536dc27773fd6d0 Mon Sep 17 00:00:00 2001 From: Dean E Clark Date: Thu, 1 Dec 2016 10:17:16 -0500 Subject: [PATCH 39/41] More styling --- src/test/java/com/jcabi/log/VerboseProcessTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index b1f208b8..a4da409e 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -385,10 +385,13 @@ public void logCompleteStackTrace() { process.stdout(); Assert.fail(); } catch (final IllegalArgumentException ex) { - MatcherAssert.assertThat(ex.getMessage(), Matchers.allOf( - Matchers.containsString(VerboseProcessExample.SYSOUT_1), - Matchers.containsString(VerboseProcessExample.SYSOUT_2) - )); + MatcherAssert.assertThat( + ex.getMessage(), + Matchers.allOf( + Matchers.containsString(VerboseProcessExample.SYSOUT_1), + Matchers.containsString(VerboseProcessExample.SYSOUT_2) + ) + ); } finally { logger.removeAppender(appender); process.close(); From 308aec4f701eae346257a179de3c3f3f6d0c1aab Mon Sep 17 00:00:00 2001 From: Dean E Clark Date: Thu, 1 Dec 2016 10:46:14 -0500 Subject: [PATCH 40/41] Removing trailing space --- src/test/java/com/jcabi/log/VerboseProcessTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index a4da409e..0bae135c 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -386,7 +386,7 @@ public void logCompleteStackTrace() { Assert.fail(); } catch (final IllegalArgumentException ex) { MatcherAssert.assertThat( - ex.getMessage(), + ex.getMessage(), Matchers.allOf( Matchers.containsString(VerboseProcessExample.SYSOUT_1), Matchers.containsString(VerboseProcessExample.SYSOUT_2) From 61d46ab70d18bd5913814e92fc982163b05294ea Mon Sep 17 00:00:00 2001 From: Dean E Clark Date: Thu, 1 Dec 2016 10:58:06 -0500 Subject: [PATCH 41/41] Suppressing imports PMD warning --- src/test/java/com/jcabi/log/VerboseProcessTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jcabi/log/VerboseProcessTest.java b/src/test/java/com/jcabi/log/VerboseProcessTest.java index 0bae135c..02d27b20 100644 --- a/src/test/java/com/jcabi/log/VerboseProcessTest.java +++ b/src/test/java/com/jcabi/log/VerboseProcessTest.java @@ -71,7 +71,7 @@ * machines, while run perfectly on others. They also fail when being * executed from IntelliJ. */ -@SuppressWarnings("PMD.TooManyMethods") +@SuppressWarnings({ "PMD.TooManyMethods", "PMD.ExcessiveImports" }) public final class VerboseProcessTest { /**