Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import jakarta.enterprise.context.spi.Context;
import jakarta.enterprise.inject.spi.AnnotatedType;
import jakarta.enterprise.inject.spi.DefinitionException;
import jakarta.enterprise.inject.spi.Extension;

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

protected void addSyntheticAnnotatedType(AnnotatedType<?> type, String id) {
protected void addSyntheticAnnotatedType(AnnotatedType<?> type, String id, Extension extension) {
AnnotatedTypeValidator.validateAnnotatedType(type);
if (type.getJavaClass().isAnnotation() || Beans.isVetoed(type)) {
return;
}
storeSyntheticAnnotatedType(getOrCreateBeanDeployment(type.getJavaClass()), type, id);
storeSyntheticAnnotatedType(getOrCreateBeanDeployment(type.getJavaClass()), type, id, extension);
}

protected void storeSyntheticAnnotatedType(BeanDeployment deployment, AnnotatedType<?> type, String id) {
deployment.getBeanDeployer().addSyntheticClass(type, getReceiver(), id);
protected void storeSyntheticAnnotatedType(BeanDeployment deployment, AnnotatedType<?> type, String id,
Extension extension) {
deployment.getBeanDeployer().addSyntheticClass(type, extension, id);
}

protected void finish() {
try {
for (AnnotatedTypeRegistration<?> annotatedTypeRegistration : additionalAnnotatedTypes) {
addSyntheticAnnotatedType(annotatedTypeRegistration.configurator.complete(), annotatedTypeRegistration.id);
addSyntheticAnnotatedType(annotatedTypeRegistration.configurator.complete(), annotatedTypeRegistration.id,
annotatedTypeRegistration.extension);
}
} catch (Exception e) {
throw new DefinitionException(e);
Expand All @@ -73,9 +76,14 @@ protected static class AnnotatedTypeRegistration<T> {

private final String id;

AnnotatedTypeRegistration(AnnotatedTypeConfiguratorImpl<T> configurator, String id) {
// store Extension reference - creation of synth. AT from configurators happens *after* we notify observers
// at that point, the getReceiver() method already returns null and we would not detect the AT as synthetic
private final Extension extension;

AnnotatedTypeRegistration(AnnotatedTypeConfiguratorImpl<T> configurator, String id, Extension extension) {
this.configurator = configurator;
this.id = id;
this.extension = extension;
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public List<Class<?>> getDecorators() {
@Override
public void addAnnotatedType(AnnotatedType<?> type, String id) {
checkWithinObserverNotification();
addSyntheticAnnotatedType(type, id);
addSyntheticAnnotatedType(type, id, getReceiver());
BootstrapLogger.LOG.addAnnotatedTypeCalled(getReceiver(), type);
}

Expand All @@ -92,14 +92,14 @@ public <T> AnnotatedTypeConfigurator<T> addAnnotatedType(Class<T> type, String i
checkWithinObserverNotification();
AnnotatedTypeConfiguratorImpl<T> configurator = new AnnotatedTypeConfiguratorImpl<>(
getBeanManager().createAnnotatedType(type));
additionalAnnotatedTypes.add(new AnnotatedTypeRegistration<T>(configurator, id));
additionalAnnotatedTypes.add(new AnnotatedTypeRegistration<T>(configurator, id, getReceiver()));
return configurator;
}

@Override
protected void storeSyntheticAnnotatedType(BeanDeployment deployment, AnnotatedType<?> type, String id) {
protected void storeSyntheticAnnotatedType(BeanDeployment deployment, AnnotatedType<?> type, String id,
Extension extension) {
SlimAnnotatedType<?> annotatedType = transformer.getUnbackedAnnotatedType(type, getBeanManager().getId(), id);
Extension extension = getReceiver();
SlimAnnotatedTypeContext<?> annotatedTypeContext = SlimAnnotatedTypeContext.of(annotatedType, extension);

ProcessAnnotatedTypeImpl<?> event = events.fireProcessAnnotatedType(getBeanManager(), annotatedTypeContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public void addStereotype(Class<? extends Annotation> stereotype, Annotation...
@Override
public void addAnnotatedType(AnnotatedType<?> type, String id) {
checkWithinObserverNotification();
addSyntheticAnnotatedType(type, id);
addSyntheticAnnotatedType(type, id, getReceiver());
BootstrapLogger.LOG.addAnnotatedTypeCalledInBBD(getReceiver(), type);
}

Expand All @@ -126,7 +126,7 @@ public <T> AnnotatedTypeConfigurator<T> addAnnotatedType(Class<T> type, String i
checkWithinObserverNotification();
AnnotatedTypeConfiguratorImpl<T> configurator = new AnnotatedTypeConfiguratorImpl<>(
getBeanManager().createAnnotatedType(type));
additionalAnnotatedTypes.add(new AnnotatedTypeRegistration<T>(configurator, id));
additionalAnnotatedTypes.add(new AnnotatedTypeRegistration<T>(configurator, id, getReceiver()));
BootstrapLogger.LOG.addAnnotatedTypeCalledInBBD(getReceiver(), type);
return configurator;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package org.jboss.weld.tests.extensions.lifecycle.processSyntheticAnnotatedType;

public class Banana {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package org.jboss.weld.tests.extensions.lifecycle.processSyntheticAnnotatedType;

public class Kiwi {
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public static Archive<?> getDeployment() {
.create(BeanArchive.class, Utils.getDeploymentNameAsHash(ProcessSyntheticAnnotatedTypeTest.class))
.addPackage(Juicy.class.getPackage())
.addAsServiceProvider(Extension.class, RegisteringExtension1.class, RegisteringExtension2.class,
ModifyingExtension.class, VerifyingExtension.class);
RegisteringExtension3.class, ModifyingExtension.class, VerifyingExtension.class);
}

@Test
Expand All @@ -60,10 +60,15 @@ public void testEventsFired() {
assertTrue(psatClasses.contains(Orange.class));
assertTrue(psatClasses.contains(Apple.class));
assertTrue(psatClasses.contains(Pear.class));
assertTrue(psatClasses.contains(Kiwi.class));
assertTrue(psatClasses.contains(Banana.class));
// also verify that PAT is fired for classes in a BDA
assertTrue(patClasses.contains(Orange.class));
assertTrue(patClasses.contains(Apple.class));
assertTrue(patClasses.contains(Pear.class));
// Kiwi and Banana have no annotations
assertFalse(patClasses.contains(Kiwi.class));
assertFalse(patClasses.contains(Banana.class));
}

@Test
Expand All @@ -72,6 +77,8 @@ public void testSource() {
assertTrue(sources.get(Apple.class) instanceof RegisteringExtension1);
assertTrue(sources.get(Orange.class) instanceof RegisteringExtension1);
assertTrue(sources.get(Pear.class) instanceof RegisteringExtension2);
assertTrue(sources.get(Kiwi.class) instanceof RegisteringExtension3);
assertTrue(sources.get(Banana.class) instanceof RegisteringExtension3);
}

@Test
Expand All @@ -89,5 +96,8 @@ public void testChangesApplied(BeanManager manager) {
assertEquals(2, manager.getBeans(Pear.class, Any.Literal.INSTANCE).size());
Set<Bean<?>> juicyPears = manager.getBeans(Pear.class, Juicy.Literal.INSTANCE);
assertEquals(1, juicyPears.size());

assertEquals(1, manager.getBeans(Kiwi.class, Juicy.Literal.INSTANCE).size());
assertEquals(1, manager.getBeans(Banana.class, Fresh.Literal.INSTANCE).size());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.jboss.weld.tests.extensions.lifecycle.processSyntheticAnnotatedType;

import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.spi.AfterTypeDiscovery;
import jakarta.enterprise.inject.spi.BeforeBeanDiscovery;
import jakarta.enterprise.inject.spi.Extension;

public class RegisteringExtension3 implements Extension {

// using BBD
void registerJuicyKiwi(@Observes BeforeBeanDiscovery event) {
event.addAnnotatedType(Kiwi.class, Kiwi.class.getSimpleName() + "Configured").add(Juicy.Literal.INSTANCE);
}

// using ATD
void registerFreshBanana(@Observes AfterTypeDiscovery event) {
event.addAnnotatedType(Banana.class, Banana.class.getSimpleName() + "Configured").add(Fresh.Literal.INSTANCE);
}
}
Loading