/*******************************************************************************
 * Copyright (c) 2001, 2005 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.jem.internal.proxy.remote;
/*
 * $RCSfile: REMCharacterClassBeanProxy.java,v $ $Revision: 1.6 $ $Date: 2005/08/24 20:39:06 $
 */

import org.eclipse.jem.internal.proxy.core.*;
import org.eclipse.jem.internal.proxy.common.remote.Commands;
/**
 * IDE Implementation of ICharacterBeanProxy for the Character class. Creation date: (2/6/00
 * 9:02:54 AM) @author: Joe Winchester
 */
final class REMCharacterClassBeanProxy extends REMConstantBeanProxy implements ICharacterBeanProxy {
	protected Character fCharValue;

	/**
	 * As well as storing the bean store the char value so that we can return the charValue faster
	 * without the need for repeated re-casting. It is package protected because it is created in
	 * special way, so no one else should create these.
	 * 
	 * @param aBean
	 *            java.lang.Object
	 */
	REMCharacterClassBeanProxy(REMProxyFactoryRegistry aRegistry, Character value) {
		super(aRegistry);
		fCharValue = value;
	}

	/**
	 * equals: Equal if: 1) This proxy == (identity) to the other object 2) Else if other is an
	 * IBeanProxy and not a constant one, then if equals on the server. 3) If this is a constant
	 * proxy and the other is too or is a constant value (e.g. IStringBeanProxy.equals(String),
	 * then true if values are equals.
	 */
	public boolean equals(Object anObject) {
		if (this == anObject)
			return true; // Identity
		if (anObject instanceof REMCharacterClassBeanProxy)
			return fCharValue.charValue() == ((REMCharacterClassBeanProxy) anObject).charValue();
		if (anObject instanceof Character)
			return fCharValue.charValue() == ((Character) anObject).charValue();
		return false;
	}

	/**
	 * Return the char value
	 */
	public char charValue() {
		return fCharValue.charValue();
	}
	/**
	 * Return the java.lang.Character value
	 */
	public Character characterValue() {
		return fCharValue;
	}

	/**
	 * Answer the toString() of the value.
	 */
	public String toBeanString() {
		return fCharValue.toString();
	}

	/**
	 * Get the beantype
	 */
	public IBeanTypeProxy getTypeProxy() {
		return ((REMStandardBeanTypeProxyFactory) fFactory.getBeanTypeProxyFactory()).characterClass;
	}

	/**
	 * Render the bean into value object.
	 */
	public void renderBean(Commands.ValueObject value) {
		value.set(fCharValue);
	}
	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jem.internal.proxy.core.INumberBeanProxy#byteValue()
	 */
	public byte byteValue() {
		return (byte) fCharValue.charValue();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jem.internal.proxy.core.INumberBeanProxy#doubleValue()
	 */
	public double doubleValue() {
		return fCharValue.charValue();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jem.internal.proxy.core.INumberBeanProxy#floatValue()
	 */
	public float floatValue() {
		return fCharValue.charValue();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jem.internal.proxy.core.INumberBeanProxy#intValue()
	 */
	public int intValue() {
		return fCharValue.charValue();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jem.internal.proxy.core.INumberBeanProxy#longValue()
	 */
	public long longValue() {
		return fCharValue.charValue();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jem.internal.proxy.core.INumberBeanProxy#numberValue()
	 */
	public Number numberValue() {
		return new Integer(charValue()); // Kludge.
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.jem.internal.proxy.core.INumberBeanProxy#shortValue()
	 */
	public short shortValue() {
		return (short) fCharValue.charValue();
	}

}
