Skip to content

Commit f343d3d

Browse files
committed
WELD-2831 Fix firing of ProcessSyntheticAnnotatedType for types added via configurators
1 parent f731019 commit f343d3d

File tree

7 files changed

+58
-13
lines changed

7 files changed

+58
-13
lines changed

impl/src/main/java/org/jboss/weld/bootstrap/events/AbstractAnnotatedTypeRegisteringEvent.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import jakarta.enterprise.context.spi.Context;
2525
import jakarta.enterprise.inject.spi.AnnotatedType;
2626
import jakarta.enterprise.inject.spi.DefinitionException;
27+
import jakarta.enterprise.inject.spi.Extension;
2728

2829
import org.jboss.weld.annotated.AnnotatedTypeValidator;
2930
import org.jboss.weld.bootstrap.BeanDeployment;
@@ -45,22 +46,24 @@ protected AbstractAnnotatedTypeRegisteringEvent(BeanManagerImpl beanManager, Typ
4546
this.additionalAnnotatedTypes = new LinkedList<>();
4647
}
4748

48-
protected void addSyntheticAnnotatedType(AnnotatedType<?> type, String id) {
49+
protected void addSyntheticAnnotatedType(AnnotatedType<?> type, String id, Extension extension) {
4950
AnnotatedTypeValidator.validateAnnotatedType(type);
5051
if (type.getJavaClass().isAnnotation() || Beans.isVetoed(type)) {
5152
return;
5253
}
53-
storeSyntheticAnnotatedType(getOrCreateBeanDeployment(type.getJavaClass()), type, id);
54+
storeSyntheticAnnotatedType(getOrCreateBeanDeployment(type.getJavaClass()), type, id, extension);
5455
}
5556

56-
protected void storeSyntheticAnnotatedType(BeanDeployment deployment, AnnotatedType<?> type, String id) {
57-
deployment.getBeanDeployer().addSyntheticClass(type, getReceiver(), id);
57+
protected void storeSyntheticAnnotatedType(BeanDeployment deployment, AnnotatedType<?> type, String id,
58+
Extension extension) {
59+
deployment.getBeanDeployer().addSyntheticClass(type, extension, id);
5860
}
5961

6062
protected void finish() {
6163
try {
6264
for (AnnotatedTypeRegistration<?> annotatedTypeRegistration : additionalAnnotatedTypes) {
63-
addSyntheticAnnotatedType(annotatedTypeRegistration.configurator.complete(), annotatedTypeRegistration.id);
65+
addSyntheticAnnotatedType(annotatedTypeRegistration.configurator.complete(), annotatedTypeRegistration.id,
66+
annotatedTypeRegistration.extension);
6467
}
6568
} catch (Exception e) {
6669
throw new DefinitionException(e);
@@ -73,9 +76,14 @@ protected static class AnnotatedTypeRegistration<T> {
7376

7477
private final String id;
7578

76-
AnnotatedTypeRegistration(AnnotatedTypeConfiguratorImpl<T> configurator, String id) {
79+
// store Extension reference - creation of synth. AT from configurators happens *after* we notify observers
80+
// at that point, the getReceiver() method already returns null and we would not detect the AT as synthetic
81+
private final Extension extension;
82+
83+
AnnotatedTypeRegistration(AnnotatedTypeConfiguratorImpl<T> configurator, String id, Extension extension) {
7784
this.configurator = configurator;
7885
this.id = id;
86+
this.extension = extension;
7987
}
8088

8189
}

impl/src/main/java/org/jboss/weld/bootstrap/events/AfterTypeDiscoveryImpl.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public List<Class<?>> getDecorators() {
9090
@Override
9191
public void addAnnotatedType(AnnotatedType<?> type, String id) {
9292
checkWithinObserverNotification();
93-
addSyntheticAnnotatedType(type, id);
93+
addSyntheticAnnotatedType(type, id, getReceiver());
9494
BootstrapLogger.LOG.addAnnotatedTypeCalled(getReceiver(), type);
9595
}
9696

@@ -99,14 +99,14 @@ public <T> AnnotatedTypeConfigurator<T> addAnnotatedType(Class<T> type, String i
9999
checkWithinObserverNotification();
100100
AnnotatedTypeConfiguratorImpl<T> configurator = new AnnotatedTypeConfiguratorImpl<>(
101101
getBeanManager().createAnnotatedType(type));
102-
additionalAnnotatedTypes.add(new AnnotatedTypeRegistration<T>(configurator, id));
102+
additionalAnnotatedTypes.add(new AnnotatedTypeRegistration<T>(configurator, id, getReceiver()));
103103
return configurator;
104104
}
105105

106106
@Override
107-
protected void storeSyntheticAnnotatedType(BeanDeployment deployment, AnnotatedType<?> type, String id) {
107+
protected void storeSyntheticAnnotatedType(BeanDeployment deployment, AnnotatedType<?> type, String id,
108+
Extension extension) {
108109
SlimAnnotatedType<?> annotatedType = transformer.getUnbackedAnnotatedType(type, getBeanManager().getId(), id);
109-
Extension extension = getReceiver();
110110
SlimAnnotatedTypeContext<?> annotatedTypeContext = SlimAnnotatedTypeContext.of(annotatedType, extension);
111111

112112
ProcessAnnotatedTypeImpl<?> event = events.fireProcessAnnotatedType(getBeanManager(), annotatedTypeContext);

impl/src/main/java/org/jboss/weld/bootstrap/events/BeforeBeanDiscoveryImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void addStereotype(Class<? extends Annotation> stereotype, Annotation...
117117
@Override
118118
public void addAnnotatedType(AnnotatedType<?> type, String id) {
119119
checkWithinObserverNotification();
120-
addSyntheticAnnotatedType(type, id);
120+
addSyntheticAnnotatedType(type, id, getReceiver());
121121
BootstrapLogger.LOG.addAnnotatedTypeCalledInBBD(getReceiver(), type);
122122
}
123123

@@ -126,7 +126,7 @@ public <T> AnnotatedTypeConfigurator<T> addAnnotatedType(Class<T> type, String i
126126
checkWithinObserverNotification();
127127
AnnotatedTypeConfiguratorImpl<T> configurator = new AnnotatedTypeConfiguratorImpl<>(
128128
getBeanManager().createAnnotatedType(type));
129-
additionalAnnotatedTypes.add(new AnnotatedTypeRegistration<T>(configurator, id));
129+
additionalAnnotatedTypes.add(new AnnotatedTypeRegistration<T>(configurator, id, getReceiver()));
130130
BootstrapLogger.LOG.addAnnotatedTypeCalledInBBD(getReceiver(), type);
131131
return configurator;
132132
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package org.jboss.weld.tests.extensions.lifecycle.processSyntheticAnnotatedType;
2+
3+
public class Banana {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package org.jboss.weld.tests.extensions.lifecycle.processSyntheticAnnotatedType;
2+
3+
public class Kiwi {
4+
}

tests-arquillian/src/test/java/org/jboss/weld/tests/extensions/lifecycle/processSyntheticAnnotatedType/ProcessSyntheticAnnotatedTypeTest.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public static Archive<?> getDeployment() {
5050
.create(BeanArchive.class, Utils.getDeploymentNameAsHash(ProcessSyntheticAnnotatedTypeTest.class))
5151
.addPackage(Juicy.class.getPackage())
5252
.addAsServiceProvider(Extension.class, RegisteringExtension1.class, RegisteringExtension2.class,
53-
ModifyingExtension.class, VerifyingExtension.class);
53+
RegisteringExtension3.class, ModifyingExtension.class, VerifyingExtension.class);
5454
}
5555

5656
@Test
@@ -60,10 +60,15 @@ public void testEventsFired() {
6060
assertTrue(psatClasses.contains(Orange.class));
6161
assertTrue(psatClasses.contains(Apple.class));
6262
assertTrue(psatClasses.contains(Pear.class));
63+
assertTrue(psatClasses.contains(Kiwi.class));
64+
assertTrue(psatClasses.contains(Banana.class));
6365
// also verify that PAT is fired for classes in a BDA
6466
assertTrue(patClasses.contains(Orange.class));
6567
assertTrue(patClasses.contains(Apple.class));
6668
assertTrue(patClasses.contains(Pear.class));
69+
// Kiwi and Banana have no annotations
70+
assertFalse(patClasses.contains(Kiwi.class));
71+
assertFalse(patClasses.contains(Banana.class));
6772
}
6873

6974
@Test
@@ -72,6 +77,8 @@ public void testSource() {
7277
assertTrue(sources.get(Apple.class) instanceof RegisteringExtension1);
7378
assertTrue(sources.get(Orange.class) instanceof RegisteringExtension1);
7479
assertTrue(sources.get(Pear.class) instanceof RegisteringExtension2);
80+
assertTrue(sources.get(Kiwi.class) instanceof RegisteringExtension3);
81+
assertTrue(sources.get(Banana.class) instanceof RegisteringExtension3);
7582
}
7683

7784
@Test
@@ -89,5 +96,8 @@ public void testChangesApplied(BeanManager manager) {
8996
assertEquals(2, manager.getBeans(Pear.class, Any.Literal.INSTANCE).size());
9097
Set<Bean<?>> juicyPears = manager.getBeans(Pear.class, Juicy.Literal.INSTANCE);
9198
assertEquals(1, juicyPears.size());
99+
100+
assertEquals(1, manager.getBeans(Kiwi.class, Juicy.Literal.INSTANCE).size());
101+
assertEquals(1, manager.getBeans(Banana.class, Fresh.Literal.INSTANCE).size());
92102
}
93103
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.jboss.weld.tests.extensions.lifecycle.processSyntheticAnnotatedType;
2+
3+
import jakarta.enterprise.event.Observes;
4+
import jakarta.enterprise.inject.spi.AfterTypeDiscovery;
5+
import jakarta.enterprise.inject.spi.BeforeBeanDiscovery;
6+
import jakarta.enterprise.inject.spi.Extension;
7+
8+
public class RegisteringExtension3 implements Extension {
9+
10+
// using BBD
11+
void registerJuicyKiwi(@Observes BeforeBeanDiscovery event) {
12+
event.addAnnotatedType(Kiwi.class, Kiwi.class.getSimpleName() + "Configured").add(Juicy.Literal.INSTANCE);
13+
}
14+
15+
// using ATD
16+
void registerFreshBanana(@Observes AfterTypeDiscovery event) {
17+
event.addAnnotatedType(Banana.class, Banana.class.getSimpleName() + "Configured").add(Fresh.Literal.INSTANCE);
18+
}
19+
}

0 commit comments

Comments
 (0)