package org.jboss.proxy.ejb.handle;
import java.rmi.RemoteException;
import java.rmi.ServerException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.security.AccessControlException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.security.Principal;
import java.util.Hashtable;
import javax.ejb.EJBHome;
import javax.ejb.Handle;
import javax.ejb.EJBObject;
import javax.naming.InitialContext;
import org.jboss.invocation.Invoker;
import org.jboss.invocation.Invocation;
import org.jboss.invocation.InvocationKey;
import org.jboss.invocation.InvocationType;
import org.jboss.invocation.InvokerInterceptor;
import org.jboss.invocation.PayloadKey;
import org.jboss.naming.NamingContextFactory;
import org.jboss.security.SecurityAssociation;
public class StatefulHandleImpl
implements Handle
{
static final long serialVersionUID = -6324520755180597156L;
protected static final Method GET_EJB_OBJECT;
private Object invokerID = null;
static
{
try
{
GET_EJB_OBJECT = Handle.class.getMethod("getEJBObject", new Class[0]);
}
catch(Exception e)
{
e.printStackTrace();
throw new ExceptionInInitializerError(e);
}
}
public int objectName;
public String jndiName;
public String invokerProxyBinding;
public Invoker invoker;
public Object id;
private Hashtable jndiEnv;
public StatefulHandleImpl(
int objectName,
String jndiName,
Invoker invoker,
String invokerProxyBinding,
Object id,
Object invokerID)
{
this.jndiName = jndiName;
this.id = id;
this.jndiEnv = (Hashtable) NamingContextFactory.lastInitialContextEnv.get();
try
{
String property = System.getProperty("org.jboss.ejb.sfsb.handle.V327");
if (property != null)
{
this.invokerProxyBinding = invokerProxyBinding;
this.invokerID = invokerID;
this.objectName = objectName;
this.invoker = invoker;
}
}
catch (AccessControlException ignored)
{
}
}
public Object getID()
{
return id;
}
public String getJNDIName()
{
return jndiName;
}
public EJBObject getEJBObject() throws RemoteException
{
try
{
InitialContext ic = null;
if( jndiEnv != null )
ic = new InitialContext(jndiEnv);
else
ic = new InitialContext();
Proxy proxy = (Proxy) ic.lookup(jndiName);
InvocationHandler ih = Proxy.getInvocationHandler(proxy);
return (EJBObject) ih.invoke(proxy, GET_EJB_OBJECT, new Object[] {id});
}
catch (RemoteException e)
{
throw e;
}
catch (Throwable t)
{
throw new RemoteException("Error during getEJBObject", t);
}
}
}