package org.dresdenocl.debug.model; import java.util.List; import org.dresdenocl.debug.events.IOclDebugEventListener; import org.dresdenocl.debug.util.OclStringUtil; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; public class OclDebugThread extends OclDebugElement implements IThread, IOclDebugEventListener { private boolean m_suspended = false; public OclDebugThread(OclDebugTarget target) { super(target); } @Override public boolean canResume() { return m_suspended; } @Override public boolean canSuspend() { return !m_suspended; } @Override public boolean isSuspended() { return m_suspended; } @Override public void resume() throws DebugException { // System.out.println("OclDebugThread resume()"); m_debugTarget.getDebugProxy().resume(); m_suspended = false; } @Override public void suspend() throws DebugException { System.out.println("OclDebugThread suspend()"); m_suspended = true; // fireSuspendEvent(DebugEvent.BREAKPOINT); fireSuspendEvent(0); } @Override public boolean canStepInto() { return true; } @Override public boolean canStepOver() { return true; } @Override public boolean canStepReturn() { return true; } @Override public boolean isStepping() { return false; } @Override public void stepInto() throws DebugException { m_debugTarget.getDebugProxy().stepInto(); } @Override public void stepOver() throws DebugException { m_debugTarget.getDebugProxy().stepOver(); } @Override public void stepReturn() throws DebugException { m_debugTarget.getDebugProxy().stepReturn(); } @Override public boolean canTerminate() { return !isTerminated(); } @Override public boolean isTerminated() { return m_debugTarget.isTerminated(); } @Override public void terminate() throws DebugException { m_debugTarget.getDebugProxy().terminate(); } @Override public boolean hasStackFrames() throws DebugException { return isSuspended(); } @Override public int getPriority() throws DebugException { return 0; } @Override public IStackFrame getTopStackFrame() throws DebugException { IStackFrame[] frames = getStackFrames(); if (frames.length > 0) { return frames[0]; } return null; } @Override public String getName() throws DebugException { return "Thread [main]"; } @Override public IBreakpoint[] getBreakpoints() { return null; } @Override public IStackFrame[] getStackFrames() throws DebugException { if (isSuspended()) { OclDebugMessage stack = m_debugTarget.getDebugProxy().getStack(); String framesData = stack.getArgument(0); if (framesData != null && !"".equals(framesData)) { List<String> frames = OclStringUtil.decode(framesData, '#'); IStackFrame[] theFrames = new IStackFrame[frames.size()]; System.out.println("OclDebugThread.getStackFrames() : frames.size() = " + frames.size()); for (int i = 0; i < frames.size(); i++) { String data = frames.get(i); theFrames[frames.size() - i - 1] = new OclStackFrame(m_debugTarget, data); } return theFrames; } } return new IStackFrame[0]; } @Override public void handleMessage(OclDebugMessage message) { // System.out.println("OclDebugThread handleMessage( " + message + " )"); if (message.hasType(EOclDebugMessageType.STARTED)) { fireCreationEvent(); } else if (message.hasType(EOclDebugMessageType.RESUMED)) { m_suspended = false; fireResumeEvent(0); } else if (message.hasType(EOclDebugMessageType.SUSPENDED)) { m_suspended = true; // TODO fireSuspendEvent(DebugEvent.BREAKPOINT); fireSuspendEvent(0); } else if (message.hasType(EOclDebugMessageType.TERMINATED)) { // ignore this event } else if (message.hasType(EOclDebugMessageType.CONSTRAINT_INTERPRETED)) { // ignore this event } else { System.out.println("ERROR " + this.getClass().getName() + ".handleMessage(" + message + ") unknown event"); } } }