Skip to content

Commit

Permalink
WBRI-329, big improvement to the way we track enterprise beans
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@3613 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Aug 27, 2009
1 parent aa5b530 commit 236ca07
Show file tree
Hide file tree
Showing 27 changed files with 260 additions and 595 deletions.
43 changes: 29 additions & 14 deletions impl/src/main/java/org/jboss/webbeans/BeanManagerImpl.java
Expand Up @@ -62,13 +62,14 @@

import org.jboss.webbeans.bean.DecoratorBean;
import org.jboss.webbeans.bean.EnterpriseBean;
import org.jboss.webbeans.bean.NewEnterpriseBean;
import org.jboss.webbeans.bean.RIBean;
import org.jboss.webbeans.bean.proxy.ClientProxyProvider;
import org.jboss.webbeans.bootstrap.api.ServiceRegistry;
import org.jboss.webbeans.context.ApplicationContext;
import org.jboss.webbeans.context.CreationalContextImpl;
import org.jboss.webbeans.context.WBCreationalContext;
import org.jboss.webbeans.ejb.EjbDescriptors;
import org.jboss.webbeans.ejb.spi.EjbDescriptor;
import org.jboss.webbeans.el.Namespace;
import org.jboss.webbeans.el.WebBeansELResolver;
import org.jboss.webbeans.introspector.WBAnnotated;
Expand Down Expand Up @@ -189,7 +190,7 @@ public String toString()
private transient final Map<String, RIBean<?>> riBeans;

// TODO review this structure
private transient final Map<Class<?>, EnterpriseBean<?>> newEnterpriseBeans;
private transient final Map<EjbDescriptor<?>, EnterpriseBean<?>> enterpriseBeans;

