You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2019/09/11 11:46:44 UTC

[openwebbeans] branch master updated: OWB-1297 drop parent creational context from Instance

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

rmannibucau 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 e19de31  OWB-1297 drop parent creational context from Instance
e19de31 is described below

commit e19de316ff77cd461afc9d49b4973979d76ef775
Author: Romain Manni-Bucau <rm...@gmail.com>
AuthorDate: Wed Sep 11 13:46:39 2019 +0200

    OWB-1297 drop parent creational context from Instance
---
 .../webbeans/inject/instance/InstanceImpl.java     | 29 ++++------
 .../test/instance/InstanceIteratorTest.java        | 65 ++++++++++++++++++++++
 2 files changed, 77 insertions(+), 17 deletions(-)

diff --git a/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java b/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
index c4b8bd7..7fb53f4 100644
--- a/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
+++ b/webbeans-impl/src/main/java/org/apache/webbeans/inject/instance/InstanceImpl.java
@@ -25,13 +25,11 @@ import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Member;
 import java.lang.reflect.Type;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -240,23 +238,20 @@ public class InstanceImpl<T> implements Instance<T>, Serializable
     @Override
     public Iterator<T> iterator()
     {
-        Set<Bean<?>> beans = resolveBeans();
-        List<T> instances = new ArrayList<>();
-        parentCreationalContext.putInjectionPoint(injectionPoint);
-        try
-        {
-            for(Bean<?> bean : beans)
+        final Iterator<Bean<?>> beans = resolveBeans().iterator();
+        return new Iterator<T>() {
+            @Override
+            public boolean hasNext()
             {
-                T instance = create(bean);
-                instances.add(instance);
+                return beans.hasNext();
             }
-        }
-        finally
-        {
-            parentCreationalContext.removeInjectionPoint();
-        }
-        
-        return instances.iterator();
+
+            @Override
+            public T next()
+            {
+                return create(beans.next());
+            }
+        };
     }
 
     public void destroy(T instance)
diff --git a/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceIteratorTest.java b/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceIteratorTest.java
index 6625304..721cfc2 100644
--- a/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceIteratorTest.java
+++ b/webbeans-impl/src/test/java/org/apache/webbeans/test/instance/InstanceIteratorTest.java
@@ -22,20 +22,30 @@ import org.junit.Assert;
 import org.apache.webbeans.test.AbstractUnitTest;
 import org.junit.Test;
 
+import javax.annotation.PreDestroy;
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.spi.AlterableContext;
 import javax.enterprise.inject.Any;
 import javax.enterprise.inject.Instance;
 import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.Bean;
 import javax.inject.Inject;
 import javax.inject.Qualifier;
 import java.lang.annotation.Retention;
 import java.lang.annotation.Target;
+import java.util.Collection;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.StreamSupport;
 
 import static java.lang.annotation.ElementType.*;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.util.stream.Collectors.toList;
 import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertTrue;
 
 public class InstanceIteratorTest extends AbstractUnitTest
 {
@@ -86,7 +96,62 @@ public class InstanceIteratorTest extends AbstractUnitTest
         Assert.assertTrue(instanceIteratorHolder.iterateOverContracts());
     }
 
+    @Test
+    public void testDestroyDependents()
+    {
+        ABean.COUNT.set(0);
+        startContainer(GetDependents.class, ABean.class);
+
+        final Set<Bean<?>> rbs = getBeanManager().getBeans(GetDependents.class);
+        final Bean<?> rb = getBeanManager().resolve(rbs);
+        final GetDependents getter = GetDependents.class.cast(getBeanManager().getReference(
+                rb, GetDependents.class, getBeanManager().createCreationalContext(rb)));
+        assertNotNull(getter);
+
+        final Collection<ABean> beans = getter.get();
+        assertEquals(1, beans.size());
+
+        final ABean bean = beans.iterator().next();
+        assertFalse(bean.isDestroyed());
+        assertEquals(0, ABean.COUNT.get());
+
+        final AlterableContext alterableContext = AlterableContext.class.cast(
+                getBeanManager().getContext(ApplicationScoped.class));
+        alterableContext.destroy(rb);
+
+        assertTrue(bean.isDestroyed());
+        assertEquals(1, ABean.COUNT.get());
+    }
+
+    public static class ABean
+    {
+        private static final AtomicInteger COUNT = new AtomicInteger();
+        private boolean destroyed;
+
+        public boolean isDestroyed()
+        {
+            return destroyed;
+        }
+
+        @PreDestroy
+        private void destroy()
+        {
+            destroyed = true;
+            COUNT.incrementAndGet();
+        }
+    }
+
+    @ApplicationScoped
+    public static class GetDependents
+    {
+        @Inject
+        private Instance<ABean> beans;
 
+        public Collection<ABean> get()
+        {
+            return StreamSupport.stream(beans.spliterator(), false).collect(toList());
+        }
+    }
 
     public static class InstanceHolder
     {