Skip to content

Commit

Permalink
support @New injecting classes from outside BDAs
Browse files Browse the repository at this point in the history
  • Loading branch information
pmuir committed Oct 19, 2009
1 parent 79642fd commit 10b9c7c
Show file tree
Hide file tree
Showing 24 changed files with 348 additions and 124 deletions.
15 changes: 15 additions & 0 deletions impl/src/main/java/org/jboss/weld/bean/AbstractBean.java
Expand Up @@ -25,6 +25,7 @@
import javax.decorator.Decorates;
import javax.enterprise.context.Dependent;
import javax.enterprise.inject.Alternative;
import javax.enterprise.inject.New;
import javax.enterprise.inject.Specializes;
import javax.enterprise.inject.Typed;
import javax.enterprise.inject.spi.Bean;
Expand Down Expand Up @@ -83,6 +84,10 @@ public abstract class AbstractBean<T, S> extends RIBean<T>
// The injection points
private Set<WeldInjectionPoint<?, ?>> injectionPoints;
private Set<WeldInjectionPoint<?, ?>> delegateInjectionPoints;

// The @New injection points
private Set<WeldInjectionPoint<?, ?>> newInjectionPoints;

// If the type a primitive?
private boolean primitive;
// The Bean manager
Expand Down Expand Up @@ -110,6 +115,7 @@ public AbstractBean(String idSuffix, BeanManagerImpl manager)
this.manager = manager;
this.injectionPoints = new HashSet<WeldInjectionPoint<?, ?>>();
this.delegateInjectionPoints = new HashSet<WeldInjectionPoint<?,?>>();
this.newInjectionPoints = new HashSet<WeldInjectionPoint<?,?>>();
}

/**
Expand Down Expand Up @@ -153,6 +159,10 @@ protected void addInjectionPoint(WeldInjectionPoint<?, ?> injectionPoint)
{
this.delegateInjectionPoints.add(injectionPoint);
}
if (injectionPoint.isAnnotationPresent(New.class))
{
this.newInjectionPoints.add(injectionPoint);
}
injectionPoints.add(injectionPoint);
}

Expand Down Expand Up @@ -390,6 +400,11 @@ public Set<Annotation> getQualifiers()
{
return injectionPoints;
}

public Set<WeldInjectionPoint<?, ?>> getNewInjectionPoints()
{
return newInjectionPoints;
}

/**
* Gets the merged stereotypes of the bean
Expand Down
18 changes: 3 additions & 15 deletions impl/src/main/java/org/jboss/weld/bean/AbstractClassBean.java
Expand Up @@ -45,8 +45,8 @@
import org.jboss.weld.DeploymentException;
import org.jboss.weld.bean.proxy.DecoratorProxyMethodHandler;
import org.jboss.weld.bootstrap.BeanDeployerEnvironment;
import org.jboss.weld.context.SerializableContextualInstance;
import org.jboss.weld.context.SerializableContextual;
import org.jboss.weld.context.SerializableContextualInstance;
import org.jboss.weld.injection.FieldInjectionPoint;
import org.jboss.weld.injection.MethodInjectionPoint;
import org.jboss.weld.introspector.WeldClass;
Expand Down Expand Up @@ -76,7 +76,6 @@ public abstract class AbstractClassBean<T> extends AbstractBean<T, Class<T>>
private List<Set<FieldInjectionPoint<?, ?>>> injectableFields;
// The initializer methods of each type in the type hierarchy, with the actual type at the bottom
private List<Set<MethodInjectionPoint<?, ?>>> initializerMethods;
private Set<String> dependencies;

private List<Decorator<?>> decorators;

Expand Down Expand Up @@ -110,6 +109,8 @@ protected Integer initialValue()
};
initStereotypes();
initPolicy();
initInitializerMethods();
initInjectableFields();
}

/**
Expand All @@ -118,8 +119,6 @@ protected Integer initialValue()
@Override
public void initialize(BeanDeployerEnvironment environment)
{
initInitializerMethods();
initInjectableFields();
super.initialize(environment);
checkBeanImplementation();
initDecorators();
Expand Down Expand Up @@ -221,11 +220,6 @@ protected void initType()
{
log.trace("Bean type specified in Java");
this.type = getAnnotatedItem().getJavaClass();
this.dependencies = new HashSet<String>();
for (Class<?> clazz = type.getSuperclass(); clazz != Object.class; clazz = clazz.getSuperclass())
{
dependencies.add(clazz.getName());
}
}

/**
Expand Down Expand Up @@ -339,12 +333,6 @@ protected String getDefaultName()
// TODO Make immutable
return injectableFields;
}

// TODO maybe a better way to expose this?
public Set<String> getSuperclasses()
{
return dependencies;
}


/**
Expand Down
3 changes: 2 additions & 1 deletion impl/src/main/java/org/jboss/weld/bean/DisposalMethod.java
Expand Up @@ -35,6 +35,7 @@
import org.jboss.weld.injection.MethodInjectionPoint;
import org.jboss.weld.introspector.WeldMethod;
import org.jboss.weld.introspector.WeldParameter;
import org.jboss.weld.util.Beans;

public class DisposalMethod<X, T> extends AbstractReceiverBean<X, T, Method>
{
Expand All @@ -52,6 +53,7 @@ protected DisposalMethod(BeanManagerImpl manager, WeldMethod<T, X> disposalMetho
initTypes();
initStereotypes();
initPolicy();
addInjectionPoints(Beans.getParameterInjectionPoints(this, disposalMethodInjectionPoint));
}

private void initDisposesParameter()
Expand All @@ -67,7 +69,6 @@ public WeldParameter<?, X> getDisposesParameter()
@Override
public void initialize(BeanDeployerEnvironment environment)
{
addInjectionPoint(disposalMethodInjectionPoint);
super.initialize(environment);
checkDisposalMethod();
initDisposesParameter();
Expand Down
9 changes: 7 additions & 2 deletions impl/src/main/java/org/jboss/weld/bean/ManagedBean.java
Expand Up @@ -89,7 +89,12 @@ public class ManagedBean<T> extends AbstractClassBean<T>
*/
public static <T> ManagedBean<T> of(WeldClass<T> clazz, BeanManagerImpl manager)
{
return new ManagedBean<T>(clazz, new StringBuilder().append(ManagedBean.class.getSimpleName()).append(BEAN_ID_SEPARATOR).append(clazz.getName()).toString(), manager);
return new ManagedBean<T>(clazz, createId(ManagedBean.class.getSimpleName(), clazz), manager);
}

