Skip to content

Commit

Permalink
Update to latest spec, better restrictions on what can be simple web …
Browse files Browse the repository at this point in the history
…beans

git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@445 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Dec 7, 2008
1 parent e12e589 commit 9aa8f7f
Show file tree
Hide file tree
Showing 17 changed files with 634 additions and 73 deletions.
5 changes: 5 additions & 0 deletions webbeans-ri/pom.xml
Expand Up @@ -66,6 +66,11 @@
<artifactId>el-api</artifactId>
</dependency>

<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
</dependency>

<dependency>
<groupId>com.google.collections</groupId>
<artifactId>google-collections</artifactId>
Expand Down
Expand Up @@ -17,6 +17,13 @@

package org.jboss.webbeans.bootstrap;

import static org.jboss.webbeans.ejb.EJB.ENTERPRISE_BEAN_CLASS;
import static org.jboss.webbeans.jsf.JSF.UICOMPONENT_CLASS;
import static org.jboss.webbeans.servlet.Servlet.FILTER_CLASS;
import static org.jboss.webbeans.servlet.Servlet.HTTP_SESSION_LISTENER_CLASS;
import static org.jboss.webbeans.servlet.Servlet.SERVLET_CLASS;
import static org.jboss.webbeans.servlet.Servlet.SERVLET_CONTEXT_LISTENER_CLASS;
import static org.jboss.webbeans.servlet.Servlet.SERVLET_REQUEST_LISTENER_CLASS;
import static org.jboss.webbeans.util.BeanFactory.createEnterpriseBean;
import static org.jboss.webbeans.util.BeanFactory.createEventBean;
import static org.jboss.webbeans.util.BeanFactory.createObserver;
Expand Down Expand Up @@ -125,53 +132,56 @@ public void registerBeans(Iterable<Class<?>> classes)
Set<AbstractBean<?, ?>> beans = new HashSet<AbstractBean<?, ?>>();
for (Class<?> clazz : classes)
{
AbstractClassBean<?> bean;
if (MetaDataCache.instance().getEjbMetaData(clazz).isEjb())
{
bean = createEnterpriseBean(clazz);
createBean(createEnterpriseBean(clazz), beans);
}
else
{
bean = createSimpleBean(clazz);
}
beans.add(bean);
CurrentManager.rootManager().getResolver().addInjectionPoints(bean.getInjectionPoints());
for (AnnotatedMethod<Object> producerMethod : bean.getProducerMethods())
else if (isTypeSimpleWebBean(clazz))
{
ProducerMethodBean<?> producerMethodBean = createProducerMethodBean(producerMethod, bean);
beans.add(producerMethodBean);
CurrentManager.rootManager().getResolver().addInjectionPoints(producerMethodBean.getInjectionPoints());
log.info("Web Bean: " + producerMethodBean);
createBean(createSimpleBean(clazz), beans);
}
for (AnnotatedField<Object> producerField : bean.getProducerFields())
{
ProducerFieldBean<?> producerFieldBean = createProducerFieldBean(producerField, bean);
beans.add(producerFieldBean);
log.info("Web Bean: " + producerFieldBean);
}
for (AnnotatedField<Object> eventField : bean.getEventFields())
}
return beans;
}

