You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
3.8 KiB
Java

EJB home factory
package com.ack.j2ee.ejb.simple;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.ejb.EJBHome;
import javax.ejb.EJBLocalHome;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
public class EJBHomeFactory {
private Map ejbHomes;
private Context initialCtx;
private static EJBHomeFactory instance;
public synchronized static void init() throws NamingException {
instance = new EJBHomeFactory( null );
}
public synchronized static void init( Context ctx ) throws NamingException {
instance = new EJBHomeFactory( ctx );
}
public static EJBHomeFactory getFactory() {
if( instance == null ) {
throw new IllegalStateException( "EJBHomeFactory singleton has not been initialised" );
}
// this can happen if client forgets to call EJBHomeFactory.init()
if( instance.getInitialContext() == null ) {
throw new
IllegalArgumentException( "initial context is null in EJBHomeFactory" );
}
return instance;
}
public static EJBHome lookUpHome( String jndiName, Class homeClass ) throws NamingException {
return EJBHomeFactory.getFactory().lookUp( jndiName, homeClass );
}
public static EJBLocalHome lookUpLocalHome( String jndiName, Class localHomeClass ) throws NamingException {
return EJBHomeFactory.getFactory().lookUpLocal( jndiName, localHomeClass );
}
/**
* object responsibilities
*/
/**
* @param jndiName
* @param homeClass
* @return NamingException
* @throws javax.naming.NamingException
*/
public EJBHome lookUp( String jndiName, Class homeClass ) throws NamingException {
/**
* input validate arguments
*/
if( jndiName == null ) {
throw new IllegalArgumentException( "supplied jndiName to lookup was null" );
}
if( homeClass == null ) {
throw new IllegalArgumentException( "supplied home class to lookup was null" );
}
// lookup ejb home in cache
EJBHome ejbHome = (EJBHome) ejbHomes.get( homeClass );
// if not there, create and add to cache
if( ejbHome == null ) {
ejbHome =
(EJBHome) PortableRemoteObject.
narrow( initialCtx.lookup( jndiName ), homeClass );
ejbHomes.put( homeClass, ejbHome );
}
// send back the specified home interface
return ejbHome;
}
public EJBLocalHome lookUpLocal( String jndiName, Class homeClass ) throws NamingException {
/**
* input validate arguments
*/
if( jndiName == null ) {
throw new IllegalArgumentException( "supplied jndiName to lookup was null" );
}
if( homeClass == null ) {
throw new IllegalArgumentException( "supplied home class to lookup was null" );
}
// lookup ejb home in cache
EJBLocalHome ejbLocalHome = (EJBLocalHome) ejbHomes.get( homeClass );
// if not there, create and add to cache
if( ejbLocalHome == null ) {
ejbLocalHome =
(EJBLocalHome) PortableRemoteObject.
narrow( initialCtx.lookup( jndiName ), homeClass );
ejbHomes.put( homeClass, ejbLocalHome );
}
// send back the specified home interface
return ejbLocalHome;
}
/**
* Constructor
* @param ctx the JNDI initial context
* @throws javax.naming.NamingException
*/
private EJBHomeFactory( Context ctx ) throws NamingException {
if( ( initialCtx = ctx ) == null ) {
initialCtx = new InitialContext();
}
ejbHomes = Collections.synchronizedMap( new HashMap() );
}
/**
* get the initial context
* @return Context the JNDI initial context
*/
private Context getInitialContext() {
return initialCtx;
}
}