Author: struberg
Date: Wed Jun 14 17:21:02 2017
New Revision: 1798720

URL: http://svn.apache.org/viewvc?rev=1798720&view=rev
Log:
OWB-1186 implement observer checks

Modified:
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/ObserverMethodConfiguratorImpl.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/ErrorStack.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/ObserverMethodConfiguratorImpl.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/ObserverMethodConfiguratorImpl.java?rev=1798720&r1=1798719&r2=1798720&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/ObserverMethodConfiguratorImpl.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/configurator/ObserverMethodConfiguratorImpl.java
 Wed Jun 14 17:21:02 2017
@@ -43,7 +43,7 @@ import java.util.stream.Collectors;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.event.EventContextImpl;
-import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.exception.WebBeansDeploymentException;
 import org.apache.webbeans.exception.WebBeansException;
 
 
@@ -285,7 +285,16 @@ public class ObserverMethodConfiguratorI
         if (observedType ==  null)
         {
             String extensionName = extension != null ? "(" + 
extension.toString() + ") ! " : "! ";
-            WebBeansConfigurationException e = new 
WebBeansConfigurationException("ObserverMethod observedType is missing "
+            WebBeansDeploymentException e = new 
WebBeansDeploymentException("ObserverMethod observedType is missing "
+                + extensionName
+                + toString());
+            webBeansContext.getBeanManagerImpl().getErrorStack().pushError(e);
+            return null;
+        }
+        if (originalObserverMethod == null && notifyWith == null)
+        {
+            String extensionName = extension != null ? "(" + 
extension.toString() + ") ! " : "! ";
+            WebBeansDeploymentException e = new 
WebBeansDeploymentException("ObserverMethod notifyWith is missing "
                 + extensionName
                 + toString());
             webBeansContext.getBeanManagerImpl().getErrorStack().pushError(e);

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java?rev=1798720&r1=1798719&r2=1798720&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
 Wed Jun 14 17:21:02 2017
@@ -24,6 +24,7 @@ import javax.enterprise.inject.spi.After
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.Decorator;
+import javax.enterprise.inject.spi.EventContext;
 import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.Interceptor;
@@ -45,6 +46,7 @@ import org.apache.webbeans.portable.even
 import org.apache.webbeans.portable.events.generics.GProcessSyntheticBean;
 import 
org.apache.webbeans.portable.events.generics.GProcessSyntheticObserverMethod;
 import org.apache.webbeans.util.AnnotationUtil;
+import org.apache.webbeans.util.ClassUtil;
 
 import java.util.HashSet;
 import java.util.Set;
@@ -211,6 +213,19 @@ public class AfterBeanDiscoveryImpl exte
     public void addObserverMethod(ObserverMethod<?> observerMethod)
     {
         checkState();
+
+        // spec requires that either notify(T) or notify(EventContext) is 
implemented
+        if (!ClassUtil.isMethodImplemented(observerMethod.getClass(), 
ObserverMethod.class, "notify", Object.class) &&
+            !ClassUtil.isMethodImplemented(observerMethod.getClass(), 
ObserverMethod.class, "notify", EventContext.class))
+        {
+            String extensionName = extension != null ? "(" + 
extension.toString() + ") ! " : "! ";
+            WebBeansConfigurationException e = new 
WebBeansConfigurationException("ObserverMethod must either implement notify(T) 
or notify(EventContext) "
+                + extensionName
+                + observerMethod.toString());
+            webBeansContext.getBeanManagerImpl().getErrorStack().pushError(e);
+
+        }
+
         GProcessSyntheticObserverMethod event = new 
GProcessSyntheticObserverMethod(webBeansContext, null, observerMethod, 
extension);
         if (!event.isVetoed())
         {

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/ErrorStack.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/ErrorStack.java?rev=1798720&r1=1798719&r2=1798720&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/ErrorStack.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/ErrorStack.java
 Wed Jun 14 17:21:02 2017
@@ -76,4 +76,9 @@ public class ErrorStack
     {
         return !errorStack.isEmpty();
     }
+
+    public Iterator<? extends Throwable> iterator()
+    {
+        return errorStack.iterator();
+    }
 }

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java?rev=1798720&r1=1798719&r2=1798720&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
 Wed Jun 14 17:21:02 2017
@@ -431,6 +431,32 @@ public final class ClassUtil
     }
 
     /**
+     * Checks, if the given {@link Class} implements the {@link Method} with 
the
+     * given name und parameterTypes.
+     * Returns {@code false} if the method is only a default method in the 
interface!
+     *
+     * @param clazz to check
+     * @param interfase the Interface which declares the method
+     * @param methodName of the method
+     * @param parameterTypes of the method
+     *
+     * @return {@code} true if the given class contains a method with the 
given name and parameterTypes,
+     *         otherwise {@code false}
+     */
+    public static boolean isMethodImplemented(Class<?> clazz, Class<?> 
interfase, String methodName, Class<?>... parameterTypes)
+    {
+        try
+        {
+            Method m = clazz.getMethod(methodName, parameterTypes);
+            return m != null && m.getDeclaringClass() != interfase;
+        }
+        catch (NoSuchMethodException e)
+        {
+            return false;
+        }
+    }
+
+    /**
      * Check if the method is already defined in a subclass
      * @param subclassMethods
      * @param superclassMethod

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1798720&r1=1798719&r2=1798720&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
 Wed Jun 14 17:21:02 2017
@@ -107,6 +107,7 @@ import javax.enterprise.inject.spi.BeanA
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.BeforeBeanDiscovery;
 import javax.enterprise.inject.spi.BeforeShutdown;
+import javax.enterprise.inject.spi.DeploymentException;
 import javax.enterprise.inject.spi.Extension;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.Interceptor;
@@ -1320,7 +1321,16 @@ public final class WebBeansUtil
             if(stack.hasErrors())
             {
                 stack.logErrors();
-                throw new WebBeansConfigurationException(logMessage);
+
+                // just because of some TCK and spec insanity...
+                if (stack.iterator().next() instanceof DeploymentException)
+                {
+                    throw new WebBeansDeploymentException(logMessage);
+                }
+                else
+                {
+                    throw new WebBeansConfigurationException(logMessage);
+                }
             }
         }
         finally


Reply via email to