blob: 7f184a2f33c19cb9d0f2a364051ba1f7851a0387 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.debug.core.model;
import java.util.ArrayList;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.jdi.internal.ValueImpl;
import org.eclipse.jdi.internal.VirtualMachineImpl;
import com.ibm.icu.text.MessageFormat;
import com.sun.jdi.InvalidTypeException;
import com.sun.jdi.Value;
import com.sun.jdi.VirtualMachine;
/**
* Common functionality for variables that support value modification
*/
public abstract class JDIModificationVariable extends JDIVariable {
private final static ArrayList fgValidSignatures = new ArrayList (9);
static {
fgValidSignatures.add("B"); // byte //$NON-NLS-1$
fgValidSignatures.add("C"); // char //$NON-NLS-1$
fgValidSignatures.add("D"); // double //$NON-NLS-1$
fgValidSignatures.add("F"); // float //$NON-NLS-1$
fgValidSignatures.add("I"); // int //$NON-NLS-1$
fgValidSignatures.add("J"); // long //$NON-NLS-1$
fgValidSignatures.add("S"); // short //$NON-NLS-1$
fgValidSignatures.add("Z"); // boolean //$NON-NLS-1$
fgValidSignatures.add(jdiStringSignature); // String
}
public JDIModificationVariable(JDIDebugTarget target) {
super(target);
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#supportsValueModification()
*/
public boolean supportsValueModification() {
return true;
}
/**
* Returns a value generated by the vm from the given expression
* @param expression the expression to produce a value from
* @return generated value, <code>null</code> is a valid value
* @throws DebugException if there is a problem generating the value
*/
protected Value generateVMValue(String expression) throws DebugException {
VirtualMachine vm= getVM();
if (vm == null) {
requestFailed(JDIDebugModelMessages.JDIModificationVariable_Unable_to_generate_value___VM_disconnected__1, null);
}
String signature= getJavaType().getSignature();
Value vmValue= null;
try {
switch (signature.charAt(0)) {
case 'Z' :
String flse= Boolean.FALSE.toString();
String tre= Boolean.TRUE.toString();
if (expression.equals(tre) || expression.equals(flse)) {
boolean booleanValue= Boolean.valueOf(expression).booleanValue();
vmValue= vm.mirrorOf(booleanValue);
}
break;
case 'B' :
byte byteValue= Byte.valueOf(expression).byteValue();
vmValue= vm.mirrorOf(byteValue);
break;
case 'C' :
if (expression.length() == 1) {
char charValue= expression.charAt(0);
vmValue= vm.mirrorOf(charValue);
} else if (expression.length() == 2) {
char charValue;
if (!(expression.charAt(0) == '\\')) {
return null;
}
switch (expression.charAt(1)) {
case 'b':
charValue= '\b';
break;
case 'f':
charValue= '\f';
break;
case 'n':
charValue= '\n';
break;
case 'r':
charValue= '\r';
break;
case 't':
charValue= '\t';
break;
case '\'':
charValue= '\'';
break;
case '\"':
charValue= '\"';
break;
case '\\':
charValue= '\\';
break;
default :
return null;
}
vmValue= vm.mirrorOf(charValue);
}
break;
case 'S' :
short shortValue= Short.valueOf(expression).shortValue();
vmValue= vm.mirrorOf(shortValue);
break;
case 'I' :
int intValue= Integer.valueOf(expression).intValue();
vmValue= vm.mirrorOf(intValue);
break;
case 'J' :
long longValue= Long.valueOf(expression).longValue();
vmValue= vm.mirrorOf(longValue);
break;
case 'F' :
float floatValue= Float.valueOf(expression).floatValue();
vmValue= vm.mirrorOf(floatValue);
break;
case 'D' :
double doubleValue= Double.valueOf(expression).doubleValue();
vmValue= vm.mirrorOf(doubleValue);
break;
case 'L' :
if (expression.equals("null")) { //$NON-NLS-1$
vmValue = null;
} else if (expression.equals("\"null\"")) { //$NON-NLS-1$
vmValue = vm.mirrorOf("null"); //$NON-NLS-1$
} else {
vmValue= vm.mirrorOf(expression);
}
break;
}
} catch (NumberFormatException nfe) {
requestFailed(MessageFormat.format(JDIDebugModelMessages.JDIModificationVariable_0,new String[]{getJavaType().toString()}),nfe);
}
return vmValue;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang.String)
*/
public boolean verifyValue(String expression) throws DebugException {
Value vmValue = generateVMValue(expression);
IValue value = JDIValue.createValue(getJavaDebugTarget(), vmValue);
return verifyValue(value);
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse.debug.core.model.IValue)
*/
public boolean verifyValue(IValue value) throws DebugException {
if (value instanceof JDIValue && value.getDebugTarget().equals(getDebugTarget())) {
JDIValue jv = (JDIValue)value;
try {
ValueImpl.checkValue(jv.getUnderlyingValue(), getUnderlyingType(), (VirtualMachineImpl)getVM());
return true;
} catch (InvalidTypeException e) {
}
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String)
*/
public final void setValue(String expression) throws DebugException {
Value value= generateVMValue(expression);
setJDIValue(value);
}
/* (non-Javadoc)
* @see org.eclipse.jdt.internal.debug.core.model.JDIVariable#setValue(org.eclipse.debug.core.model.IValue)
*/
public final void setValue(IValue v) throws DebugException {
if (v instanceof JDIValue) {
JDIValue value = (JDIValue)v;
setJDIValue(value.getUnderlyingValue());
}
}
/**
* Set this variable's value to the given value
*/
protected abstract void setJDIValue(Value value) throws DebugException;
}