Author: struberg
Date: Thu Jun  1 10:04:43 2017
New Revision: 1797175

URL: http://svn.apache.org/viewvc?rev=1797175&view=rev
Log:
OWB-1189 add first ugly hack for async events

Added:
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/events/async/
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/events/async/ObserversAsyncTest.java
   (with props)
Modified:
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/EventTest.java
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/exception/EventExceptionTest.java
    
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
    
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ObserverMethodsBuilder.java
 Thu Jun  1 10:04:43 2017
@@ -95,7 +95,7 @@ public class ObserverMethodsBuilder<T>
                 checkObserverMethodConditions(bean, observesParameter);
                 
                 //Looking for ObserverMethod
-                ObserverMethod<?> definedObserver = 
webBeansContext.getBeanManagerImpl().getNotificationManager().
+                ObserverMethod<?> definedObserver = 
webBeansContext.getNotificationManager().
                         getObservableMethodForAnnotatedMethod(annotatedMethod, 
observesParameter, bean);
                 if (definedObserver != null)
                 {

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
 Thu Jun  1 10:04:43 2017
@@ -323,7 +323,7 @@ public class BeansDeployer
                 validateDecoratorDecoratedTypes();
                 validateDecoratorGenericTypes();
 
-                
webBeansContext.getBeanManagerImpl().getNotificationManager().clearCaches();
+                webBeansContext.getNotificationManager().clearCaches();
 
                 // fire event
                 fireAfterDeploymentValidationEvent();
@@ -863,7 +863,7 @@ public class BeansDeployer
         logger.fine("Validation of the observer methods' injection points has 
started.");
         
         //Validate Observers
-        
validateObservers(webBeansContext.getBeanManagerImpl().getNotificationManager().getObserverMethods());
+        
validateObservers(webBeansContext.getNotificationManager().getObserverMethods());
 
         logger.info(OWBLogConst.INFO_0003);
     }

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/WebBeansContext.java
 Thu Jun  1 10:04:43 2017
@@ -37,6 +37,7 @@ import org.apache.webbeans.context.creat
 import org.apache.webbeans.conversation.ConversationManager;
 import org.apache.webbeans.decorator.DecoratorsManager;
 import org.apache.webbeans.deployment.StereoTypeManager;
+import org.apache.webbeans.event.NotificationManager;
 import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.inject.AlternativesManager;
 import org.apache.webbeans.inject.impl.InjectionPointFactory;
@@ -104,6 +105,7 @@ public class WebBeansContext
     private final ConversationManager conversationManager;
     private ConversationService conversationService = null;
     private final ApplicationBoundaryService applicationBoundaryService;
+    private final NotificationManager notificationManager = new 
NotificationManager(this);
 
 
     public WebBeansContext()
@@ -177,6 +179,7 @@ public class WebBeansContext
         managerMap.put(SerializableBeanVault.class, serializableBeanVault);
         managerMap.put(StereoTypeManager.class, stereoTypeManager);
         managerMap.put(InterceptorResolutionService.class, 
interceptorResolutionService);
+        managerMap.put(NotificationManager.class, notificationManager);
 
     }
 
@@ -373,6 +376,11 @@ public class WebBeansContext
         return beanArchiveService;
     }
 
