blob: 872923470d832c4cd9b69ed12ae53b0ac46a0ad0 [file] [log] [blame]
package org.eclipse.jdt.internal.debug.core;
/*
* (c) Copyright IBM Corp. 2000, 2001.
* All Rights Reserved.
*/
import com.sun.jdi.VMDisconnectedException;
import com.sun.jdi.Value;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.IDebugStatusConstants;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.jdt.debug.core.IJavaModifiers;
import org.eclipse.jdt.debug.core.IJavaVariable;
public abstract class JDIVariable extends JDIDebugElement implements IJavaVariable {
// NLS
protected final static String PREFIX= "jdi_variable.";
protected static final String ERROR = PREFIX + "error.";
protected static final String ERROR_GET_NAME = ERROR + "get_name";
protected static final String ERROR_GET_REFERENCE_TYPE = ERROR + "get_reference_type";
protected static final String ERROR_GET_SIGNATURE = ERROR + "get_signature";
protected static final String ERROR_GET_VALUE= ERROR + "get_value";
protected static final String ERROR_SET_VALUE= ERROR + "set_value";
protected static final String ERROR_SET_VALUE_NOT_SUPPORTED= ERROR + "set_value.not_supported";
/**
* Cache of current value - see #getValue().
*/
protected JDIValue fValue;
//non NLS
protected final static String jdiStringSignature= "Ljava/lang/String;";
/**
* Creates a new variable with the given parent. Parents can
* be stack frames (for locals), or values for field members.
*/
public JDIVariable(JDIDebugElement parent) {
super(parent);
}
/**
* @see IAdaptable
*/
public Object getAdapter(Class adapter) {
if (adapter == IJavaVariable.class || adapter == IJavaModifiers.class) {
return this;
}
return super.getAdapter(adapter);
}
/**
* @see IDebugElement
*/
public int getElementType() {
return VARIABLE;
}
/**
* Returns this variable's current underlying jdi value.
* Subclasses must implement #retrieveValue() and do not
* need to guard against JDI exceptions, as this method
* handles them.
*
* @exception DebugException if unable to access the value
*/
protected final Value getCurrentValue() throws DebugException {
try {
return retrieveValue();
} catch (VMDisconnectedException e) {
} catch (RuntimeException e) {
targetRequestFailed(ERROR_GET_VALUE, e);
}
return null;
}
/**
* Returns this variables underlying jdi value
*/
protected abstract Value retrieveValue();
/**
* Returns the current value of this variable. The value
* is cached, but on each access we see if the value has changed
* and update if required.
*
* @see IVariable
*/
public IValue getValue() throws DebugException {
Value currentValue = getCurrentValue();
if (fValue == null) {
fValue = new JDIValue(this, currentValue);
} else {
Value previousValue = fValue.getUnderlyingValue();
if (currentValue == previousValue) {
return fValue;
}
if (previousValue == null || currentValue == null) {
fValue = new JDIValue(this, currentValue);
} else if (!previousValue.equals(currentValue)) {
fValue = new JDIValue(this, currentValue);
}
}
return fValue;
}
/**
* @see IValueModification
*/
public boolean supportsValueModification() {
return false;
}
/**
* @see IValueModification
*/
public void setValue(String expression) throws DebugException {
notSupported(ERROR_SET_VALUE_NOT_SUPPORTED);
}
/**
* @see IValueModification
*/
public boolean verifyValue(String expression) {
return false;
}
/**
* @see IDebugElement
*/
public IStackFrame getStackFrame() {
return getParent().getStackFrame();
}
/**
* @see IDebugElement
*/
public IThread getThread() {
return getParent().getThread();
}
/**
* @see IJavaVariable
*/
public boolean isVolatile() throws DebugException {
return false;
}
/**
* @see IJavaVariable
*/
public boolean isTransient() throws DebugException {
return false;
}
/**
* @see IJavaVariable
*/
public boolean isSynthetic() throws DebugException {
return false;
}
/**
* @see IJavaVariable
*/
public boolean isPublic() throws DebugException {
return false;
}
/**
* @see IJavaVariable
*/
public boolean isPrivate() throws DebugException {
return false;
}
/**
* @see IJavaVariable
*/
public boolean isProtected() throws DebugException {
return false;
}
/**
* @see IJavaVariable
*/
public boolean isPackagePrivate() throws DebugException {
return false;
}
/**
* @see IJavaVariable
*/
public boolean isStatic() throws DebugException {
return false;
}
/**
* @see IJavaVariable
*/
public boolean isFinal() throws DebugException {
return false;
}
}