public void createBean(AbstractClassBean<?> bean, Set<AbstractBean<?, ?>> beans)
{
beans.add(bean);
CurrentManager.rootManager().getResolver().addInjectionPoints(bean.getInjectionPoints());
for (AnnotatedMethod<Object> producerMethod : bean.getProducerMethods())
{
ProducerMethodBean<?> producerMethodBean = createProducerMethodBean(producerMethod, bean);
beans.add(producerMethodBean);
CurrentManager.rootManager().getResolver().addInjectionPoints(producerMethodBean.getInjectionPoints());
log.info("Web Bean: " + producerMethodBean);
}
for (AnnotatedField<Object> producerField : bean.getProducerFields())
{
ProducerFieldBean<?> producerFieldBean = createProducerFieldBean(producerField, bean);
beans.add(producerFieldBean);
log.info("Web Bean: " + producerFieldBean);
}
for (AnnotatedField<Object> eventField : bean.getEventFields())
{
EventBean<?> eventBean = createEventBean(eventField);
beans.add(eventBean);
CurrentManager.rootManager().getResolver().addInjectionPoints(eventBean.getInjectionPoints());
log.info("Web Bean: " + eventBean);
}
for (AnnotatedMethod<Object> observerMethod : bean.getObserverMethods())
{
ObserverImpl<?> observer = createObserver(observerMethod, bean);
if (observerMethod.getAnnotatedParameters(Observes.class).size() == 1)
{
EventBean<?> eventBean = createEventBean(eventField);
beans.add(eventBean);
CurrentManager.rootManager().getResolver().addInjectionPoints(eventBean.getInjectionPoints());
log.info("Web Bean: " + eventBean);
registerObserver(observer, observerMethod.getAnnotatedParameters(Observes.class).get(0).getType(), observerMethod.getAnnotatedParameters(Observes.class).get(0).getBindingTypesAsArray());
}
for (AnnotatedMethod<Object> observerMethod : bean.getObserverMethods())
else
{
ObserverImpl<?> observer = createObserver(observerMethod, bean);
if (observerMethod.getAnnotatedParameters(Observes.class).size() == 1)
{
registerObserver(observer, observerMethod.getAnnotatedParameters(Observes.class).get(0).getType(), observerMethod.getAnnotatedParameters(Observes.class).get(0).getBindingTypesAsArray());
}
else
{
throw new DefinitionException("Observer method can only have one parameter annotated @Observes " + observer);
}

throw new DefinitionException("Observer method can only have one parameter annotated @Observes " + observer);
}
log.info("Web Bean: " + bean);

}
return beans;
log.info("Web Bean: " + bean);
}


Expand Down Expand Up @@ -244,5 +254,10 @@ private static <T> void registerObserver(Observer<T> observer, Class<?> eventTyp
{
CurrentManager.rootManager().addObserver(observer, (Class<T>) eventType, bindings);
}

protected static boolean isTypeSimpleWebBean(Class<?> type)
{
return !SERVLET_CLASS.isAssignableFrom(type) && !FILTER_CLASS.isAssignableFrom(type) && !SERVLET_CONTEXT_LISTENER_CLASS.isAssignableFrom(type) && !HTTP_SESSION_LISTENER_CLASS.isAssignableFrom(type) && !SERVLET_REQUEST_LISTENER_CLASS.isAssignableFrom(type) && !ENTERPRISE_BEAN_CLASS.isAssignableFrom(type) && !UICOMPONENT_CLASS.isAssignableFrom(type);
}

}
42 changes: 10 additions & 32 deletions webbeans-ri/src/main/java/org/jboss/webbeans/ejb/EJB.java
Expand Up @@ -19,62 +19,40 @@

import java.lang.annotation.Annotation;

import org.jboss.webbeans.util.Reflections;
import org.jboss.webbeans.util.ApiAbstraction;

