Author: andygumbrecht
Date: Wed Jul 31 13:20:49 2013
New Revision: 1508847

URL: http://svn.apache.org/r1508847
Log:
Make LocalInitialContextFactory thread safe - Creating a new 
LocalInitialContext could/would result in a NullPointerException on getRoot() 
after a destroy due to race condition.
Finals.

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClientInjections.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContextFactory.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/osgi/client/LocalInitialContextFactory.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClientInjections.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClientInjections.java?rev=1508847&r1=1508846&r2=1508847&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClientInjections.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/ClientInjections.java
 Wed Jul 31 13:20:49 2013
@@ -25,19 +25,21 @@ import javax.naming.NamingException;
 import java.util.List;
 
 public final class ClientInjections {
+
     private ClientInjections() {
         // no-op
     }
 
+    @SuppressWarnings("unchecked")
     public static InjectionProcessor<?> clientInjector(final Object object) 
throws OpenEJBException {
         if (object == null) {
             throw new NullPointerException("Object supplied to 'inject' 
operation is null");
         }
 
-        Context clients;
+        final Context clients;
         try {
             clients = (Context) 
SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext()
-                    .lookup("openejb/client/");
+                                              .lookup("openejb/client/");
         } catch (NamingException e) {
             throw new OpenEJBException(object.getClass().getName(), e);
         }
@@ -48,7 +50,7 @@ public final class ClientInjections {
         Class<?> current = object.getClass();
         while (current != null && !current.equals(Object.class)) {
             try {
-                String moduleId = (String) clients.lookup(current.getName());
+                final String moduleId = (String) 
clients.lookup(current.getName());
                 ctx = (Context) clients.lookup(moduleId);
                 injections = (List<Injection>) ctx.lookup("info/injections");
                 break;
@@ -59,10 +61,10 @@ public final class ClientInjections {
 
         if (injections == null) {
             throw new OpenEJBException("Unable to find injection meta-data for 
"
-                    + object.getClass().getName()
-                    + ".  Ensure that class was annotated with @"
-                    + LocalClient.class.getName()+" and was successfully 
discovered and deployed. "
-                    + " See 
http://openejb.apache.org/3.0/local-client-injection.html";);
+                                       + object.getClass().getName()
+                                       + ".  Ensure that class was annotated 
with @"
+                                       + LocalClient.class.getName() + " and 
was successfully discovered and deployed. "
+                                       + " See 
http://openejb.apache.org/3.0/local-client-injection.html";);
         }
 
         return new InjectionProcessor(object, injections, ctx);

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java?rev=1508847&r1=1508846&r2=1508847&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java
 Wed Jul 31 13:20:49 2013
@@ -16,11 +16,6 @@
  */
 package org.apache.openejb;
 
-import java.util.Date;
-import java.util.Properties;
-
-import javax.transaction.TransactionManager;
-
 import org.apache.openejb.assembler.classic.DeploymentExceptionManager;
 import org.apache.openejb.cdi.CdiBuilder;
 import org.apache.openejb.loader.SystemInstance;
@@ -35,6 +30,10 @@ import org.apache.openejb.util.OpenEjbVe
 import org.apache.openejb.util.OptionsLog;
 import org.apache.openejb.util.SafeToolkit;
 
+import javax.transaction.TransactionManager;
+import java.util.Date;
+import java.util.Properties;
+
 /**
  * @version $Rev$ $Date$
  */
@@ -49,30 +48,31 @@ public final class OpenEJB {
         return SystemInstance.get().getComponent(ApplicationServer.class);
     }
 
-    public static TransactionManager getTransactionManager(){
+    public static TransactionManager getTransactionManager() {
         return SystemInstance.get().getComponent(TransactionManager.class);
     }
 
     public static class Instance {
-        private static Messages messages = new 
Messages("org.apache.openejb.util.resources");
+
+        private static final Messages messages = new 
Messages("org.apache.openejb.util.resources");
         private final Throwable initialized;
 
         /**
          * 1 usage
          * org.apache.openejb.core.ivm.naming.InitContextFactory
          */
-        public Instance(Properties props) throws OpenEJBException {
+        public Instance(final Properties props) throws OpenEJBException {
             this(props, new org.apache.openejb.core.ServerFederation());
         }
 
         /**
          * 2 usages
          */
-        public Instance(Properties initProps, ApplicationServer appServer) 
throws OpenEJBException {
+        public Instance(final Properties initProps, final ApplicationServer 
appServer) throws OpenEJBException {
             if (appServer == null) {
                 throw new IllegalArgumentException("appServer must not be 
null");
             }
-            initialized = new InitializationException("Initialized at "+new 
Date()).fillInStackTrace();
+            initialized = new InitializationException("Initialized at " + new 
Date()).fillInStackTrace();
 
             try {
                 SystemInstance.init(initProps);
@@ -84,7 +84,7 @@ public final class OpenEJB {
             } catch (Exception e) {
                 throw new OpenEJBException(e);
             }
-            SystemInstance system = SystemInstance.get();
+            final SystemInstance system = SystemInstance.get();
 
             final Logger logger = 
Logger.getInstance(LogCategory.OPENEJB_STARTUP, 
"org.apache.openejb.util.resources");
 
@@ -92,15 +92,16 @@ public final class OpenEJB {
 
             system.setComponent(ApplicationServer.class, appServer);
 
-            OpenEjbVersion versionInfo = OpenEjbVersion.get();
+            final OpenEjbVersion versionInfo = OpenEjbVersion.get();
             if (!system.getOptions().get("openejb.nobanner", true)) {
+                //noinspection UseOfSystemOutOrSystemErr
                 versionInfo.print(System.out);
             }
 
-            Logger logger2 = Logger.getInstance(LogCategory.OPENEJB, 
"org.apache.openejb.util.resources");
-            final String[] bannerValues = new String[] {
-                    null, versionInfo.getUrl(), new Date().toString(), 
versionInfo.getCopyright(),
-                    versionInfo.getVersion(), versionInfo.getDate(), 
versionInfo.getTime(), null
+            final Logger logger2 = Logger.getInstance(LogCategory.OPENEJB, 
"org.apache.openejb.util.resources");
+            final String[] bannerValues = new String[]{
+                                                          null, 
versionInfo.getUrl(), new Date().toString(), versionInfo.getCopyright(),
+                                                          
versionInfo.getVersion(), versionInfo.getDate(), versionInfo.getTime(), null
             };
             for (int i = 0; i < bannerValues.length; i++) {
                 if (bannerValues[i] == null) {
@@ -116,18 +117,18 @@ public final class OpenEJB {
             //OWB support.  The classloader has to be able to load all OWB 
components including the ones supplied by OpenEjb.
             CdiBuilder.initializeOWB(getClass().getClassLoader());
 
-            String className = system.getOptions().get("openejb.assembler", 
"org.apache.openejb.assembler.classic.Assembler");
+            final String className = 
system.getOptions().get("openejb.assembler", 
"org.apache.openejb.assembler.classic.Assembler");
 
             logger.debug("startup.instantiatingAssemblerClass", className);
-            
-            Assembler assembler;
+
+            final Assembler assembler;
             try {
                 assembler = (Assembler) 
SafeToolkit.getToolkit("OpenEJB").newInstance(className);
             } catch (OpenEJBException oe) {
                 logger.fatal("startup.assemblerCannotBeInstantiated", oe);
                 throw oe;
             } catch (Throwable t) {
-                String msg = 
messages.message("startup.openejbEncounteredUnexpectedError");
+                final String msg = 
messages.message("startup.openejbEncounteredUnexpectedError");
                 logger.fatal(msg, t);
                 throw new OpenEJBException(msg, t);
             }
@@ -138,7 +139,7 @@ public final class OpenEJB {
                 logger.fatal("startup.assemblerFailedToInitialize", oe);
                 throw oe;
             } catch (Throwable t) {
-                String msg = 
messages.message("startup.assemblerEncounteredUnexpectedError");
+                final String msg = 
messages.message("startup.assemblerEncounteredUnexpectedError");
                 logger.fatal(msg, t);
                 throw new OpenEJBException(msg, t);
             }
@@ -149,14 +150,14 @@ public final class OpenEJB {
                 logger.fatal("startup.assemblerFailedToBuild", oe);
                 throw oe;
             } catch (Throwable t) {
-                String msg = 
messages.message("startup.assemblerEncounterUnexpectedBuildError");
+                final String msg = 
messages.message("startup.assemblerEncounterUnexpectedBuildError");
                 logger.fatal(msg, t);
                 throw new OpenEJBException(msg, t);
             }
 
-            ContainerSystem containerSystem = assembler.getContainerSystem();
+            final ContainerSystem containerSystem = 
assembler.getContainerSystem();
             if (containerSystem == null) {
-                String msg = 
messages.message("startup.assemblerReturnedNullContainer");
+                final String msg = 
messages.message("startup.assemblerReturnedNullContainer");
                 logger.fatal(msg);
                 throw new OpenEJBException(msg);
             }
@@ -167,7 +168,7 @@ public final class OpenEJB {
                 logger.debug("startup.debugContainers", 
containerSystem.containers().length);
 
                 if (containerSystem.containers().length > 0) {
-                    Container[] c = containerSystem.containers();
+                    final Container[] c = containerSystem.containers();
                     logger.debug("startup.debugContainersType");
                     for (int i = 0; i < c.length; i++) {
                         String entry = "   ";
@@ -196,7 +197,7 @@ public final class OpenEJB {
                 logger.debug("startup.debugDeployments", 
containerSystem.deployments().length);
                 if (containerSystem.deployments().length > 0) {
                     logger.debug("startup.debugDeploymentsType");
-                    BeanContext[] d = containerSystem.deployments();
+                    final BeanContext[] d = containerSystem.deployments();
                     for (int i = 0; i < d.length; i++) {
                         String entry = "   ";
                         switch (d[i].getComponentType()) {
@@ -228,9 +229,9 @@ public final class OpenEJB {
                 }
             }
 
-            SecurityService securityService = assembler.getSecurityService();
+            final SecurityService securityService = 
assembler.getSecurityService();
             if (securityService == null) {
-                String msg = 
messages.message("startup.assemblerReturnedNullSecurityService");
+                final String msg = 
messages.message("startup.assemblerReturnedNullSecurityService");
                 logger.fatal(msg);
                 throw new OpenEJBException(msg);
             } else {
@@ -238,9 +239,9 @@ public final class OpenEJB {
             }
             system.setComponent(SecurityService.class, securityService);
 
-            TransactionManager transactionManager = 
assembler.getTransactionManager();
+            final TransactionManager transactionManager = 
assembler.getTransactionManager();
             if (transactionManager == null) {
-                String msg = 
messages.message("startup.assemblerReturnedNullTransactionManager");
+                final String msg = 
messages.message("startup.assemblerReturnedNullTransactionManager");
                 logger.fatal(msg);
                 throw new OpenEJBException(msg);
             } else {
@@ -258,9 +259,12 @@ public final class OpenEJB {
     }
 
     public static void destroy() {
-        Assembler assembler = 
SystemInstance.get().getComponent(Assembler.class);
-        if (assembler != null) assembler.destroy();
-        SystemInstance.reset();
+        final Assembler assembler = 
SystemInstance.get().getComponent(Assembler.class);
+        if (assembler != null) {
+            assembler.destroy();
+        } else {
+            SystemInstance.reset();
+        }
         instance = null;
     }
 
@@ -268,23 +272,23 @@ public final class OpenEJB {
      * 1 usage
      * org.apache.openejb.core.ivm.naming.InitContextFactory
      */
-    public static void init(Properties props) throws OpenEJBException {
+    public static void init(final Properties props) throws OpenEJBException {
         init(props, null);
     }
 
-    private static Messages messages = new 
Messages("org.apache.openejb.util.resources");
+    private static final Messages messages = new 
Messages("org.apache.openejb.util.resources");
 
     /**
      * 2 usages
      */
-    public static void init(Properties initProps, ApplicationServer appServer) 
throws OpenEJBException {
+    public static void init(final Properties initProps, final 
ApplicationServer appServer) throws OpenEJBException {
         if (isInitialized()) {
-            if (instance != null){
-                String msg = messages.message("startup.alreadyInitialized");
+            if (instance != null) {
+                final String msg = 
messages.message("startup.alreadyInitialized");
                 logger().error(msg, instance.initialized);
                 throw new OpenEJBException(msg, instance.initialized);
             } else {
-                String msg = messages.message("startup.alreadyInitialized");
+                final String msg = 
messages.message("startup.alreadyInitialized");
                 logger().error(msg);
                 throw new OpenEJBException(msg);
             }
@@ -305,8 +309,8 @@ public final class OpenEJB {
     }
 
     public static class InitializationException extends Exception {
-        public InitializationException(String message)
-        {
+
+        public InitializationException(final String message) {
             super(message);
         }
     }

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1508847&r1=1508846&r2=1508847&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Wed Jul 31 13:20:49 2013
@@ -789,8 +789,8 @@ public class Assembler extends Assembler
             final List<BeanContext> allDeployments = initEjbs(classLoader, 
appInfo, appContext, injections, new ArrayList<BeanContext>(), null);
 
             if ("true".equalsIgnoreCase(SystemInstance.get()
-                    .getProperty(PROPAGATE_APPLICATION_EXCEPTIONS,
-                            
appInfo.properties.getProperty(PROPAGATE_APPLICATION_EXCEPTIONS, "false")))) {
+                                                      
.getProperty(PROPAGATE_APPLICATION_EXCEPTIONS,
+                                                                   
appInfo.properties.getProperty(PROPAGATE_APPLICATION_EXCEPTIONS, "false")))) {
                 propagateApplicationExceptions(appInfo, classLoader, 
allDeployments);
             }
 
@@ -1029,11 +1029,11 @@ public class Assembler extends Assembler
                             final MethodContext methodContext = 
entry.getValue();
                             for (final ScheduleData scheduleData : 
methodContext.getSchedules()) {
                                 timerStore.createCalendarTimer(timerService,
-                                        (String) beanContext.getDeploymentID(),
-                                        null,
-                                        entry.getKey(),
-                                        scheduleData.getExpression(),
-                                        scheduleData.getConfig());
+                                                               (String) 
beanContext.getDeploymentID(),
+                                                               null,
+                                                               entry.getKey(),
+                                                               
scheduleData.getExpression(),
+                                                               
scheduleData.getConfig());
                             }
                         }
                         beanContext.setEjbTimerService(timerService);
@@ -1105,7 +1105,7 @@ public class Assembler extends Assembler
                     if (container.getBeanContext(deployment.getDeploymentID()) 
== null) {
                         container.deploy(deployment);
                         if (!((String) 
deployment.getDeploymentID()).endsWith(".Comp")
-                                && !deployment.isHidden()) {
+                            && !deployment.isHidden()) {
                             logger.info("createApplication.createdEjb", 
deployment.getDeploymentID(), deployment.getEjbName(), 
container.getContainerID());
                         }
                         if (logger.isDebugEnabled()) {
@@ -1126,7 +1126,7 @@ public class Assembler extends Assembler
                     final Container container = deployment.getContainer();
                     container.start(deployment);
                     if (!((String) 
deployment.getDeploymentID()).endsWith(".Comp")
-                            && !deployment.isHidden()) {
+                        && !deployment.isHidden()) {
                         logger.info("createApplication.startedEjb", 
deployment.getDeploymentID(), deployment.getEjbName(), 
container.getContainerID());
                     }
                 } catch (Throwable t) {
@@ -1180,10 +1180,10 @@ public class Assembler extends Assembler
             final MBeanServer server = LocalMBeanServer.get();
             try {
                 final ObjectName leaf = new 
ObjectNameBuilder("openejb.user.mbeans")
-                        .set("application", id)
-                        .set("group", clazz.getPackage().getName())
-                        .set("name", clazz.getSimpleName())
-                        .build();
+                                            .set("application", id)
+                                            .set("group", 
clazz.getPackage().getName())
+                                            .set("name", clazz.getSimpleName())
+                                            .build();
 
                 server.registerMBean(new DynamicMBeanWrapper(wc, instance), 
leaf);
                 appMbeans.put(mbeanClass, leaf.getCanonicalName());
@@ -1422,7 +1422,7 @@ public class Assembler extends Assembler
         } else if (ExecutorService.class.isInstance(object)) {
             ExecutorService.class.cast(object).shutdown();
         } else if (DataSource.class.isInstance(object)) {
-
+            //Do nothing?
         } else if (logger.isDebugEnabled()) {
             logger.debug("Not processing resource on destroy: " + className);
         }
@@ -1675,7 +1675,7 @@ public class Assembler extends Assembler
                 }
             } catch (NamingException e) {
                 undeployException.getCauses().add(new Exception("Unable to 
prune openejb/Deployments and openejb/local namespaces, this could cause future 
deployments to fail.",
-                        e));
+                                                                e));
             }
 
             deployments.clear();
@@ -1771,7 +1771,7 @@ public class Assembler extends Assembler
         }
     }
 
-    private void destroyLookedUpResource(Context globalContext, String id, 
String name) throws NamingException {
+    private void destroyLookedUpResource(final Context globalContext, final 
String id, final String name) throws NamingException {
         final Object object = globalContext.lookup(name);
         final String clazz;
         if (object == null) { // should it be possible?
@@ -1904,7 +1904,7 @@ public class Assembler extends Assembler
             initialContext = new InitialContext(contextInfo.properties);
         } catch (NamingException ne) {
             throw new OpenEJBException(String.format("JndiProvider(id=\"%s\") 
could not be created.  Failed to create the InitialContext using the supplied 
properties",
-                    contextInfo.id), ne);
+                                                     contextInfo.id), ne);
         }
 
         try {
@@ -2081,8 +2081,10 @@ public class Assembler extends Assembler
                 for (final Map.Entry<Object, Object> entry : p.entrySet()) {
                     final String key = entry.getKey().toString();
                     if (!props.containsKey(key)
-                            // never override from Definition, just use it to 
complete the properties set
-                            && !(key.equalsIgnoreCase("url") && 
props.containsKey("JdbcUrl"))) { // with @DataSource we can get both, see 
org.apache.openejb.config.ConvertDataSourceDefinitions.rawDefinition()
+                        // never override from Definition, just use it to 
complete the properties set
+                        &&
+                        !(key.equalsIgnoreCase("url") &&
+                          props.containsKey("JdbcUrl"))) { // with @DataSource 
we can get both, see 
org.apache.openejb.config.ConvertDataSourceDefinitions.rawDefinition()
                         props.put(key, entry.getValue());
                     }
                 }
@@ -2136,8 +2138,8 @@ public class Assembler extends Assembler
             final BootstrapContext bootstrapContext;
             if (transactionManager instanceof GeronimoTransactionManager) {
                 bootstrapContext = new 
GeronimoBootstrapContext((GeronimoWorkManager) workManager,
-                        (GeronimoTransactionManager) transactionManager,
-                        (GeronimoTransactionManager) transactionManager);
+                                                                
(GeronimoTransactionManager) transactionManager,
+                                                                
(GeronimoTransactionManager) transactionManager);
             } else if (transactionManager instanceof XATerminator) {
                 bootstrapContext = new SimpleBootstrapContext(workManager, 
(XATerminator) transactionManager);
             } else {
@@ -2200,7 +2202,7 @@ public class Assembler extends Assembler
             // init cm if needed
             final Object eagerInit = unset.remove("eagerInit");
             if (eagerInit != null && eagerInit instanceof String && 
"true".equalsIgnoreCase((String) eagerInit)
-                    && connectionManager instanceof AbstractConnectionManager) 
{
+                && connectionManager instanceof AbstractConnectionManager) {
                 try {
                     ((AbstractConnectionManager) connectionManager).doStart();
                     try {
@@ -2255,7 +2257,7 @@ public class Assembler extends Assembler
             bindResource(alias, service);
         }
         if (serviceInfo.originAppName != null && 
!serviceInfo.originAppName.isEmpty() && !"/".equals(serviceInfo.originAppName)
-                && !serviceInfo.id.startsWith("global")) {
+            && !serviceInfo.id.startsWith("global")) {
             final String baseJndiName = 
serviceInfo.id.substring(serviceInfo.originAppName.length() + 1);
             serviceInfo.aliases.add(baseJndiName);
             final ContextualJndiReference ref = new 
ContextualJndiReference(baseJndiName);
@@ -2667,14 +2669,14 @@ public class Assembler extends Assembler
         }
 
         public void afterApplicationCreated(
-                @Observes
-                final AssemblerAfterApplicationCreated event) {
+                                               @Observes
+                                               final 
AssemblerAfterApplicationCreated event) {
             delegate.afterApplicationCreated(event.getApp());
         }
 
         public void beforeApplicationDestroyed(
-                @Observes
-                final AssemblerBeforeApplicationDestroyed event) {
+                                                  @Observes
+                                                  final 
AssemblerBeforeApplicationDestroyed event) {
             delegate.beforeApplicationDestroyed(event.getApp());
         }
 

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContextFactory.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContextFactory.java?rev=1508847&r1=1508846&r2=1508847&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContextFactory.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/client/LocalInitialContextFactory.java
 Wed Jul 31 13:20:49 2013
@@ -20,5 +20,6 @@ package org.apache.openejb.client;
 /**
  * @deprecated use org.apache.openejb.core.LocalInitialContextFactory
  */
+@Deprecated
 public class LocalInitialContextFactory extends 
org.apache.openejb.core.LocalInitialContextFactory {
 }

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java?rev=1508847&r1=1508846&r2=1508847&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java
 Wed Jul 31 13:20:49 2013
@@ -22,46 +22,73 @@ import org.apache.openejb.util.OptionsLo
 
 import javax.naming.Context;
 import javax.naming.NamingException;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.util.Hashtable;
 import java.util.Properties;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * @version $Rev$ $Date$
  */
+@SuppressWarnings("UseOfObsoleteCollectionType")
 public class LocalInitialContextFactory implements 
javax.naming.spi.InitialContextFactory {
 
-    private static OpenEJBInstance openejb;
+    private static final ReentrantLock lock = new ReentrantLock();
+    private static OpenEJBInstance openejb = null;
 
     private boolean bootedOpenEJB;
 
-    public Context getInitialContext(Hashtable env) throws 
javax.naming.NamingException {
+    @Override
+    public Context getInitialContext(final Hashtable env) throws 
javax.naming.NamingException {
         init(env);
         return getLocalInitialContext(env);
     }
 
-    protected void init(Hashtable env) throws javax.naming.NamingException {
-        if (openejb != null) {
-            return;
-        }
+    protected void init(final Hashtable env) throws 
javax.naming.NamingException {
+
+        final ReentrantLock l = lock;
+        l.lock();
+
         try {
-            Properties properties = new Properties();
-            properties.putAll(env);
-            init(properties);
-        } catch (Exception e) {
-            throw (NamingException) new NamingException("Attempted to load 
OpenEJB. " + e.getMessage()).initCause(e);
+            if (openejb != null && openejb.isInitialized()) {
+                return;
+            }
+            try {
+                final Properties properties = new Properties();
+                properties.putAll(env);
+                init(properties);
+            } catch (Exception e) {
+                throw (NamingException) new NamingException("Attempted to load 
OpenEJB. " + e.getMessage()).initCause(e);
+            }
+        } finally {
+            l.unlock();
         }
     }
 
     boolean bootedOpenEJB() {
-        return bootedOpenEJB;
+        final ReentrantLock l = lock;
+        l.lock();
+
+        try {
+            return bootedOpenEJB;
+        } finally {
+            l.unlock();
+        }
+
     }
 
-    public void init(Properties properties) throws Exception {
-        if (openejb != null) return;
+    private void init(final Properties properties) throws Exception {
+        if (openejb != null && openejb.isInitialized()) {
+            return;
+        }
+
         openejb = new OpenEJBInstance();
-        if (openejb.isInitialized()) return;
+
+        if (openejb.isInitialized()) {
+            return;
+        }
+
         bootedOpenEJB = true;
         SystemInstance.init(properties);
         OptionsLog.install();
@@ -69,32 +96,40 @@ public class LocalInitialContextFactory 
         openejb.init(properties);
     }
 
-    public void close(){
-        openejb = null;
+    public void close() {
+        final ReentrantLock l = lock;
+        l.lock();
+
+        try {
+            openejb = null;
+        } finally {
+            l.unlock();
+        }
     }
 
-    private Context getLocalInitialContext(Hashtable env) throws 
javax.naming.NamingException {
-        Context context;
+    private Context getLocalInitialContext(final Hashtable env) throws 
javax.naming.NamingException {
+        final Context context;
         try {
-            ClassLoader cl = SystemInstance.get().getClassLoader();
+            final ClassLoader cl = SystemInstance.get().getClassLoader();
 
-            Class localInitialContext = 
Class.forName("org.apache.openejb.core.LocalInitialContext", true, cl);
+            final Class localInitialContext = 
Class.forName("org.apache.openejb.core.LocalInitialContext", true, cl);
 
-            Constructor constructor = 
localInitialContext.getConstructor(Hashtable.class, 
LocalInitialContextFactory.class);
+            //noinspection unchecked
+            final Constructor constructor = 
localInitialContext.getConstructor(Hashtable.class, 
LocalInitialContextFactory.class);
             context = (Context) constructor.newInstance(env, this);
         } catch (Throwable e) {
             if (e instanceof InvocationTargetException) {
-                InvocationTargetException ite = (InvocationTargetException) e;
-                if (ite.getTargetException() != null){
+                final InvocationTargetException ite = 
(InvocationTargetException) e;
+                if (ite.getTargetException() != null) {
                     e = ite.getTargetException();
                 }
             }
 
-            if (e instanceof NamingException){
+            if (e instanceof NamingException) {
                 throw (NamingException) e;
             }
             throw (NamingException) new javax.naming.NamingException("Cannot 
instantiate a LocalInitialContext. Exception: "
-                    + e.getClass().getName() + " " + 
e.getMessage()).initCause(e);
+                                                                     + 
e.getClass().getName() + " " + e.getMessage()).initCause(e);
         }
 
         return context;

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/osgi/client/LocalInitialContextFactory.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/osgi/client/LocalInitialContextFactory.java?rev=1508847&r1=1508846&r2=1508847&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/osgi/client/LocalInitialContextFactory.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/osgi/client/LocalInitialContextFactory.java
 Wed Jul 31 13:20:49 2013
@@ -16,18 +16,18 @@
  */
 package org.apache.openejb.osgi.client;
 
-import java.util.Hashtable;
+import org.apache.openejb.core.LocalInitialContext;
 
 import javax.naming.Context;
-
-import org.apache.openejb.core.LocalInitialContext;
+import java.util.Hashtable;
 
 /**
  * @version $Rev$ $Date$
  */
 public class LocalInitialContextFactory extends 
org.apache.openejb.core.LocalInitialContextFactory {
 
-    public Context getInitialContext(Hashtable env) throws 
javax.naming.NamingException {
+    @Override
+    public Context getInitialContext(final Hashtable env) throws 
javax.naming.NamingException {
         init(env);
         return new LocalInitialContext(env, this);
     }


Reply via email to