package org.eclipse.dltk.internal.testing.util;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.dltk.debug.ui.ScriptDebugConsole;
import org.eclipse.dltk.testing.DLTKTestingConstants;
import org.eclipse.dltk.testing.ITestingProcessor;
import org.eclipse.jface.text.IRegion;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;
import org.eclipse.ui.console.IConsoleListener;
import org.eclipse.ui.console.IConsoleManager;
import org.eclipse.ui.console.TextConsole;
public class TestingConsoleListener implements IConsoleListener {
private final String launchKey;
private final ILaunch launch;
private final ITestingProcessor processor;
private boolean initialized = false;
private boolean finalized = false;
public TestingConsoleListener(String launchKey, ILaunch launch,
ITestingProcessor processor) {
this.launchKey = launchKey;
this.launch = launch;
this.processor = processor;
}
public synchronized void consolesAdded(IConsole[] consoles) {
// System.out.println("consolesAdded:" + consoles.length);
checkConsoles(consoles);
if (initialized) {
uninstall();
}
}
private synchronized void checkConsoles(IConsole[] consoles) {
if (initialized) {
return;
}
for (int i = 0; i < consoles.length; i++) {
final IConsole console = consoles[i];
if (console instanceof org.eclipse.debug.ui.console.IConsole) {
org.eclipse.debug.ui.console.IConsole pc = (org.eclipse.debug.ui.console.IConsole) console;
IProcess process = pc.getProcess();
if (process != null
&& launchKey.equals(process.getLaunch().getAttribute(
DLTKTestingConstants.LAUNCH_ATTR_KEY))) {
process((TextConsole) console);
initialized = true;
}
} else if (console instanceof ScriptDebugConsole) {
ScriptDebugConsole cl = (ScriptDebugConsole) console;
ILaunch launch2 = cl.getLaunch();
if (launch2 != null
&& launchKey
.equals(launch2
.getAttribute(DLTKTestingConstants.LAUNCH_ATTR_KEY))) {
process(cl);
initialized = true;
}
}
}
}
private synchronized void done() {
if (!finalized) {
finalized = true;
processor.done();
uninstall();
}
}
private void process(TextConsole pc) {
pc.addPatternMatchListener(new ConsoleLineNotifier() {
private boolean first = true;
public void connect(TextConsole console) {
super.connect(console);
// System.out.println("%");
}
public synchronized void lineAppended(IRegion region, String content) {
if (first) {
first = false;
processor.start();
}
processor.processLine(content);
}
public synchronized void disconnect() {
super.disconnect();
done();
}
public synchronized void consoleClosed() {
super.consoleClosed();
done();
}
});
}
public void consolesRemoved(IConsole[] consoles) {
// empty
}
public int hashCode() {
return launchKey.hashCode();
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final TestingConsoleListener other = (TestingConsoleListener) obj;
return launchKey.equals(other.launchKey);
}
/**
*
*/
public void install() {
if (initialized) {
return;
}
checkConsoles(getConsoleManager().getConsoles());
if (!initialized) {
getConsoleManager().addConsoleListener(this);
}
}
public void uninstall() {
getConsoleManager().removeConsoleListener(this);
}
private static IConsoleManager getConsoleManager() {
return ConsolePlugin.getDefault().getConsoleManager();
}
}