diff --git a/.github/workflows/ci-actions.yml b/.github/workflows/ci-actions.yml index b065c7db00c..1a4bc4b1f3e 100644 --- a/.github/workflows/ci-actions.yml +++ b/.github/workflows/ci-actions.yml @@ -18,7 +18,7 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK - uses: actions/setup-java@v3.12.0 + uses: actions/setup-java@v4.2.1 with: java-version: 11 distribution: 'temurin' @@ -35,7 +35,7 @@ jobs: shell: bash - name: Cache Maven Repository id: cache-maven - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.m2/repository # Caching is an automated pre/post action that installs the cache if the key exists and exports the cache @@ -54,7 +54,7 @@ jobs: zip -r wildfly.zip wildfly cd .. - name: Persist WildFly - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: wildfly-patched-zip path: container/wildfly.zip @@ -62,7 +62,7 @@ jobs: shell: bash run: tar -czf maven-repo.tgz -C ~ .m2/repository - name: Persist Maven Repo - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: maven-repo path: maven-repo.tgz @@ -94,12 +94,12 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java.name }} - uses: actions/setup-java@v3.12.0 + uses: actions/setup-java@v4.2.1 with: java-version: ${{ matrix.java.java-version }} distribution: 'temurin' - name: Download Maven Repo - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: maven-repo path: . @@ -107,7 +107,7 @@ jobs: shell: bash run: tar -xzf maven-repo.tgz -C ~ - name: Download Patched WildFly - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wildfly-patched-zip path: . @@ -125,13 +125,13 @@ jobs: find . -name '*-reports' -type d | tar -czf test-reports.tgz -T - find . -name 'server.log' -type f | tar -czf server-log.tgz -T - - name: Upload failure Archive (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: test-reports-incontainer-jdk${{matrix.java.name}} path: 'test-reports.tgz' - name: Upload server log artifact (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: server-log-incontainer-jdk${{matrix.java.name}} @@ -161,12 +161,12 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java.name }} - uses: actions/setup-java@v3.12.0 + uses: actions/setup-java@v4.2.1 with: java-version: ${{ matrix.java.java-version }} distribution: 'temurin' - name: Download Maven Repo - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: maven-repo path: . @@ -174,7 +174,7 @@ jobs: shell: bash run: tar -xzf maven-repo.tgz -C ~ - name: Download Patched WildFly - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wildfly-patched-zip path: . @@ -192,13 +192,13 @@ jobs: find . -name '*-reports' -type d | tar -czf test-reports.tgz -T - find . -name 'server.log' -type f | tar -czf server-log.tgz -T - - name: Upload failure Archive (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: test-reports-cdi-tck-jdk${{matrix.java.name}} path: 'test-reports.tgz' - name: Upload server log artifact (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: server-log-cdi-tck-jdk${{matrix.java.name}} @@ -220,12 +220,12 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java.name }} - uses: actions/setup-java@v3.12.0 + uses: actions/setup-java@v4.2.1 with: java-version: ${{ matrix.java.java-version }} distribution: 'temurin' - name: Download Maven Repo - uses: actions/download-artifact@v1 + uses: actions/download-artifact@v4 with: name: maven-repo path: . @@ -233,7 +233,7 @@ jobs: shell: bash run: tar -xzf maven-repo.tgz -C ~ - name: Download Patched WildFly - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wildfly-patched-zip path: . @@ -251,13 +251,13 @@ jobs: find . -name '*-reports' -type d | tar -czf test-reports.tgz -T - find . -name 'server.log' -type f | tar -czf server-log.tgz -T - - name: Upload failure Archive (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: test-reports-cdi-tck-jdk${{matrix.java.name}}-incontainer-relaxed path: 'test-reports.tgz' - name: Upload server log artifact (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: server-log-cdi-tck-jdk${{matrix.java.name}} @@ -270,7 +270,7 @@ jobs: shell: bash run: find . -name '*-reports' -type d | tar -czf test-reports.tgz -T - - name: Upload failure Archive (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: test-reports-cdi-tck-jdk${{matrix.java.name}}-relaxed @@ -300,12 +300,12 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java.name }} - uses: actions/setup-java@v3.12.0 + uses: actions/setup-java@v4.2.1 with: java-version: ${{ matrix.java.java-version }} distribution: 'temurin' - name: Download Maven Repo - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: maven-repo path: . @@ -320,7 +320,7 @@ jobs: shell: bash run: find . -name '*-reports' -type d | tar -czf test-reports.tgz -T - - name: Upload failure Archive (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: test-reports-no-container-jdk${{matrix.java.name}} @@ -335,12 +335,12 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK 11 - uses: actions/setup-java@v3.12.0 + uses: actions/setup-java@v4.2.1 with: java-version: 11 distribution: 'temurin' - name: Download Maven Repo - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: maven-repo path: . @@ -348,7 +348,7 @@ jobs: shell: bash run: tar -xzf maven-repo.tgz -C ~ - name: Download Patched WildFly - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: wildfly-patched-zip path: . @@ -366,13 +366,13 @@ jobs: find . -name '*-reports' -type d | tar -czf test-reports.tgz -T - find . -name 'server.log' -type f | tar -czf server-log.tgz -T - - name: Upload failed tests artifact (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: test-reports-examples path: 'test-reports.tgz' - name: Upload server log artifact (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: server-log-examples @@ -402,12 +402,12 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK ${{ matrix.java.name }} - uses: actions/setup-java@v3.12.0 + uses: actions/setup-java@v4.2.1 with: java-version: ${{ matrix.java.java-version }} distribution: 'temurin' - name: Download Maven Repo - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: maven-repo path: . @@ -422,7 +422,7 @@ jobs: shell: bash run: find . -name '*-reports' -type d | tar -czf test-reports.tgz -T - - name: Upload failure Archive (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: test-reports-cdi-tck-se-jdk${{matrix.java.name}} @@ -437,12 +437,12 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up JDK 11 - uses: actions/setup-java@v3.12.0 + uses: actions/setup-java@v4.2.1 with: java-version: 11 distribution: 'temurin' - name: Download Maven Repo - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: maven-repo path: . @@ -457,7 +457,7 @@ jobs: shell: bash run: find . -name '*-reports' -type d | tar -czf test-reports.tgz -T - - name: Upload failure Archive (if maven failed) - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 if: failure() with: name: test-reports-se-servlet-coop diff --git a/impl/src/main/java/org/jboss/weld/annotated/enhanced/EnhancedAnnotatedType.java b/impl/src/main/java/org/jboss/weld/annotated/enhanced/EnhancedAnnotatedType.java index b264b6582b6..e6f601b096b 100644 --- a/impl/src/main/java/org/jboss/weld/annotated/enhanced/EnhancedAnnotatedType.java +++ b/impl/src/main/java/org/jboss/weld/annotated/enhanced/EnhancedAnnotatedType.java @@ -69,7 +69,7 @@ public interface EnhancedAnnotatedType extends EnhancedAnnotated> * @return A set of abstracted fields with the given annotation. Returns an * empty set if there are no matches */ - Collection> getEnhancedFields(Class annotationType); + Collection> getEnhancedFields(Class annotationType); /** * Gets all fields declared on this class only. diff --git a/impl/src/main/java/org/jboss/weld/annotated/enhanced/jlr/EnhancedAnnotatedTypeImpl.java b/impl/src/main/java/org/jboss/weld/annotated/enhanced/jlr/EnhancedAnnotatedTypeImpl.java index bda1bc1bba8..bca05472689 100644 --- a/impl/src/main/java/org/jboss/weld/annotated/enhanced/jlr/EnhancedAnnotatedTypeImpl.java +++ b/impl/src/main/java/org/jboss/weld/annotated/enhanced/jlr/EnhancedAnnotatedTypeImpl.java @@ -34,7 +34,6 @@ import jakarta.enterprise.inject.spi.AnnotatedConstructor; import jakarta.enterprise.inject.spi.AnnotatedField; import jakarta.enterprise.inject.spi.AnnotatedMethod; -import jakarta.inject.Inject; import org.jboss.weld.annotated.enhanced.ConstructorSignature; import org.jboss.weld.annotated.enhanced.EnhancedAnnotatedConstructor; @@ -45,8 +44,6 @@ import org.jboss.weld.annotated.slim.AnnotatedTypeIdentifier; import org.jboss.weld.annotated.slim.SlimAnnotatedType; import org.jboss.weld.annotated.slim.backed.BackedAnnotatedType; -import org.jboss.weld.interceptor.spi.model.InterceptionType; -import org.jboss.weld.interceptor.util.InterceptionTypeRegistry; import org.jboss.weld.resources.ClassTransformer; import org.jboss.weld.util.collections.ImmutableSet; import org.jboss.weld.util.collections.ListMultimap; @@ -71,17 +68,6 @@ */ public class EnhancedAnnotatedTypeImpl extends AbstractEnhancedAnnotated> implements EnhancedAnnotatedType { - private static final Set> MAPPED_METHOD_ANNOTATIONS; - - static { - Set> annotations = new HashSet>(); - for (InterceptionType interceptionType : InterceptionTypeRegistry.getSupportedInterceptionTypes()) { - annotations.add(InterceptionTypeRegistry.getAnnotationClass(interceptionType)); - } - annotations.add(Inject.class); - MAPPED_METHOD_ANNOTATIONS = ImmutableSet.copyOf(annotations); - } - @SuppressFBWarnings("unchecked") private static final Set> MAPPED_METHOD_PARAMETER_ANNOTATIONS = ImmutableSet.of(Observes.class, ObservesAsync.class); @@ -95,7 +81,7 @@ public class EnhancedAnnotatedTypeImpl extends AbstractEnhancedAnnotated> fields; // The map from annotation type to abstracted field with annotation - private final Multimap, EnhancedAnnotatedField> annotatedFields; + private final Multimap, EnhancedAnnotatedField> annotatedFields; // The set of abstracted fields private final Set> declaredFields; @@ -158,7 +144,14 @@ protected EnhancedAnnotatedTypeImpl(SlimAnnotatedType annotatedType, this.superclass = classTransformer.getEnhancedAnnotatedType(superclass, slim.getIdentifier().getBdaId()); } } else { - this.superclass = classTransformer.getEnhancedAnnotatedType(Object.class, AnnotatedTypeIdentifier.NULL_BDA_ID); + EnhancedAnnotatedType superclassAt; + Class superclass = annotatedType.getJavaClass().getSuperclass(); + if (superclass == null) { + superclassAt = classTransformer.getEnhancedAnnotatedType(Object.class, AnnotatedTypeIdentifier.NULL_BDA_ID); + } else { + superclassAt = classTransformer.getEnhancedAnnotatedType(superclass, slim.getIdentifier().getBdaId()); + } + this.superclass = superclassAt; } // Assign class field information @@ -189,7 +182,7 @@ protected EnhancedAnnotatedTypeImpl(SlimAnnotatedType annotatedType, } this.declaredFields = new HashSet>(declaredFieldsTemp); } else { - Multimap, EnhancedAnnotatedField> annotatedFields = new ListMultimap, EnhancedAnnotatedField>(); + Multimap, EnhancedAnnotatedField> annotatedFields = new ListMultimap<>(); fieldsTemp = new HashSet>(); for (AnnotatedField annotatedField : annotatedType.getFields()) { EnhancedAnnotatedField weldField = EnhancedAnnotatedFieldImpl.of(annotatedField, this, @@ -345,10 +338,8 @@ protected EnhancedAnnotatedTypeImpl(SlimAnnotatedType annotatedType, Set> effectiveMethods) { Multimap, EnhancedAnnotatedMethod> result = SetMultimap.newSetMultimap(); for (EnhancedAnnotatedMethod method : effectiveMethods) { - for (Class annotation : MAPPED_METHOD_ANNOTATIONS) { - if (method.isAnnotationPresent(annotation)) { - result.put(annotation, method); - } + for (Annotation ann : method.getAnnotations()) { + result.put(ann.annotationType(), method); } } return Multimaps.unmodifiableMultimap(result); @@ -443,10 +434,10 @@ public EnhancedAnnotatedConstructor getDeclaredEnhancedConstructor(Constructo * @return A set of matching abstracted fields, null if none are found. */ @Override - public Collection> getEnhancedFields(Class annotationType) { + public Collection> getEnhancedFields(Class annotationType) { if (annotatedFields == null) { // Build collection from class hierarchy - ArrayList> aggregatedFields = new ArrayList>( + ArrayList> aggregatedFields = new ArrayList<>( this.declaredAnnotatedFields.get(annotationType)); if ((superclass != null) && (superclass.getJavaClass() != Object.class)) { aggregatedFields.addAll(superclass.getEnhancedFields(annotationType)); @@ -490,8 +481,6 @@ public boolean isSerializable() { /** * Gets the abstracted methods that have a certain annotation type present - *

