Skip to content

Commit

Permalink
Wire in producer methods
Browse files Browse the repository at this point in the history
git-svn-id: http://anonsvn.jboss.org/repos/weld/ri/trunk@260 1c488680-804c-0410-94cd-c6b725194a0e
  • Loading branch information
pmuir committed Nov 6, 2008
1 parent e2ae004 commit 19c7869
Show file tree
Hide file tree
Showing 12 changed files with 64 additions and 42 deletions.
Expand Up @@ -21,11 +21,6 @@ public AbstractBean(ManagerImpl manager)
this.manager = manager;
}

protected T getInstance()
{
return getModel().getConstructor().invoke(manager);
}

protected void bindInterceptors()
{
// TODO
Expand Down
Expand Up @@ -3,12 +3,12 @@
import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.model.bean.ProducerMethodBeanModel;

public class ProducerBean<T> extends AbstractBean<T>
public class ProducerMethodBean<T> extends AbstractBean<T>
{

private ProducerMethodBeanModel<T> model;

public ProducerBean(ProducerMethodBeanModel<T> model, ManagerImpl manager)
public ProducerMethodBean(ProducerMethodBeanModel<T> model, ManagerImpl manager)
{
super(manager);
this.model = model;
Expand All @@ -23,8 +23,7 @@ public ProducerMethodBeanModel<T> getModel()
@Override
public T create()
{
// TODO Auto-generated method stub
return null;
return model.getConstructor().invoke(manager, manager.getInstance(model.getDeclaringBean()));
}


Expand Down
Expand Up @@ -19,7 +19,7 @@ public SimpleBean(SimpleBeanModel<T> model, ManagerImpl manager)
@Override
public T create()
{
T instance = getInstance();
T instance = model.getConstructor().invoke(manager);
bindDecorators();
bindInterceptors();
injectEjbAndCommonFields();
Expand Down
Expand Up @@ -5,6 +5,6 @@
public interface BeanConstructor<T, S>
{

public T invoke(ManagerImpl manager);
public T invoke(ManagerImpl manager, Object instance);

}
Expand Up @@ -28,4 +28,9 @@ public T invoke(ManagerImpl manager)
}
}

public T invoke(ManagerImpl manager, Object instance)
{
return invoke(manager);
}

}
Expand Up @@ -25,5 +25,10 @@ public Object getAnnotatedItem()
// TODO Auto-generated method stub
return null;
}

public T invoke(ManagerImpl manager, Object instance)
{
return invoke(manager);
}

}
Expand Up @@ -4,6 +4,7 @@

import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.introspector.AnnotatedMethod;
import org.jboss.webbeans.util.Reflections;

public class MethodConstructor<T> extends InjectableMethod<T> implements
BeanConstructor<T, AnnotatedMethod<T>>
Expand All @@ -13,17 +14,10 @@ public MethodConstructor(Method method)
{
super(method);
}

@Override
public AnnotatedMethod<T> getAnnotatedItem()
{
return null;
}

public T invoke(ManagerImpl manager)
public T invoke(ManagerImpl manager, Object instance)
{
// TODO Auto-generated method stub
return null;
return (T) Reflections.invokeAndWrap(getAnnotatedItem().getDelegate(), instance, getParameterValues(manager));
}

}
Expand Up @@ -13,6 +13,7 @@
import javax.webbeans.Observes;

import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.bean.AbstractBean;
import org.jboss.webbeans.injectable.InjectableMethod;
import org.jboss.webbeans.injectable.InjectableParameter;
import org.jboss.webbeans.injectable.MethodConstructor;
Expand All @@ -28,16 +29,17 @@ public class ProducerMethodBeanModel<T> extends AbstractBeanModel<T, Method>
private AnnotatedItem<T, Method> xmlAnnotatedItem;
private AnnotatedMethod<T> annotatedMethod;

private BeanModel<?, ?> declaringBean;
private AbstractBean<?> declaringBean;

// Cached values
private String location;
private Type declaredBeanType;

public ProducerMethodBeanModel(AnnotatedMethod<T> annotatedMethod, AnnotatedMethod<T> xmlAnnotatedMethod, ManagerImpl manager)
public ProducerMethodBeanModel(AnnotatedMethod<T> annotatedMethod, AnnotatedMethod<T> xmlAnnotatedMethod, ManagerImpl manager, AbstractBean<?> declaringBean)
{
this.annotatedMethod = annotatedMethod;
this.xmlAnnotatedItem = xmlAnnotatedMethod;
this.declaringBean = declaringBean;
init(manager);
}

Expand Down Expand Up @@ -74,18 +76,9 @@ protected void initDeploymentType()
super.initDeploymentType();
if (getDeploymentType() == null)
{
if (getDeclaringBean() == null)
{
initDeclaringBean(manager);
}
deploymentType = declaringBean.getDeploymentType();
}
}

protected void initDeclaringBean(ManagerImpl container)
{
declaringBean = container.getModelManager().getBeanModel(getAnnotatedItem().getDelegate().getDeclaringClass());
}

public MethodConstructor<T> getConstructor()
{
Expand Down Expand Up @@ -236,7 +229,7 @@ public InjectableMethod<?> getDisposalMethod()
return removeMethod;
}

public BeanModel<?, ?> getDeclaringBean()
public AbstractBean<?> getDeclaringBean()
{
return declaringBean;
}
Expand Down
Expand Up @@ -248,11 +248,11 @@ public static boolean isParameterizedType(Class<?> type)
return type.getTypeParameters().length > 0;
}

