package jde.debugger; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; import jde.debugger.command.CommandHandler; import jde.debugger.command.DebugCommand; import jde.debugger.command.DebugCommandFactory; /** * Class of JDEbug debuggers. *
* This class defines methods for communicating with the JDE. It * maintains a list of active applications. It passes application * commands to the apps specified by the commands. *
* See {@link Protocol Protocol class} for command/response formats and * {@link EventHandler EventHandler} for event set formats. *
* JDEbug responds to every command with either a result or error * message. *
*
* @author Amit Kumar
* @since 0.1
* @author Paul Kinnucan
* @since 1.3
* @version $Revision: 1.13 $
*/
public class JDEbug extends Thread implements Protocol {
/**
* The ID of jdebug. This is used by jde when issuing commands that
* are not specific to any particular vm, for instance, 'quit', or
* the command used to launch new application/vms.
* It is the Integer -1.
*/
public static final Integer debuggerID = new Integer(-1);
public static JDEbug theDebugger = new JDEbug();
private boolean m_shutdown = false;
private CommandStream m_commandStream;
/**
* Protected constructor, since this is a singleton class.
*/
protected JDEbug() {
}
public void init() throws IOException {
// The debugger uses standard in to read commands from Emacs.
m_commandStream = new CommandStream(new BufferedReader(new InputStreamReader(System.in)));
}
/**
* Runs the debugger thread. This method reads and executes commands
* from the JDE.
*/
public void run() {
JDE.debug(FRAMEWORK, "Starting JDEbug main loop");
while (!m_shutdown) {
JDE.debug(FRAMEWORK, "JDEbug waiting for cmd");
List command = m_commandStream.nextCommand();
JDE.debug(FRAMEWORK, "JDEbug got cmd");
final Integer procID = Integer.valueOf(command.get(0).toString());
final Integer cmdID = Integer.valueOf(command.get(1).toString());
final String cmdName = command.get(2).toString().toLowerCase();
final List arguments = command.subList(3, command.size());
try {
CommandHandler handler = SessionManager.getCommandHandler(procID);
if (handler == null) {
throw new JDEException("no command handler found for debugger process: " + procID);
}
JDE.debug(EVENTS, "JDEbug firing command event");
handler.fireCommandEvent(procID,
cmdID,
cmdName,
arguments);
}
catch (JDEException ex) {
JDE.commandResult(cmdID, "Error occurred while executing " + cmdName +
". Error: " + ex,
CMD_NOK, QUOTE);
}
}
JDE.debug(FRAMEWORK, "jdebug main loop terminating");
SessionManager.shutdown(); // Just in case no Quit command was issued
}
/**
* Sets a flag that terminates the main loop (implemented in the
* {@link #run} method).
*/
public void shutdown() {
m_shutdown = true;
}
} // JDEbug
/*
* $Log: JDEbug.java,v $
* Revision 1.13 2003/04/29 16:51:57 troy
* Initial version of GUI. Includes display of local variables.
*
* Revision 1.12 2003/01/16 05:38:28 paulk
* Cosmetic change
*
* Revision 1.11 2003/01/08 06:53:37 paulk
* Integrate Petter Mahlen's updates.
*
* Revision 1.10 2001/08/14 05:15:01 paulk
* Miscellaneous updates.
*
* Revision 1.9 2001/03/24 05:36:48 paulk
* Updated to reflect reorganization of debuggee code.
*
* Revision 1.8 2000/10/20 04:18:29 paulk
* *** empty log message ***
*
* Revision 1.7 2000/07/28 06:26:31 paulk
* Committing all modified files.
*
* Revision 1.6 2000/02/14 06:25:34 paulk
* Implemented workaround for JPDA bug that prevented setting of
* breakpoints in inner classes.
*
* Revision 1.5 2000/01/31 12:41:39 paulk
* * Continue converting commands from functional to OO implementation.
*
* Revision 1.4 2000/01/30 12:47:40 paulk
* Changed to a singleton class. Implemented support for object-oriented
* commands created by DebugCommandFactory. Reimplemented launch and
* listen commands as object-oriented commands.
*
* Revision 1.3 2000/01/28 04:24:55 paulk
* Threaded listen commands. Moved launch, attach, and listen commands
* from Application to Jdebug class. Did general cleanup of Jdebug and
* Application class, including using more specific names for some
* variables, moving fields to the end of files, rewriting comments.
*
*/
// End of JDEbug.java