Skip to content

Commit

Permalink
Fix generic type of Extension metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
jharting committed Mar 23, 2015
1 parent a612101 commit 4fee4f1
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@
/**
* @author pmuir
*/
public class ExtensionBean extends AbstractBuiltInBean<Extension> {
public class ExtensionBean<E extends Extension> extends AbstractBuiltInBean<E> {

private final AnnotatedType<Extension> annotatedType;
private final Metadata<Extension> instance;
private final AnnotatedType<E> annotatedType;
private final Metadata<E> instance;
private final boolean passivationCapable;
private final boolean proxiable;

public ExtensionBean(BeanManagerImpl manager, EnhancedAnnotatedType<Extension> clazz, Metadata<Extension> instance) {
public ExtensionBean(BeanManagerImpl manager, EnhancedAnnotatedType<E> clazz, Metadata<E> instance) {
super(new StringBeanIdentifier(BeanIdentifiers.forExtension(clazz)), manager, clazz.getJavaClass());
this.annotatedType = clazz.slim();
this.instance = instance;
Expand All @@ -55,7 +55,7 @@ public ExtensionBean(BeanManagerImpl manager, EnhancedAnnotatedType<Extension> c
checkPublicFields(clazz);
}

private void checkPublicFields(EnhancedAnnotatedType<Extension> clazz) {
private void checkPublicFields(EnhancedAnnotatedType<E> clazz) {
for (AnnotatedField<?> field : clazz.getFields()) {
Member member = field.getJavaMember();
if (Modifier.isPublic(member.getModifiers()) && !Modifier.isStatic(member.getModifiers())) {
Expand All @@ -81,7 +81,7 @@ public boolean isPassivationCapableBean() {
}

@Override
public Extension create(CreationalContext<Extension> creationalContext) {
public E create(CreationalContext<E> creationalContext) {
return instance.getValue();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
public class ExtensionBeanDeployer {

private final BeanManagerImpl beanManager;
private final Set<Metadata<Extension>> extensions;
private final Set<Metadata<? extends Extension>> extensions;
private final Deployment deployment;
private final BeanDeploymentArchiveMapping bdaMapping;
private final Collection<ContextHolder<? extends Context>> contexts;
Expand All @@ -58,7 +58,7 @@ public class ExtensionBeanDeployer {
public ExtensionBeanDeployer(BeanManagerImpl manager, Deployment deployment, BeanDeploymentArchiveMapping bdaMapping,
Collection<ContextHolder<? extends Context>> contexts) {
this.beanManager = manager;
this.extensions = new HashSet<Metadata<Extension>>();
this.extensions = new HashSet<Metadata<? extends Extension>>();
this.deployment = deployment;
this.bdaMapping = bdaMapping;
this.contexts = contexts;
Expand All @@ -67,31 +67,35 @@ public ExtensionBeanDeployer(BeanManagerImpl manager, Deployment deployment, Bea
}

public ExtensionBeanDeployer deployBeans() {
ClassTransformer classTransformer = beanManager.getServices().get(ClassTransformer.class);
for (Metadata<Extension> extension : extensions) {
// Locate the BeanDeployment for this extension
BeanDeployment beanDeployment = DeploymentStructures.getOrCreateBeanDeployment(deployment, beanManager, bdaMapping, contexts, extension.getValue()
.getClass());

EnhancedAnnotatedType<Extension> enchancedAnnotatedType = getEnhancedAnnotatedType(classTransformer, extension, beanDeployment);

if (enchancedAnnotatedType != null) {
ExtensionBean bean = new ExtensionBean(beanDeployment.getBeanManager(), enchancedAnnotatedType, extension);
Set<ObserverInitializationContext<?, ?>> observerMethodInitializers = new HashSet<ObserverInitializationContext<?, ?>>();
createObserverMethods(bean, beanDeployment.getBeanManager(), enchancedAnnotatedType, observerMethodInitializers);
beanDeployment.getBeanManager().addBean(bean);
beanDeployment.getBeanDeployer().addExtension(bean);
for (ObserverInitializationContext<?, ?> observerMethodInitializer : observerMethodInitializers) {
observerMethodInitializer.initialize();
beanDeployment.getBeanManager().addObserver(observerMethodInitializer.getObserver());
containerLifecycleEventObservers.processObserverMethod(observerMethodInitializer.getObserver());
}
}
final ClassTransformer classTransformer = beanManager.getServices().get(ClassTransformer.class);
for (Metadata<? extends Extension> extension : extensions) {
deployBean(extension, classTransformer);
}
return this;
}

private EnhancedAnnotatedType<Extension> getEnhancedAnnotatedType(ClassTransformer classTransformer, Metadata<Extension> extension,
private <E extends Extension> void deployBean(Metadata<E> extension, ClassTransformer classTransformer) {
// Locate the BeanDeployment for this extension
BeanDeployment beanDeployment = DeploymentStructures.getOrCreateBeanDeployment(deployment, beanManager, bdaMapping, contexts, extension.getValue()
.getClass());

EnhancedAnnotatedType<E> enchancedAnnotatedType = getEnhancedAnnotatedType(classTransformer, extension, beanDeployment);

if (enchancedAnnotatedType != null) {
ExtensionBean<E> bean = new ExtensionBean<E>(beanDeployment.getBeanManager(), enchancedAnnotatedType, extension);
Set<ObserverInitializationContext<?, ?>> observerMethodInitializers = new HashSet<ObserverInitializationContext<?, ?>>();
createObserverMethods(bean, beanDeployment.getBeanManager(), enchancedAnnotatedType, observerMethodInitializers);
beanDeployment.getBeanManager().addBean(bean);
beanDeployment.getBeanDeployer().addExtension(bean);
for (ObserverInitializationContext<?, ?> observerMethodInitializer : observerMethodInitializers) {
observerMethodInitializer.initialize();
beanDeployment.getBeanManager().addObserver(observerMethodInitializer.getObserver());
containerLifecycleEventObservers.processObserverMethod(observerMethodInitializer.getObserver());
}
}
}

private <E extends Extension> EnhancedAnnotatedType<E> getEnhancedAnnotatedType(ClassTransformer classTransformer, Metadata<E> extension,
BeanDeployment beanDeployment) {
Class<? extends Extension> clazz = extension.getValue().getClass();
try {
Expand All @@ -105,13 +109,13 @@ private EnhancedAnnotatedType<Extension> getEnhancedAnnotatedType(ClassTransform
}
}

public void addExtensions(Iterable<Metadata<Extension>> extensions) {
for (Metadata<Extension> extension : extensions) {
public void addExtensions(Iterable<Metadata<? extends Extension>> extensions) {
for (Metadata<? extends Extension> extension : extensions) {
addExtension(extension);
}
}

public void addExtension(Metadata<Extension> extension) {
public void addExtension(Metadata<? extends Extension> extension) {
this.extensions.add(extension);
}

Expand Down
13 changes: 9 additions & 4 deletions impl/src/main/java/org/jboss/weld/bootstrap/WeldStartup.java
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@
import org.jboss.weld.util.reflection.Reflections;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;

/**
* Common bootstrapping functionality that is run at application startup and
Expand All @@ -145,7 +146,6 @@
* @author Ales Justin
* @author Marko Luksa
*/
@SuppressWarnings("deprecation")
public class WeldStartup {

static {
Expand All @@ -155,7 +155,7 @@ public class WeldStartup {
private BeanManagerImpl deploymentManager;
private BeanDeploymentArchiveMapping bdaMapping;
private Collection<ContextHolder<? extends Context>> contexts;
private Iterable<Metadata<Extension>> extensions;
private List<Metadata<? extends Extension>> extensions;
private Environment environment;
private Deployment deployment;
private DeploymentVisitor deploymentVisitor;
Expand All @@ -177,7 +177,7 @@ public WeldRuntime startContainer(String contextId, Environment environment, Dep
this.contextId = contextId;

if (this.extensions == null) {
this.extensions = deployment.getExtensions();
setExtensions(deployment.getExtensions());
}

final ServiceRegistry registry = deployment.getServices();
Expand Down Expand Up @@ -565,7 +565,7 @@ protected static void verifyServices(ServiceRegistry services, Set<Class<? exten
}

public TypeDiscoveryConfiguration startExtensions(Iterable<Metadata<Extension>> extensions) {
this.extensions = extensions;
setExtensions(extensions);
// TODO: we should fire BeforeBeanDiscovery to allow extensions to register additional scopes
@SuppressWarnings("unchecked")
final Set<Class<? extends Annotation>> beanDefiningAnnotations = ImmutableSet.of(
Expand Down Expand Up @@ -615,4 +615,9 @@ private boolean isEjbServicesRegistered() {
}
return false;
}

private void setExtensions(Iterable<Metadata<Extension>> extensions) {
this.extensions = new ArrayList<Metadata<? extends Extension>>();
Iterables.addAll(this.extensions, extensions);
}
}

0 comments on commit 4fee4f1

Please sign in to comment.