001 package com.mockrunner.ejb;
002
003 import javax.naming.Context;
004 import javax.naming.InitialContext;
005 import javax.naming.NamingException;
006 import javax.transaction.UserTransaction;
007
008 import org.mockejb.jndi.MockContextFactory;
009
010 import com.mockrunner.base.NestedApplicationException;
011
012 /**
013 * Util class for creating and managing the JNDI context
014 */
015 public class JNDIUtil
016 {
017 /**
018 * Calls <code>MockContextFactory.setAsInitial()</code>, if the
019 * <code>MockContextFactory</code> is not already the current
020 * context factory.
021 */
022 public static void initMockContextFactory() throws NamingException
023 {
024 String factory = System.getProperty(Context.INITIAL_CONTEXT_FACTORY);
025 if(null == factory || !factory.equals(MockContextFactory.class.getName()))
026 {
027 MockContextFactory.setAsInitial();
028 }
029 }
030
031 /**
032 * Calls <code>MockContextFactory.revertSetAsInitial()</code>, if the
033 * <code>MockContextFactory</code> is the current context factory.
034 */
035 public static void resetMockContextFactory()
036 {
037 String factory = System.getProperty(Context.INITIAL_CONTEXT_FACTORY);
038 if(null != factory && factory.equals(MockContextFactory.class.getName()))
039 {
040 MockContextFactory.revertSetAsInitial();
041 }
042 }
043
044 /**
045 * Tries to get the JNDI context from the specified configuration.
046 * If the configuration returns <code>null</code> for the context,
047 * this method initializes the MockEJB JNDI implementation.
048 * @param configuration the configuration
049 * @return the JNDI context
050 */
051 public static Context getContext(Configuration configuration)
052 {
053 Context context = configuration.getContext();
054 if(null == context)
055 {
056 try
057 {
058 JNDIUtil.initMockContextFactory();
059 context = new InitialContext();
060 }
061 catch(NamingException exc)
062 {
063 throw new NestedApplicationException(exc);
064 }
065 configuration.setContext(context);
066 }
067 return context;
068 }
069
070 /**
071 * Binds the specified <code>UserTransaction</code> to the specified
072 * JNDI context.
073 * @param configuration the configuration
074 * @param context the JNDI context
075 * @param transaction the <code>UserTransaction</code>
076 */
077 public static void bindUserTransaction(Configuration configuration, Context context, UserTransaction transaction) throws NamingException
078 {
079 if(configuration.getBindMockUserTransactionToJNDI())
080 {
081 context.rebind(configuration.getUserTransactionJNDIName(), transaction);
082 context.rebind("javax.transaction.UserTransaction", transaction);
083 context.rebind("java:comp/UserTransaction", transaction);
084 }
085 }
086 }