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


 */


import org.eclipse.jem.internal.proxy.common.remote.Commands;
import org.eclipse.jem.internal.proxy.core.*;
/**
 * Remote Implementation of INumberBeanProxy for the primitive "long".
 * It can answer all of the primitive number types (int, long, short, byte, double, float).
 * Creation date: (2/6/00 9:02:54 AM)
 * @author: Joe Winchester
 */
class REMLongTypeBeanProxy extends REMConstantBeanProxy implements INumberBeanProxy {
	private final long fLong;

/**
 * It is package protected because they are created
 * in a special way and no one else should create them.
 * @param aBean java.lang.Object
 */
REMLongTypeBeanProxy(REMProxyFactoryRegistry aRegistry, long aLong) {
	super(aRegistry);
	fLong = aLong;
}
/**
 * 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 REMLongTypeBeanProxy)
		return fLong == ((REMLongTypeBeanProxy) anObject).longValue();
	if (anObject instanceof Long)
		return fLong == ((Long) anObject).longValue();
	return false;
}

/* (non-Javadoc)
 * @see org.eclipse.jem.internal.proxy.core.IBeanProxy#sameAs(org.eclipse.jem.internal.proxy.core.IBeanProxy)
 */
public boolean sameAs(IBeanProxy aBeanProxy) {
	if (this == aBeanProxy)
		return true;	// Identity
	if (aBeanProxy instanceof REMLongTypeBeanProxy)
		return fLong == ((REMLongTypeBeanProxy) aBeanProxy).longValue();
	return false;
}
/**
 * byteValue method comment.
 */
public byte byteValue() {
	return (byte) fLong;
}
/**
 * doubleValue method comment.
 */
public double doubleValue() {
	return fLong;
}
/**
 * floatValue method comment.
 */
public float floatValue() {
	return fLong;
}
/**
 * Return the int value
 */
public int intValue() {
	return (int) fLong;
}
/**
 * longValue method comment.
 */
public long longValue() {
	return fLong;
}
/**
 * numberValue method comment.
 */
public Number numberValue() {
	return new Long(fLong);
}
/**
 * shortValue method comment.
 */
public short shortValue() {
	return (short) fLong;
}

/**
 * The bean's toString.
 */
public String toBeanString() {
	return String.valueOf(fLong);
}

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

/**
 * Render the bean into value object.
 */
public void renderBean(Commands.ValueObject value) {
	value.set(fLong);
}
}


