Skip to content

Commit

Permalink
Split out a bean deployer environment
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@2145 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Mar 23, 2009
1 parent bb450ac commit c5bbc3b
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 49 deletions.
62 changes: 32 additions & 30 deletions impl/src/main/java/org/jboss/webbeans/bootstrap/BeanDeployer.java
Expand Up @@ -26,6 +26,7 @@
import org.jboss.webbeans.event.ObserverImpl;
import org.jboss.webbeans.introspector.AnnotatedClass;
import org.jboss.webbeans.introspector.AnnotatedField;
import org.jboss.webbeans.introspector.AnnotatedItem;
import org.jboss.webbeans.introspector.AnnotatedMethod;
import org.jboss.webbeans.introspector.WrappedAnnotatedField;
import org.jboss.webbeans.introspector.WrappedAnnotatedMethod;
Expand All @@ -41,22 +42,26 @@ public class BeanDeployer

private static final LogProvider log = Logging.getLogProvider(BeanDeployer.class);

private final Set<RIBean<?>> beans;
private final Set<ObserverImpl<?>> observers;
private final BeanDeployerEnvironment beanDeployerEnvironment;
private final Set<AnnotatedClass<?>> classes;
private final ManagerImpl manager;

public BeanDeployer(ManagerImpl manager)
{
this.manager = manager;
this.beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
this.beanDeployerEnvironment = new BeanDeployerEnvironment();
this.classes = new HashSet<AnnotatedClass<?>>();
this.observers = new HashSet<ObserverImpl<?>>();
}

public BeanDeployer addBean(RIBean<?> bean)
public <T> BeanDeployer addBean(AnnotatedItem<T, ?> item, RIBean<T> bean)
{
this.beans.add(bean);
this.beanDeployerEnvironment.addBean(item, bean);
return this;
}

public <T> BeanDeployer addBean(RIBean<T> bean)
{
this.beanDeployerEnvironment.addBean(null, bean);
return this;
}

Expand Down Expand Up @@ -96,29 +101,26 @@ else if (isTypeSimpleWebBean(clazz))

public BeanDeployer deploy()
{
Set<RIBean<?>> beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
beans.addAll(beanDeployerEnvironment.getBeans());
for (RIBean<?> bean : beans)
{
bean.initialize();
log.info("Bean: " + bean);
}
manager.setBeans(beans);
for (ObserverImpl<?> observer : observers)
for (ObserverImpl<?> observer : beanDeployerEnvironment.getObservers())
{
observer.initialize();
log.info("Observer : " + observer);
manager.addObserver(observer);
}
return this;
}

public Set<RIBean<?>> getBeans()
{
return beans;
}

protected void printBeans()

public BeanDeployerEnvironment getBeanDeployerEnvironment()
{

return beanDeployerEnvironment;
}

/**
Expand All @@ -130,10 +132,10 @@ protected void printBeans()
* @param bean
* The bean representation
*/
protected void createBean(AbstractClassBean<?> bean, final AnnotatedClass<?> annotatedClass)
protected <T> void createBean(AbstractClassBean<T> bean, final AnnotatedClass<T> annotatedClass)
{

beans.add(bean);
addBean(annotatedClass, bean);

manager.getResolver().addInjectionPoints(bean.getInjectionPoints());

Expand All @@ -158,10 +160,10 @@ private void createProducerMethods(AbstractClassBean<?> declaringBean, Annotated
}
}

private void createProducerMethod(AbstractClassBean<?> declaringBean, AnnotatedMethod<?> annotatedMethod)
private <T> void createProducerMethod(AbstractClassBean<?> declaringBean, AnnotatedMethod<T> annotatedMethod)
{
ProducerMethodBean<?> bean = ProducerMethodBean.of(annotatedMethod, declaringBean, manager);
beans.add(bean);
ProducerMethodBean<T> bean = ProducerMethodBean.of(annotatedMethod, declaringBean, manager);
addBean(annotatedMethod, bean);
manager.getResolver().addInjectionPoints(bean.getInjectionPoints());
}

Expand All @@ -183,10 +185,10 @@ private void createRealizedProducerFields(AbstractClassBean<?> declaringBean, An
}
}

private void createProducerField(AbstractClassBean<?> declaringBean, AnnotatedField<?> field)
private <T> void createProducerField(AbstractClassBean<?> declaringBean, AnnotatedField<T> field)
{
ProducerFieldBean<?> bean = ProducerFieldBean.of(field, declaringBean, manager);
beans.add(bean);
ProducerFieldBean<T> bean = ProducerFieldBean.of(field, declaringBean, manager);
addBean(field, bean);
}

