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