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

}
