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(); }