package jde.debugger;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.text.DateFormat;
import java.util.Date;
/**
* JDE.java
*
*
* Created: Thu Feb 15 12:58:59 2001
*
* @author Paul Kinnucan
* @version $Revision: 1.8 $
*/
public class JDE implements Protocol {
/**
* The single instance of this class.
*
*/
private static JDE s_jde = new JDE(System.out);
/**
* Writes command responses, messages, and event notifications to
* JDE.
*/
private PrintWriter m_out;
/** logical OR of the debug flags that should be used in this particular session */
private int m_debugFlags
= APP_IO
// | JDE_PIPE
// | EVENTS
| EXCEPTION
// | FRAMEWORK
// | COMMANDS
| GUI
;
private JDE(OutputStream out) {
m_out = new PrintWriter(out, true);
}
/*
* Private methods ----------------------------------------------------
*/
private synchronized void p_transmit(String type, String message) {
m_out.println("(" + JDE_BUG + type + " " + message + ")");
}
private void p_setDebugFlags(int flags) {
m_debugFlags = flags;
}
private void p_debug(int flag, String message) {
if ((m_debugFlags & flag) != 0) {
p_transmit(DEBUG, " \"" +
DateFormat.getTimeInstance(DateFormat.MEDIUM).format(new Date()) + ": " +
message + "\"");
}
}
/*
* Public, static interface --------------------------------------------------
*/
/**
* To indicate which of the debugging flags should be set. If a
* flag is set, it means that calls to JDE.debug()
* with that flag will actually be printed.
*
* @param flags an int
value with a bitwise OR of the
* types of information that are desired.
* @see Protocol#NONE
*/
public static void setDebugFlags(int flags) {
s_jde.p_setDebugFlags(flags);
}
/**
* Send a debugging message to Emacs, for display in the
* *JDEbug*
buffer. The message will only be printed
* if the flag that is passed in the first argument is set. The
* current time is prepended to the message string.
*
* @param flag an int
value
* @param message a String
value
* @see Protocol
* @see #setDebugFlags
*/
public static void debug(int flag, String message) {
s_jde.p_debug(flag, message);
}
/**
* Sends the result of executing a debugger command to
* Emacs. Depending on wether the command was successful or not,
* different lisp code will be generated. If the
* quote
argument is set ({@link Protocol#QUOTE}),
* double quotes will be added around the message string. The idea
* is that if the command result should be a Lisp string, you
* should set the quote
argument to get the double
* quotes, and otherwise not.
*
* @param cmdID the ID of the command
* @param message a String
value
* @param success indicates what to generate, {@link
* Protocol#COMMAND_RESULT} or {@link Protocol#COMMAND_ERROR}
* @param quote a boolean
value
*/
public static void commandResult(Integer cmdID, String message, boolean success, boolean quote) {
String type = success ? COMMAND_RESULT : COMMAND_ERROR;
StringBuffer messageBuffer = new StringBuffer(cmdID.toString());
if (message != null && message.length() > 0) {
messageBuffer.append(" ");
if (quote) {
messageBuffer.append("\"");
}
messageBuffer.append(message);
if (quote) {
messageBuffer.append("\"");
}
}
s_jde.p_transmit(type, messageBuffer.toString());
}
/**
* Equivalent to calling {@link #commandResult(Integer,
* String, boolean, boolean)} with the quote
argument
* set to {@link Protocol#NOQUOTE}.
*
* @param cmdID an Integer
value
* @param message a String
value
* @param success a boolean
value
*/
public static void commandResult(Integer cmdID, String message, boolean success) {
commandResult(cmdID, message, success, NOQUOTE);
}
/**
* A method for sending more arbitrary information to Emacs. If
* the quote
argument is set, double quotes will
* added around the message string.
*
* @param procID an Integer
value
* @param type a String
value indicating what Lisp
* command should be sent
* @param message a String
value
* @param quote a boolean
value
*/
public static void signal(Integer procID, String type, String message, boolean quote) {
StringBuffer messageBuffer = new StringBuffer(procID.toString());
if (message != null && message.length() > 0) {
messageBuffer.append(" ");
if (quote) {
messageBuffer.append("\"");
}
messageBuffer.append(message);
if (quote) {
messageBuffer.append("\"");
}
}
s_jde.p_transmit(type, messageBuffer.toString());
}
/** A method for signaling JDEE that an exception occured. The
message displayed in Emacs will include the stack trace. */
public static void signalException(Throwable exc) {
s_jde.p_signalException(exc);
}
private void p_signalException(Throwable exc) {
if ((m_debugFlags & EXCEPTION) != 0) {
Writer writer = new StringWriter();
exc.printStackTrace(new PrintWriter(writer));
signal(new Integer(-1), ERROR,
"Exception during command execution: " +
writer.toString(),
QUOTE);
}
}
/**
* Equivalent to calling {@link #signal(Integer,
* String, String, boolean)} with the quote
argument
* set to false.
*
* @param procID an Integer
value
* @param type a String
value
* @param message a String
value
*/
public static void signal(Integer procID, String type, String message) {
signal(procID, type, message, NOQUOTE);
}
}// JDE
/*
* $Log: JDE.java,v $
* Revision 1.8 2004/12/24 16:05:13 troy
* Add window to display threads and stacks
*
* Revision 1.7 2003/09/21 05:23:11 paulk
* Fix bug in setDebugFlags (it was calling itself).
*
* Revision 1.6 2003/04/29 16:51:56 troy
* Initial version of GUI. Includes display of local variables.
*
* Revision 1.5 2003/01/15 05:50:51 paulk
* Remove CRs.
*
* Revision 1.4 2003/01/08 06:53:38 paulk
* Integrate Petter Mahlen's updates.
*
*/
// End of JDE.java