Author: rmannibucau
Date: Fri Jun 16 18:29:20 2017
New Revision: 1798973

URL: http://svn.apache.org/viewvc?rev=1798973&view=rev
Log:
better fireAsync impl

Modified:
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java
    openwebbeans/trunk/webbeans-tck/testng-dev.xml

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=1798973&r1=1798972&r2=1798973&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
 Fri Jun 16 18:29:20 2017
@@ -45,6 +45,7 @@ import java.util.concurrent.CopyOnWriteA
 import java.util.concurrent.Executor;
 import java.util.concurrent.ForkJoinPool;
 import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.event.NotificationOptions;
@@ -782,21 +783,12 @@ public final class NotificationManager
         {
             return null;
         }
-        final CDICompletionFuture<T> future = new CDICompletionFuture<>(event);
-        // propagate the exception to the future aggregator 
(CDICompletionFuture)
-        CompletableFuture[] futures = completableFutures.stream()
-                .map(f -> f.exceptionally(e ->
-                {
-                    future.addError(e);
-                    return null;
-                })).toArray(CompletableFuture[]::new);
-        // execute all futures and *once done* complete our future
-        CompletableFuture.allOf(futures)
-                .handle((e, t) ->
-                {
-                    future.done();
-                    return null;
-                });
+        final CDICompletionFuture<T> future = new CDICompletionFuture<>(event, 
completableFutures.size());
+        completableFutures.forEach(f -> f.handle((t, e) ->
+        {
+            future.addResult(e);
+            return null;
+        }));
         return future;
     }
 
@@ -900,33 +892,37 @@ public final class NotificationManager
     private static final class CDICompletionFuture<T> extends 
CompletableFuture<T>
     {
         private final T event;
+        private final AtomicInteger counter;
         private CompletionException error;
 
-        private CDICompletionFuture(final T event)
+        private CDICompletionFuture(final T event, final int total)
         {
             this.event = event;
+            this.counter = new AtomicInteger(total);
         }
 
-        CDICompletionFuture<T> addError(final Throwable t)
-        {
-            if (error == null)
-            {
-                error = new CompletionException(null);
-            }
-            error.addSuppressed(t);
-            return this;
-        }
-
-        void done()
+        CDICompletionFuture<T> addResult(final Throwable t)
         {
-            if (error != null)
+            if (t != null)
             {
-                completeExceptionally(error);
+                if (error == null)
+                {
+                    error = new CompletionException(null);
+                }
+                error.addSuppressed(t);
             }
-            else
+            if (counter.decrementAndGet() == 0)
             {
-                complete(event);
+                if (error != null)
+                {
+                    completeExceptionally(error);
+                }
+                else
+                {
+                    complete(event);
+                }
             }
+            return this;
         }
     }
 

Modified: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java?rev=1798973&r1=1798972&r2=1798973&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/AbstractUnitTest.java
 Fri Jun 16 18:29:20 2017
@@ -73,6 +73,11 @@ public abstract class AbstractUnitTest
         shutDownContainer();
     }
 
+    protected void startContainerInnerClasses()
+    {
+        startContainer(getClass().getClasses());
+    }
+
     protected void startContainer(Class<?>... beanClasses)
     {
         startContainer(new ArrayList<Class<?>>(Arrays.asList(beanClasses)), 
null);

Modified: openwebbeans/trunk/webbeans-tck/testng-dev.xml
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-tck/testng-dev.xml?rev=1798973&r1=1798972&r2=1798973&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-tck/testng-dev.xml (original)
+++ openwebbeans/trunk/webbeans-tck/testng-dev.xml Fri Jun 16 18:29:20 2017
@@ -18,7 +18,7 @@
 <suite name="JSR-346-TCK" verbose="2" configfailurepolicy="continue">
   <test name="JSR-346 TCK">
     <classes>
-          <class 
name="org.jboss.cdi.tck.tests.interceptors.definition.conflictingenablement.InterceptorConflictingEnablementTest"
 />
+          <class 
name="org.jboss.cdi.tck.tests.event.observer.async.handlingExceptions.MultipleExceptionsInObserversNotificationTest"
 />
       <!--
 
       <class 
name="org.jboss.cdi.tck.tests.event.parameterized.ParameterizedEventTest" />


Reply via email to