/**
* Utility class for EJB annotations etc
*
* @author Pete Muir
*/
public class EJB
public class EJB extends ApiAbstraction
{

public @interface Dummy
{
}

// Annotation instances
public static final Class<? extends Annotation> STATELESS_ANNOTATION;
public static final Class<? extends Annotation> STATEFUL_ANNOTATION;
public static final Class<? extends Annotation> MESSAGE_DRIVEN_ANNOTATION;
public static final Class<? extends Annotation> FAKE_MESSAGE_DRIVEN_ANNOTATION;
public static final Class<? extends Annotation> SINGLETON_ANNOTATION;
public static final Class<? extends Annotation> REMOVE_ANNOTATION;
public static final Class<?> ENTERPRISE_BEAN_CLASS;

/**
* Static initialization block
*/
static
{
STATELESS_ANNOTATION = classForName("javax.ejb.Stateless");
STATEFUL_ANNOTATION = classForName("javax.ejb.Stateful");
MESSAGE_DRIVEN_ANNOTATION = classForName("javax.ejb.MessageDriven");
STATELESS_ANNOTATION = annotationTypeForName("javax.ejb.Stateless");
STATEFUL_ANNOTATION = annotationTypeForName("javax.ejb.Stateful");
MESSAGE_DRIVEN_ANNOTATION = annotationTypeForName("javax.ejb.MessageDriven");
// Fake MDB for tests
FAKE_MESSAGE_DRIVEN_ANNOTATION = classForName("org.jboss.webbeans.test.annotations.MessageDriven");
FAKE_MESSAGE_DRIVEN_ANNOTATION = annotationTypeForName("org.jboss.webbeans.test.annotations.MessageDriven");
// FIXME Faking singleton for tests
SINGLETON_ANNOTATION = classForName("org.jboss.webbeans.test.annotations.Singleton");
SINGLETON_ANNOTATION = annotationTypeForName("org.jboss.webbeans.test.annotations.Singleton");
// SINGLETON_ANNOTATION = classForName("javax.ejb.Singleton");
REMOVE_ANNOTATION = classForName("javax.ejb.Remove");
}

/**
* Initializes an annotation class
*
* @param name The name of the annotation class
* @return The instance of the annotation. Returns a dummy if the class was
* not found
*/
@SuppressWarnings("unchecked")
private static Class<? extends Annotation> classForName(String name)
{
try
{
return (Class<? extends Annotation>) Reflections.classForName(name);
}
catch (ClassNotFoundException cnfe)
{
return Dummy.class;
}
REMOVE_ANNOTATION = annotationTypeForName("javax.ejb.Remove");
ENTERPRISE_BEAN_CLASS = classForName("javax.ejb.EnterpriseBean");
}

}
10 changes: 10 additions & 0 deletions webbeans-ri/src/main/java/org/jboss/webbeans/jsf/JSF.java
@@ -0,0 +1,10 @@
package org.jboss.webbeans.jsf;

import org.jboss.webbeans.util.ApiAbstraction;

public class JSF extends ApiAbstraction
{

public static final Class<?> UICOMPONENT_CLASS = classForName("javax.faces.component.UIComponent");

}
14 changes: 14 additions & 0 deletions webbeans-ri/src/main/java/org/jboss/webbeans/servlet/Servlet.java
@@ -0,0 +1,14 @@
package org.jboss.webbeans.servlet;

import org.jboss.webbeans.util.ApiAbstraction;

public class Servlet extends ApiAbstraction
{

public static final Class<?> SERVLET_CLASS = classForName("javax.servlet.Servlet");
public static final Class<?> FILTER_CLASS = classForName("javax.servlet.Filter");
public static final Class<?> SERVLET_CONTEXT_LISTENER_CLASS = classForName("javax.servlet.ServletContextListener");
public static final Class<?> HTTP_SESSION_LISTENER_CLASS = classForName("javax.servlet.http.HttpSessionListener");
public static final Class<?> SERVLET_REQUEST_LISTENER_CLASS = classForName("javax.servlet.ServletRequestListener");

}
@@ -0,0 +1,52 @@
package org.jboss.webbeans.util;

import java.lang.annotation.Annotation;

public class ApiAbstraction
{

public @interface DummyAnnotation
{
}


public interface Dummy
{
}

/**
* Initializes an annotation class
*
* @param name The name of the annotation class
* @return The instance of the annotation. Returns a dummy if the class was
* not found
*/
@SuppressWarnings("unchecked")
protected static Class<? extends Annotation> annotationTypeForName(String name)
{
try
{
return (Class<? extends Annotation>) Reflections.classForName(name);
}
catch (ClassNotFoundException cnfe)
{
return DummyAnnotation.class;
}
}

@SuppressWarnings("unchecked")
protected static Class<?> classForName(String name)
{
try
{
return (Class<? extends Annotation>) Reflections.classForName(name);
}
catch (ClassNotFoundException cnfe)
{
return Dummy.class;
}
}



}
Expand Up @@ -63,6 +63,8 @@ public static Class<?> classForName(String name) throws ClassNotFoundException
return Class.forName(name);
}
}



