blob: 7a48924b04557c10825729a335e3640664f2fa5b [file] [log] [blame]
package org.eclipse.emf.henshin.interpreter.debug;
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.emf.henshin.interpreter.matching.conditions.DebugApplicationCondition;
public class HenshinDebugTarget extends HenshinDebugElement implements IDebugTarget {
private ILaunch launch;
/**
* The debug thread (containing the DebugApplicationCondition).
* Has to be set separately using {@link #initTarget(DebugApplicationCondition)}.
*/
private HenshinDebugThread debugThread;
/**
* The DebugTarget's name (displays in the debug view)
*/
private String name;
private IThread[] threads;
/**
* HenshinDebugTarget Constructor. <br>
* NOTE: The associated debugThread has to be set separately
* using {@link #initTarget(DebugApplicationCondition)}.
* @param launch
* @param ruleName
*/
public HenshinDebugTarget(ILaunch launch, String ruleName) {
super(null);
this.launch = launch;
if (ruleName != null && !ruleName.isEmpty()) {
this.setName("Debugging Rule \"" + ruleName + "\"");
} else {
this.setName("HenshinDebugTarget");
}
}
/**
* Connects the given DebugApplicationCondition to this DebugTarget
* @param applicationCondition the DebugApplicationCondition that will be used for debugging.
*/
public void initTarget(DebugApplicationCondition applicationCondition) {
this.debugThread = new HenshinDebugThread(this, applicationCondition);
fireCreationEvent();
}
@Override
public ILaunch getLaunch() {
return launch;
}
@Override
public IDebugTarget getDebugTarget() {
return this;
}
@Override
public boolean canTerminate() {
return debugThread.canTerminate();
}
@Override
public boolean isTerminated() {
return debugThread.isTerminated();
}
@Override
public void terminate() throws DebugException {
debugThread.terminate();
}
@Override
public boolean canResume() {
return debugThread.canResume();
}
@Override
public boolean canSuspend() {
return debugThread.canSuspend();
}
@Override
public boolean isSuspended() {
return debugThread.isSuspended();
}
@Override
public void resume() throws DebugException {
debugThread.resume();
}
@Override
public void suspend() throws DebugException {
debugThread.suspend();
}
@Override
public void breakpointAdded(IBreakpoint breakpoint) { }
@Override
public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) { }
@Override
public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) { }
@Override
public boolean canDisconnect() {
return false;
}
@Override
public void disconnect() throws DebugException { }
@Override
public boolean isDisconnected() {
return false;
}
@Override
public boolean supportsStorageRetrieval() {
return false;
}
@Override
public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException {
return null;
}
@Override
public IProcess getProcess() {
return null;
}
@Override
public IThread[] getThreads() throws DebugException {
if (threads == null) {
threads = new IThread[]{debugThread};
}
return threads;
}
@Override
public boolean hasThreads() throws DebugException {
return true;
}
@Override
public String getName() throws DebugException {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean supportsBreakpoint(IBreakpoint breakpoint) {
// maybe add this in the future
return false;
}
public void dispose() {
fireTerminateEvent();
}
@Override
public void fireEvent(DebugEvent event) {
// All events that are fired on the debug target should be fired on the thread as well.
try {
DebugEvent threadEvent = new DebugEvent(getThreads()[0], event.getKind(), event.getDetail());
if (DebugPlugin.getDefault() != null)
DebugPlugin.getDefault().fireDebugEventSet(new DebugEvent[] {event,threadEvent});
} catch (DebugException e) {
}
}
}