protected static String createId(String beanType, WeldClass<?> clazz)
{
return new StringBuilder().append(beanType).append(BEAN_ID_SEPARATOR).append(clazz.getBaseType()).toString();
}

/**
Expand All @@ -104,6 +109,7 @@ protected ManagedBean(WeldClass<T> type, String idSuffix, BeanManagerImpl manage
initType();
initTypes();
initBindings();
initConstructor();
}

/**
Expand Down Expand Up @@ -173,7 +179,6 @@ public void initialize(BeanDeployerEnvironment environment)
{
if (!isInitialized())
{
initConstructor();
checkConstructor();
super.initialize(environment);
initPostConstruct();
Expand Down
2 changes: 1 addition & 1 deletion impl/src/main/java/org/jboss/weld/bean/NewManagedBean.java
Expand Up @@ -43,7 +43,7 @@ public class NewManagedBean<T> extends ManagedBean<T> implements NewBean
*/
public static <T> NewManagedBean<T> of(WeldClass<T> clazz, BeanManagerImpl manager)
{
return new NewManagedBean<T>(clazz, new StringBuilder().append(NewManagedBean.class.getSimpleName()).append(BEAN_ID_SEPARATOR).append(clazz.getName()).toString(), manager);
return new NewManagedBean<T>(clazz, createId(NewManagedBean.class.getSimpleName(), clazz), manager);
}

private Set<Annotation> bindings;
Expand Down
2 changes: 1 addition & 1 deletion impl/src/main/java/org/jboss/weld/bean/NewSessionBean.java
Expand Up @@ -46,7 +46,7 @@ public class NewSessionBean<T> extends SessionBean<T> implements NewBean
public static <T> NewSessionBean<T> of(InternalEjbDescriptor<T> ejbDescriptor, BeanManagerImpl manager)
{
WeldClass<T> type = manager.getServices().get(ClassTransformer.class).loadClass(ejbDescriptor.getBeanClass());
return new NewSessionBean<T>(type, ejbDescriptor, new StringBuilder().append(NewSessionBean.class.getSimpleName()).append(BEAN_ID_SEPARATOR).append(ejbDescriptor.getEjbName()).toString(), manager);
return new NewSessionBean<T>(type, ejbDescriptor, createId(NewSessionBean.class.getSimpleName(), ejbDescriptor), manager);
}

