--- /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