--- /dev/null 2015-04-26 06:51:08.003313989 -0700 +++ new/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/internal/Log.java 2015-06-25 08:33:17.789422953 -0700 @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2002-2012, the original author or authors. + * + * This software is distributable under the BSD license. See the terms of the + * BSD license in the documentation provided with this software. + * + * http://www.opensource.org/licenses/bsd-license.php + */ +package jdk.internal.jline.internal; + +import java.io.PrintStream; + +import static jdk.internal.jline.internal.Preconditions.checkNotNull; + +/** + * Internal logger. + * + * @author Jason Dillon + * @since 2.0 + */ +public final class Log +{ + ///CLOVER:OFF + + public static enum Level + { + TRACE, + DEBUG, + INFO, + WARN, + ERROR + } + + @SuppressWarnings({"StringConcatenation"}) + public static final boolean TRACE = Boolean.getBoolean(Log.class.getName() + ".trace"); + + @SuppressWarnings({"StringConcatenation"}) + public static final boolean DEBUG = TRACE || Boolean.getBoolean(Log.class.getName() + ".debug"); + + private static PrintStream output = System.err; + + public static PrintStream getOutput() { + return output; + } + + public static void setOutput(final PrintStream out) { + output = checkNotNull(out); + } + + /** + * Helper to support rendering messages. + */ + @TestAccessible + static void render(final PrintStream out, final Object message) { + if (message.getClass().isArray()) { + Object[] array = (Object[]) message; + + out.print("["); + for (int i = 0; i < array.length; i++) { + out.print(array[i]); + if (i + 1 < array.length) { + out.print(","); + } + } + out.print("]"); + } + else { + out.print(message); + } + } + + @TestAccessible + static void log(final Level level, final Object... messages) { + //noinspection SynchronizeOnNonFinalField + synchronized (output) { + output.format("[%s] ", level); + + for (int i=0; i