package org.nodeclipse.debug.model;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IStreamsProxy;
import org.eclipse.debug.core.model.IThread;
import org.nodeclipse.debug.util.Constants;
import org.nodeclipse.debug.util.LogUtil;
public class Thread extends NodeDebugElement implements IThread {
IStreamsProxy streamsProxy;
private List<StackFrame> frames;
public Thread(IDebugTarget target) {
super(target);
streamsProxy = target.getProcess().getStreamsProxy();
}
@Override
public boolean canResume() {
return getDebugTarget().canResume();
}
@Override
public boolean canSuspend() {
return getDebugTarget().canSuspend();
}
@Override
public boolean isSuspended() {
return getDebugTarget().isSuspended();
}
@Override
public void resume() throws DebugException {
getDebugTarget().resume();
}
@Override
public void suspend() throws DebugException {
getDebugTarget().suspend();
}
@Override
public boolean canStepInto() {
return true;
}
@Override
public boolean canStepOver() {
return true;
}
@Override
public boolean canStepReturn() {
return true;
}
@Override
public boolean isStepping() {
return false;
}
public void sendCommand(String command) {
try {
if (!isTerminated()) {
streamsProxy.write(command + Constants.EOL);
}
} catch (IOException e) {
LogUtil.error(e);
}
}
@Override
public void stepInto() throws DebugException {
sendCommand(Constants.STEP);
}
@Override
public void stepOver() throws DebugException {
sendCommand(Constants.NEXT);
}
@Override
public void stepReturn() throws DebugException {
sendCommand(Constants.OUT);
}
@Override
public boolean canTerminate() {
return getDebugTarget().canTerminate();
}
@Override
public boolean isTerminated() {
return getDebugTarget().isTerminated();
}
@Override
public void terminate() throws DebugException {
getDebugTarget().terminate();
}
@Override
public IStackFrame[] getStackFrames() throws DebugException {
// TODO
if (frames == null) {
frames = new ArrayList<StackFrame>();
// for (StackFrame frame : frames) {
StackFrame frame = new StackFrame(getDebugTarget(), this);
frames.add(frame);
// }
}
return frames.toArray(new IStackFrame[frames.size()]);
}
@Override
public boolean hasStackFrames() throws DebugException {
return getStackFrames().length > 0;
}
@Override
public int getPriority() throws DebugException {
return 0;
}
@Override
public IStackFrame getTopStackFrame() throws DebugException {
IStackFrame[] frames = getStackFrames();
return frames.length > 0 ? frames[0] : null;
}
@Override
public String getName() throws DebugException {
return "nodethread-" + this.toString();
}
@Override
public IBreakpoint[] getBreakpoints() {
return new IBreakpoint[0];
}
}