+    public NotificationManager getNotificationManager()
+    {
+        return notificationManager;
+    }
+
     public ConversationService getConversationService()
     {
         if (conversationService == null)

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
 Thu Jun  1 10:04:43 2017
@@ -23,6 +23,7 @@ import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -58,6 +59,7 @@ import javax.naming.Reference;
 import javax.naming.Referenceable;
 import javax.naming.StringRefAddr;
 
+import org.apache.webbeans.annotation.AnyLiteral;
 import org.apache.webbeans.annotation.DefaultLiteral;
 import org.apache.webbeans.component.AbstractOwbBean;
 import org.apache.webbeans.component.AbstractProducerBean;
@@ -83,8 +85,8 @@ import org.apache.webbeans.context.Custo
 import org.apache.webbeans.context.CustomPassivatingContextImpl;
 import org.apache.webbeans.context.creational.CreationalContextImpl;
 import org.apache.webbeans.decorator.DecoratorComparator;
+import org.apache.webbeans.event.EventImpl;
 import org.apache.webbeans.event.EventMetadataImpl;
-import org.apache.webbeans.event.NotificationManager;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.exception.DuplicateDefinitionException;
 
@@ -146,9 +148,6 @@ public class BeanManagerImpl implements
     /**Normal scoped cache proxies*/
     private Map<Contextual<?>, Object> cacheProxies = new 
ConcurrentHashMap<Contextual<?>, Object>();
 
-    /**Event notification manager instance*/
-    private NotificationManager notificationManager = null;
-
     /**Injection resolver instance*/
     private InjectionResolver injectionResolver = null;
 
@@ -233,7 +232,6 @@ public class BeanManagerImpl implements
     {
         this.webBeansContext = webBeansContext;
         injectionResolver = new InjectionResolver(webBeansContext);
-        notificationManager = new NotificationManager(webBeansContext);
         annotatedElementFactory = webBeansContext.getAnnotatedElementFactory();
     }
 
@@ -262,16 +260,6 @@ public class BeanManagerImpl implements
     }
 
     /**
-     * Return manager notification manager.
-     *
-     * @return notification manager
-     */
-    public NotificationManager getNotificationManager()
-    {
-        return notificationManager;
-    }
-
-    /**
      * Gets injection resolver.
      *
      * @return injection resolver
@@ -464,11 +452,10 @@ public class BeanManagerImpl implements
         fireEvent(event, false, bindings);
     }
 
-    //X TODO OWB-1182 CDI 2.0
     @Override
     public Event<Object> getEvent()
     {
-        throw new UnsupportedOperationException("CDI 2.0 not yet imlemented");
+        return new EventImpl<>(new EventMetadataImpl(null, Object.class, null, 
new Annotation[]{AnyLiteral.INSTANCE}, webBeansContext), webBeansContext);
     }
 
     public void fireEvent(Object event, boolean containerEvent, Annotation... 
bindings)
@@ -486,7 +473,7 @@ public class BeanManagerImpl implements
      */
     public void fireContextLifecyleEvent(Object payload, Annotation 
lifecycleQualifier)
     {
-        if 
(notificationManager.hasContextLifecycleObserver(lifecycleQualifier))
+        if 
(webBeansContext.getNotificationManager().hasContextLifecycleObserver(lifecycleQualifier))
         {
             fireEvent(payload, lifecycleQualifier);
         }
@@ -504,7 +491,7 @@ public class BeanManagerImpl implements
 
     public void fireEvent(Object event, EventMetadataImpl metadata, boolean 
isLifecycleEvent)
     {
-        notificationManager.fireEvent(event, metadata, isLifecycleEvent);
+        webBeansContext.getNotificationManager().fireEvent(event, metadata, 
isLifecycleEvent, null);
     }
 
     public Set<Bean<?>> getComponents()
@@ -1283,11 +1270,10 @@ public class BeanManagerImpl implements
     public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, 
EventMetadataImpl metadata)
     {
         LinkedList<ObserverMethod<? super Object>> observerMethods
-            = new LinkedList<>(notificationManager.resolveObservers(event, 
metadata, false));
+            = new 
LinkedList<>(webBeansContext.getNotificationManager().resolveObservers(event, 
metadata, false));
 
         // new in CDI-2.0: sort observers
-        Collections.sort(observerMethods,
-            (ObserverMethod o1, ObserverMethod o2) -> 
Integer.compare(o1.getPriority(), o2.getPriority()));
+        Collections.sort(observerMethods, 
Comparator.comparingInt(ObserverMethod::getPriority));
 
         return new LinkedHashSet<>(observerMethods);
     }

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
 Thu Jun  1 10:04:43 2017
