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
+{
+}