private Set<Annotation> bindings;
Expand Down
2 changes: 1 addition & 1 deletion impl/src/main/java/org/jboss/weld/bean/ProducerMethod.java
Expand Up @@ -79,6 +79,7 @@ protected ProducerMethod(WeldMethod<T, X> method, AbstractClassBean<X> declaring
this.id = new StringBuilder().append(BEAN_ID_PREFIX).append(getClass().getSimpleName()).append(BEAN_ID_SEPARATOR).append(declaringBean.getAnnotatedItem().getName()).append(getAnnotatedItem().getSignature().toString()).toString();
initStereotypes();
initPolicy();
initProducerMethodInjectableParameters();
}

/**
Expand All @@ -89,7 +90,6 @@ public void initialize(BeanDeployerEnvironment environment)
{
if (!isInitialized())
{
initProducerMethodInjectableParameters();
super.initialize(environment);
checkProducerMethod();
initDisposalMethod(environment);
Expand Down
7 changes: 6 additions & 1 deletion impl/src/main/java/org/jboss/weld/bean/SessionBean.java
Expand Up @@ -92,9 +92,14 @@ public class SessionBean<T> extends AbstractClassBean<T>
public static <T> SessionBean<T> of(InternalEjbDescriptor<T> ejbDescriptor, BeanManagerImpl manager)
{
WeldClass<T> type = manager.getServices().get(ClassTransformer.class).loadClass(ejbDescriptor.getBeanClass());
return new SessionBean<T>(type, ejbDescriptor, new StringBuilder().append(SessionBean.class.getSimpleName()).append(BEAN_ID_SEPARATOR).append(ejbDescriptor.getEjbName()).toString(), manager);
return new SessionBean<T>(type, ejbDescriptor, createId(SessionBean.class.getSimpleName(), ejbDescriptor) , manager);
}

protected static String createId(String beanType, InternalEjbDescriptor<?> ejbDescriptor)
{
return new StringBuilder().append(beanType).append(BEAN_ID_SEPARATOR).append(ejbDescriptor.getEjbName()).toString();
}

/**
* Constructor
*
Expand Down
Expand Up @@ -23,6 +23,7 @@
import javax.validation.Validator;

import org.jboss.weld.BeanManagerImpl;
import org.jboss.weld.Container;
import org.jboss.weld.util.collections.Arrays2;
import org.jboss.weld.validation.spi.ValidationServices;

Expand Down Expand Up @@ -55,7 +56,7 @@ public Validator create(CreationalContext<Validator> creationalContext)
{
if (getManager().getServices().contains(ValidationServices.class))
{
return getManager().getServices().get(ValidationServices.class).getDefaultValidatorFactory().getValidator();
return Container.instance().deploymentServices().get(ValidationServices.class).getDefaultValidatorFactory().getValidator();
}
else
{
Expand Down
Expand Up @@ -102,14 +102,19 @@ public Object invoke(Object self, Method proxiedMethod, Method proceed, Object[]
// getting lazy created
return null;
}
if (proxiedInstance == null)
{
// TODO not sure if this right PLM
return null;
}
if (proxiedMethod.getName().equals("equals") && proxiedMethod.getParameterTypes().length == 1 && proxiedMethod.getParameterTypes()[0] == Object.class && args[0] == self)
{
return true;
}
try
{
Object returnValue = Reflections.lookupMethod(proxiedMethod, proxiedInstance).invoke(proxiedInstance, args);
log.trace("Executed method " + proxiedMethod + " on " + proxiedInstance + " with parameters " + Arrays.toString(args) + " and got return value " + returnValue);
log.trace("Executed method " + proxiedMethod + " on " + proxiedInstance + " with parameters " + Arrays.toString(args) + " and got return value " + returnValue == null ? null : returnValue);
return returnValue;
}
catch (InvocationTargetException e)
Expand Down
Expand Up @@ -23,7 +23,6 @@
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.interceptor.Interceptor;

import org.jboss.weld.BeanManagerImpl;
import org.jboss.weld.bean.AbstractClassBean;
Expand Down Expand Up @@ -155,7 +154,7 @@ else if (bean instanceof ProducerMethod<?, ?>)
* The class bean
*
*/
protected <T> void createSubBeans(AbstractClassBean<T> bean)
protected <T> void createObserversProducersDisposers(AbstractClassBean<T> bean)
{
createProducerMethods(bean, bean.getAnnotatedItem());
createProducerFields(bean, bean.getAnnotatedItem());
Expand All @@ -181,14 +180,14 @@ protected <X> void createDisposalMethods(AbstractClassBean<X> declaringBean, Wel
{
DisposalMethod<X, ?> disposalBean = DisposalMethod.of(manager, method, declaringBean);
disposalBean.initialize(getEnvironment());
getEnvironment().addBean(disposalBean);
getEnvironment().addDisposesMethod(disposalBean);
}
}

protected <X, T> void createProducerMethod(AbstractClassBean<X> declaringBean, WeldMethod<T, X> annotatedMethod)
{
ProducerMethod<X, T> bean = ProducerMethod.of(annotatedMethod, declaringBean, manager);
getEnvironment().addBean(bean);
getEnvironment().addProducerMethod(bean);
}

protected <X, T> void createProducerField(AbstractClassBean<X> declaringBean, WeldField<T, X> field)
Expand All @@ -206,7 +205,7 @@ else if (isEEResourceProducerField(field))
{
bean = ProducerField.of(field, declaringBean, manager);
}
getEnvironment().addBean(bean);
getEnvironment().addProducerField(bean);
}

