/*
* JBoss, the OpenSource EJB server
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.ejb.plugins.jrmp.interfaces;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectInput;
import java.rmi.MarshalledObject;
import java.lang.reflect.Method;
import javax.naming.InitialContext;
import javax.ejb.EJBObject;
import javax.ejb.EJBHome;
import org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker;
import org.jboss.ejb.CacheKey;
/**
* An EJB entity bean proxy class.
*
* @author Rickard Öberg (rickard.oberg@telkel.com)
* @author Marc Fleury
* @author Jason Dillon <jason@planet57.com>
* @version $Revision: 1.24 $
*/
public class EntityProxy
extends BeanProxy
{
// Constants -----------------------------------------------------
/** Serial Version Identifier. */
private static final long serialVersionUID = -1523442773137704949L;
// Attributes ----------------------------------------------------
/** The primary key of the entity bean. */
protected CacheKey cacheKey;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
/**
* No-argument constructor for externalization.
*/
public EntityProxy() {}
/**
* Construct a EntityProxy.
*
* @param name The JNDI name of the container that we proxy for.
* @param container The remote interface of the invoker for which
* this is a proxy for.
* @param id The primary key of the entity.
* @param optimize True if the proxy will attempt to optimize
* VM-local calls.
*
* @throws NullPointerException Id may not be null.
*/
public EntityProxy(final String name,
final ContainerRemote container,
final Object id,
final boolean optimize)
{
super(name, container, optimize);
if (id == null)
throw new NullPointerException("Id may not be null");
// make sure that our ide is a CacheKey
if (id instanceof CacheKey) {
this.cacheKey = (CacheKey)id;
}
else {
// In case we pass the Object or anything else we encapsulate
cacheKey = new CacheKey(id);
}
}
// Public --------------------------------------------------------
/**
* InvocationHandler implementation.
*
* @param proxy The proxy object.
* @param m The method being invoked.
* @param args The arguments for the method.
*
* @throws Throwable Any exception or error thrown while processing.
*/
public final Object invoke(final Object proxy,
final Method m,
Object[] args)
throws Throwable
{
// Normalize args to always be an array
// Isn't this a bug in the proxy call??
if (args == null)
args = EMPTY_ARGS;
// Implement local methods
if (m.equals(TO_STRING)) {
return name + ":" + cacheKey.getId().toString();
}
else if (m.equals(EQUALS)) {
return invoke(proxy, IS_IDENTICAL, args);
}
else if (m.equals(HASH_CODE)) {
return new Integer(cacheKey.getId().hashCode());
}
// Implement local EJB calls
else if (m.equals(GET_HANDLE)) {
return new EntityHandleImpl(initialContextHandle, name, cacheKey.getId());
}
else if (m.equals(GET_PRIMARY_KEY)) {
return cacheKey.getId();
}
else if (m.equals(GET_EJB_HOME)) {
return getEJBHome();
}
else if (m.equals(IS_IDENTICAL)) {
return isIdentical(args[0], cacheKey.getId());
}
// If not taken care of, go on and call the container
else {
return invokeContainer(cacheKey, m, args);
}
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
/**
* Externalization support.
*
* @param out
*
* @throws IOException
*/
public void writeExternal(final ObjectOutput out)
throws IOException
{
super.writeExternal(out);
out.writeObject(cacheKey);
}
/**
* Externalization support.
*
* @param in
*
* @throws IOException
* @throws ClassNotFoundException
*/
public void readExternal(final ObjectInput in)
throws IOException, ClassNotFoundException
{
super.readExternal(in);
cacheKey = (CacheKey)in.readObject();
}
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}