package xtc.lang.blink; import xtc.lang.blink.NativeDebugger.LanguageTransitionEventType; /** A common Blink event class. */ public abstract class Event { /** dummy event source when we do not care about the source. */ public static final BlinkEventSource dummySource = new BlinkEventSource() { public String getEventSourceName() { return "dummy"; } }; /** The intended consumer of a Blink event. */ public enum EventConsumer { BlinkController, JavaDebugger, NativerDebugger, } /** The Blink event source. */ final BlinkEventSource source; /** The event consumer. */ final EventConsumer consumer; /** * Constructor. * * @param source The event source. */ Event(BlinkEventSource source) { this(source, EventConsumer.BlinkController); } /** * Constructor. * * @param source The source. */ Event(BlinkEventSource source, EventConsumer consumer) { assert source != null; this.source = source; this.consumer = consumer; } /** Getter method for the EventSource. */ public BlinkEventSource getSource() { return source; } /** User-friendly description of this event type. */ public abstract String getName(); /** User-friendly description. */ public String toString() { return "Event[" + getName() + "," + getSource().getEventSourceName() + "," + consumer + "]"; } /** The Blink event source tag. */ static interface BlinkEventSource { /** Getter method for readable event source. */ public abstract String getEventSourceName(); } /** * A Blink user command event. */ static class UserCommandEvent extends Event { /** The Blink user command. */ private final String userCommand; /** * Constructor. * * @param source The event source. * @param line The command line. */ UserCommandEvent(CommandLineInterface source, String line) { super(source); this.userCommand = line; } /** Getter method for the User command. */ public String getCommandLine() { return userCommand; } /** User-friendly description of this event type. */ public String getName() { return "UserCommand"; } /** User friendly message.*/ public String toString() { return super.toString() + userCommand; } } /** The raw text output message event. */ static class RawTextMessageEvent extends Event { /** The message. */ final char[] message; /** * Constructor. * * @param source The source micro debugger. * @param message The message. */ RawTextMessageEvent(BlinkEventSource source, char[] message) { this(source, message, 0, message.length); } /** * Constructor. * * @param source THe source. * @param msgBuf The buffer. * @param index The beginning of the message with the buffer. * @param len The message length. */ RawTextMessageEvent(BlinkEventSource source, char[] msgBuf, int index, int len) { super(source); assert msgBuf != null && index >= 0 && len > 0 && msgBuf.length >= (index + len); this.message = new char[len]; System.arraycopy(msgBuf, index, message, 0, len); } /** Getter method for the message. */ char[] getMessage() { return message; } /** User-friendly description of this event type. */ public String getName() { return "RawMessage"; } /** * Obtain a user readable description of this event. * * @return The description. */ public String toString() { return super.toString() + new String(message);//.replace("\n", "\\n"); } } /** The session finish request event. */ public static class SessionFinishRequestEvent extends Event { /** The user friendly Reason. */ private final String reason; /** The constructor.*/ SessionFinishRequestEvent(String reason) { super(dummySource); this.reason = reason; } /** The getter for the reason. */ public String getReason() { return reason; } /** User-friendly description of this event type. */ public String getName() { return "BlinkSessionEnd"; } public String toString() { return super.toString() + reason; } } /** A base event class for the sub-debugger event. */ static abstract class SubDebuggerEvent extends Event { SubDebuggerEvent(BlinkEventSource s) { super(s); } } /** A death event class. */ static class DeathEvent extends SubDebuggerEvent { /** * Constructor. * @param source The source. */ DeathEvent(BlinkEventSource source) { super(source); } public String getName() { return "Death"; } } /** A Language transition event. */ static abstract class LanguageTransitionEvent extends SubDebuggerEvent { final LanguageTransitionEventType bptype; public LanguageTransitionEvent(NativeDebugger s, LanguageTransitionEventType bptype) { this(s, bptype, null); } public LanguageTransitionEvent(NativeDebugger s, LanguageTransitionEventType bptype, String c2jtarget) { super(s); this.bptype = bptype; } } static final class Java2NativeCallEvent extends LanguageTransitionEvent { Java2NativeCallEvent(NativeDebugger s) { super(s, LanguageTransitionEventType.J2C_CALL); } public String getName() {return "Java2NativeCallEvent";} } static final class Java2NativeReturnEvent extends LanguageTransitionEvent { private final String targetClassName; private final int targetLineNumber; Java2NativeReturnEvent(NativeDebugger s, String javaTarget, int targetLineNumber) { super(s, LanguageTransitionEventType.J2C_RETURN); this.targetClassName = javaTarget; this.targetLineNumber = targetLineNumber; } public int getTargetLineNumber() {return targetLineNumber;} public String getJavaTarget() {return targetClassName;} public String getName() {return "Java2NativeReturnEvent";} } static final class Native2JavaCallEvent extends LanguageTransitionEvent { private final String cname; /* Target java class name.*/ private final int lineNumber; /* Target line number. */ Native2JavaCallEvent(NativeDebugger s, String cname, int lineNumber) { super(s, LanguageTransitionEventType.C2J_CALL); this.cname = cname; this.lineNumber = lineNumber; } public String getClassName() {return cname;} public int getLineNumber() {return lineNumber;} public String getName() {return "Native2JavaCallEvent";} } static final class Native2JavaReturnEvent extends LanguageTransitionEvent { Native2JavaReturnEvent(NativeDebugger s) { super(s, LanguageTransitionEventType.C2J_RETURN); } public String getName() {return "Native2JavaReturnEvent";} } /** A native break point hit. */ static class NativeBreakPointHitEvent extends SubDebuggerEvent { private final int debuggerBreakpointID; private final String message; public NativeBreakPointHitEvent(BlinkEventSource s, int bpid, String message) { super(s); this.debuggerBreakpointID = bpid; this.message = message; } /** Getters. */ public int getDebuggerBreakpointID() {return debuggerBreakpointID;} public String getMessage() {return message;} public String getName() {return "NativeBreakPointHit";} } static class NativeJNIWarningEvent extends SubDebuggerEvent { private final String message; public NativeJNIWarningEvent(BlinkEventSource s, String message) { super(s); this.message = message; } public String getMessage() {return message;} public String getName() {return "JNIWarningEvent";} } /** J2C completion event.*/ static class Native2JavaCompletionEvent extends SubDebuggerEvent { public Native2JavaCompletionEvent(NativeDebugger s) { super(s); } /** User-friendly description of this event type. */ public String getName() { return "Native2JavaCompletionEvent"; } } /** A native stop completion event. */ static class NativeStepCompletionEvent extends SubDebuggerEvent { public NativeStepCompletionEvent(NativeDebugger s) { super(s); } /** User-friendly description of this event type. */ public String getName() { return "NativeStepCompleted"; } } /** The J2C break point hit event. */ static class J2CBreakPointHitEvent extends SubDebuggerEvent { public J2CBreakPointHitEvent(NativeDebugger s) { super(s); } /** User-friendly description of this event type. */ public String getName() { return "J2CHit"; } } static class DummyCallCompletionEvent extends SubDebuggerEvent { public DummyCallCompletionEvent(NativeDebugger s) { super(s); } public String getName() {return "DummyCallCompletionEvent";} } /** A Java debugger event that cause the JVM to stop. */ static abstract class JavaPauseEvent extends SubDebuggerEvent { final private String threadName; final private String className; final private int lineNumber; final private String methodName; final private int bcindex; final private String message; public JavaPauseEvent(BlinkEventSource s, String threadName, String className, int lineNumber, String methodName, int bcindex, String message) { super(s); this.threadName = threadName; this.className = className; this.lineNumber = lineNumber; this.methodName = methodName; this.bcindex = bcindex; this.message = message; } /** Getters. */ public String getThreadName() {return threadName;} public String getClassName() {return className;} public int getLineNumber() {return lineNumber;} public String getMethodName() {return methodName;} public int getBcindex() {return bcindex;} public String getMessage() {return message;} } /** Java breakpoint event. */ static class JavaBreakPointHitEvent extends JavaPauseEvent { public JavaBreakPointHitEvent(JavaDebugger s, String threadName, String className, int lineNumber, String methodName, int bcindex, String message) { super(s, threadName, className, lineNumber, methodName, bcindex, message); } public String getName() {return "JavaBPHit";} } /** Java step completion event. */ static class JavaStepCompletionEvent extends JavaPauseEvent { public JavaStepCompletionEvent(JavaDebugger s, String threadName, String className, int lineNumber, String methodName, int bcindex, String message) { super(s, threadName, className, lineNumber, methodName, bcindex, message); } public String getName() {return "JavaStepCompleted";} } /** Java exception event. */ static class JavaExceptionEvent extends JavaPauseEvent { private final String exceptionClass; public JavaExceptionEvent(JavaDebugger s, String threadName, String className, int lineNumber, String methodName, int bcindex, String message, String exceptionClass) { super(s, threadName, className, lineNumber, methodName, bcindex, message); this.exceptionClass = exceptionClass; } public String getExceptionClass() {return exceptionClass;} public String getName() {return "JavaExceptionOccured";} } /** A Java load library event. */ static class JavaLoadLibraryEvent extends JavaPauseEvent { public JavaLoadLibraryEvent(JavaDebugger s, String threadName, String className, int lineNumber, String methodName, int bcindex, String message) { super(s, threadName, className, lineNumber, methodName, bcindex, message); } /** User-friendly description of this event type. */ public String getName() {return "JavaLoadLibrary";} } /** J2C completion event.*/ static class Java2NativeCompletionEvent extends SubDebuggerEvent { public Java2NativeCompletionEvent(JavaDebugger s) { super(s); } /** User-friendly description of this event type. */ public String getName() { return "J2CCompletion"; } } }