| /******************************************************************************* |
| * 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; |
| |
| } |