From a20916e1990cc115553725448d260572590b329f Mon Sep 17 00:00:00 2001 From: Andrew Rouse Date: Tue, 9 Jan 2024 16:23:10 +0000 Subject: [PATCH 1/2] Test additional bindings with InvocationContext Test that additional bindings (where a binding annotation is placed on another binding annotation) are returned by InvocationContext.getInterceptorBindings. Signed-off-by: Andrew Rouse --- .../contract/invocationContext/Binding15.java | 20 +++++++++++ .../Binding15Additional.java | 33 +++++++++++++++++++ .../InvocationContextTest.java | 3 +- .../invocationContext/SimpleBean.java | 1 + 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/Binding15.java create mode 100644 impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/Binding15Additional.java diff --git a/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/Binding15.java b/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/Binding15.java new file mode 100644 index 000000000..07101a39d --- /dev/null +++ b/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/Binding15.java @@ -0,0 +1,20 @@ +package org.jboss.cdi.tck.interceptors.tests.contract.invocationContext; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import jakarta.enterprise.util.AnnotationLiteral; +import jakarta.interceptor.InterceptorBinding; + +@InterceptorBinding +@Binding15Additional("AdditionalBinding") +@Target({ TYPE, METHOD }) +@Retention(RUNTIME) +public @interface Binding15 { + + public class Literal extends AnnotationLiteral implements Binding15 {} +} diff --git a/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/Binding15Additional.java b/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/Binding15Additional.java new file mode 100644 index 000000000..a3a3bf0df --- /dev/null +++ b/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/Binding15Additional.java @@ -0,0 +1,33 @@ +package org.jboss.cdi.tck.interceptors.tests.contract.invocationContext; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import jakarta.enterprise.util.AnnotationLiteral; +import jakarta.interceptor.InterceptorBinding; + +@InterceptorBinding +@Retention(RUNTIME) +@Target({ TYPE, METHOD }) +public @interface Binding15Additional { + + String value(); + + public class Literal extends AnnotationLiteral implements Binding15Additional { + + private String value; + + public Literal(String value) { + this.value = value; + } + + @Override + public String value() { + return value; + } + } +} diff --git a/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/InvocationContextTest.java b/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/InvocationContextTest.java index 95cae963b..0f347c72d 100644 --- a/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/InvocationContextTest.java +++ b/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/InvocationContextTest.java @@ -139,7 +139,8 @@ public void testGetInterceptorBindings() { new PseudoBinding.Literal(), new AroundConstructBinding1.Literal())); assertEquals(Interceptor12.getAllBindings(), Set.of(new SimplePCBinding.Literal(), new PseudoBinding.Literal(), new AroundConstructBinding1.Literal(), new Binding11.Literal(), new Binding12.Literal(), - new Binding13.Literal("ko"), new Binding14.Literal("foobar"))); + new Binding13.Literal("ko"), new Binding14.Literal("foobar"), + new Binding15.Literal(), new Binding15Additional.Literal("AdditionalBinding"))); assertEquals(Interceptor12.getBinding12s(), Set.of(new Binding12.Literal())); assertEquals(Interceptor12.getBinding12(), new Binding12.Literal()); assertEquals(Interceptor12.getBinding5s(), Set.of()); diff --git a/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/SimpleBean.java b/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/SimpleBean.java index 8205e6ef0..c2a157d8d 100644 --- a/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/SimpleBean.java +++ b/impl/src/main/java/org/jboss/cdi/tck/interceptors/tests/contract/invocationContext/SimpleBean.java @@ -82,6 +82,7 @@ public String echo(String s) { @Binding12 @Binding13("ko") // does not associate `Interceptor13` with this bean due to different annotation member @Binding14("foobar") + @Binding15 // Associates both @Binding15 and @Binding15Additional("AdditionalBinding") public boolean bindings() { return true; } From c5aed17b20a3aadcba100e9140bbbefdc3deebed Mon Sep 17 00:00:00 2001 From: Andrew Rouse Date: Tue, 9 Jan 2024 18:16:29 +0000 Subject: [PATCH 2/2] Test binding added by extension visible Test that an interceptor binding added to a method via an annotation is used to bind the interceptor and visible via InterceptionContext.getInterceptorBinding Signed-off-by: Andrew Rouse --- .../ChangeInterceptorBindingExtension.java | 17 +++++++++ .../ChangeInterceptorBindingTest.java | 36 +++++++++++++++++++ .../changeInterceptorBinding/MyBinding.java | 36 +++++++++++++++++++ .../MyInterceptor.java | 18 ++++++++++ .../changeInterceptorBinding/MyService.java | 11 ++++++ 5 files changed, 118 insertions(+) create mode 100644 impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/ChangeInterceptorBindingExtension.java create mode 100644 impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/ChangeInterceptorBindingTest.java create mode 100644 impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyBinding.java create mode 100644 impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyInterceptor.java create mode 100644 impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyService.java diff --git a/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/ChangeInterceptorBindingExtension.java b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/ChangeInterceptorBindingExtension.java new file mode 100644 index 000000000..da8a86401 --- /dev/null +++ b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/ChangeInterceptorBindingExtension.java @@ -0,0 +1,17 @@ +package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInterceptorBinding; + +import jakarta.enterprise.inject.build.compatible.spi.BuildCompatibleExtension; +import jakarta.enterprise.inject.build.compatible.spi.ClassConfig; +import jakarta.enterprise.inject.build.compatible.spi.Enhancement; + +public class ChangeInterceptorBindingExtension implements BuildCompatibleExtension { + + @Enhancement(types = MyService.class) + public void enhancement(ClassConfig config) { + config.methods() + .stream() + .filter(it -> "hello".equals(it.info().name())) + .forEach(m -> m.addAnnotation(new MyBinding.Literal("foo"))); + } + +} diff --git a/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/ChangeInterceptorBindingTest.java b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/ChangeInterceptorBindingTest.java new file mode 100644 index 000000000..f3e2a878d --- /dev/null +++ b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/ChangeInterceptorBindingTest.java @@ -0,0 +1,36 @@ +package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInterceptorBinding; + +import static org.testng.Assert.assertEquals; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.cdi.tck.AbstractTest; +import org.jboss.cdi.tck.cdi.Sections; +import org.jboss.cdi.tck.interceptors.InterceptorsSections; +import org.jboss.cdi.tck.shrinkwrap.WebArchiveBuilder; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.test.audit.annotations.SpecAssertion; +import org.jboss.test.audit.annotations.SpecVersion; +import org.testng.annotations.Test; + +/** + * Test interceptor bindings applied to methods via extension are used to bind the correct interceptor and returned from InvocationContext.getInterceptorBindings() + */ +@SpecVersion(spec = "cdi", version = "4.1") +public class ChangeInterceptorBindingTest extends AbstractTest { + + @Deployment + public static WebArchive createTestArchive() { + return new WebArchiveBuilder() + .withTestClassPackage(ChangeInterceptorBindingTest.class) + .withBuildCompatibleExtension(ChangeInterceptorBindingExtension.class) + .build(); + } + + @Test + @SpecAssertion(section = Sections.ENHANCEMENT_PHASE, id = "b") + @SpecAssertion(section = InterceptorsSections.INVOCATIONCONTEXT, id="o") + public void test() { + assertEquals(getContextualReference(MyService.class).hello(), "Intercepted(foo): Hello!"); + } + +} diff --git a/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyBinding.java b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyBinding.java new file mode 100644 index 000000000..2935bc109 --- /dev/null +++ b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyBinding.java @@ -0,0 +1,36 @@ +package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInterceptorBinding; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import jakarta.enterprise.util.AnnotationLiteral; +import jakarta.enterprise.util.Nonbinding; +import jakarta.interceptor.InterceptorBinding; + +@InterceptorBinding +@Inherited +@Retention(RUNTIME) +@Target({ TYPE, METHOD }) +public @interface MyBinding { + + @Nonbinding + public String value(); + + public class Literal extends AnnotationLiteral implements MyBinding { + private String value; + + public Literal(String value) { + this.value = value; + } + + @Override + public String value() { + return value; + } + } +} diff --git a/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyInterceptor.java b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyInterceptor.java new file mode 100644 index 000000000..da02e6418 --- /dev/null +++ b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyInterceptor.java @@ -0,0 +1,18 @@ +package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInterceptorBinding; + +import jakarta.annotation.Priority; +import jakarta.interceptor.AroundInvoke; +import jakarta.interceptor.Interceptor; +import jakarta.interceptor.InvocationContext; + +@Interceptor +@MyBinding("") +@Priority(1000) +public class MyInterceptor { + + @AroundInvoke + public Object aroundInvoke(InvocationContext ctx) throws Exception { + MyBinding binding = ctx.getInterceptorBinding(MyBinding.class); + return "Intercepted(" + binding.value() + "): " + ctx.proceed(); + } +} diff --git a/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyService.java b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyService.java new file mode 100644 index 000000000..c74c60453 --- /dev/null +++ b/impl/src/main/java/org/jboss/cdi/tck/tests/build/compatible/extensions/changeInterceptorBinding/MyService.java @@ -0,0 +1,11 @@ +package org.jboss.cdi.tck.tests.build.compatible.extensions.changeInterceptorBinding; + +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class MyService { + + public String hello() { + return "Hello!"; + } +}