/* * 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.Serializable; import javax.naming.InitialContext; import javax.naming.NamingException; /** * Provides the interface for creating new handles instances and * for getting a reference to the initial context. * * @author Jason Dillon <jason@planet57.com> * @version $Revision: 1.2 $ */ public abstract class InitialContextHandle implements Serializable { /** Serial Version Identifier. */ private static final long serialVersionUID = 8271304971930101243L; /** The factory for producing handles. */ private static InitialContextHandleFactory factory = null; /** * Lookup the class of the factory that will be used to construct * new handle instances. */ private static Class getFactoryType() { String propname = InitialContextHandle.class.getName() + ".factory"; String classname = System.getProperty(propname, null); Class type; if (classname != null) { try { type = Class.forName(classname); } catch (ClassNotFoundException e) { throw new RuntimeException ("invalid factory class name: " + classname); } // check if the given class is the correct type before // attempting to construct a new object if (! InitialContextHandleFactory.class.isAssignableFrom(type)) { throw new RuntimeException("does not implement: " + InitialContextHandleFactory.class); } } else { type = DefaultInitialContextHandle.Factory.class; } return type; } /** * Construct a new factory if one has not been created yet. */ private static synchronized void createFactory() { if (factory != null) return; // get the type of factory that will be used Class type = getFactoryType(); // create a new instance try { factory = (InitialContextHandleFactory)type.newInstance(); } catch (Exception e) { if (e instanceof RuntimeException) throw (RuntimeException)e; // should really use a nesting exception here to preserve // the target throwables detail. throw new RuntimeException("failed to construct factory: " + e); } } /** * Factory method for producting state objects. * * @return A state object. */ public static InitialContextHandle create() { // lazy initialize the factory if (factory == null) { createFactory(); } return factory.create(); } /** * Get the initial context for this handle. * * @return InitialContext. * * @throws NamingException Failed to create InitialContext. */ public abstract InitialContext getInitialContext() throws NamingException; }