You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2011/02/24 17:54:18 UTC

svn commit: r1074211 - in /myfaces/extensions/cdi/trunk: core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/startup/ core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/tools/ core/impl/src/main/java/org/apache/myfaces/exte...

Author: gpetracek
Date: Thu Feb 24 16:54:17 2011
New Revision: 1074211

URL: http://svn.apache.org/viewvc?rev=1074211&view=rev
Log:
EXTCDI-146

Modified:
    myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/startup/CodiStartupBroadcaster.java
    myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/tools/DefaultAnnotation.java
    myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java
    myfaces/extensions/cdi/trunk/core/impl/src/test/java/org/apache/myfaces/extensions/cdi/core/test/impl/config/ConfigTest.java
    myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/DefaultTransactionalInterceptorStrategy.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/CodiLifecycleWrapper.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/startup/ApplicationStartupBroadcaster.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/CodiRenderKitFactory.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextAwareViewHandler.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/phase/CodiLifecycleWrapper.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/scope/conversation/CodiRenderKitFactory.java

Modified: myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/startup/CodiStartupBroadcaster.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/startup/CodiStartupBroadcaster.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/startup/CodiStartupBroadcaster.java (original)
+++ myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/startup/CodiStartupBroadcaster.java Thu Feb 24 16:54:17 2011
@@ -65,6 +65,7 @@ public abstract class CodiStartupBroadca
 
     private static synchronized void invokeStartupEventBroadcaster(ClassLoader classLoader)
     {
+        // switch into paranoia mode
         if (initialized.containsKey(classLoader))
         {
             return;

Modified: myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/tools/DefaultAnnotation.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/tools/DefaultAnnotation.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/tools/DefaultAnnotation.java (original)
+++ myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/tools/DefaultAnnotation.java Thu Feb 24 16:54:17 2011
@@ -47,57 +47,67 @@ public class DefaultAnnotation implement
 
     // NOTE that this cache needs to be a WeakHashMap in order to prevent a memory leak
     // (the garbage collector should be able to remove the ClassLoader).
-    private static Map<ClassLoader, Map<String, Annotation>> annotationCachePerClassLoader
+    private static volatile Map<ClassLoader, Map<String, Annotation>> annotationCache
             = new WeakHashMap<ClassLoader, Map<String, Annotation>>();
 
     public static <T extends Annotation> T of(Class<T> annotationClass)
     {
-        Map<String, Annotation> annotationCache = getAnnotationCache();
-        final String key = annotationClass.getName();
+        String key = annotationClass.getName();
+
+        Map<String, Annotation> cache = getAnnotationCache();
+
+        Annotation annotation = cache.get(key);
 
-        Annotation annotation = annotationCache.get(key);
-        
         if (annotation == null)
         {
-            // switch into paranoia mode
-            //noinspection SynchronizationOnLocalVariableOrMethodParameter
-            synchronized (annotationCache)
-            {
-                annotation = annotationCache.get(key);
-                if (annotation == null)
-                {
-                    annotation = (Annotation) Proxy.newProxyInstance(
-                            annotationClass.getClassLoader(),
-                            new Class[]{annotationClass},
-                            new DefaultAnnotation(annotationClass));
-                    
-                    annotationCache.put(key, annotation);
-                }
-            }
+            annotation = initAnnotation(key, annotationClass, cache);
         }
 
         return (T) annotation;
     }
 
+    private static synchronized <T extends Annotation> Annotation initAnnotation(String key,
+                                                                                 Class<T> annotationClass,
+                                                                                 Map<String, Annotation> cache)
+    {
+        Annotation annotation = cache.get(key);
+
+        // switch into paranoia mode
+        if(annotation == null)
+        {
+            annotation = (Annotation) Proxy.newProxyInstance(annotationClass.getClassLoader(),
+                    new Class[]{annotationClass},
+                    new DefaultAnnotation(annotationClass));
+
+            cache.put(key, annotation);
+        }
+
+        return annotation;
+    }
+
     private static Map<String, Annotation> getAnnotationCache()
     {
         ClassLoader classLoader = ClassUtils.getClassLoader(null);
-        Map<String, Annotation> annotationCache = annotationCachePerClassLoader.get(classLoader);
-        if (annotationCache == null)
+        Map<String, Annotation> cache = annotationCache.get(classLoader);
+
+        if (cache == null)
         {
-            // switch into paranoia mode
-            synchronized (annotationCachePerClassLoader)
-            {
-                annotationCache = annotationCachePerClassLoader.get(classLoader);
-                if (annotationCache == null)
-                {
-                    annotationCache = new ConcurrentHashMap<String, Annotation>();
-                    annotationCachePerClassLoader.put(classLoader, annotationCache);
-                }
-            }
+            cache = init(classLoader);
         }
 
-        return annotationCache;
+        return cache;
+    }
+
+    private static synchronized Map<String, Annotation> init(ClassLoader classLoader)
+    {
+        // switch into paranoia mode
+        Map<String, Annotation> cache = annotationCache.get(classLoader);
+        if (cache == null)
+        {
+            cache = new ConcurrentHashMap<String, Annotation>();
+            annotationCache.put(classLoader, cache);
+        }
+        return cache;
     }
 
     private Class<? extends Annotation> annotationClass;
@@ -211,5 +221,4 @@ public class DefaultAnnotation implement
     {
         return annotationClass.hashCode();
     }
-
 }

Modified: myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java (original)
+++ myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/projectstage/ProjectStageProducer.java Thu Feb 24 16:54:17 2011
@@ -24,6 +24,7 @@ import org.apache.myfaces.extensions.cdi
 import org.apache.myfaces.extensions.cdi.core.impl.util.CodiUtils;
 
 import javax.enterprise.context.Dependent;
+import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Default;
 import javax.enterprise.inject.Produces;
 import java.io.Serializable;
@@ -52,7 +53,7 @@ import java.io.Serializable;
  *
  * TODO move jsf specific parts
  */
-@Dependent
+@ApplicationScoped
 public class ProjectStageProducer implements Serializable
 {
     private static final long serialVersionUID = -2987762608635612074L;
@@ -72,7 +73,7 @@ public class ProjectStageProducer implem
     /**
      * for the singleton factory
      */
-    private static ProjectStageProducer projectStageProducer;
+    private static volatile ProjectStageProducer projectStageProducer;
 
     /**
      * We can only produce @Dependent scopes since an enum is final.
@@ -85,7 +86,8 @@ public class ProjectStageProducer implem
     {
         if(projectStage == null)
         {
-            initProjectStage();
+            //triggers initialization
+            getInstance();
         }
         return projectStage;
     }
@@ -105,32 +107,48 @@ public class ProjectStageProducer implem
      *
      * @return the ProjectStageProducer instance.
      */
-    public static synchronized ProjectStageProducer getInstance()
+    public static ProjectStageProducer getInstance()
     {
         if (projectStageProducer == null)
         {
-            projectStageProducer = CodiUtils.lookupFromEnvironment(ProjectStageProducer.class);
-
-            if(projectStageProducer == null)
-            {
-                //workaround to avoid the usage of a service loader
-                projectStageProducer = ClassUtils.tryToInstantiateClassForName(
-                        "org.apache.myfaces.extensions.cdi.jsf2.impl.projectstage.JsfProjectStageProducer",
-                        ProjectStageProducer.class);
-            }
+            lazyInit();
+        }
 
-            if (projectStageProducer == null)
-            {
-                // if we still didn't find a customised ProjectStageProducer,
-                // then we take the default one.
-                projectStageProducer = new ProjectStageProducer();
-            }
+        if(projectStage == null)
+        {
             projectStageProducer.initProjectStage();
         }
 
         return projectStageProducer;
     }
 
+    private static synchronized void lazyInit()
+    {
+        // switch into paranoia mode
+        if (projectStageProducer != null)
+        {
+            return;
+        }
+
+        projectStageProducer = CodiUtils.lookupFromEnvironment(ProjectStageProducer.class);
+
+        if(projectStageProducer == null)
+        {
+            //workaround to avoid the usage of a service loader
+            projectStageProducer = ClassUtils.tryToInstantiateClassForName(
+                    "org.apache.myfaces.extensions.cdi.jsf2.impl.projectstage.JsfProjectStageProducer",
+                    ProjectStageProducer.class);
+        }
+
+        if (projectStageProducer == null)
+        {
+            // if we still didn't find a customised ProjectStageProducer,
+            // then we take the default one.
+            projectStageProducer = new ProjectStageProducer();
+        }
+        projectStageProducer.initProjectStage();
+    }
+
     /**
      * This function can be used to manually set the ProjectStage for the application.
      * This is e.g. useful in unit tests.
@@ -185,6 +203,7 @@ public class ProjectStageProducer implem
 
     protected void initProjectStage()
     {
+        // switch into paranoia mode
         synchronized (ProjectStageProducer.class)
         {
             if(projectStage == null)

Modified: myfaces/extensions/cdi/trunk/core/impl/src/test/java/org/apache/myfaces/extensions/cdi/core/test/impl/config/ConfigTest.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/impl/src/test/java/org/apache/myfaces/extensions/cdi/core/test/impl/config/ConfigTest.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/impl/src/test/java/org/apache/myfaces/extensions/cdi/core/test/impl/config/ConfigTest.java (original)
+++ myfaces/extensions/cdi/trunk/core/impl/src/test/java/org/apache/myfaces/extensions/cdi/core/test/impl/config/ConfigTest.java Thu Feb 24 16:54:17 2011
@@ -81,6 +81,12 @@ public class ConfigTest
     }
 
     @Test
+    public void testLazyInitBeforeStaticCall()
+    {
+        assertEquals(new ProjectStageProducer(){}.getProjectStage(), ProjectStage.Production);
+    }
+
+    @Test
     public void testConfiguredClassViaSystemPropertyConfig()
     {
         assertNull(CodiUtils.lookupFromEnvironment(ClassDeactivator.class));

Modified: myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/DefaultTransactionalInterceptorStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/DefaultTransactionalInterceptorStrategy.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/DefaultTransactionalInterceptorStrategy.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jpa-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jpa/impl/DefaultTransactionalInterceptorStrategy.java Thu Feb 24 16:54:17 2011
@@ -69,7 +69,8 @@ public class DefaultTransactionalInterce
     private static transient ThreadLocal<HashMap<String, EntityManager>> entityManagerMap =
             new ThreadLocal<HashMap<String, EntityManager>>();
 
-    private static transient Map<ClassLoader, Map<String, PersistenceContextMetaEntry>> persistenceContextMetaEntries =
+    private static transient volatile Map<ClassLoader, Map<String, PersistenceContextMetaEntry>>
+            persistenceContextMetaEntries =
             new ConcurrentHashMap<ClassLoader, Map<String, PersistenceContextMetaEntry>>();
 
     /** 1 ms  in nanoTime ticks */

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/view/ViewConfigCache.java Thu Feb 24 16:54:17 2011
@@ -65,7 +65,7 @@ public class ViewConfigCache
             inlineViewConfigRootMarker =
             new HashMap<ClassLoader, Class>();
 
-    private static Map<ClassLoader, Boolean>
+    private static volatile Map<ClassLoader, Boolean>
             lazyInitAllowed =
             new HashMap<ClassLoader, Boolean>();
 

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/CodiLifecycleWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/CodiLifecycleWrapper.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/CodiLifecycleWrapper.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/phase/CodiLifecycleWrapper.java Thu Feb 24 16:54:17 2011
@@ -43,9 +43,9 @@ class CodiLifecycleWrapper extends Lifec
 
     private BeforeAfterFacesRequestBroadcaster beforeAfterFacesRequestBroadcaster;
 
-    private Boolean initialized;
+    private volatile Boolean initialized;
 
-    private Boolean applicationInitialized;
+    private volatile Boolean applicationInitialized;
 
     CodiLifecycleWrapper(Lifecycle wrapped, List<PhaseListener> phaseListeners)
     {
@@ -104,6 +104,14 @@ class CodiLifecycleWrapper extends Lifec
         //just an !additional! check to improve the performance
         if(applicationInitialized == null)
         {
+            initApplication();
+        }
+    }
+
+    private synchronized void initApplication()
+    {
+        if(applicationInitialized == null)
+        {
             applicationInitialized = true;
             ApplicationStartupBroadcaster applicationStartupBroadcaster =
                     CodiUtils.getContextualReferenceByClass(ApplicationStartupBroadcaster.class);
@@ -124,16 +132,22 @@ class CodiLifecycleWrapper extends Lifec
     {
         if(this.initialized == null)
         {
-            synchronized (this)
-            {
-                if(ClassDeactivation.isClassActivated(BeforeAfterFacesRequestBroadcaster.class))
-                {
-                    this.beforeAfterFacesRequestBroadcaster =
-                            CodiUtils.getContextualReferenceByClass(BeforeAfterFacesRequestBroadcaster.class);
-                }
+            init();
+        }
+    }
 
-                this.initialized = true;
+    private synchronized void init()
+    {
+        // switch into paranoia mode
+        if(this.initialized == null)
+        {
+            if(ClassDeactivation.isClassActivated(BeforeAfterFacesRequestBroadcaster.class))
+            {
+                this.beforeAfterFacesRequestBroadcaster =
+                        CodiUtils.getContextualReferenceByClass(BeforeAfterFacesRequestBroadcaster.class);
             }
+
+            this.initialized = true;
         }
     }
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/startup/ApplicationStartupBroadcaster.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/startup/ApplicationStartupBroadcaster.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/startup/ApplicationStartupBroadcaster.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/listener/startup/ApplicationStartupBroadcaster.java Thu Feb 24 16:54:17 2011
@@ -33,7 +33,7 @@ import java.util.concurrent.ConcurrentHa
 @ApplicationScoped
 public class ApplicationStartupBroadcaster
 {
-    private static Map<ClassLoader, Boolean> initialized =
+    private static volatile Map<ClassLoader, Boolean> initialized =
             new ConcurrentHashMap<ClassLoader, Boolean>();
 
     @Inject
@@ -46,8 +46,7 @@ public class ApplicationStartupBroadcast
             return;
         }
 
-        //noinspection SynchronizeOnNonFinalField
-        synchronized (initialized)
+        synchronized (ApplicationStartupBroadcaster.class)
         {
             // switch into paranoia mode
             if(initialized.containsKey(getClassLoader()))

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/CodiRenderKitFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/CodiRenderKitFactory.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/CodiRenderKitFactory.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/CodiRenderKitFactory.java Thu Feb 24 16:54:17 2011
@@ -39,7 +39,7 @@ public class CodiRenderKitFactory extend
     private RenderKitFactory wrapped;
     private RenderKitWrapperFactory renderKitWrapperFactory;
 
-    private Boolean initialized;
+    private volatile Boolean initialized;
     private final boolean deactivated;
 
     public CodiRenderKitFactory(RenderKitFactory wrapped)
@@ -87,8 +87,14 @@ public class CodiRenderKitFactory extend
         return new InterceptedRenderKit(renderKit);
     }
 
-    private void lazyInit()
+    private synchronized void lazyInit()
     {
+        // switch into paranoia mode
+        if(this.initialized != null)
+        {
+            return;
+        }
+
         if(this.renderKitWrapperFactory == null)
         {
             //workaround for mojarra

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextAwareViewHandler.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextAwareViewHandler.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextAwareViewHandler.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/scope/conversation/WindowContextAwareViewHandler.java Thu Feb 24 16:54:17 2011
@@ -38,7 +38,7 @@ public class WindowContextAwareViewHandl
 {
     private ViewHandler wrapped;
 
-    private WindowHandler windowHandler;
+    private volatile WindowHandler windowHandler;
 
     private final boolean deactivated;
 
@@ -69,10 +69,19 @@ public class WindowContextAwareViewHandl
         return url;
     }
 
-    private synchronized void lazyInit()
+    private void lazyInit()
     {
         if(this.windowHandler == null)
         {
+            init();
+        }
+    }
+
+    private synchronized void init()
+    {
+        // switch into paranoia mode
+        if(this.windowHandler == null)
+        {
             this.windowHandler = ConversationUtils.getWindowHandler();
         }
     }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/phase/CodiLifecycleWrapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/phase/CodiLifecycleWrapper.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/phase/CodiLifecycleWrapper.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/listener/phase/CodiLifecycleWrapper.java Thu Feb 24 16:54:17 2011
@@ -44,7 +44,7 @@ class CodiLifecycleWrapper extends Lifec
 
     private BeforeAfterFacesRequestBroadcaster beforeAfterFacesRequestBroadcaster;
 
-    private Boolean initialized;
+    private volatile Boolean initialized;
 
     private Boolean applicationInitialized;
 
@@ -125,16 +125,22 @@ class CodiLifecycleWrapper extends Lifec
     {
         if(this.initialized == null)
         {
-            synchronized (this)
-            {
-                if(ClassDeactivation.isClassActivated(BeforeAfterFacesRequestBroadcaster.class))
-                {
-                    this.beforeAfterFacesRequestBroadcaster =
-                            CodiUtils.getContextualReferenceByClass(BeforeAfterFacesRequestBroadcaster.class);
-                }
+            init();
+        }
+    }
 
-                this.initialized = true;
+    private synchronized void init()
+    {
+        // switch into paranoia mode
+        if(this.initialized == null)
+        {
+            if(ClassDeactivation.isClassActivated(BeforeAfterFacesRequestBroadcaster.class))
+            {
+                this.beforeAfterFacesRequestBroadcaster =
+                        CodiUtils.getContextualReferenceByClass(BeforeAfterFacesRequestBroadcaster.class);
             }
+
+            this.initialized = true;
         }
     }
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/scope/conversation/CodiRenderKitFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/scope/conversation/CodiRenderKitFactory.java?rev=1074211&r1=1074210&r2=1074211&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/scope/conversation/CodiRenderKitFactory.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/scope/conversation/CodiRenderKitFactory.java Thu Feb 24 16:54:17 2011
@@ -42,7 +42,7 @@ public class CodiRenderKitFactory extend
     private final RenderKitFactory wrapped;
     private RenderKitWrapperFactory renderKitWrapperFactory;
     
-    private Boolean initialized;
+    private volatile Boolean initialized;
     private final boolean deactivated;
 
     public CodiRenderKitFactory(RenderKitFactory wrapped)
@@ -90,8 +90,14 @@ public class CodiRenderKitFactory extend
         return new InterceptedRenderKit(renderKit);
     }
 
-    private void lazyInit()
+    private synchronized void lazyInit()
     {
+        // switch into paranoia mode
+        if(this.initialized != null)
+        {
+            return;
+        }
+
         if(this.renderKitWrapperFactory == null)
         {
             //workaround for mojarra