This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openwebbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new 3a818a3  OWB-1373 use BeanManager to resolve observers
3a818a3 is described below

commit 3a818a37f37714e5ea4da82c093168f2f5850f4e
Author: Mark Struberg <[email protected]>
AuthorDate: Sun Feb 28 18:10:31 2021 +0100

    OWB-1373 use BeanManager to resolve observers
    
    When using the NotificationManager directly we might miss
    detection of ObserverMethods which are located in a Parent BeanManager
    in an EAR setup.
---
 .../java/org/apache/webbeans/event/EventImpl.java  |  8 ++--
 .../test/events/observer/EventSourceOwnerBean.java | 36 +++++++++++++++
 .../webbeans/test/events/observer/EventTest.java   | 51 ++++++++++------------
 .../AlternativeSpecializedEventObserverTest.java   | 38 ++++++++++++++++
 .../AlternativeSpecializedFactory.java             | 32 ++++++++++++++
 .../EventSourceOwnerBean.java                      | 36 +++++++++++++++
 .../events/specializedalternative/Factory.java     | 40 +++++++++++++++++
 .../specializedalternative/FactoryEvent.java       | 23 ++++++++++
 8 files changed, 231 insertions(+), 33 deletions(-)

diff --git 
a/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java 
b/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
index 5f7b71f..0d3f381 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
@@ -177,7 +177,7 @@ public class EventImpl<T> implements Event<T>, Serializable
             if (defaultMetadataObservers == null)
             {
                 final List<ObserverMethod<? super Object>> tmp = new 
ArrayList<>( // faster than LinkedList
-                        notificationManager.resolveObservers(event, metadata, 
false));
+                        
webBeansContext.getBeanManagerImpl().resolveObserverMethods(event, metadata));
                 notificationManager.prepareObserverListForFire(false, false, 
tmp);
                 this.defaultMetadataObservers = tmp;
             }
@@ -206,7 +206,7 @@ public class EventImpl<T> implements Event<T>, Serializable
             if (observerMethods == null)
             {
                 observerMethods = new ArrayList<>( // faster than LinkedList
-                        notificationManager.resolveObservers(event, metadata, 
false));
+                        
webBeansContext.getBeanManagerImpl().resolveObserverMethods(event, metadata));
                 notificationManager.prepareObserverListForFire(false, false, 
observerMethods);
                 this.observers.putIfAbsent(key, observerMethods);
             }
@@ -223,7 +223,7 @@ public class EventImpl<T> implements Event<T>, Serializable
             if (defaultMetadataAsyncObservers == null)
             {
                 final List<ObserverMethod<? super Object>> tmp = new 
ArrayList<>( // faster than LinkedList
-                        notificationManager.resolveObservers(event, metadata, 
false));
+                        
webBeansContext.getBeanManagerImpl().resolveObserverMethods(event, metadata));
                 notificationManager.prepareObserverListForFire(false, true, 
tmp);
                 this.defaultMetadataAsyncObservers = tmp;
             }
@@ -252,7 +252,7 @@ public class EventImpl<T> implements Event<T>, Serializable
             if (observerMethods == null)
             {
                 observerMethods = new ArrayList<>( // faster than LinkedList
-                        notificationManager.resolveObservers(event, metadata, 
false));
+                        
webBeansContext.getBeanManagerImpl().resolveObserverMethods(event, metadata));
                 notificationManager.prepareObserverListForFire(false, true, 
observerMethods);
                 this.asyncObservers.putIfAbsent(key, observerMethods);
             }
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/events/observer/EventSourceOwnerBean.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/observer/EventSourceOwnerBean.java
new file mode 100644
index 0000000..3404351
--- /dev/null
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/observer/EventSourceOwnerBean.java
@@ -0,0 +1,36 @@
+/*
+ * 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.observer;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+
+/**
+ * Bean which contains an injected Event for StaticTestEvent
+ */
+@ApplicationScoped
+public class EventSourceOwnerBean
+{
+    private @Inject Event<PrivateTestEvent> eventSource;
+
+    public void fireForMe(PrivateTestEvent testEvent) {
+        eventSource.fire(testEvent);
+    }
+}
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/events/observer/EventTest.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/observer/EventTest.java
index 96d9889..bc133ae 100644
--- 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/events/observer/EventTest.java
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/observer/EventTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.webbeans.test.events.observer;
 
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Logger;
 