protected <X> void createProducerFields(AbstractClassBean<X> declaringBean, WeldClass<X> annotatedClass)
Expand All @@ -228,36 +227,46 @@ protected <X> void createObserverMethods(RIBean<X> declaringBean, WeldClass<X> a
protected <X, T> void createObserverMethod(RIBean<X> declaringBean, WeldMethod<T, X> method)
{
ObserverMethodImpl<X, T> observer = ObserverFactory.create(method, declaringBean, manager);
getEnvironment().addObserver(observer);
getEnvironment().addObserverMethod(observer);
}

protected <T> void createSimpleBean(WeldClass<T> annotatedClass)
protected <T> ManagedBean<T> createManagedBean(WeldClass<T> annotatedClass)
{
ManagedBean<T> bean = ManagedBean.of(annotatedClass, manager);
getEnvironment().addBean(bean);
createSubBeans(bean);
getEnvironment().addBean(NewManagedBean.of(annotatedClass, manager));
getEnvironment().addManagedBean(bean);
createObserversProducersDisposers(bean);
return bean;
}

protected <T> void createNewManagedBean(WeldClass<T> annotatedClass)
{
getEnvironment().addManagedBean(NewManagedBean.of(annotatedClass, manager));
}

protected <T> void createDecorator(WeldClass<T> annotatedClass)
{
DecoratorImpl<T> bean = DecoratorImpl.of(annotatedClass, manager);
getEnvironment().addBean(bean);
getEnvironment().addDecorator(bean);
}

protected <T> void createInterceptor(WeldClass<T> annotatedClass)
{
InterceptorImpl<T> bean = InterceptorImpl.of(annotatedClass, manager);
getEnvironment().addBean(bean);
getEnvironment().addInterceptor(bean);
}

protected <T> void createEnterpriseBean(InternalEjbDescriptor<T> ejbDescriptor)
protected <T> SessionBean<T> createSessionBean(InternalEjbDescriptor<T> ejbDescriptor)
{
// TODO Don't create enterprise bean if it has no local interfaces!
SessionBean<T> bean = SessionBean.of(ejbDescriptor, manager);
getEnvironment().addBean(bean);
createSubBeans(bean);
getEnvironment().addBean(NewSessionBean.of(ejbDescriptor, manager));
getEnvironment().addSessionBean(bean);
createObserversProducersDisposers(bean);
return bean;
}

protected <T> void createNewSessionBean(InternalEjbDescriptor<T> ejbDescriptor)
{
getEnvironment().addSessionBean(NewSessionBean.of(ejbDescriptor, manager));
}

/**
Expand All @@ -267,7 +276,7 @@ protected <T> void createEnterpriseBean(InternalEjbDescriptor<T> ejbDescriptor)
* The type to inspect
* @return True if simple Web Bean, false otherwise
*/
protected boolean isTypeManagedBeanOrDecorator(WeldClass<?> clazz)
protected boolean isTypeManagedBeanOrDecoratorOrInterceptor(WeldClass<?> clazz)
{
Class<?> javaClass = clazz.getJavaClass();
EJBApiAbstraction ejbApiAbstraction = manager.getServices().get(EJBApiAbstraction.class);
Expand Down

0 comments on commit 10b9c7c

Please sign in to comment.