package org.dresdenocl.debug.model; import java.util.List; import org.dresdenocl.debug.util.OclStringUtil; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IDebugTarget; import org.eclipse.debug.core.model.IRegisterGroup; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.debug.core.model.IThread; import org.eclipse.debug.core.model.IVariable; public class OclStackFrame extends OclDebugElement implements IStackFrame { private String m_resourceURI; private String m_name; private int m_id; private int m_line; private int m_charStart; private int m_charEnd; public OclStackFrame(OclDebugTarget target, String data) { super(target); List<String> dataParts = OclStringUtil.decode(data, ','); m_name = dataParts.get(0); m_id = Integer.parseInt(dataParts.get(1)); m_resourceURI = dataParts.get(2); m_line = Integer.parseInt(dataParts.get(3)); m_charStart = Integer.parseInt(dataParts.get(4)); m_charEnd = Integer.parseInt(dataParts.get(5)); } @Override public IDebugTarget getDebugTarget() { return m_debugTarget; } @Override public boolean canStepInto() { return getThread().canStepInto(); } @Override public boolean canStepOver() { return getThread().canStepOver(); } @Override public boolean canStepReturn() { return getThread().canStepReturn(); } @Override public boolean isStepping() { return getThread().isStepping(); } @Override public void stepInto() throws DebugException { getThread().stepInto(); } @Override public void stepOver() throws DebugException { getThread().stepOver(); } @Override public void stepReturn() throws DebugException { getThread().stepReturn(); } @Override public boolean canResume() { return getThread().canResume(); } @Override public boolean canSuspend() { return getThread().canSuspend(); } @Override public boolean isSuspended() { return getThread().isSuspended(); } @Override public void resume() throws DebugException { getThread().resume(); } @Override public void suspend() throws DebugException { getThread().suspend(); } @Override public boolean canTerminate() { return getThread().canTerminate(); } @Override public boolean isTerminated() { return getThread().isTerminated(); } @Override public void terminate() throws DebugException { getThread().terminate(); } @Override public IThread getThread() { return m_debugTarget.getThread(); } @Override public IVariable[] getVariables() throws DebugException { return m_debugTarget.getDebugProxy().getStackVariables( Integer.toString(m_id)); } @Override public boolean hasVariables() throws DebugException { return true; } @Override public int getLineNumber() throws DebugException { return m_line; } @Override public int getCharStart() throws DebugException { return m_charStart; } @Override public int getCharEnd() throws DebugException { return m_charEnd; } @Override public String getName() throws DebugException { return m_name; } @Override public IRegisterGroup[] getRegisterGroups() throws DebugException { return new IRegisterGroup[0]; } @Override public boolean hasRegisterGroups() throws DebugException { return false; } public String getResourceURI() { return m_resourceURI; } @Override public boolean equals(Object that) { if (that == null) { return false; } if (that instanceof OclStackFrame) { OclStackFrame thatFrame = (OclStackFrame) that; try { return m_name.equals(thatFrame.getName()) && m_line == thatFrame.getLineNumber() && m_charStart == thatFrame.getCharStart() && m_charEnd == thatFrame.getCharEnd(); } catch (DebugException e) { } } return false; } @Override public int hashCode() { return 31 + (m_charEnd + m_charStart + m_line) * 7; } }