/**
* Gets the property name from a getter method
Expand Down
Expand Up @@ -14,7 +14,7 @@
import org.jboss.webbeans.test.beans.TunaFarm;
import org.testng.annotations.Test;

@SpecVersion("PDR")
@SpecVersion("20081206")
public class SimpleBeanLifecycleTest extends AbstractTest
{

Expand Down
Expand Up @@ -3,7 +3,9 @@
import static org.jboss.webbeans.util.BeanFactory.createSimpleBean;

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

Expand All @@ -28,10 +30,18 @@
import org.jboss.webbeans.test.beans.broken.ParameterizedBean;
import org.jboss.webbeans.test.beans.broken.OuterBean.InnerBean;
import org.jboss.webbeans.test.beans.broken.OuterBean.StaticInnerBean;
import org.jboss.webbeans.test.beans.nonBeans.EnterpriseBeanWebBean;
import org.jboss.webbeans.test.beans.nonBeans.FilterBean;
import org.jboss.webbeans.test.beans.nonBeans.HttpSessionListenerBean;
import org.jboss.webbeans.test.beans.nonBeans.ServletBean;
import org.jboss.webbeans.test.beans.nonBeans.ServletContextListenerBean;
import org.jboss.webbeans.test.beans.nonBeans.ServletRequestListenerBean;
import org.jboss.webbeans.test.beans.nonBeans.UIComponentBean;
import org.jboss.webbeans.test.bindings.SynchronousAnnotationLiteral;
import org.jboss.webbeans.test.mock.MockWebBeanDiscovery;
import org.testng.annotations.Test;

@SpecVersion("PDR")
@SpecVersion("20081206")
public class SimpleBeanModelTest extends AbstractTest
{

Expand Down Expand Up @@ -68,8 +78,35 @@ public void testClassCannotBeInterceptorAndDecorator()

}

@Test(groups="deployment") @SpecAssertion(section="3.2")
public void testOnlyOneWebBeanPerAnnotatedClass()
@Test(groups="stub")
public void testEntitiesNotDiscoveredAsSimpleBeans()
{
assert false;
}

@Test
public void testClassesImplementingServletInterfacesNotDiscoveredAsSimpleBeans()
{
bootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(FilterBean.class, HttpSessionListenerBean.class, ServletBean.class, ServletContextListenerBean.class, ServletRequestListenerBean.class)), null, null));
assert manager.getBeans().size() == 1;
}

@Test
public void testClassesImplementingEnterpriseBeanInterfaceNotDiscoveredAsSimpleBean()
{
bootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(EnterpriseBeanWebBean.class)), null, null));
assert manager.getBeans().size() == 1;
}

@Test
public void testClassExtendingUiComponentNotDiscoveredAsSimpleBean()
{
bootstrap.boot(new MockWebBeanDiscovery(new HashSet<Class<?>>(Arrays.asList(UIComponentBean.class)), null, null));
assert manager.getBeans().size() == 1;
}

@Test(groups="stub")
public void testEjbsNotDiscoveredAsSimpleBean()
{

}
Expand Down
@@ -0,0 +1,8 @@
package org.jboss.webbeans.test.beans.nonBeans;

import javax.ejb.EnterpriseBean;

public class EnterpriseBeanWebBean implements EnterpriseBean
{

}
@@ -0,0 +1,6 @@
package org.jboss.webbeans.test.beans.nonBeans;

public class EntityBean
{

}

0 comments on commit 9aa8f7f

Please sign in to comment.