blob: 13fa3f385d1fd9e99a4425dbe9c5c6e843aa3377 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2012 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 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 {
public JDIModificationVariable(JDIDebugTarget target) {
super(target);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.debug.core.model.IValueModification#supportsValueModification
* ()
*/
@Override
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,
getJavaType().toString()), nfe);
}
return vmValue;
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang
* .String)
*/
@Override
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)
*/
@Override
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
* )
*/
@Override
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)
*/
@Override
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;
}