@@ -33,9 +31,7 @@ public class EventTest extends AbstractUnitTest {
     @Test
     public void multipleObserverMethodsWithSameName()
     {
-        Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
-        beanClasses.add(Painter.class);
-        startContainer(beanClasses, null);
+        startContainer(Painter.class);
 
         final Orange orange = new Orange();
         getBeanManager().fireEvent(orange);
@@ -54,10 +50,7 @@ public class EventTest extends AbstractUnitTest {
     @Test
     public void testOverriddenObserverMethodsInSubclasses()
     {
-        Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
-        beanClasses.add(Superclass.class);
-        beanClasses.add(BeanA.class);
-        startContainer(beanClasses, null);
+        startContainer(Superclass.class, BeanA.class);
 
         TestEvent testEvent = new TestEvent();
         getBeanManager().fireEvent(testEvent);
@@ -69,12 +62,24 @@ public class EventTest extends AbstractUnitTest {
     }
 
     @Test
+    public void testEventViaEventSource()
+    {
+        startContainer(Superclass.class, BeanA.class, 
EventSourceOwnerBean.class);
+
+        PrivateTestEvent testEvent = new PrivateTestEvent();
+        getInstance(EventSourceOwnerBean.class).fireForMe(testEvent);
+
+        Assert.assertEquals(2, testEvent.getCalledObservers().size());
+        Assert.assertTrue(testEvent.getCalledObservers().contains("BeanA"));
+        
Assert.assertTrue(testEvent.getCalledObservers().contains("BeanA[Superclass]"));
+
+        shutDownContainer();
+    }
+
+    @Test
     public void testSubclassRemovesObserverAnnotationByOverriding()
     {
-        Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
-        beanClasses.add(Superclass.class);
-        beanClasses.add(BeanB.class);
-        startContainer(beanClasses, null);
+        startContainer(Superclass.class, BeanB.class);
 
         TestEvent testEvent = new TestEvent();
         getBeanManager().fireEvent(testEvent);
@@ -86,10 +91,7 @@ public class EventTest extends AbstractUnitTest {
     
     @Test
     public void testObserverOnPrivateMethod() {
-        Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
-        beanClasses.add(Superclass.class);
-        beanClasses.add(BeanA.class);
-        startContainer(beanClasses, null);
+        startContainer(Superclass.class, BeanA.class);
 
         PrivateTestEvent testEvent = new PrivateTestEvent();
         getBeanManager().fireEvent(testEvent);
@@ -104,10 +106,7 @@ public class EventTest extends AbstractUnitTest {
     
     @Test
     public void testPrivateMethodCannotBeOverridden() {
-        Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
-        beanClasses.add(Superclass.class);
-        beanClasses.add(BeanB.class);
-        startContainer(beanClasses, null);
+        startContainer(Superclass.class, BeanB.class);
 
         PrivateTestEvent testEvent = new PrivateTestEvent();
         getBeanManager().fireEvent(testEvent);
@@ -121,10 +120,7 @@ public class EventTest extends AbstractUnitTest {
     
     @Test
     public void testObserverOnStaticMethod() {
-        Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
-        beanClasses.add(Superclass.class);
-        beanClasses.add(BeanA.class);
-        startContainer(beanClasses, null);
+        startContainer(Superclass.class, BeanA.class);
 
         StaticTestEvent testEvent = new StaticTestEvent();
         getBeanManager().fireEvent(testEvent);
@@ -139,10 +135,7 @@ public class EventTest extends AbstractUnitTest {
     
     @Test
     public void testStaticMethodCannotBeOverridden() {
-        Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
-        beanClasses.add(Superclass.class);
-        beanClasses.add(BeanB.class);
-        startContainer(beanClasses, null);
+        startContainer(Superclass.class, BeanB.class);
 
         StaticTestEvent testEvent = new StaticTestEvent();
         getBeanManager().fireEvent(testEvent);
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/AlternativeSpecializedEventObserverTest.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/AlternativeSpecializedEventObserverTest.java
new file mode 100644
index 0000000..1a1820d
--- /dev/null
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/AlternativeSpecializedEventObserverTest.java
@@ -0,0 +1,38 @@
+/*
+ * 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.specializedalternative;
+
+import org.apache.webbeans.test.AbstractUnitTest;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class AlternativeSpecializedEventObserverTest extends AbstractUnitTest
+{
+    @Test
+    public void testEventing() {
+        startContainer(Factory.class, AlternativeSpecializedFactory.class, 
EventSourceOwnerBean.class);
+        Factory.reset();
+
+        getInstance(EventSourceOwnerBean.class).fireForMe(new FactoryEvent());
+
+        Assert.assertTrue(Factory.isEventDelivered());
+
+        shutDownContainer();
+    }
+}
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/AlternativeSpecializedFactory.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/AlternativeSpecializedFactory.java
new file mode 100644
index 0000000..7744f04
--- /dev/null
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/AlternativeSpecializedFactory.java
@@ -0,0 +1,32 @@
+/*
+ * 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.specializedalternative;
+
+
+import javax.enterprise.inject.Alternative;
+import javax.enterprise.inject.Specializes;
+
+/**
+ * Not activated Alternative should simply get ignored
+ */
+@Specializes
+@Alternative
+public class AlternativeSpecializedFactory extends Factory
+{
+}
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/EventSourceOwnerBean.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/EventSourceOwnerBean.java
new file mode 100644
index 0000000..6396e09
--- /dev/null
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/EventSourceOwnerBean.java
@@ -0,0 +1,36 @@
+/*
+ * 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.specializedalternative;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Event;
+import javax.inject.Inject;
+
+/**
+ * Bean which contains an injected Event for StaticTestEvent
+ */
+@ApplicationScoped
+public class EventSourceOwnerBean
+{
+    private @Inject Event<FactoryEvent> eventSource;
+
+    public void fireForMe(FactoryEvent testEvent) {
+        eventSource.fire(testEvent);
+    }
+}
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/Factory.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/Factory.java
new file mode 100644
index 0000000..50b420d
--- /dev/null
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/Factory.java
@@ -0,0 +1,40 @@
+/*
+ * 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.specializedalternative;
+
+import javax.enterprise.event.Observes;
+
+public class Factory {
+
+    public static boolean eventDelivered;
+
+    public void observe(@Observes FactoryEvent event) {
+        if (this.getClass().equals(Factory.class)) {
+            eventDelivered = true;
+        }
+    }
+
+    public static boolean isEventDelivered() {
+        return eventDelivered;
+    }
+
+    public static void reset() {
+        Factory.eventDelivered = false;
+    }
+}
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/FactoryEvent.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/FactoryEvent.java
new file mode 100644
index 0000000..3e5e50e
--- /dev/null
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/events/specializedalternative/FactoryEvent.java
@@ -0,0 +1,23 @@
+/*
+ * 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.specializedalternative;
+
+public class FactoryEvent
+{
+}

Reply via email to