@@ -83,18 +83,23 @@ public class EventImpl<T> implements Eve
         webBeansContext.getBeanManagerImpl().fireEvent(event, 
metadata.select(eventType), false);
     }
 
-    //X TODO OWB-1182 CDI 2.0
     @Override
-    public <U extends T> CompletionStage<U> fireAsync(U u)
+    public <U extends T> CompletionStage<U> fireAsync(U event)
     {
-        throw new UnsupportedOperationException("CDI 2.0 not yet imlemented");
+        Type eventType = event.getClass();
+        webBeansContext.getWebBeansUtil().validEventType(eventType.getClass(), 
metadata.getType());
+        return webBeansContext.getNotificationManager().fireEvent(event, 
metadata.select(eventType), false,
+                    
webBeansContext.getNotificationManager().getDefaultNotificationOptions());
     }
 
     //X TODO OWB-1182 CDI 2.0
     @Override
-    public <U extends T> CompletionStage<U> fireAsync(U u, NotificationOptions 
notificationOptions)
+    public <U extends T> CompletionStage<U> fireAsync(U event, 
NotificationOptions notificationOptions)
     {
-        throw new UnsupportedOperationException("CDI 2.0 not yet imlemented");
+        Type eventType = event.getClass();
+        webBeansContext.getWebBeansUtil().validEventType(eventType.getClass(), 
metadata.getType());
+        return webBeansContext.getNotificationManager().fireEvent(event, 
metadata.select(eventType), false,
+                    notificationOptions);
     }
 
     /**
@@ -103,7 +108,6 @@ public class EventImpl<T> implements Eve
     @Override
     public Event<T> select(Annotation... bindings)
     {
-        
         return new EventImpl<T>(metadata.select(bindings), webBeansContext);
     }
     

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
 Thu Jun  1 10:04:43 2017
@@ -26,15 +26,22 @@ import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionStage;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.event.NotificationOptions;
 import javax.enterprise.event.ObserverException;
 import javax.enterprise.event.TransactionPhase;
 import javax.enterprise.inject.spi.AfterBeanDiscovery;
@@ -87,21 +94,23 @@ public final class NotificationManager
     private final Map<Type, Set<ObserverMethod<?>>> observers = new 
ConcurrentHashMap<Type, Set<ObserverMethod<?>>>();
     private final WebBeansContext webBeansContext;
 
+    private final NotificationOptions defaultNotificationOptions;
+
     /**
      * Contains information whether certain Initialized and Destroyed events 
have observer methods.
      */
     private final ConcurrentMap<Annotation, Boolean> 
hasContextLifecycleEventObservers
-        = new ConcurrentHashMap<Annotation, Boolean>();
+        = new ConcurrentHashMap<>();
 
     /**
      * List of ObserverMethods cached by their raw types.
      */
     private final ConcurrentHashMap<Class<?>, Set<ObserverMethod<?>>> 
observersByRawType
-        = new ConcurrentHashMap<Class<?>, Set<ObserverMethod<?>>>();
+        = new ConcurrentHashMap<>();
 
 
 