public static Object invokeAndWrap(Method method, Object instance)
public static Object invokeAndWrap(Method method, Object instance, Object... parameters)
{
try
{
return method.invoke(instance);
return method.invoke(instance, parameters);
}
catch (IllegalArgumentException e)
{
Expand Down
Expand Up @@ -92,7 +92,7 @@ public void testConstructor()
{
BeanConstructor<EventImpl<DangerCall>, ?> constructor = eventBeanModel.getConstructor();
assert constructor != null;
Event<DangerCall> event = constructor.invoke(manager);
Event<DangerCall> event = constructor.invoke(manager, null);
assert event != null;
}
}
@@ -1,11 +1,31 @@
package org.jboss.webbeans.test;

import static org.jboss.webbeans.test.util.Util.createProducerMethodBean;
import static org.jboss.webbeans.test.util.Util.createSimpleWebBean;

import java.lang.reflect.Method;

import javax.webbeans.DefinitionException;

import org.jboss.webbeans.bean.ProducerMethodBean;
import org.jboss.webbeans.bean.SimpleBean;
import org.jboss.webbeans.test.beans.SpiderProducer;
import org.jboss.webbeans.test.beans.Tarantula;
import org.testng.annotations.Test;

public class ProducerMethodBeanLifecycleTest
public class ProducerMethodBeanLifecycleTest extends AbstractTest
{

@Test(groups="producerMethod") @SpecAssertion(section="5.6")
public void testProducerMethodBeanCreate() throws Exception
{
SimpleBean<SpiderProducer> spiderProducer = createSimpleWebBean(SpiderProducer.class, manager);
manager.addBean(spiderProducer);
Method method = SpiderProducer.class.getMethod("produceTarantula");
ProducerMethodBean<Tarantula> tarantulaBean = createProducerMethodBean(Tarantula.class, method, manager, spiderProducer);
Tarantula tarantula = tarantulaBean.create();
assert tarantula != null;
}

@Test(groups="producerMethod") @SpecAssertion(section="3.3")
public void testNonDependentProducerMethodThatReturnsNull()
Expand Down Expand Up @@ -43,13 +63,13 @@ public void testDisposalMethodHasParametersInjected()
}


@Test(groups="producerMethod") @SpecAssertion(section="3.4")
@Test(groups="producerMethod") @SpecAssertion(section={"3.4", "5.6"})
public void testProducerMethodReturnsNullIsDependent()
{
assert false;
}

@Test(groups="producerMethod", expectedExceptions=DefinitionException.class) @SpecAssertion(section="3.4")
@Test(groups="producerMethod", expectedExceptions=DefinitionException.class) @SpecAssertion(section={"3.4", "5.6"})
public void testProducerMethodReturnsNullIsNotDependent()
{

Expand Down
19 changes: 15 additions & 4 deletions webbeans-ri/src/test/java/org/jboss/webbeans/test/util/Util.java
Expand Up @@ -5,7 +5,8 @@
import java.util.HashMap;

import org.jboss.webbeans.ManagerImpl;
import org.jboss.webbeans.bean.ProducerBean;
import org.jboss.webbeans.bean.AbstractBean;
import org.jboss.webbeans.bean.ProducerMethodBean;
import org.jboss.webbeans.bean.SimpleBean;
import org.jboss.webbeans.introspector.AnnotatedClass;
import org.jboss.webbeans.introspector.AnnotatedMethod;
Expand Down Expand Up @@ -42,19 +43,29 @@ public static <T> EnterpriseBeanModel<T> createEnterpriseBeanModel(Class<T> claz
return new EnterpriseBeanModel<T>(new SimpleAnnotatedClass<T>(clazz), xmlAnnotatedType, manager);
}

public static <T> ProducerBean<T> createProducerMethodBean(Class<T> type, Method method, ManagerImpl manager)
public static <T> ProducerMethodBean<T> createProducerMethodBean(Class<T> type, Method method, ManagerImpl manager, AbstractBean<?> declaringBean)
{
return new ProducerBean<T>(createProducerModel(type, method, null, manager), manager);
return new ProducerMethodBean<T>(createProducerModel(type, method, null, manager, declaringBean), manager);
}

public static <T> ProducerMethodBean<T> createProducerMethodBean(Class<T> type, Method method, ManagerImpl manager)
{
return createProducerMethodBean(type, method, manager, null);
}

public static <T> ProducerMethodBeanModel<T> createProducerModel(Class<T> type, Method method, ManagerImpl manager)
{
return createProducerModel(type, method, null, manager);
}

public static <T> ProducerMethodBeanModel<T> createProducerModel(Class<T> type, Method method, AnnotatedMethod<T> xmlAnnotatedMethod, ManagerImpl manager, AbstractBean<?> declaringBean)
{
return new ProducerMethodBeanModel<T>(new SimpleAnnotatedMethod<T>(method), xmlAnnotatedMethod, manager, declaringBean);
}

public static <T> ProducerMethodBeanModel<T> createProducerModel(Class<T> type, Method method, AnnotatedMethod<T> xmlAnnotatedMethod, ManagerImpl manager)
{
return new ProducerMethodBeanModel<T>(new SimpleAnnotatedMethod<T>(method), xmlAnnotatedMethod, manager);
return createProducerModel(type, method, xmlAnnotatedMethod, manager, null);
}

@Deprecated
Expand Down

0 comments on commit 19c7869

Please sign in to comment.