package org.erlide.backend.debug.model;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.debug.core.DebugException;
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.erlide.backend.debug.IErlangDebugNode;
/**
* A debug node is a distributed node connected to the debug target. It is only
* created when debugging distributed systems, and only for the "other" nodes
* connected.
*
* @author jakob
*
*/
public class ErlangDebugNode extends ErlangDebugElement
implements IDebugTarget, IErlangDebugNode {
private final String fNodeName;
private final List<ErlangProcess> fShownProcesses;
private final ErlangDebugTarget fErlangDebugTarget;
public ErlangDebugNode(final ErlangDebugTarget target, final String nodeName) {
super(null);
fNodeName = nodeName;
fShownProcesses = new ArrayList<>();
fErlangDebugTarget = target;
}
@Override
public String getName() throws DebugException {
return fNodeName;
}
@Override
public IProcess getProcess() {
return null;
}
@Override
public IThread[] getThreads() throws DebugException {
if (isTerminated()) {
return ErlangDebugTarget.NO_PROCS;
}
return fShownProcesses.toArray(new IThread[fShownProcesses.size()]);
}
@Override
public boolean hasThreads() throws DebugException {
return true;
}
@Override
public boolean supportsBreakpoint(final IBreakpoint breakpoint) {
return fErlangDebugTarget.supportsBreakpoint(breakpoint);
}
@Override
public boolean canTerminate() {
return true;
}
@Override
public boolean isTerminated() {
return false;
}
@Override
public void terminate() throws DebugException {
fErlangDebugTarget.terminate();
}
@Override
public boolean canResume() {
return false;
}
@Override
public boolean canSuspend() {
return false;
}
@Override
public boolean isSuspended() {
return false;
}
@Override
public void resume() throws DebugException {
}
@Override
public void suspend() throws DebugException {
}
@Override
public void breakpointAdded(final IBreakpoint breakpoint) {
fErlangDebugTarget.breakpointAdded(breakpoint);
}
@Override
public void breakpointChanged(final IBreakpoint breakpoint,
final IMarkerDelta delta) {
fErlangDebugTarget.breakpointChanged(breakpoint, delta);
}
@Override
public void breakpointRemoved(final IBreakpoint breakpoint,
final IMarkerDelta delta) {
fErlangDebugTarget.breakpointRemoved(breakpoint, delta);
}
@Override
public boolean canDisconnect() {
return false;
}
@Override
public void disconnect() throws DebugException {
}
@Override
public boolean isDisconnected() {
return false;
}
@Override
public IMemoryBlock getMemoryBlock(final long startAddress, final long length)
throws DebugException {
return fErlangDebugTarget.getMemoryBlock(startAddress, length);
}
@Override
public boolean supportsStorageRetrieval() {
return fErlangDebugTarget.supportsStorageRetrieval();
}
@Override
public void addErlangProcess(final ErlangProcess ep) {
fShownProcesses.add(ep);
}
@Override
public void removeErlangProcess(final ErlangProcess p) {
fShownProcesses.remove(p);
}
@Override
public ErlangDebugTarget getErlangDebugTarget() {
return fErlangDebugTarget;
}
@Override
public ILaunch getLaunch() {
return fErlangDebugTarget.getLaunch();
}
@Override
public IDebugTarget getDebugTarget() {
return this;
}
}