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 <strub...@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(); + } + } + }