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

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

commit 613f5e6c2cb25f610d1fa0a288e044838680c5ce
Author: Mark Struberg <strub...@apache.org>
AuthorDate: Fri Feb 23 12:51:50 2024 +0100

    OWB-1438 synthetic InjectionPoint for CDI.current().select(..).get()
---
 .../webbeans/inject/instance/InstanceImpl.java     | 102 ++++++++++++++++++---
 .../test/tests/InjectionPointInjectionTest.java    |   5 +
 2 files changed, 96 insertions(+), 11 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 c4bb34882..ebaee034b 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
@@ -213,7 +213,7 @@ public class InstanceImpl<T> implements Instance<T>, 
Serializable
                 qualifierAnnotations.toArray(new Annotation[0]) :
                 concatenateQualifiers(qualifiers);
         return new InstanceImpl<>(
-            injectionClazz, injectionPoint == null ? null : new 
InstanceInjectionPoint(injectionPoint, newQualifiersArray),
+            injectionClazz, injectionPoint == null ? null : new 
DelegatingInjectionPoint(injectionPoint, newQualifiersArray),
             webBeansContext, newQualifiersArray);
     }
 
@@ -328,7 +328,13 @@ public class InstanceImpl<T> implements Instance<T>, 
Serializable
         BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
         CreationalContextImpl<?> creationalContext = 
beanManager.createCreationalContext(bean);
 
-        creationalContext.putInjectionPoint(injectionPoint);
+        InjectionPoint ip = injectionPoint;
+        if (ip == null)
+        {
+            // create a synthetic injection point to transport the type and 
qualifier
+            ip = new TypedInjectionPoint(injectionClazz, 
bean.getQualifiers().toArray(new Annotation[bean.getQualifiers().size()]));
+        }
+        creationalContext.putInjectionPoint(ip);
         try
         {
             T reference = (T) beanManager.getReference(bean, injectionClazz, 
creationalContext);
@@ -400,27 +406,82 @@ public class InstanceImpl<T> implements Instance<T>, 
Serializable
         }
     }
 
-    private static class InstanceInjectionPoint implements InjectionPoint, 
Serializable
+    private static class TypedInjectionPoint extends InstanceInjectionPoint
     {
-        private InjectionPoint delegate;
-        private Set<Annotation> qualifiers;
+        private Type type;
 
-        protected InstanceInjectionPoint(InjectionPoint injectionPoint, 
Annotation[] newQualifiersArray)
+        public TypedInjectionPoint(Type type, Annotation[] newQualifiersArray)
         {
-            this.delegate = injectionPoint;
-            this.qualifiers = Collections.unmodifiableSet(new 
HashSet<>(Arrays.asList(newQualifiersArray)));
+            super(newQualifiersArray);
+            this.type = type;
         }
 
         @Override
         public Type getType()
         {
-            return delegate.getType();
+            return type;
         }
 
         @Override
-        public Set<Annotation> getQualifiers()
+        public Bean<?> getBean()
         {
-            return qualifiers;
+            return null;
+        }
+
+        @Override
+        public Member getMember()
+        {
+            return null;
+        }
+
+        @Override
+        public Annotated getAnnotated()
+        {
+            return null;
+        }
+
+        @Override
+        public boolean isDelegate()
+        {
+            return false;
+        }
+
+        @Override
+        public boolean isTransient()
+        {
+            return false;
+        }
+
+        private void readObject(ObjectInputStream inp) throws IOException, 
ClassNotFoundException
+        {
+            OwbCustomObjectInputStream owbCustomObjectInputStream = new 
OwbCustomObjectInputStream(inp, WebBeansUtil.getCurrentClassLoader());
+            qualifiers = 
Set.class.cast(owbCustomObjectInputStream.readObject());
+            type = Type.class.cast(owbCustomObjectInputStream.readObject());
+        }
+
+        private void writeObject(ObjectOutputStream op) throws IOException
+        {
+            ObjectOutputStream out = new ObjectOutputStream(op);
+            out.writeObject(qualifiers);
+            out.writeObject(type);
+        }
+
+    }
+
+    private static class DelegatingInjectionPoint extends 
InstanceInjectionPoint
+    {
+        private InjectionPoint delegate;
+
+        protected DelegatingInjectionPoint(InjectionPoint injectionPoint, 
Annotation[] newQualifiersArray)
+        {
+            super(newQualifiersArray);
+            this.delegate = injectionPoint;
+        }
+
+        @Override
+        public Type getType()
+        {
+            return delegate.getType();
         }
 
         @Override
@@ -466,6 +527,25 @@ public class InstanceImpl<T> implements Instance<T>, 
Serializable
             out.writeObject(qualifiers);
             out.writeObject(delegate);
         }
+
+    }
+
+    private abstract static class InstanceInjectionPoint implements 
InjectionPoint, Serializable
+    {
+        protected Set<Annotation> qualifiers;
+
+        protected InstanceInjectionPoint(Annotation[] newQualifiersArray)
+        {
+            this.qualifiers = Collections.unmodifiableSet(new 
HashSet<>(Arrays.asList(newQualifiersArray)));
+        }
+
+
+        @Override
+        public Set<Annotation> getQualifiers()
+        {
+            return qualifiers;
+        }
+
     }
 
     public class HandleImpl<X> implements Instance.Handle<X>
diff --git 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java
 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java
index 8d8c98f78..eba02deef 100644
--- 
a/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java
+++ 
b/webbeans-impl/src/test/java/org/apache/webbeans/test/tests/InjectionPointInjectionTest.java
@@ -22,6 +22,7 @@ import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertNotNull;
 
@@ -34,6 +35,7 @@ import jakarta.enterprise.inject.Instance;
 import jakarta.enterprise.inject.spi.AnnotatedField;
 import jakarta.enterprise.inject.spi.AnnotatedType;
 import jakarta.enterprise.inject.spi.Bean;
+import jakarta.enterprise.inject.spi.CDI;
 import jakarta.enterprise.inject.spi.InjectionPoint;
 import jakarta.enterprise.inject.spi.InjectionTarget;
 import jakarta.inject.Inject;
@@ -90,6 +92,9 @@ public class InjectionPointInjectionTest extends 
AbstractUnitTest {
         assertThat(owner.getObserverInjectionName(), is("observerInjection"));
         assertThat(owner.getParameterizedObserverInjectionName(), 
is("observeParameterizedInjectionPoint"));
 
+        assertEquals(ProducerMethodInjectionPointOwner.class, 
CDI.current().select(ProducerMethodInjectionPointOwner.class).get().getInjectionPoint().getType());
+
+
         shutDownContainer();
     }
 

Reply via email to