private void createProducerFields(AbstractClassBean<?> declaringBean, AnnotatedClass<?> annotatedClass)
Expand All @@ -213,22 +215,22 @@ private void createRealizedObserverMethods(AbstractClassBean<?> declaringBean, A
private void createObserverMethod(AbstractClassBean<?> declaringBean, AnnotatedMethod<?> method)
{
ObserverImpl<?> observer = ObserverFactory.create(method, declaringBean, manager);
observers.add(observer);
beanDeployerEnvironment.getObservers().add(observer);
}

private void createSimpleBean(AnnotatedClass<?> annotatedClass)
private <T> void createSimpleBean(AnnotatedClass<T> annotatedClass)
{
SimpleBean<?> bean = SimpleBean.of(annotatedClass, manager);
SimpleBean<T> bean = SimpleBean.of(annotatedClass, manager);
createBean(bean, annotatedClass);
beans.add(NewSimpleBean.of(annotatedClass, manager));
addBean(NewSimpleBean.of(annotatedClass, manager));
}

private void createEnterpriseBean(AnnotatedClass<?> annotatedClass)
private <T> void createEnterpriseBean(AnnotatedClass<T> annotatedClass)
{
// TODO Don't create enterprise bean if it has no local interfaces!
EnterpriseBean<?> bean = EnterpriseBean.of(annotatedClass, manager);
EnterpriseBean<T> bean = EnterpriseBean.of(annotatedClass, manager);
createBean(bean, annotatedClass);
beans.add(NewEnterpriseBean.of(annotatedClass, manager));
addBean(NewEnterpriseBean.of(annotatedClass, manager));
}

/**
Expand Down
@@ -0,0 +1,62 @@
package org.jboss.webbeans.bootstrap;

import java.lang.annotation.Annotation;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import org.jboss.webbeans.bean.RIBean;
import org.jboss.webbeans.event.ObserverImpl;
import org.jboss.webbeans.injection.resolution.ResolvableAnnotatedClass;
import org.jboss.webbeans.introspector.AnnotatedItem;

public class BeanDeployerEnvironment
{

private static final AnnotatedItem<?, ?> OTHER_BEANS_ANNOTATED_ITEM = ResolvableAnnotatedClass.of(BeanDeployerEnvironment.class, new Annotation[0]);

private final Map<AnnotatedItem<?, ?>, Set<RIBean<?>>> beanMap;
private final Set<ObserverImpl<?>> observers;

public BeanDeployerEnvironment()
{
this.beanMap = new HashMap<AnnotatedItem<?,?>, Set<RIBean<?>>>();
this.observers = new HashSet<ObserverImpl<?>>();
}

public Map<AnnotatedItem<?, ?>, Set<RIBean<?>>> getBeanMap()
{
return beanMap;
}

public void addBean(AnnotatedItem<?, ?> key, RIBean<?> value)
{
if (key == null)
{
key = OTHER_BEANS_ANNOTATED_ITEM;
}
if (!beanMap.containsKey(key))
{
beanMap.put(key, new HashSet<RIBean<?>>());
}
beanMap.get(key).add(value);
}

public Set<RIBean<?>> getBeans()
{
Set<RIBean<?>> beans = new HashSet<RIBean<?>>();
for (Entry<AnnotatedItem<?, ?>, Set<RIBean<?>>> entry : beanMap.entrySet())
{
beans.addAll(entry.getValue());
}
return beans;
}

public Set<ObserverImpl<?>> getObservers()
{
return observers;
}

}
Expand Up @@ -2,6 +2,8 @@

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;

import javax.inject.AnnotationLiteral;

Expand All @@ -17,6 +19,7 @@
import org.jboss.webbeans.bean.standard.InstanceBean;
import org.jboss.webbeans.bean.standard.ManagerBean;
import org.jboss.webbeans.bootstrap.BeanDeployer;
import org.jboss.webbeans.bootstrap.BootstrapOrderingBeanComparator;
import org.jboss.webbeans.literal.NewLiteral;
import org.jboss.webbeans.mock.MockEjbDescriptor;
import org.jboss.webbeans.mock.MockServletLifecycle;
Expand Down Expand Up @@ -61,13 +64,15 @@ public void testNewSimpleBeansAfterNonNew()
BeanDeployer beanDeployer = new BeanDeployer(manager);
beanDeployer.addClasses(Arrays.asList(Cow.class, Tuna.class));
beanDeployer.createBeans();
assert beanDeployer.getBeans().size() == 4;
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(0, 2))
Set<RIBean<?>> beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
beans.addAll(beanDeployer.getBeanDeployerEnvironment().getBeans());
assert beans.size() == 4;
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(0, 2))
{
assert !(bean instanceof NewBean);
assert bean instanceof SimpleBean;
}
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(2, 4))
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(2, 4))
{
assert (bean instanceof NewBean);
assert bean instanceof SimpleBean;
Expand All @@ -82,13 +87,15 @@ public void testNewEnterpriseBeansAfterNonNew()
manager.getEjbDescriptorCache().add(MockEjbDescriptor.of(Lion.class));
manager.getEjbDescriptorCache().add(MockEjbDescriptor.of(Gazelle.class));
beanDeployer.createBeans();
assert beanDeployer.getBeans().size() == 4;
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(0, 2))
Set<RIBean<?>> beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
beans.addAll(beanDeployer.getBeanDeployerEnvironment().getBeans());
assert beans.size() == 4;
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(0, 2))
{
assert !(bean instanceof NewBean);
assert bean instanceof EnterpriseBean;
}
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(2, 4))
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(2, 4))
{
assert (bean instanceof NewBean);
assert bean instanceof EnterpriseBean;
Expand All @@ -102,17 +109,19 @@ public void testStandardBeansBeforeAll()
beanDeployer.addBean(EventBean.of(manager)).addBean(InjectionPointBean.of(manager)).addBean(InstanceBean.of(manager)).addBean(ManagerBean.of(manager));
beanDeployer.addClasses(Arrays.asList(Cow.class, Tuna.class));
beanDeployer.createBeans();
assert beanDeployer.getBeans().size() == 8;
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(0, 4))
Set<RIBean<?>> beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
beans.addAll(beanDeployer.getBeanDeployerEnvironment().getBeans());
assert beans.size() == 8;
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(0, 4))
{
assert bean instanceof AbstractStandardBean;
}
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(4, 6))
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(4, 6))
{
assert !(bean instanceof NewBean);
assert bean instanceof SimpleBean;
}
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(6, 8))
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(6, 8))
{
assert (bean instanceof NewBean);
assert bean instanceof SimpleBean;
Expand All @@ -125,12 +134,14 @@ public void testOrgJbossWebbeansBeforeUsers()
BeanDeployer beanDeployer = new BeanDeployer(manager);
beanDeployer.addClasses(Arrays.asList(Cow.class, Tuna.class, RoadRunner.class));
beanDeployer.createBeans();
assert beanDeployer.getBeans().size() == 6;
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(0, 4))
Set<RIBean<?>> beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
beans.addAll(beanDeployer.getBeanDeployerEnvironment().getBeans());
assert beans.size() == 6;
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(0, 4))
{
assert bean.getType().getName().startsWith("org.jboss.webbeans");
}
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beanDeployer.getBeans()).subList(4, 6))
for (RIBean<?> bean : new ArrayList<RIBean<?>>(beans).subList(4, 6))
{
assert bean.getType().getName().startsWith("com.acme");
}
Expand All @@ -145,8 +156,10 @@ public void testProducerMethodAfterDeclaringBean()
int indexOfProducerDeclaringBean = 0;
int indexOfProducer = 0;
int i = 0;
assert beanDeployer.getBeans().size() == 5;
for (RIBean<?> bean : beanDeployer.getBeans())
Set<RIBean<?>> beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
beans.addAll(beanDeployer.getBeanDeployerEnvironment().getBeans());
assert beans.size() == 5;
for (RIBean<?> bean : beans)
{
if (bean.getType().equals(TarantulaProducer.class) && !bean.getBindings().contains(new NewLiteral()))
{
Expand All @@ -167,12 +180,14 @@ public void testClassHierarchies()
BeanDeployer beanDeployer = new BeanDeployer(manager);
beanDeployer.addClasses(Arrays.asList(Spider.class, Tarantula.class, DefangedTarantula.class, Tuna.class));
beanDeployer.createBeans();
assert beanDeployer.getBeans().size() == 8;
Set<RIBean<?>> beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
beans.addAll(beanDeployer.getBeanDeployerEnvironment().getBeans());
assert beans.size() == 8;
int indexOfSpider = 0;
int indexOfTarantula = 0;
int indexOfDefangedTarantula = 0;
int i = 0;
for (RIBean<?> bean : beanDeployer.getBeans())
for (RIBean<?> bean : beans)
{
if (bean.getType().equals(Spider.class))
{
Expand All @@ -198,13 +213,15 @@ public void testClassHierarchiesForMethods()
BeanDeployer beanDeployer = new BeanDeployer(manager);
beanDeployer.addClasses(Arrays.asList(Shop.class, JewelryShop.class, Tuna.class));
beanDeployer.createBeans();
assert beanDeployer.getBeans().size() == 8;
Set<RIBean<?>> beans = new TreeSet<RIBean<?>>(new BootstrapOrderingBeanComparator());
beans.addAll(beanDeployer.getBeanDeployerEnvironment().getBeans());
assert beans.size() == 8;
int indexOfShop = 0;
int indexOfJewelryShop = 0;
int indexOfExpensiveGift = 0;
int indexOfNecklace = 0;
int i = 0;
for (RIBean<?> bean : beanDeployer.getBeans())
for (RIBean<?> bean : beans)
{
if (bean.getType().equals(Shop.class) && !bean.getBindings().contains(new NewLiteral()))
{
Expand Down

0 comments on commit c5bbc3b

Please sign in to comment.