-    public static final Set<Class> CONTAINER_EVENT_CLASSES = new 
HashSet<Class>(
+    public static final Set<Class> CONTAINER_EVENT_CLASSES = new HashSet<>(
         Arrays.asList(new Class[]{
             AfterBeanDiscovery.class,
             AfterDeploymentValidation.class,
@@ -126,6 +135,15 @@ public final class NotificationManager
     public NotificationManager(WebBeansContext webBeansContext)
     {
         this.webBeansContext = webBeansContext;
+        this.defaultNotificationOptions = 
NotificationOptions.ofExecutor(getDefaultExecutor());
+    }
+
+    //X TODO move to some SPI and implement properly!
+    private ExecutorService getDefaultExecutor()
+    {
+        // this is just for the start!
+        //X must get implemented properly with configuration etc
+        return Executors.newFixedThreadPool(5);
     }
 
     /**
@@ -628,8 +646,19 @@ public final class NotificationManager
         return matching;
     }
 
-    public void fireEvent(Object event, EventMetadataImpl metadata, boolean 
isLifecycleEvent)
+    public NotificationOptions getDefaultNotificationOptions()
+    {
+        return defaultNotificationOptions;
+    }
+
+    /**
+     * Fire the given event
+     * @param notificationOptions if {@code null} then this is a synchronous 
event. Otherwise fireAsync
+     */
+    public <T> CompletionStage<T> fireEvent(Object event, EventMetadataImpl 
metadata, boolean isLifecycleEvent, NotificationOptions notificationOptions)
     {
+        final boolean async = notificationOptions != null;
+
         if (!isLifecycleEvent && 
webBeansContext.getWebBeansUtil().isContainerEventType(event))
         {
             throw new IllegalArgumentException("Firing container events is 
forbidden");
@@ -637,10 +666,21 @@ public final class NotificationManager
 
         LinkedList<ObserverMethod<? super Object>> observerMethods = new 
LinkedList<>(resolveObservers(event, metadata, isLifecycleEvent));
 
+        // filter for all async or all synchronous observermethods
+        // oldschool and not Streams, because of performance and avoiding tons 
of temporary objects
+        Iterator<ObserverMethod<? super Object>> observerMethodIterator = 
observerMethods.iterator();
+        while (observerMethodIterator.hasNext())
+        {
+            if (async != observerMethodIterator.next().isAsync())
+            {
+                observerMethodIterator.remove();
+            }
+        }
+
         // new in CDI-2.0: sort observers
-        Collections.sort(observerMethods,
-            (ObserverMethod o1, ObserverMethod o2) -> 
Integer.compare(o1.getPriority(), o2.getPriority()));
+        
observerMethods.sort(Comparator.comparingInt(ObserverMethod::getPriority));
 
+        List<CompletableFuture<Void>> completableFutures = async ? new 
ArrayList<>() : null;
 
         for (ObserverMethod<? super Object> observer : observerMethods)
         {
@@ -656,6 +696,11 @@ public final class NotificationManager
                 
                 if(phase != null && 
!phase.equals(TransactionPhase.IN_PROGRESS))
                 {
+                    if (async)
+                    {
+                        throw new WebBeansConfigurationException("Async 
Observer Methods can only use TransactionPhase.IN_PROGRESS!");
+                    }
+
                     TransactionService transactionService = 
webBeansContext.getService(TransactionService.class);
                     if(transactionService != null)
                     {
@@ -663,25 +708,18 @@ public final class NotificationManager
                     }
                     else
                     {
-                        if (observer instanceof OwbObserverMethod)
-                        {
-                            ((OwbObserverMethod<? super 
Object>)observer).notify(event, metadata);
-                        }
-                        else
-                        {
-                            observer.notify(event);
-                        }
+                        invokeObserverMethod(event, metadata, observer);
                     }                    
                 }
                 else
                 {
-                    if (observer instanceof OwbObserverMethod)
+                    if (async)
                     {
-                        ((OwbObserverMethod<? super 
Object>)observer).notify(event, metadata);
+                        
completableFutures.add(invokeObserverMethodAsync(event, metadata, observer, 
notificationOptions));
                     }
                     else
                     {
-                        observer.notify(event);
+                        invokeObserverMethod(event, metadata, observer);
                     }
                 }
             }
@@ -726,6 +764,53 @@ public final class NotificationManager
                 throw new WebBeansException(e);
             }
         }
+
+        return complete(completableFutures, (T) event);
+    }
+
+    private <T> CompletableFuture<T> complete(List<CompletableFuture<Void>> 
completableFutures, T event)
+    {
+        if (completableFutures == null)
+        {
+            return null;
+        }
+        return CompletableFuture.allOf(completableFutures.toArray(new 
CompletableFuture[completableFutures.size()]))
+                                .thenApply(v -> event);
+    }
+
+    //X TODO review
+    private CompletableFuture invokeObserverMethodAsync(Object event,
+                                           EventMetadataImpl metadata,
+                                           ObserverMethod<? super Object> 
observer,
+                                           NotificationOptions 
notificationOptions)
+    {
+        return CompletableFuture.runAsync(() -> runAsync(event, metadata, 
observer), notificationOptions.getExecutor());
+    }
+
+    private void runAsync(Object event, EventMetadataImpl metadata, 
ObserverMethod<? super Object> observer)
+    {
+        //X TODO set up threads, requestcontext etc
+        webBeansContext.getContextsService().startContext(RequestScoped.class, 
null);
+        try
+        {
+            invokeObserverMethod(event, metadata, observer);
+        }
+        finally
+        {
+            
webBeansContext.getContextsService().endContext(RequestScoped.class, null);
+        }
+    }
+
+    private void invokeObserverMethod(Object event, EventMetadataImpl 
metadata, ObserverMethod<? super Object> observer)
+    {
+        if (observer instanceof OwbObserverMethod)
+        {
+            ((OwbObserverMethod<? super Object>)observer).notify(event, 
metadata);
+        }
+        else
+        {
+            observer.notify(event);
+        }
     }
 
     /**

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
 Thu Jun  1 10:04:43 2017
@@ -227,7 +227,7 @@ public class AfterBeanDiscoveryImpl impl
         {
             beanManager.fireEvent(event, true, 
AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
             ObserverMethod newObserverMethod = event.getObserverMethod();
-            
beanManager.getNotificationManager().addObserver(newObserverMethod);
+            
webBeansContext.getNotificationManager().addObserver(newObserverMethod);
         }
     }
 

Added: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/events/async/ObserversAsyncTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/events/async/ObserversAsyncTest.java?rev=1797175&view=auto
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/events/async/ObserversAsyncTest.java
 (added)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/events/async/ObserversAsyncTest.java
 Thu Jun  1 10:04:43 2017
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.webbeans.test.events.async;
+
+import javax.annotation.Priority;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.event.Observes;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class ObserversAsyncTest
+{
+
+
+    public static class VisitorCollectorEvent
+    {
+        private List<String> visitors = Collections.synchronizedList(new 
ArrayList<>());
+
+        public void visiting(String visitor)
+        {
+            visitors.add(visitor);
+        }
+
+        public List<String> getVisitors()
+        {
+            return visitors;
+        }
+    }
+
+    @RequestScoped
+    public class Observer1
+    {
+        public void visit(@Observes @Priority(1) VisitorCollectorEvent 
visitorCollector)
+        {
+            sleep(10L);
+            visitorCollector.visiting(getClass().getSimpleName());
+        }
+    }
+
+    private void sleep(long time)
+    {
+        try
+        {
+            Thread.sleep(time);
+        }
+        catch (InterruptedException e)
+        {
+            // ignore
+        }
+    }
+}

Propchange: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/events/async/ObserversAsyncTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/EventTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/EventTest.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/EventTest.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/EventTest.java
 Thu Jun  1 10:04:43 2017
@@ -25,10 +25,8 @@ import javax.enterprise.util.AnnotationL
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.test.AbstractUnitTest;
 import org.apache.webbeans.test.annotation.binding.Binding1;
-import org.apache.webbeans.test.event.ITypeArgumentEventInterface;
 import org.apache.webbeans.test.event.LoggedInEvent;
 import org.apache.webbeans.test.event.LoggedInObserver;
-import org.apache.webbeans.test.event.TypeArgumentBaseEvent;
 import org.apache.webbeans.test.event.TypeArgumentEvent;
 import org.apache.webbeans.test.event.TypeArgumentInterfaceObserver;
 import org.apache.webbeans.test.event.TypeArgumentObserver;
@@ -48,7 +46,7 @@ public class EventTest extends AbstractU
         };
 
         LoggedInObserver observer = new 
LoggedInObserver(ArrayUtil.asSet(anns));
-        
WebBeansContext.getInstance().getBeanManagerImpl().getNotificationManager().addObserver(observer);
+        
WebBeansContext.getInstance().getNotificationManager().addObserver(observer);
 
         getBeanManager().fireEvent(new LoggedInEvent(), anns);
 
@@ -66,7 +64,7 @@ public class EventTest extends AbstractU
 
         TypeArgumentObserver observer = new 
TypeArgumentObserver(ArrayUtil.asSet(anns));
 
-        
WebBeansContext.getInstance().getBeanManagerImpl().getNotificationManager().addObserver(observer);
+        
WebBeansContext.getInstance().getNotificationManager().addObserver(observer);
 
         getBeanManager().fireEvent(new TypeArgumentEvent(), anns);
 
@@ -83,7 +81,7 @@ public class EventTest extends AbstractU
         };
 
         TypeArgumentInterfaceObserver observer = new 
TypeArgumentInterfaceObserver(ArrayUtil.asSet(anns));
-        
WebBeansContext.getInstance().getBeanManagerImpl().getNotificationManager().addObserver(observer);
+        
WebBeansContext.getInstance().getNotificationManager().addObserver(observer);
 
         getBeanManager().fireEvent(new TypeArgumentEvent(), anns);
         Assert.assertEquals("ok", observer.getResult());

Modified: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/exception/EventExceptionTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/exception/EventExceptionTest.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/exception/EventExceptionTest.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/exception/EventExceptionTest.java
 Thu Jun  1 10:04:43 2017
@@ -95,7 +95,7 @@ public class EventExceptionTest extends
             };
 
             LoggedInObserver observer = new 
LoggedInObserver(ArrayUtil.asSet(anns));
-            
WebBeansContext.getInstance().getBeanManagerImpl().getNotificationManager().addObserver(observer);
+            
WebBeansContext.getInstance().getNotificationManager().addObserver(observer);
 
             getBeanManager().fireEvent(new LoggedInEvent(), anns);
 
@@ -121,7 +121,7 @@ public class EventExceptionTest extends
             };
             
             LoggedInObserver observer = new 
LoggedInObserver(ArrayUtil.asSet(anns));
-            
WebBeansContext.getInstance().getBeanManagerImpl().getNotificationManager().addObserver(observer);
+            
WebBeansContext.getInstance().getNotificationManager().addObserver(observer);
             Assert.fail("IllegalArgumentException expected");
         }
         catch (IllegalArgumentException e)

Modified: 
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
 (original)
+++ 
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
 Thu Jun  1 10:04:43 2017
@@ -779,7 +779,7 @@ public class WebContextsService extends
     {
         if (fireRequestLifecycleEvents == null)
         {
-            NotificationManager notificationManager = 
webBeansContext.getBeanManagerImpl().getNotificationManager();
+            NotificationManager notificationManager = 
webBeansContext.getNotificationManager();
             fireRequestLifecycleEvents
                 = 
notificationManager.hasContextLifecycleObserver(InitializedLiteral.INSTANCE_REQUEST_SCOPED)
 ||
                   
notificationManager.hasContextLifecycleObserver(DestroyedLiteral.INSTANCE_REQUEST_SCOPED);

Modified: 
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java?rev=1797175&r1=1797174&r2=1797175&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java
 (original)
+++ 
openwebbeans/trunk/webbeans-web/src/main/java/org/apache/webbeans/web/lifecycle/WebContainerLifecycle.java
 Thu Jun  1 10:04:43 2017
@@ -134,7 +134,7 @@ public final class WebContainerLifecycle
         }
 
         // fire @Initialized(ApplicationScoped.class) if any observer for it 
exists
-        if (webBeansContext.getBeanManagerImpl().getNotificationManager().
+        if (webBeansContext.getNotificationManager().
             
hasContextLifecycleObserver(InitializedLiteral.INSTANCE_APPLICATION_SCOPED))
         {
             // we need to temporarily start the ReqeustContext


Reply via email to