- * If the annotated methods map is null, initialize it first * * @param annotationType The annotation type to match * @return A set of matching method abstractions. Returns an empty set if no diff --git a/impl/src/main/java/org/jboss/weld/injection/InjectionPointFactory.java b/impl/src/main/java/org/jboss/weld/injection/InjectionPointFactory.java index 8c2a9320080..bea9241394e 100644 --- a/impl/src/main/java/org/jboss/weld/injection/InjectionPointFactory.java +++ b/impl/src/main/java/org/jboss/weld/injection/InjectionPointFactory.java @@ -189,13 +189,14 @@ public MethodInjectionPoint createMethodInjectionPoint(MethodInject /* * Utility methods for field InjectionPoints */ - public List>> getFieldInjectionPoints(Bean declaringBean, EnhancedAnnotatedType type, + public List>> getFieldInjectionPoints(Bean declaringBean, + EnhancedAnnotatedType type, BeanManagerImpl manager) { List>> injectableFieldsList = new ArrayList>>(); if (type.slim() instanceof UnbackedAnnotatedType) { // external AnnotatedTypes require special treatment - Collection> allFields = type.getEnhancedFields(Inject.class); + Collection> allFields = type.getEnhancedFields(Inject.class); for (Class clazz = type.getJavaClass(); clazz != null && clazz != Object.class; clazz = clazz.getSuperclass()) { ImmutableSet.Builder> fields = ImmutableSet.builder(); diff --git a/impl/src/main/java/org/jboss/weld/injection/ResourceInjectionProcessor.java b/impl/src/main/java/org/jboss/weld/injection/ResourceInjectionProcessor.java index d282a411937..eb19fd9b2ab 100644 --- a/impl/src/main/java/org/jboss/weld/injection/ResourceInjectionProcessor.java +++ b/impl/src/main/java/org/jboss/weld/injection/ResourceInjectionProcessor.java @@ -90,7 +90,6 @@ protected Set> createResourceInjections(Bean declari } Class marker = getMarkerAnnotation(processorContext); - final Collection> fields = type.getDeclaredEnhancedFields(marker); final Collection> methods = type.getDeclaredEnhancedMethods(marker); diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/Foo.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/Foo.java new file mode 100644 index 00000000000..7b320b7f46d --- /dev/null +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/Foo.java @@ -0,0 +1,14 @@ +package org.jboss.weld.tests.injectionPoint.resource.extension; + +import jakarta.annotation.Resource; +import jakarta.enterprise.context.ApplicationScoped; + +@ApplicationScoped +public class Foo { + @Resource(name = "org.jboss.weld.tests.reproducer.Foo/world") + private String value; + + public String value() { + return "hello " + value; + } +} diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/FooSpecialized.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/FooSpecialized.java new file mode 100644 index 00000000000..3fd0ecab6e2 --- /dev/null +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/FooSpecialized.java @@ -0,0 +1,9 @@ +package org.jboss.weld.tests.injectionPoint.resource.extension; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Specializes; + +@ApplicationScoped +@Specializes +public class FooSpecialized extends Foo { +} diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/FooSpecializedNoBeanDef.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/FooSpecializedNoBeanDef.java new file mode 100644 index 00000000000..8d74c464552 --- /dev/null +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/FooSpecializedNoBeanDef.java @@ -0,0 +1,8 @@ +package org.jboss.weld.tests.injectionPoint.resource.extension; + +import jakarta.enterprise.inject.Specializes; + +// no bean defining annotation - this bean is not picked up via discovery but is instead registered via extension +@Specializes +public class FooSpecializedNoBeanDef extends Foo { +} diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/MyExtension.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/MyExtension.java new file mode 100644 index 00000000000..1a4ccc3f880 --- /dev/null +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/MyExtension.java @@ -0,0 +1,14 @@ +package org.jboss.weld.tests.injectionPoint.resource.extension; + +import jakarta.enterprise.event.Observes; +import jakarta.enterprise.inject.spi.AfterTypeDiscovery; +import jakarta.enterprise.inject.spi.BeanManager; +import jakarta.enterprise.inject.spi.Extension; + +public class MyExtension implements Extension { + + void afterTypeDiscovery(@Observes AfterTypeDiscovery event, BeanManager bm) { + event.addAnnotatedType(bm.createAnnotatedType(FooSpecializedNoBeanDef.class), + FooSpecializedNoBeanDef.class.getName() + "_synth"); + } +} diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/SpecializationDiscoveryTest.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/SpecializationDiscoveryTest.java new file mode 100644 index 00000000000..0cf18887816 --- /dev/null +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/SpecializationDiscoveryTest.java @@ -0,0 +1,46 @@ +package org.jboss.weld.tests.injectionPoint.resource.extension; + +import static org.junit.Assert.assertEquals; + +import jakarta.inject.Inject; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.weld.test.util.Utils; +import org.jboss.weld.tests.category.Integration; +import org.junit.Assert; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +/** + * Test inheritance of {@code @Resource} field when adding a specialized bean through discovery versus through extension + * See https://issues.redhat.com/browse/WELD-2798 + */ +@Category(Integration.class) +@RunWith(Arquillian.class) +public class SpecializationDiscoveryTest { + + @Deployment + public static Archive deploy() { + return ShrinkWrap + .create(WebArchive.class, + Utils.getDeploymentNameAsHash(SpecializationDiscoveryTest.class, Utils.ARCHIVE_TYPE.WAR)) + .addClasses(Foo.class, FooSpecialized.class, SpecializationDiscoveryTest.class) + .addAsWebInfResource(SpecializationDiscoveryTest.class.getPackage(), "web.xml", "web.xml"); + } + + @Inject + Foo foo; + + @Test + public void test() { + // foo is an instance of the specialized bean + Assert.assertTrue(foo instanceof FooSpecialized); + // resource has been injected + assertEquals("hello world", foo.value()); + } +} diff --git a/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/SpecializationExtensionTest.java b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/SpecializationExtensionTest.java new file mode 100644 index 00000000000..9aa5b891390 --- /dev/null +++ b/tests-arquillian/src/test/java/org/jboss/weld/tests/injectionPoint/resource/extension/SpecializationExtensionTest.java @@ -0,0 +1,53 @@ +package org.jboss.weld.tests.injectionPoint.resource.extension; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import jakarta.enterprise.inject.spi.Extension; +import jakarta.inject.Inject; + +import org.jboss.arquillian.container.test.api.Deployment; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.shrinkwrap.api.Archive; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.asset.EmptyAsset; +import org.jboss.shrinkwrap.api.spec.WebArchive; +import org.jboss.weld.test.util.Utils; +import org.jboss.weld.tests.category.Integration; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +/** + * Test inheritance of {@code @Resource} field when adding a specialized bean through discovery versus through extension + * See https://issues.redhat.com/browse/WELD-2798 + */ +@Category(Integration.class) +@RunWith(Arquillian.class) +public class SpecializationExtensionTest { + + @Deployment + public static Archive deploy() { + return ShrinkWrap + .create(WebArchive.class, + Utils.getDeploymentNameAsHash(SpecializationExtensionTest.class, Utils.ARCHIVE_TYPE.WAR)) + .addClasses(Foo.class, FooSpecializedNoBeanDef.class, MyExtension.class, + SpecializationExtensionTest.class) + .addAsServiceProvider(Extension.class, MyExtension.class) + .addAsWebInfResource(SpecializationExtensionTest.class.getPackage(), "web.xml", "web.xml") + // archive has an extension, it also needs beans.xml to be considered bean archive + .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"); + + } + + @Inject + Foo foo; + + @Test + public void test() { + // foo is an instance of the specialized bean + assertTrue(foo instanceof FooSpecializedNoBeanDef); + // resource has been injected + assertEquals("hello world", foo.value()); + } +} diff --git a/tests-arquillian/src/test/resources/org/jboss/weld/tests/injectionPoint/resource/extension/web.xml b/tests-arquillian/src/test/resources/org/jboss/weld/tests/injectionPoint/resource/extension/web.xml new file mode 100644 index 00000000000..b90c178acfa --- /dev/null +++ b/tests-arquillian/src/test/resources/org/jboss/weld/tests/injectionPoint/resource/extension/web.xml @@ -0,0 +1,15 @@ + + + + Resource Injection Tests + + + org.jboss.weld.tests.reproducer.Foo/world + java.lang.String + world + + + \ No newline at end of file diff --git a/tests-common/src/main/java/org/jboss/weld/test/util/annotated/ForwardingWeldClass.java b/tests-common/src/main/java/org/jboss/weld/test/util/annotated/ForwardingWeldClass.java index ca2ca398a4c..e149bdb7402 100644 --- a/tests-common/src/main/java/org/jboss/weld/test/util/annotated/ForwardingWeldClass.java +++ b/tests-common/src/main/java/org/jboss/weld/test/util/annotated/ForwardingWeldClass.java @@ -65,7 +65,7 @@ public Collection> getEnhancedConstructors() { return delegate().getEnhancedConstructors(); } - public Collection> getEnhancedFields(Class annotationType) { + public Collection> getEnhancedFields(Class annotationType) { return delegate().getEnhancedFields(annotationType); }