You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by db...@apache.org on 2011/07/15 08:38:15 UTC
svn commit: r1146977 - in /openwebbeans/trunk:
webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
Author: dblevins
Date: Fri Jul 15 06:38:15 2011
New Revision: 1146977
URL: http://svn.apache.org/viewvc?rev=1146977&view=rev
Log:
OWB-592: EJB Specialization utility method
Modified:
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
Modified: openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java?rev=1146977&r1=1146976&r2=1146977&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java (original)
+++ openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java Fri Jul 15 06:38:15 2011
@@ -37,6 +37,7 @@ import org.apache.webbeans.component.Inj
import org.apache.webbeans.component.ProducerFieldBean;
import org.apache.webbeans.component.ProducerMethodBean;
import org.apache.webbeans.component.creation.BeanCreator.MetaDataProvider;
+import org.apache.webbeans.config.DefinitionUtil;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.ejb.common.component.BaseEjbBean;
@@ -177,6 +178,75 @@ public final class EjbUtility
manager.getBeans().addAll(producerFieldBeans);
}
+ public static <T> void defineSpecializedData(Class<T> clazz, BaseEjbBean<T> ejbBean)
+ {
+ final String message = "There are errors that are added by %s event observers for %s. Look at logs for further details";
+
+ final WebBeansContext webBeansContext = ejbBean.getWebBeansContext();
+ final BeanManagerImpl manager = webBeansContext.getBeanManagerImpl();
+
+ final AnnotatedElementFactory annotatedElementFactory = webBeansContext.getAnnotatedElementFactory();
+
+ final AnnotatedType<T> annotatedType = annotatedElementFactory.newAnnotatedType(clazz);
+
+ final DefinitionUtil util = webBeansContext.getDefinitionUtil();
+
+ final Set<ProducerMethodBean<?>> producerMethodBeans = util.defineProducerMethods(ejbBean, clazz);
+
+ final Set<ProducerFieldBean<?>> producerFieldBeans = util.defineProducerFields(ejbBean, clazz);
+
+ checkProducerMethods(producerMethodBeans, ejbBean);
+
+ // PRODUCER METHODS
+ Map<ProducerMethodBean<?>, AnnotatedMethod<?>> annotatedMethods = new HashMap<ProducerMethodBean<?>, AnnotatedMethod<?>>();
+ for(ProducerMethodBean<?> producerMethod : producerMethodBeans)
+ {
+ AnnotatedMethod<?> method = annotatedElementFactory.newAnnotatedMethod(producerMethod.getCreatorMethod(), annotatedType);
+
+ ProcessProducerImpl<?, ?> producerEvent = webBeansContext.getWebBeansUtil().fireProcessProducerEventForMethod(producerMethod, method);
+
+ webBeansContext.getWebBeansUtil().inspectErrorStack(String.format(message, "ProcessProducer", "ProducerMethods"));
+
+ annotatedMethods.put(producerMethod, method);
+ manager.putInjectionTargetWrapper(producerMethod, new InjectionTargetWrapper(producerEvent.getProducer()));
+
+ producerEvent.setProducerSet(false);
+ }
+
+ // PRODUCER FIELDS
+ Map<ProducerFieldBean<?>, AnnotatedField<?>> annotatedFields = new HashMap<ProducerFieldBean<?>, AnnotatedField<?>>();
+ for(ProducerFieldBean<?> producerField : producerFieldBeans)
+ {
+ AnnotatedField<?> field = annotatedElementFactory.newAnnotatedField(producerField.getCreatorField(), annotatedType);
+
+ ProcessProducerImpl<?, ?> producerEvent = webBeansContext.getWebBeansUtil().fireProcessProducerEventForField(producerField, field);
+
+ webBeansContext.getWebBeansUtil().inspectErrorStack(String.format(message, "ProcessProducer", "ProducerFields"));
+
+ annotatedFields.put(producerField, field);
+ manager.putInjectionTargetWrapper(producerField, new InjectionTargetWrapper(producerEvent.getProducer()));
+
+
+ producerEvent.setProducerSet(false);
+ }
+
+ //Fires ProcessProducerMethod
+ webBeansContext.getWebBeansUtil().fireProcessProducerMethodBeanEvent(annotatedMethods, annotatedType);
+ webBeansContext.getWebBeansUtil().inspectErrorStack(String.format(message, "ProcessProducerMethod", "producer method beans"));
+
+ //Fires ProcessProducerField
+ webBeansContext.getWebBeansUtil().fireProcessProducerFieldBeanEvent(annotatedFields);
+ webBeansContext.getWebBeansUtil().inspectErrorStack(String.format(message, "ProcessProducerField", "producer field beans"));
+
+ // Let the plugin handle adding the new bean instance as it knows more about its EJB Bean
+
+ manager.getBeans().addAll(producerMethodBeans);
+ manager.getBeans().addAll(producerFieldBeans);
+
+ util.defineDisposalMethods(ejbBean, clazz);
+
+ }
+
private static void checkProducerMethods(Set<ProducerMethodBean<?>> producerMethodBeans, BaseEjbBean<?> bean)
{
for(ProducerMethodBean<?> producerMethodBean : producerMethodBeans)
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java?rev=1146977&r1=1146976&r2=1146977&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java Fri Jul 15 06:38:15 2011
@@ -694,41 +694,45 @@ public final class DefinitionUtil
*/
public Set<ProducerFieldBean<?>> defineProducerFields(InjectionTargetBean<?> component)
{
- Set<ProducerFieldBean<?>> producerFields = new HashSet<ProducerFieldBean<?>>();
- Field[] fields = webBeansContext.getSecurityService().doPrivilegedGetDeclaredFields(component.getReturnType());
- createProducerField(component, producerFields, fields);
- return producerFields;
+ final Class<?> returnType = component.getReturnType();
+
+ return defineProducerFields(component, returnType);
}
- private void createProducerField(InjectionTargetBean<?> component, Set<ProducerFieldBean<?>> producerFields, Field[] fields)
+ public Set<ProducerFieldBean<?>> defineProducerFields(InjectionTargetBean<?> component, Class<?> returnType)
{
+ final Field[] fields = webBeansContext.getSecurityService().doPrivilegedGetDeclaredFields(returnType);
+
+ final Set<ProducerFieldBean<?>> producerFields = new HashSet<ProducerFieldBean<?>>();
+
for (Field field : fields)
- {
- Type genericType = field.getGenericType();
-
+ {
+ final Type genericType = field.getGenericType();
+
// Producer field
if (AnnotationUtil.hasAnnotation(field.getDeclaredAnnotations(), Produces.class))
- {
+ {
if(ClassUtil.isParametrizedType(genericType))
{
if(!ClassUtil.checkParametrizedType((ParameterizedType)genericType))
{
- throw new WebBeansConfigurationException("Producer field : " + field.getName() + " return type in class : " +
+ throw new WebBeansConfigurationException("Producer field : " + field.getName() + " return type in class : " +
field.getDeclaringClass().getName() + " can not be Wildcard type or Type variable");
}
}
-
- ProducerFieldBean<?> newComponent = createProducerFieldComponent(field.getType(), field, component);
+
+ final ProducerFieldBean<?> newComponent = createProducerFieldComponent(field.getType(), field, component);
if (newComponent != null)
{
producerFields.add(newComponent);
- }
+ }
}
}
+ return producerFields;
}
/**
@@ -743,17 +747,23 @@ public final class DefinitionUtil
{
Asserts.assertNotNull(component, "component parameter can not be null");
- Set<ProducerMethodBean<?>> producerComponents = new HashSet<ProducerMethodBean<?>>();
-
Class<?> clazz = component.getReturnType();
+
+ return defineProducerMethods(component, clazz);
+ }
+
+ public Set<ProducerMethodBean<?>> defineProducerMethods(AbstractInjectionTargetBean<?> component, Class<?> clazz)
+ {
Method[] declaredMethods = webBeansContext.getSecurityService().doPrivilegedGetDeclaredMethods(clazz);
+ Set<ProducerMethodBean<?>> producerComponents = new HashSet<ProducerMethodBean<?>>();
+
// This methods defined in the class
for (Method declaredMethod : declaredMethods)
{
createProducerComponents(component, producerComponents, declaredMethod, clazz);
}
-
+
return producerComponents;
}
@@ -893,11 +903,16 @@ public final class DefinitionUtil
{
Class<?> clazz = component.getReturnType();
+ defineDisposalMethods(component, clazz);
+
+ }
+
+ public <T> void defineDisposalMethods(AbstractOwbBean<T> component, Class<?> clazz)
+ {
Method[] methods = AnnotationUtil.getMethodsWithParameterAnnotation(clazz, Disposes.class);
// From Normal
createDisposalMethods(component, methods, clazz);
-
}
private <T> void createDisposalMethods(AbstractOwbBean<T> component, Method[] methods, Class<?> clazz)
@@ -1254,7 +1269,7 @@ public final class DefinitionUtil
private <T> void createObserverMethods(InjectionTargetBean<T> component, Class<?> clazz, Method[] candidateMethods)
{
-
+ // TODO Overriding an event method disables it (cdi 1.0: section 4.2)
for (Method candidateMethod : candidateMethods)
{