Java tutorial
/* * Created on Mar 18, 2007 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.lang.ref.SoftReference; 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.IValue; import org.eclipse.debug.core.model.IVariable; import org.jactr.eclipse.core.ast.Support; import org.jactr.eclipse.runtime.debug.ACTRDebugTarget; import org.jactr.io.antlr3.builder.JACTRBuilder; public class ASTVariable extends ACTRDebugElement implements IVariable, IValue { /** * Logger definition */ static private final transient Log LOGGER = LogFactory.getLog(ASTVariable.class); private final CommonTree _ast; private String _variableName; private String _variableType; private String _variableValue; private SoftReference<IVariable[]> _children = new SoftReference<IVariable[]>(null); public ASTVariable(CommonTree ast, ACTRDebugTarget target) { setDebugTarget(target); _ast = ast; extractDisplayTexts(); if (_ast == null) LOGGER.error("NULL AST?", new NullPointerException()); if (LOGGER.isDebugEnabled()) LOGGER.debug("Variable created " + _variableName + " "); } public ASTVariable(CommonTree ast, String variableValue, ACTRDebugTarget target) { this(ast, target); setVariableValue(variableValue); } public CommonTree getCommonTree() { return _ast; } public void setReferenceTypeName(String variableType) { _variableType = variableType; } public void setName(String name) { _variableName = name; } public void setVariableValue(String value) { _variableValue = value; } public String getName() throws DebugException { return _variableName; } public String getReferenceTypeName() throws DebugException { return _variableType; } public IValue getValue() throws DebugException { return this; } public boolean hasValueChanged() throws DebugException { return false; } public void setValue(String expression) throws DebugException { } public void setValue(IValue value) throws DebugException { } public boolean supportsValueModification() { return false; } public boolean verifyValue(String expression) throws DebugException { return false; } public boolean verifyValue(IValue value) throws DebugException { return false; } public String getValueString() throws DebugException { return _variableValue; } public IVariable[] getVariables() throws DebugException { IVariable[] children = _children.get(); if (children == null) { ArrayList<IVariable> variables = new ArrayList<IVariable>(); for (CommonTree child : Support.getVisibleChildren(_ast)) variables.add(new ASTVariable(child, _target)); children = variables.toArray(new IVariable[variables.size()]); _children = new SoftReference<IVariable[]>(children); } return children; } public boolean hasVariables() throws DebugException { return getVariables().length != 0; } public boolean isAllocated() throws DebugException { return true; } /** * we actually rely upon the ACTRModelPresentation to display the icon, and * name we just need to set the variable value */ protected void extractDisplayTexts() { String name = _ast.getText(); String tokenType = "[" + JACTRBuilder.tokenNames[_ast.getType()].toLowerCase() + "]"; setReferenceTypeName(tokenType); CommonTree nameNode = null; for (int i = 0; i < _ast.getChildCount() && nameNode == null; i++) { nameNode = (CommonTree) _ast.getChild(i); if (nameNode.getType() != JACTRBuilder.NAME) nameNode = null; } int type = _ast.getType(); if (nameNode != null) name = nameNode.getText(); setName(name); switch (type) { case JACTRBuilder.SLOT: setVariableValue(_ast.getChild(2).getText()); break; case JACTRBuilder.PARAMETER: setVariableValue(_ast.getChild(1).getText()); break; default: break; } } }