/* * 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.lang.reflect.Method; import org.jboss.ejb.plugins.jrmp.server.JRMPContainerInvoker; /** * An EJB stateless session bean proxy class. * * @author Rickard Öberg (rickard.oberg@telkel.com) * @author Marc Fleury * @author Jason Dillon <jason@planet57.com> * @version $Revision: 1.15 $ */ public class StatelessSessionProxy extends BeanProxy { // Constants ----------------------------------------------------- /** Serial Version Identifier. */ private static final long serialVersionUID = 2327647224051998978L; // Attributes ---------------------------------------------------- // Static -------------------------------------------------------- // Constructors -------------------------------------------------- /** * No-argument constructor for externalization. */ public StatelessSessionProxy() {} /** * Construct a StatelessSessionProxy. * * @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 optimize True if the proxy will attempt to optimize * VM-local calls. */ public StatelessSessionProxy(final String name, final ContainerRemote container, final boolean optimize) { super(name, container, optimize); } // 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 + ":Stateless"; } else if (m.equals(EQUALS)) { return invoke(proxy, IS_IDENTICAL, args); } else if (m.equals(HASH_CODE)) { // We base the stateless hash on the hash of the proxy... // MF XXX: it could be that we want to return the hash of the name? return new Integer(this.hashCode()); } // Implement local EJB calls else if (m.equals(GET_HANDLE)) { return new StatelessHandleImpl(initialContextHandle, name); } else if (m.equals(GET_PRIMARY_KEY)) { // MF FIXME // The spec says that SSB PrimaryKeys should not be returned and the call should throw an exception // However we need to expose the field *somehow* so we can check for "isIdentical" // For now we use a non-spec compliant implementation and just return the key as is // See jboss1.0 for the PKHolder and the hack to be spec-compliant and yet solve the problem // This should be the following call //throw new RemoteException("Session Beans do not expose their keys, RTFS"); // This is how it can be solved with a PKHolder (extends RemoteException) // throw new PKHolder("RTFS", name); // This is non-spec compliant but will do for now // We can consider the name of the container to be the primary key, since all stateless beans // are equal within a home return name; } else if (m.equals(GET_EJB_HOME)) { return getEJBHome(); } else if (m.equals(IS_IDENTICAL)) { // All stateless beans are identical within a home, // if the names are equal we are equal return isIdentical(args[0], name); } // If not taken care of, go on and call the container else { return invokeContainer(null, m, args); } } // Package protected --------------------------------------------- // Protected ----------------------------------------------------- // Private ------------------------------------------------------- // Inner classes ------------------------------------------------- }