// TODO This isn't right, specialization should follow accessibility rules, but I think we can enforce these in resolve()
private transient final Map<Contextual<?>, Contextual<?>> specializedBeans;
Expand Down Expand Up @@ -283,7 +284,7 @@ public List<Context> get()
new CopyOnWriteArrayList<DecoratorBean<?>>(),
new CopyOnWriteArrayList<ObserverMethod<?,?>>(),
new CopyOnWriteArrayList<String>(),
new ConcurrentHashMap<Class<?>, EnterpriseBean<?>>(),
new ConcurrentHashMap<EjbDescriptor<?>, EnterpriseBean<?>>(),
new ConcurrentHashMap<String, RIBean<?>>(),
new ClientProxyProvider(),
contexts,
Expand All @@ -309,7 +310,7 @@ public static BeanManagerImpl newManager(BeanManagerImpl rootManager, ServiceReg
new CopyOnWriteArrayList<DecoratorBean<?>>(),
new CopyOnWriteArrayList<ObserverMethod<?,?>>(),
new CopyOnWriteArrayList<String>(),
rootManager.getNewEnterpriseBeanMap(),
rootManager.getEnterpriseBeans(),
new ConcurrentHashMap<String, RIBean<?>>(),
rootManager.getClientProxyProvider(),
rootManager.getContexts(),
Expand Down Expand Up @@ -343,7 +344,7 @@ public static BeanManagerImpl newChildActivityManager(BeanManagerImpl parentMana
parentManager.getDecorators(),
registeredObservers,
namespaces,
parentManager.getNewEnterpriseBeanMap(),
parentManager.getEnterpriseBeans(),
parentManager.getRiBeans(),
parentManager.getClientProxyProvider(),
parentManager.getContexts(),
Expand All @@ -367,7 +368,7 @@ private BeanManagerImpl(
List<DecoratorBean<?>> decorators,
List<ObserverMethod<?,?>> observers,
List<String> namespaces,
Map<Class<?>, EnterpriseBean<?>> newEnterpriseBeans,
Map<EjbDescriptor<?>, EnterpriseBean<?>> enterpriseBeans,
Map<String, RIBean<?>> riBeans,
ClientProxyProvider clientProxyProvider,
ListMultimap<Class<? extends Annotation>, Context> contexts,
Expand All @@ -381,7 +382,7 @@ private BeanManagerImpl(
this.services = serviceRegistry;
this.beans = beans;
this.decorators = decorators;
this.newEnterpriseBeans = newEnterpriseBeans;
this.enterpriseBeans = enterpriseBeans;
this.riBeans = riBeans;
this.clientProxyProvider = clientProxyProvider;
this.contexts = contexts;
Expand Down Expand Up @@ -528,12 +529,12 @@ public void addBean(Bean<?> bean)
{
return;
}
if (bean instanceof NewEnterpriseBean)
if (bean.getClass().equals(EnterpriseBean.class))
{
NewEnterpriseBean<?> newEnterpriseBean = (NewEnterpriseBean<?>) bean;
newEnterpriseBeans.put(newEnterpriseBean.getType(), newEnterpriseBean);
EnterpriseBean<?> enterpriseBean = (EnterpriseBean<?>) bean;
enterpriseBeans.put(enterpriseBean.getEjbDescriptor(), enterpriseBean);
}
if (bean instanceof RIBean)
if (bean instanceof RIBean<?>)
{
RIBean<?> riBean = (RIBean<?>) bean;
riBeans.put(riBean.getId(), riBean);
Expand Down Expand Up @@ -752,9 +753,9 @@ protected void registerBeanNamespace(Bean<?> bean)
*
* @return The bean map
*/
public Map<Class<?>, EnterpriseBean<?>> getNewEnterpriseBeanMap()
public Map<EjbDescriptor<?>, EnterpriseBean<?>> getEnterpriseBeans()
{
return newEnterpriseBeans;
return enterpriseBeans;
}

/**
Expand Down Expand Up @@ -1284,9 +1285,13 @@ public Namespace getRootNamespace()

public <T> InjectionTarget<T> createInjectionTarget(AnnotatedType<T> type)
{
// TODO Cache on our side?
return new SimpleInjectionTarget<T>(getServices().get(ClassTransformer.class).loadClass(type), this);
}

public <T> InjectionTarget<T> createInjectionTarget(EjbDescriptor<T> descriptor)
{
return getBean(descriptor);
}

public <X> Bean<? extends X> getMostSpecializedBean(Bean<X> bean)
{
Expand Down Expand Up @@ -1400,4 +1405,14 @@ public <X> Bean<? extends X> resolve(Set<Bean<? extends X>> beans)
}
}

public <T> EjbDescriptor<T> getEjbDescriptor(String beanName)
{
return getServices().get(EjbDescriptors.class).get(beanName);
}

public <T> EnterpriseBean<T> getBean(EjbDescriptor<T> descriptor)
{
return (EnterpriseBean<T>) getEnterpriseBeans().get(descriptor);
}

}
72 changes: 72 additions & 0 deletions impl/src/main/java/org/jboss/webbeans/bean/AbstractClassBean.java
Expand Up @@ -42,6 +42,7 @@
import org.jboss.webbeans.injection.FieldInjectionPoint;
import org.jboss.webbeans.injection.MethodInjectionPoint;
import org.jboss.webbeans.introspector.WBClass;
import org.jboss.webbeans.introspector.WBMethod;
import org.jboss.webbeans.log.LogProvider;
import org.jboss.webbeans.log.Logging;
import org.jboss.webbeans.util.Beans;
Expand Down Expand Up @@ -74,6 +75,8 @@ public abstract class AbstractClassBean<T> extends AbstractBean<T, Class<T>> imp
private Class<T> proxyClassForDecorators;

private final ThreadLocal<Integer> decoratorStackPosition;
private WBMethod<?, ?> postConstruct;
private WBMethod<?, ?> preDestroy;

/**
* Constructor
Expand Down Expand Up @@ -351,6 +354,75 @@ public String getId()
{
return id;
}

public void postConstruct(T instance)
{
WBMethod<?, ?> postConstruct = getPostConstruct();
if (postConstruct != null)
{
try
{
postConstruct.invoke(instance);
}
catch (Exception e)
{
throw new RuntimeException("Unable to invoke " + postConstruct + " on " + instance, e);
}
}
}

public void preDestroy(T instance)
{
WBMethod<?, ?> preDestroy = getPreDestroy();
if (preDestroy != null)
{
try
{
// note: RI supports injection into @PreDestroy
preDestroy.invoke(instance);
}
catch (Exception e)
{
throw new RuntimeException("Unable to invoke " + preDestroy + " on " + instance, e);
}
}
}

/**
* Initializes the post-construct method
*/
protected void initPostConstruct()
{
this.postConstruct = Beans.getPostConstruct(getAnnotatedItem());
}

/**
* Initializes the pre-destroy method
*/
protected void initPreDestroy()
{
this.preDestroy = Beans.getPreDestroy(getAnnotatedItem());
}

/**
* Returns the post-construct method
*
* @return The post-construct method
*/
public WBMethod<?, ?> getPostConstruct()
{
return postConstruct;
}

/**
* Returns the pre-destroy method
*
* @return The pre-destroy method
*/
public WBMethod<?, ?> getPreDestroy()
{
return preDestroy;
}


}
65 changes: 23 additions & 42 deletions impl/src/main/java/org/jboss/webbeans/bean/EnterpriseBean.java
Expand Up @@ -46,10 +46,12 @@
import org.jboss.webbeans.ejb.api.SessionObjectReference;
import org.jboss.webbeans.ejb.spi.BusinessInterfaceDescriptor;
import org.jboss.webbeans.ejb.spi.EjbServices;
import org.jboss.webbeans.injection.InjectionContextImpl;
import org.jboss.webbeans.introspector.WBClass;
import org.jboss.webbeans.introspector.WBMethod;
import org.jboss.webbeans.log.Log;
import org.jboss.webbeans.log.Logging;
import org.jboss.webbeans.resources.ClassTransformer;
import org.jboss.webbeans.util.Beans;
import org.jboss.webbeans.util.Proxies;

Expand Down Expand Up @@ -79,9 +81,10 @@ public class EnterpriseBean<T> extends AbstractClassBean<T>
* @param manager the current manager
* @return An Enterprise Web Bean
*/
public static <T> EnterpriseBean<T> of(WBClass<T> clazz, BeanManagerImpl manager, BeanDeployerEnvironment environment)
public static <T> EnterpriseBean<T> of(InternalEjbDescriptor<T> ejbDescriptor, BeanManagerImpl manager)
{
return new EnterpriseBean<T>(clazz, manager, environment);
WBClass<T> type = manager.getServices().get(ClassTransformer.class).loadClass(ejbDescriptor.getBeanClass());
return new EnterpriseBean<T>(type, ejbDescriptor, manager);
}

/**
Expand All @@ -90,26 +93,11 @@ public static <T> EnterpriseBean<T> of(WBClass<T> clazz, BeanManagerImpl manager
* @param type The type of the bean
* @param manager The Web Beans manager
*/
protected EnterpriseBean(WBClass<T> type, BeanManagerImpl manager, BeanDeployerEnvironment environment)
protected EnterpriseBean(WBClass<T> type, InternalEjbDescriptor<T> ejbDescriptor, BeanManagerImpl manager)
{
super(type, manager);
initType();
Iterable<InternalEjbDescriptor<T>> ejbDescriptors = environment.getEjbDescriptors().get(getType());
if (ejbDescriptors == null)
{
throw new DefinitionException("Not an EJB " + toString());
}
for (InternalEjbDescriptor<T> ejbDescriptor : ejbDescriptors)
{
if (this.ejbDescriptor == null)
{
this.ejbDescriptor = ejbDescriptor;
}
else
{
throw new RuntimeException("TODO Multiple EJBs have the same bean class! " + getType());
}
}
this.ejbDescriptor = ejbDescriptor;
initTypes();
initBindings();
}
Expand Down Expand Up @@ -195,7 +183,8 @@ protected void checkScopeAllowed()
protected void preSpecialize(BeanDeployerEnvironment environment)
{
super.preSpecialize(environment);
if (!environment.getEjbDescriptors().containsKey(getAnnotatedItem().getWBSuperclass().getJavaClass()))
// We appear to check this twice?
if (!environment.getEjbDescriptors().contains(getAnnotatedItem().getWBSuperclass().getJavaClass()))
{
throw new DefinitionException("Annotation defined specializing EJB must have EJB superclass");
}
Expand All @@ -209,7 +198,7 @@ protected void specialize(BeanDeployerEnvironment environment)
throw new IllegalStateException(toString() + " does not specialize a bean");
}
AbstractClassBean<?> specializedBean = environment.getClassBean(getAnnotatedItem().getWBSuperclass());
if (!(specializedBean instanceof EnterpriseBean))
if (!(specializedBean instanceof EnterpriseBean<?>))
{
throw new IllegalStateException(toString() + " doesn't have a session bean as a superclass " + specializedBean);
}
Expand All @@ -234,19 +223,19 @@ public T create(final CreationalContext<T> creationalContext)
return instance;
}

public void inject(T instance, CreationalContext<T> ctx)
{
throw new UnsupportedOperationException("Unable to perform injection on a session bean");
}

public void postConstruct(T instance)
{
throw new UnsupportedOperationException("Unable to call postConstruct() on a session bean");
}

public void preDestroy(T instance)
public void inject(final T instance, final CreationalContext<T> ctx)
{
throw new UnsupportedOperationException("Unable to call preDestroy() on a session bean");
new InjectionContextImpl<T>(getManager(), this, instance)
{

public void proceed()
{
Beans.injectBoundFields(instance, ctx, getManager(), getInjectableFields());
Beans.callInitializers(instance, ctx, getManager(), getInitializerMethods());
}

}.run();

}

public T produce(CreationalContext<T> ctx)
Expand Down Expand Up @@ -284,15 +273,7 @@ public void destroy(T instance, CreationalContext<T> creationalContext)
throw new IllegalArgumentException("Cannot destroy session bean instance not created by the container");
}
EnterpriseBeanInstance enterpiseBeanInstance = (EnterpriseBeanInstance) instance;

if (enterpiseBeanInstance.isDestroyed(Marker.INSTANCE))
{
return;
}
else
{
enterpiseBeanInstance.destroy(Marker.INSTANCE, this, creationalContext);
}
enterpiseBeanInstance.destroy(Marker.INSTANCE, this, creationalContext);
creationalContext.release();
}

Expand Down
Expand Up @@ -23,9 +23,10 @@
import javax.enterprise.context.Dependent;

import org.jboss.webbeans.BeanManagerImpl;
import org.jboss.webbeans.bootstrap.BeanDeployerEnvironment;
import org.jboss.webbeans.ejb.InternalEjbDescriptor;
import org.jboss.webbeans.introspector.WBClass;
import org.jboss.webbeans.literal.NewLiteral;
import org.jboss.webbeans.resources.ClassTransformer;

/**
* Represents a @New enterprise bean
Expand All @@ -42,9 +43,10 @@ public class NewEnterpriseBean<T> extends EnterpriseBean<T> implements NewBean
* @param manager The Web Beans manager
* @return a new NewEnterpriseBean instance
*/
public static <T> NewEnterpriseBean<T> of(WBClass<T> clazz, BeanManagerImpl manager, BeanDeployerEnvironment environment)
public static <T> NewEnterpriseBean<T> of(InternalEjbDescriptor<T> ejbDescriptor, BeanManagerImpl manager)
{
return new NewEnterpriseBean<T>(clazz, manager, environment);
WBClass<T> type = manager.getServices().get(ClassTransformer.class).loadClass(ejbDescriptor.getBeanClass());
return new NewEnterpriseBean<T>(type, ejbDescriptor, manager);
}

private Set<Annotation> bindings;
Expand All @@ -55,9 +57,9 @@ public static <T> NewEnterpriseBean<T> of(WBClass<T> clazz, BeanManagerImpl mana
* @param type An annotated class
* @param manager The Web Beans manager
*/
protected NewEnterpriseBean(final WBClass<T> type, BeanManagerImpl manager, BeanDeployerEnvironment environment)
protected NewEnterpriseBean(final WBClass<T> type, InternalEjbDescriptor<T> ejbDescriptor, BeanManagerImpl manager)
{
super(type, manager, environment);
super(type, ejbDescriptor, manager);
this.bindings = new HashSet<Annotation>();
this.bindings.add(new NewLiteral()
{
Expand Down

0 comments on commit 236ca07

Please sign in to comment.