Skip to content

Commit

Permalink
Add Boostrap class and basic tests
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@302 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Nov 13, 2008
1 parent b20eec4 commit 95eef7f
Show file tree
Hide file tree
Showing 38 changed files with 304 additions and 100 deletions.
13 changes: 6 additions & 7 deletions webbeans-ri/src/main/java/org/jboss/webbeans/ModelManager.java
Expand Up @@ -5,7 +5,6 @@
import java.util.Map;

import org.jboss.webbeans.ejb.EjbMetaData;
import org.jboss.webbeans.introspector.AnnotatedClass;
import org.jboss.webbeans.model.AnnotationModel;
import org.jboss.webbeans.model.BindingTypeModel;
import org.jboss.webbeans.model.ScopeModel;
Expand Down Expand Up @@ -84,23 +83,23 @@ protected <S extends Annotation> BindingTypeModel<?> createAnnotationModel(Class

}

private class EjbMetaDataMap extends ForwardingMap<AnnotatedClass<?>, EjbMetaData<?>>
private class EjbMetaDataMap extends ForwardingMap<Class<?>, EjbMetaData<?>>
{

private Map<AnnotatedClass<?>, EjbMetaData<?>> delegate;
private Map<Class<?>, EjbMetaData<?>> delegate;

public EjbMetaDataMap()
{
delegate = new HashMap<AnnotatedClass<?>, EjbMetaData<?>>();
delegate = new HashMap<Class<?>, EjbMetaData<?>>();
}

@Override
protected Map<AnnotatedClass<?>, EjbMetaData<?>> delegate()
protected Map<Class<?>, EjbMetaData<?>> delegate()
{
return delegate;
}

public <T> EjbMetaData<T> putIfAbsent(AnnotatedClass<T> key)
public <T> EjbMetaData<T> putIfAbsent(Class<T> key)
{
if (!containsKey(key))
{
Expand Down Expand Up @@ -142,7 +141,7 @@ public <T extends Annotation> BindingTypeModel<T> getBindingTypeModel(Class<T> b
return bindingTypes.putIfAbsent(bindingType);
}

public <E> EjbMetaData<E> getEjbMetaData(AnnotatedClass<E> clazz)
public <T> EjbMetaData<T> getEjbMetaData(Class<T> clazz)
{
return ejbMetaDataMap.putIfAbsent(clazz);
}
Expand Down
Expand Up @@ -66,6 +66,11 @@ protected void initType()
}
}

public Set<AnnotatedMethod<Object>> getProducerMethods()
{
return getAnnotatedItem().getAnnotatedMethods(Produces.class);
}

@Override
protected void initInjectionPoints()
{
Expand Down
Expand Up @@ -109,14 +109,14 @@ private void checkSpecialization()
}
if (!isDefinedInXml())
{
if (!getManager().getModelManager().getEjbMetaData(getAnnotatedItem().getSuperclass()).isEjb())
if (!getManager().getModelManager().getEjbMetaData(getAnnotatedItem().getSuperclass().getType()).isEjb())
{
throw new DefinitionException("Annotation defined specializing EJB must have EJB superclass");
}
}
else
{
if (getManager().getModelManager().getEjbMetaData(getAnnotatedItem().getSuperclass()).isEjb())
if (getManager().getModelManager().getEjbMetaData(getAnnotatedItem().getSuperclass().getType()).isEjb())
{
throw new DefinitionException("XML defined specializing EJB must have annotation defined EJB implementation");
}
Expand All @@ -135,7 +135,7 @@ protected void initRemoveMethod()
// >1 @Destructor
if (getEjbMetaData().getDestructorMethods().size() > 1)
{
throw new DefinitionException("Multiple @Destructor methods not allowed");
throw new DefinitionException("Multiple @Destructor methods not allowed on " + getAnnotatedItem());
}


Expand Down
Expand Up @@ -40,7 +40,7 @@ protected void merge(Set<Annotation> stereotypeAnnotations, ManagerImpl manager)
StereotypeModel<?> stereotype = manager.getModelManager().getStereotype(stereotypeAnnotation.annotationType());
if (stereotype == null)
{
throw new NullPointerException("Stereotype " + stereotypeAnnotation + " not registered with container");
throw new IllegalStateException("Stereotype " + stereotypeAnnotation + " not registered with container");
}
if (stereotype.getDefaultDeploymentType() != null)
{
Expand Down
Expand Up @@ -28,9 +28,14 @@ public class ProducerMethodBean<T> extends AbstractBean<T, Method>
private String location;

public ProducerMethodBean(Method method, AbstractClassBean<?> declaringBean, ManagerImpl manager)
{
this(new AnnotatedMethodImpl<T>(method, declaringBean.getAnnotatedItem()), declaringBean, manager);
}

public ProducerMethodBean(AnnotatedMethod<T> method, AbstractClassBean<?> declaringBean, ManagerImpl manager)
{
super(manager);
this.method = new AnnotatedMethodImpl<T>(method, declaringBean.getAnnotatedItem());
this.method = method;
this.declaringBean = declaringBean;
init();
}
Expand Down
@@ -0,0 +1,54 @@
package org.jboss.webbeans.bootstrap;

import static org.jboss.webbeans.util.BeanFactory.createEnterpriseBean;
import static org.jboss.webbeans.util.BeanFactory.createProducerMethodBean;
import static org.jboss.webbeans.util.BeanFactory.createSimpleBean;

import java.util.HashSet;
import java.util.Set;

import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.bean.AbstractBean;
import org.jboss.webbeans.bean.AbstractClassBean;
import org.jboss.webbeans.introspector.AnnotatedMethod;

public class Bootstrap
{

private ManagerImpl manager;

public Bootstrap()
{
this(new ManagerImpl());
}

protected Bootstrap(ManagerImpl manager)
{
this.manager = manager;
}

public Set<AbstractBean<?, ?>> discoverBeans(Class<?>... classes)
{
Set<AbstractBean<?, ?>> beans = new HashSet<AbstractBean<?, ?>>();
for (Class<?> clazz : classes)
{
AbstractClassBean<?> bean;
if (manager.getModelManager().getEjbMetaData(clazz).isEjb())
{
bean = createEnterpriseBean(clazz, manager);
}
else
{
bean = createSimpleBean(clazz, manager);
}
beans.add(bean);
for (AnnotatedMethod<Object> producerMethod : bean.getProducerMethods())
{
beans.add(createProducerMethodBean(producerMethod.getType(), producerMethod, manager, bean));
}

}
return beans;
}

}
@@ -1,4 +1,4 @@
package org.jboss.webbeans.test.util;
package org.jboss.webbeans.util;

import java.lang.reflect.Method;

Expand All @@ -9,8 +9,9 @@
import org.jboss.webbeans.bean.SimpleBean;
import org.jboss.webbeans.bean.XmlEnterpriseBean;
import org.jboss.webbeans.bean.XmlSimpleBean;
import org.jboss.webbeans.introspector.AnnotatedMethod;

public class Util
public class BeanFactory
{
public static <T> SimpleBean<T> createSimpleBean(Class<T> clazz, ManagerImpl manager)
{
Expand All @@ -36,5 +37,10 @@ public static <T> ProducerMethodBean<T> createProducerMethodBean(Class<T> type,
{
return new ProducerMethodBean<T>(method, declaringBean, manager);
}

public static <T> ProducerMethodBean<T> createProducerMethodBean(Class<T> type, AnnotatedMethod<T> method, ManagerImpl manager, AbstractClassBean<?> declaringBean)
{
return new ProducerMethodBean<T>(method, declaringBean, manager);
}

}
16 changes: 8 additions & 8 deletions webbeans-ri/src/test/java/org/jboss/webbeans/examples/Tests.java
Expand Up @@ -5,7 +5,7 @@
import org.jboss.webbeans.bean.ProducerMethodBean;
import org.jboss.webbeans.bean.SimpleBean;
import org.jboss.webbeans.test.AbstractTest;
import org.jboss.webbeans.test.util.Util;
import org.jboss.webbeans.util.BeanFactory;
import org.testng.annotations.Test;

public class Tests extends AbstractTest
Expand All @@ -26,11 +26,11 @@ public void testGameGenerator() throws Exception {

private void setupGameGenerator() throws NoSuchMethodException
{
SimpleBean<Game> gameBean = Util.createSimpleBean(Game.class, manager);
SimpleBean<Generator> generatorBean = Util.createSimpleBean(Generator.class, manager);
SimpleBean<Game> gameBean = BeanFactory.createSimpleBean(Game.class, manager);
SimpleBean<Generator> generatorBean = BeanFactory.createSimpleBean(Generator.class, manager);
Method method = Generator.class.getDeclaredMethod("next");
method.setAccessible(true);
ProducerMethodBean<Integer> nextBean = Util.createProducerMethodBean(int.class, method, manager, generatorBean);
ProducerMethodBean<Integer> nextBean = BeanFactory.createProducerMethodBean(int.class, method, manager, generatorBean);

manager.addBean(gameBean);
manager.addBean(generatorBean);
Expand Down Expand Up @@ -65,10 +65,10 @@ public void testSentenceTranslator() throws Exception {

private void setupTextTranslator()
{
SimpleBean<SentenceParser> spBean = Util.createSimpleBean(SentenceParser.class, manager);
SimpleBean<SentenceTranslator> stBean = Util.createSimpleBean(SentenceTranslator.class, manager);
SimpleBean<MockSentenceTranslator> mstBean = Util.createSimpleBean(MockSentenceTranslator.class, manager);
SimpleBean<TextTranslator> ttBean = Util.createSimpleBean(TextTranslator.class, manager);
SimpleBean<SentenceParser> spBean = BeanFactory.createSimpleBean(SentenceParser.class, manager);
SimpleBean<SentenceTranslator> stBean = BeanFactory.createSimpleBean(SentenceTranslator.class, manager);
SimpleBean<MockSentenceTranslator> mstBean = BeanFactory.createSimpleBean(MockSentenceTranslator.class, manager);
SimpleBean<TextTranslator> ttBean = BeanFactory.createSimpleBean(TextTranslator.class, manager);

manager.addBean(spBean);
manager.addBean(stBean);
Expand Down
Expand Up @@ -9,6 +9,7 @@
import javax.webbeans.Production;
import javax.webbeans.Standard;

import org.jboss.webbeans.bootstrap.Bootstrap;
import org.jboss.webbeans.model.StereotypeModel;
import org.jboss.webbeans.test.annotations.AnimalStereotype;
import org.jboss.webbeans.test.annotations.AnotherDeploymentType;
Expand All @@ -18,19 +19,22 @@
import org.jboss.webbeans.test.annotations.MammalStereotype;
import org.jboss.webbeans.test.annotations.RequestScopedAnimalStereotype;
import org.jboss.webbeans.test.annotations.RiverFishStereotype;
import org.jboss.webbeans.test.mock.MockBootstrap;
import org.jboss.webbeans.test.mock.MockManagerImpl;
import org.testng.annotations.BeforeMethod;

public class AbstractTest
{

protected MockManagerImpl manager;
protected Bootstrap bootstrap;


@BeforeMethod
public final void before()
{
manager = new MockManagerImpl();
bootstrap = new MockBootstrap(manager);
init();
}

Expand Down
@@ -1,7 +1,7 @@
package org.jboss.webbeans.test;

import static org.jboss.webbeans.test.util.Util.createProducerMethodBean;
import static org.jboss.webbeans.test.util.Util.createSimpleBean;
import static org.jboss.webbeans.util.BeanFactory.createProducerMethodBean;
import static org.jboss.webbeans.util.BeanFactory.createSimpleBean;

import java.lang.reflect.Method;

Expand Down
102 changes: 102 additions & 0 deletions webbeans-ri/src/test/java/org/jboss/webbeans/test/BoostrapTest.java
@@ -0,0 +1,102 @@
package org.jboss.webbeans.test;

import java.util.HashSet;
import java.util.Set;

import org.jboss.webbeans.bean.AbstractBean;
import org.jboss.webbeans.test.beans.Elephant;
import org.jboss.webbeans.test.beans.Panther;
import org.jboss.webbeans.test.beans.Salmon;
import org.jboss.webbeans.test.beans.SeaBass;
import org.jboss.webbeans.test.beans.Sole;
import org.jboss.webbeans.test.beans.Tarantula;
import org.jboss.webbeans.test.beans.TarantulaProducer;
import org.jboss.webbeans.test.beans.Tiger;
import org.jboss.webbeans.test.beans.Tuna;
import org.jboss.webbeans.test.ejb.model.valid.Hound;
import org.testng.annotations.Test;

public class BoostrapTest extends AbstractTest
{
@Test(groups="bootstrap")
public void testSingleSimpleBean()
{
Set<AbstractBean<?, ?>> beans = bootstrap.discoverBeans(Tuna.class);
assert beans.size() == 1;
assert beans.iterator().next().getType().equals(Tuna.class);
}

@Test(groups="bootstrap")
public void testSingleEnterpriseBean()
{
Set<AbstractBean<?, ?>> beans = bootstrap.discoverBeans(Hound.class);
assert beans.size() == 1;
assert beans.iterator().next().getType().equals(Hound.class);
}

@Test(groups="bootstrap")
public void testMultipleSimpleBean()
{
Set<AbstractBean<?, ?>> beans = bootstrap.discoverBeans(Tuna.class, Salmon.class, SeaBass.class, Sole.class);
assert beans.size() == 4;
Set<Class<?>> classes = new HashSet<Class<?>>();
for (AbstractBean<?, ?> bean : beans)
{
classes.add(bean.getType());
}
assert classes.contains(Tuna.class);
assert classes.contains(Salmon.class);
assert classes.contains(SeaBass.class);
assert classes.contains(Sole.class);
}

@Test(groups="bootstrap")
public void testProducerMethodBean()
{
Set<AbstractBean<?, ?>> beans = bootstrap.discoverBeans(TarantulaProducer.class);
assert beans.size() == 2;
Set<Class<?>> classes = new HashSet<Class<?>>();
for (AbstractBean<?, ?> bean : beans)
{
classes.add(bean.getType());
}
assert classes.contains(TarantulaProducer.class);
assert classes.contains(Tarantula.class);
}

@Test(groups="bootstrap")
public void testMultipleEnterpriseBean()
{
Set<AbstractBean<?, ?>> beans = bootstrap.discoverBeans(Hound.class, Elephant.class, Panther.class, Tiger.class);
assert beans.size() == 4;
Set<Class<?>> classes = new HashSet<Class<?>>();
for (AbstractBean<?, ?> bean : beans)
{
classes.add(bean.getType());
}
assert classes.contains(Hound.class);
assert classes.contains(Elephant.class);
assert classes.contains(Panther.class);
assert classes.contains(Tiger.class);
}

@Test(groups="bootstrap")
public void testMultipleEnterpriseAndSimpleBean()
{
Set<AbstractBean<?, ?>> beans = bootstrap.discoverBeans(Hound.class, Elephant.class, Panther.class, Tiger.class, Tuna.class, Salmon.class, SeaBass.class, Sole.class);
assert beans.size() == 8;
Set<Class<?>> classes = new HashSet<Class<?>>();
for (AbstractBean<?, ?> bean : beans)
{
classes.add(bean.getType());
}
assert classes.contains(Hound.class);
assert classes.contains(Elephant.class);
assert classes.contains(Panther.class);
assert classes.contains(Tiger.class);
assert classes.contains(Tuna.class);
assert classes.contains(Salmon.class);
assert classes.contains(SeaBass.class);
assert classes.contains(Sole.class);
}
}

0 comments on commit 95eef7f

Please sign in to comment.