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)
{