Java tutorial
/* * Created on Jun 11, 2006 Copyright (C) 2001-5, Anthony Harrison anh23@pitt.edu * (jactr.org) This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of the License, * or (at your option) any later version. This library is distributed in the * hope that it will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU Lesser General Public License for more details. You should have * received a copy of the GNU Lesser General Public License along with this * library; if not, write to the Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA 02111-1307 USA */ package org.jactr.eclipse.runtime.debug.elements; import java.text.NumberFormat; import java.util.ArrayList; import org.antlr.runtime.tree.CommonTree; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.debug.core.DebugException; 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; import org.jactr.eclipse.runtime.debug.ACTRDebugTarget; import org.jactr.tools.async.shadow.ShadowController; public class ACTRStackFrame extends ACTRDebugElement implements IStackFrame { /** * Logger definition */ static private final transient Log LOGGER = LogFactory.getLog(ACTRStackFrame.class); double _time; String _productionName; int _line; ACTRThread _thread; String _displayText; public ACTRStackFrame(ACTRThread thread, double time, String productionName, int lineNumber) { _time = time; _productionName = productionName; _line = lineNumber; _thread = thread; StringBuilder sb = new StringBuilder(); sb.append("["); sb.append(NumberFormat.getNumberInstance().format(_time)).append("] : "); sb.append(_productionName); _displayText = sb.toString(); setDebugTarget((ACTRDebugTarget) thread.getDebugTarget()); } public String getProductionName() { return _productionName; } public String getSourceName() { return _thread.getSourceName(); } public int getCharEnd() throws DebugException { return -1; } public int getCharStart() throws DebugException { return -1; } public int getLineNumber() throws DebugException { return _line; } public String getName() throws DebugException { return _displayText; } public IRegisterGroup[] getRegisterGroups() throws DebugException { return new IRegisterGroup[0]; } public IThread getThread() { return _thread; } public IVariable[] getVariables() throws DebugException { if (!isTop()) return new IVariable[0]; ShadowController sc = _target.getACTRSession().getShadowController(); CommonTree modelDescriptor = sc.getModelDescriptor(_thread.getName()); CommonTree breakPoint = sc.getBreakpointData(_thread.getName()); ArrayList<IVariable> variables = new ArrayList<IVariable>(); if (modelDescriptor != null) variables.add(new ASTVariable(modelDescriptor, "current model state", _target)); if (breakPoint != null) variables.add(new ASTVariable(breakPoint, "current break point", _target)); return variables.toArray(new IVariable[0]); } public boolean hasRegisterGroups() throws DebugException { return false; } public boolean hasVariables() throws DebugException { boolean isTopFrame = isTop(); if (LOGGER.isDebugEnabled()) LOGGER.debug("is the top frame : " + isTopFrame); return isTopFrame; } public boolean isTop() { try { return _thread.getTopStackFrame() == this; } catch (Exception e) { return false; } } public boolean canStepInto() { if (isTop()) return _thread.canStepInto(); return false; } public boolean canStepOver() { if (isTop()) return _thread.canStepOver(); return false; } public boolean canStepReturn() { if (isTop()) return _thread.canStepReturn(); return false; } public boolean isStepping() { return _thread.isStepping(); } public void stepInto() throws DebugException { _thread.stepInto(); } public void stepOver() throws DebugException { _thread.stepOver(); } public void stepReturn() throws DebugException { _thread.stepReturn(); } public boolean canResume() { return _thread.canResume(); } public boolean canSuspend() { return _thread.canSuspend(); } public boolean isSuspended() { return _thread.isSuspended(); } public void resume() throws DebugException { if (canResume()) _thread.resume(); } public void suspend() throws DebugException { if (canSuspend()) _thread.suspend(); } public boolean canTerminate() { return _thread.canTerminate(); } public boolean isTerminated() { return _thread.isTerminated(); } public void terminate() throws DebugException { _thread.terminate(); } }