< prev index next >
src/jdk.jdi/share/classes/com/sun/tools/example/debug/tty/MessageOutput.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -31,10 +31,12 @@
* this sample code.
*/
package com.sun.tools.example.debug.tty;
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
import java.util.*;
import java.text.MessageFormat;
/**
* Internationalization (i18n) convenience methods for jdb.
*
@@ -50,10 +52,16 @@
* The resource bundle containing localizable message content.
* This is loaded by TTY.main() at start-up
*/
static ResourceBundle textResources;
+ /** If set then used to buffer the output before writing it to System.out */
+ private final static ThreadLocal<BufferedOutput> bufferedOutput = new ThreadLocal<>();
+
+ /** Default writer to System.out */
+ private final static PrintWriter systemOutWriter = new PrintWriter(System.out, true);
+
/** Our message formatter. Allocated once, used many times */
private static MessageFormat messageFormat;
/**
* Fatal shutdown notification. This is sent to System.err
@@ -103,76 +111,76 @@
* Commands.java (multiple locations)
* These are the only sites that should be calling this
* method.
*/
static void printDirectln(String line) {
- System.out.println(line);
+ getWriter().println(line);
}
static void printDirect(String line) {
- System.out.print(line);
+ getWriter().print(line);
}
static void printDirect(char c) {
- System.out.print(c);
+ getWriter().print(c);
}
/**
* Print a newline.
* Use this instead of '\n'
*/
static void println() {
- System.out.println();
+ getWriter().println();
}
/**
* Format and print a simple string.
*/
static void print(String key) {
- System.out.print(format(key));
+ getWriter().print(format(key));
}
/**
* Format and print a simple string.
*/
static void println(String key) {
- System.out.println(format(key));
+ getWriter().println(format(key));
}
/**
* Fetch, format and print a message with one string argument.
* This is the most common usage.
*/
static void print(String key, String argument) {
- System.out.print(format(key, argument));
+ getWriter().print(format(key, argument));
}
static void println(String key, String argument) {
- System.out.println(format(key, argument));
+ getWriter().println(format(key, argument));
}
/**
* Fetch, format and print a message with an arbitrary
* number of message arguments.
*/
static void println(String key, Object [] arguments) {
- System.out.println(format(key, arguments));
+ getWriter().println(format(key, arguments));
}
/**
* Print a newline, followed by the string.
*/
static void lnprint(String key) {
- System.out.println();
- System.out.print(textResources.getString(key));
+ getWriter().println();
+ getWriter().print(textResources.getString(key));
}
static void lnprint(String key, String argument) {
- System.out.println();
- System.out.print(format(key, argument));
+ getWriter().println();
+ getWriter().print(format(key, argument));
}
static void lnprint(String key, Object [] arguments) {
- System.out.println();
- System.out.print(format(key, arguments));
+ getWriter().println();
+ getWriter().print(format(key, arguments));
}
/**
* Print an exception message with a stack trace.
*/
@@ -182,28 +190,78 @@
println(key);
} catch (MissingResourceException mex) {
printDirectln(key);
}
}
- System.out.flush();
- e.printStackTrace();
+ getWriter().flush();
+ e.printStackTrace(getWriter());
}
static void printPrompt() {
printPrompt(false);
}
static void printPrompt(boolean simple) {
ThreadInfo threadInfo = ThreadInfo.getCurrentThreadInfo();
if (simple || threadInfo == null) {
- System.out.print
+ getWriter().print
(MessageOutput.format("jdb prompt with no current thread"));
} else {
- System.out.print
+ getWriter().print
(MessageOutput.format("jdb prompt thread name and current stack frame",
new Object [] {
threadInfo.getThread().name(),
Integer.valueOf(threadInfo.getCurrentFrameIndex() + 1)}));
}
- System.out.flush();
+ getWriter().flush();
+ }
+
+ /** Starts buffering the output to the internal buffer */
+ static void startBuffering() {
+ assert (bufferedOutput.get() == null);
+ bufferedOutput.set(new BufferedOutput());
+ }
+
+ /** Stops buffering the output and writes the buffer to System.out */
+ static void stopBuffering() {
+ BufferedOutput bo = bufferedOutput.get();
+ assert (bo != null);
+ bufferedOutput.set(null);
+ bo.close();
+ systemOutWriter.print(bo.toString());
+ systemOutWriter.flush();
+ }
+
+ /**
+ * If bufferedOutput is set returns the writer the writes to the internal buffer, otherwise
+ * returns writer that writes to System.out
+ */
+ private static PrintWriter getWriter() {
+ return bufferedOutput.get() != null? bufferedOutput.get().getPrintWriter() : systemOutWriter;
+ }
+
+ /** Provides a writer that buffers the output to the string */
+ private static class BufferedOutput {
+ private final ByteArrayOutputStream baos;
+ private final PrintWriter pw;
+
+ BufferedOutput() {
+ baos = new ByteArrayOutputStream();
+ pw = new PrintWriter(baos);
+ }
+
+ PrintWriter getPrintWriter() {
+ return pw;
+ }
+
+ void close() {
+ pw.flush();
+ pw.close();
+ }
+
+ @Override
+ public String toString() {
+ return baos.toString();
+ }
+
}
}
< prev index next >