org.aspectj/tests/new/AJDBTest.java
2002-12-16 18:51:06 +00:00

189 lines
5.4 KiB
Java

import org.aspectj.tools.ajdb.Main;
import org.aspectj.debugger.tty.CommandLineDebugger;
import org.aspectj.debugger.base.*;
import com.sun.jdi.*;
import com.sun.jdi.event.*;
import java.io.*;
import java.util.*;
import org.aspectj.testing.Tester;
public class AJDBTest implements StopListener, VMListener {
String classpath;
{
classpath = "\"" + Tester.outputDir();
String javaClasspath = System.getProperty("java.class.path");
if (javaClasspath != null) {
classpath += ";" + javaClasspath;
}
classpath += "\"";
}
protected String[] stringCommands() {
return new String[] {
"workingdir " + Tester.workingDir(),
"use " + "./new",
"stop on AJDBClass.java:24",
"run -classpath " + classpath + " AJDBClass",
};
}
protected String getSourceName() {
return "AJDBClass.java";
}
// Methods for VMListener
protected void death(VMDeathEvent e) {
System.out.println("*** Death: " + e);
}
protected void disconnect(VMDisconnectEvent e) {
System.out.println("*** Disconnect: " + e);
}
protected void start(VMStartEvent e) {
System.out.println("*** Start: " + e);
}
// Methods for StopListener
protected void access(AccessWatchpointEvent e) {
}
protected void breakpoint(BreakpointEvent e) {
checkLines((List) ex("where"), "next");
}
protected void exception(ExceptionEvent e) {
}
protected void modification(ModificationWatchpointEvent e) {
}
protected void step(StepEvent e) {
List lines = (List) ex("where");
checkLines(lines);
try {
StackFrame frame = (StackFrame) lines.get(0);
Location loc = frame.location();
if (loc.sourceName().equals("Thread.java") &&
loc.method().name().equals("exit")) {
isRunning = false;
}
} catch (Throwable t) {}
ex("next");
}
public void checkLines(Collection lines, Object then) {
checkLines(lines);
if (then != null) ex(then);
}
public void checkLines(Collection lines) {
Iterator iter = lines.iterator();
while (iter.hasNext()) {
StackFrame frame = (StackFrame) iter.next();
String source = "no.source";
try {
source = debugger.sourceName(frame.location());
} catch (Throwable t) {}
int line = debugger.lineNumber(frame.location());
if (source.equals(getSourceName())) {
Tester.check(line>0, "non-mapping line for " + frame);
}
}
}
// VMListener
public void vmDeathEvent(VMDeathEvent e) {
death(e);
}
public void vmDisconnectEvent(VMDisconnectEvent e) {
disconnect(e);
}
public void vmStartEvent(VMStartEvent e) {
start(e);
}
// StopListener
public final void accessWatchpointEvent(AccessWatchpointEvent e) {
access(e);
}
public final void breakpointEvent(BreakpointEvent e) {
breakpoint(e);
}
public final void exceptionEvent(ExceptionEvent e) {
exception(e);
}
public final void modificationWatchpointEvent(ModificationWatchpointEvent e) {
modification(e);
}
public final void stepEvent(StepEvent e) {
step(e);
}
AJDebugger debugger;
CommandLineDebugger ajdb;
public void realMain(String[] args) {
String fileName = null;
String[] newArgs = args;
if (args.length > 0) {
fileName = args[0];
newArgs = new String[args.length-1];
System.arraycopy(args, 1, newArgs, 0, newArgs.length);
}
realMain(fileName, newArgs);
}
private void realMain(String fileName, String[] args) {
debugger = (ajdb = new Main().debug(args)).getDebugger();
debugger.addStopListener(this);
debugger.addVMListener(this);
ex(fileName == null ? commands() : commands(fileName));
while (isRunning) {
//System.out.println(">>>>>>>> " + debugger.isRunning());
}
}
private boolean isRunning = true;
public final Collection commands() {
Collection list = new Vector();
String[] commands = stringCommands();
for (int i = 0; i < commands.length; i++) {
list.add(commands[i]);
}
return list;
}
Object ex(Object command) {
return ajdb.executeCommand(command+"");
}
void ex(Collection list) {
Iterator iter = list.iterator();
while (iter.hasNext()) {
ex(iter.next());
}
}
final static String COMMENT = "#";
final static String FILENAME = "script.txt";
Collection commands(String fileName) {
Collection list = new Vector();
try {
BufferedReader in = new BufferedReader(new FileReader(fileName));
String line;
while ((line = in.readLine()) != null) {
line = line.trim();
if (line.startsWith(COMMENT)) {
continue;
}
list.add(line);
}
in.close();
} catch (IOException ioe) {
ioe.printStackTrace();
System.exit(-1);
}
return list;
}
public static void main(String[] args) {
new AJDBTest().realMain(args);
}
}