You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2023/01/25 17:26:17 UTC

[openwebbeans] 01/02: OWB-1417 implement Handle

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

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

commit 55f97ee2beb38dee7492bdfa47cc1ca6f65d4c46
Author: Mark Struberg <st...@apache.org>
AuthorDate: Wed Jan 25 18:25:25 2023 +0100

    OWB-1417 implement Handle<T>
---
 .../webbeans/inject/instance/InstanceImpl.java     | 69 ++++++++++++++++++++--
 1 file changed, 63 insertions(+), 6 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 059c94497..73a7075f6 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
@@ -32,6 +32,7 @@ import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import jakarta.enterprise.context.spi.AlterableContext;
@@ -112,15 +113,15 @@ public class InstanceImpl<T> implements Instance<T>, Serializable
     @Override
     public Handle<T> getHandle()
     {
-        //X TODO implement!
-        return null;
+        return new HandleImpl<T>(getBean());
     }
 
     @Override
     public Iterable<? extends Handle<T>> handles()
     {
-        //X TODO implement!
-        return null;
+        return resolveBeans().stream()
+            .map(bean -> (Handle<T>)new HandleImpl(bean))
+            .collect(Collectors.toList());
     }
 
     /**
@@ -132,6 +133,13 @@ public class InstanceImpl<T> implements Instance<T>, Serializable
     public T get()
     {
 
+        Bean<?> bean = getBean();
+
+        return create(bean);
+    }
+
+    private Bean<?> getBean()
+    {
         Set<Bean<?>> beans = resolveBeans();
 
         Bean<?> bean = webBeansContext.getBeanManagerImpl().resolve(beans);
@@ -142,8 +150,7 @@ public class InstanceImpl<T> implements Instance<T>, Serializable
             anns = qualifierAnnotations.toArray(anns);
             InjectionExceptionUtil.throwUnsatisfiedResolutionException(ClassUtil.getClazz(injectionClazz), injectionPoint, anns);
         }
-
-        return create(bean);
+        return bean;
     }
 
 
@@ -456,4 +463,54 @@ public class InstanceImpl<T> implements Instance<T>, Serializable
             out.writeObject(delegate);
         }
     }
+
+    public class HandleImpl<X> implements Instance.Handle<X>
+    {
+        private final Bean<X> bean;
+        private boolean destroyed = false;
+        private X contextualReference = null;
+
+        public HandleImpl(Bean<?> bean)
+        {
+            this.bean = (Bean<X>) bean;
+        }
+
+        @Override
+        public X get()
+        {
+            if (destroyed)
+            {
+                throw new IllegalStateException("Contextual Reference already destroyed");
+            }
+            if (contextualReference == null)
+            {
+                contextualReference = (X) create(bean);
+            }
+
+            return contextualReference;
+        }
+
+        @Override
+        public Bean<X> getBean()
+        {
+            return bean;
+        }
+
+        @Override
+        public void destroy()
+        {
+            if (!destroyed && contextualReference != null)
+            {
+                InstanceImpl.this.destroy((T) contextualReference);
+                destroyed = true;
+            }
+        }
+
+        @Override
+        public void close()
+        {
+            destroy();
+        }
+    }
+
 }