/*
* 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.Serializable;
import java.rmi.ServerException;
import java.lang.reflect.*;
import javax.ejb.*;
import javax.naming.*;
/**
* An abstract base handle class from which all handles extend from.
*
* @author Jason Dillon <jason@planet57.com>
* @version $Revision: 1.1 $
*/
public abstract class AbstractHandle
implements Serializable
{
// Constants -----------------------------------------------------
/** Serial Version Identifier. */
private static final long serialVersionUID = -6161932252555944539L;
// Attributes ----------------------------------------------------
/** JNDI name used for lookups. */
protected final String name;
/** A handle used to restore the correct naming context. */
protected final InitialContextHandle initialContextHandle;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
/**
* Initialize.
*
* @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 A JNDI name.
*/
public AbstractHandle(final InitialContextHandle handle,
final String name)
{
this.initialContextHandle = handle;
this.name = name;
}
/**
* Initialize, creating a new initial context handle object.
*
* @param name A JNDI name.
*/
public AbstractHandle(final String name) {
this(InitialContextHandle.create(), name);
}
// Public --------------------------------------------------------
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
/**
* Create an InitialContext using the saved environment or
* create a vanilla InitialContext when the enviroment
* is null.
*
* @return InitialContext suitable for the bean that this
* is a proxy for.
*
* @throws NamingException Failed to create InitialContext.
*/
protected InitialContext createInitialContext()
throws NamingException
{
if (initialContextHandle == null) {
// HACK to allow lookups when using the HomeHandle created by
// a JRMPContainerInvoker, which does not provide an
// initialContextHandle
return new InitialContext();
}
return initialContextHandle.getInitialContext();
}
/**
* Get the EJBHome reference at the configured JNDI
* name.
*
* @return EJBHome reference.
*
* @throws NamingException Failed to lookup EJBHome.
* @throws ClassCastException Object at specified name is not an
* instance of EJBHome.
*/
protected EJBHome lookupEJBHome() throws NamingException {
// restore the naming context
InitialContext ctx = createInitialContext();
try {
return (EJBHome)ctx.lookup(name);
}
finally {
ctx.close();
}
}
/**
* Helper to perform the actual lookup and reflection.
*
* @param name The name of the method that is to be used.
* @param types The signature of the method.
* @param args The arguments to the method.
* @return An EJBObject.
*
* @throws ServerException Could not get EJBObject.
*/
protected EJBObject getEJBObject(final String name,
final Class[] types,
final Object[] args)
throws ServerException
{
try {
EJBHome home = lookupEJBHome();
Class type = home.getClass();
Method method = type.getMethod(name, types);
return (EJBObject)method.invoke(home, args);
}
catch (Exception e) {
throw new ServerException("Could not get EJBObject", e);
}
}
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}