/* * 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.rmi.RemoteException; import java.rmi.ServerException; import java.rmi.MarshalledObject; import java.lang.reflect.Method; import javax.ejb.Handle; import javax.ejb.EJBObject; import javax.naming.InitialContext; import org.jboss.security.SecurityAssociation; import org.jboss.logging.Logger; /** * An EJB stateful session bean handle. * * @author Rickard Öberg (rickard.oberg@telkel.com) * @author <jason@planet57.com> * @version $Revision: 1.6.4.1 $ */ public class StatefulHandleImpl extends AbstractHandle implements Handle { // Constants ----------------------------------------------------- /** Serial Version Identifier. */ private static final long serialVersionUID = -2592509632957623102L; // Static -------------------------------------------------------- /** A reference to {@link Handle#getEJBObject}. */ protected static final Method GET_EJB_OBJECT; /** * Initialize Handle method references. */ static { try { GET_EJB_OBJECT = Handle.class.getMethod("getEJBObject", new Class[0]); } catch (Exception e) { e.printStackTrace(); throw new ExceptionInInitializerError(e); } } // Attributes ---------------------------------------------------- /** The identity of the bean. */ protected final Object id; // Constructors -------------------------------------------------- /** * Construct a StatefulHandleImpl. * * @param handle The initial context handle that will be used * to restore the naming context or null to use * a fresh InitialContext object. * @param name JNDI name. * @param id Identity of the bean. */ public StatefulHandleImpl(final InitialContextHandle handle, final String name, final Object id) { super(handle, name); this.id = id; } // Public -------------------------------------------------------- /** * Handle implementation. * * @return EJBObject reference. * * @throws ServerException Could not get EJBObject. */ public EJBObject getEJBObject() throws RemoteException { try { InitialContext ctx = createInitialContext(); ContainerRemote container; // get a ref to the container, then close the naming context try { container = (ContainerRemote)ctx.lookup("invokers/" + name); } finally { ctx.close(); } // Create a new MethodInvocation for distribution //System.out.println("I am about to invoke and getEJBOBject is "+getEJBObjectMethod.getName() +" My ID is "+id); RemoteMethodInvocation rmi = new RemoteMethodInvocation(null, GET_EJB_OBJECT, new Object[] { id }); // MF FIXME: WE DEFINITLY NEED THE SECURITY ON SUCH A CALL... // We also need a pointer to the TM...:( // Set the transaction context //rmi.setTransaction(tm != null? tm.getTransaction() : null); // Set the security stuff // MF fixme this will need to use "thread local" and therefore same construct as above // rmi.setPrincipal(sm != null? sm.getPrincipal() : null); // rmi.setCredential(sm != null? sm.getCredential() : null); // is the credential thread local? (don't think so... but...) //rmi.setPrincipal( getPrincipal() ); // rmi.setCredential( getCredential() ); // LT: added next two lines as fix for bug 474134 (26/10/01). Not sure which of the above comments are relevant... rmi.setPrincipal(SecurityAssociation.getPrincipal()); rmi.setCredential(SecurityAssociation.getCredential()); // Invoke on the remote server, enforce marshalling MarshalledObject mo = new MarshalledObject(rmi); return (EJBObject)container.invokeHome(mo).get(); } catch (Exception e) { throw new ServerException("Could not get EJBObject", e); } } // Package protected --------------------------------------------- // Protected ----------------------------------------------------- // Private ------------------------------------------------------- // Inner classes ------------------------------------------------- }