You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by gp...@apache.org on 2012/04/12 09:42:12 UTC

git commit: DELTASPIKE-158 @ExceptionHandler

Updated Branches:
  refs/heads/master e39cf97e7 -> b2e7b9086


DELTASPIKE-158 @ExceptionHandler

 filter decorators and interceptors


Project: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/commit/b2e7b908
Tree: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/tree/b2e7b908
Diff: http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/diff/b2e7b908

Branch: refs/heads/master
Commit: b2e7b9086d988693cf0623c1daede7ed893d51e1
Parents: e39cf97
Author: gpetracek <gp...@apache.org>
Authored: Thu Apr 12 09:23:37 2012 +0200
Committer: gpetracek <gp...@apache.org>
Committed: Thu Apr 12 09:38:01 2012 +0200

----------------------------------------------------------------------
 .../control/HandlerMethodStorageProducer.java      |    8 +-
 .../control/extension/CatchExtension.java          |  174 --------------
 .../extension/ExceptionControlExtension.java       |  183 +++++++++++++++
 .../services/javax.enterprise.inject.spi.Extension |    2 +-
 .../control/handler/HandlerComparatorTest.java     |    4 +-
 5 files changed, 191 insertions(+), 180 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/b2e7b908/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/HandlerMethodStorageProducer.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/HandlerMethodStorageProducer.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/HandlerMethodStorageProducer.java
index 6ff9ef4..5f4864d 100644
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/HandlerMethodStorageProducer.java
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/HandlerMethodStorageProducer.java
@@ -19,7 +19,7 @@
 package org.apache.deltaspike.core.impl.exception.control;
 
 import org.apache.deltaspike.core.api.provider.BeanProvider;
-import org.apache.deltaspike.core.impl.exception.control.extension.CatchExtension;
+import org.apache.deltaspike.core.impl.exception.control.extension.ExceptionControlExtension;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.enterprise.inject.Produces;
@@ -33,7 +33,9 @@ public class HandlerMethodStorageProducer
     protected HandlerMethodStorage createHandlerMethodStorage()
     {
         //X TODO change it back to parameter injection after fixing the test-setup for ExcludeIntegrationTest
-        CatchExtension catchExtension = BeanProvider.getContextualReference(CatchExtension.class);
-        return new HandlerMethodStorageImpl(catchExtension.getAllExceptionHandlers());
+        ExceptionControlExtension exceptionControlExtension =
+                BeanProvider.getContextualReference(ExceptionControlExtension.class);
+
+        return new HandlerMethodStorageImpl(exceptionControlExtension.getAllExceptionHandlers());
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/b2e7b908/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/extension/CatchExtension.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/extension/CatchExtension.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/extension/CatchExtension.java
deleted file mode 100644
index 2248512..0000000
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/extension/CatchExtension.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.deltaspike.core.impl.exception.control.extension;
-
-import org.apache.deltaspike.core.api.exception.control.ExceptionHandler;
-import org.apache.deltaspike.core.api.exception.control.HandlerMethod;
-import org.apache.deltaspike.core.impl.exception.control.HandlerMethodImpl;
-import org.apache.deltaspike.core.spi.activation.Deactivatable;
-import org.apache.deltaspike.core.util.ClassDeactivationUtils;
-
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.InjectionException;
-import javax.enterprise.inject.spi.AfterDeploymentValidation;
-import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.enterprise.inject.spi.BeforeBeanDiscovery;
-import javax.enterprise.inject.spi.Extension;
-import javax.enterprise.inject.spi.InjectionPoint;
-import javax.enterprise.inject.spi.ProcessAnnotatedType;
-import java.lang.reflect.Type;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.logging.Logger;
-
-/**
- * CDI extension to find handlers at startup.
- */
-@SuppressWarnings({ "unchecked", "CdiManagedBeanInconsistencyInspection" })
-public class CatchExtension implements Extension, Deactivatable
-{
-    private static final Logger LOG = Logger.getLogger(CatchExtension.class.getName());
-
-    //this map is application scoped by the def. of the cdi spec.
-    //if it needs to be static a classloader key is needed + a cleanup in a BeforeShutdown observer
-    private Map<? super Type, Collection<HandlerMethod<? extends Throwable>>> allHandlers
-        = new HashMap<Type, Collection<HandlerMethod<? extends Throwable>>>();
-
-    private Boolean isActivated = null;
-
-    @SuppressWarnings("UnusedDeclaration")
-    protected void init(@Observes BeforeBeanDiscovery afterBeanDiscovery)
-    {
-        initActivation();
-    }
-
-    /**
-     * Listener to ProcessBean event to locate handlers.
-     *
-     * @param processAnnotatedType current annotated type-event
-     * @param beanManager  Activated Bean Manager
-     * @throws TypeNotPresentException if any of the actual type arguments refers to a non-existent type declaration
-     *                                 when trying to obtain the actual type arguments from a
-     *                                 {@link java.lang.reflect.ParameterizedType}
-     * @throws java.lang.reflect.MalformedParameterizedTypeException
-     *                                 if any of the actual type parameters refer to a parameterized type that cannot
-     *                                 be instantiated for any reason when trying to obtain the actual type arguments
-     *                                 from a {@link java.lang.reflect.ParameterizedType}
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    public <T> void findHandlers(@Observes final ProcessAnnotatedType processAnnotatedType,
-                                 final BeanManager beanManager)
-    {
-        if (!this.isActivated)
-        {
-            return;
-        }
-
-        if (processAnnotatedType.getAnnotatedType().getJavaClass().isAnnotationPresent(ExceptionHandler.class))
-        {
-            final Set<AnnotatedMethod<? super T>> methods = processAnnotatedType.getAnnotatedType().getMethods();
-
-            for (AnnotatedMethod<? super T> method : methods)
-            {
-                if (HandlerMethodImpl.isHandler(method))
-                {
-                    if (method.getJavaMember().getExceptionTypes().length != 0)
-                    {
-                        //TODO discuss unified handling of definition errors
-                        throw new IllegalStateException(
-                            String.format("Handler method %s must not throw exceptions", method.getJavaMember()));
-                    }
-
-                    //beanManager won't be stored in the instance -> no issue with wls12c
-                    registerHandlerMethod(new HandlerMethodImpl(method, beanManager));
-                }
-            }
-        }
-    }
-
-    /**
-     * Verifies all injection points for every handler are valid.
-     *
-     * @param afterDeploymentValidation Lifecycle event
-     * @param beanManager  BeanManager instance
-     */
-    @SuppressWarnings("UnusedDeclaration")
-    public void verifyInjectionPoints(/*@Observes X TODO fails with OWB -> reactivate as soon as we have a workaround*/
-                                      final AfterDeploymentValidation afterDeploymentValidation,
-                                      final BeanManager beanManager)
-    {
-        if (!this.isActivated)
-        {
-            return;
-        }
-
-        for (Map.Entry<? super Type, Collection<HandlerMethod<? extends Throwable>>> entry : allHandlers.entrySet())
-        {
-            for (HandlerMethod<? extends Throwable> handler : entry.getValue())
-            {
-                for (InjectionPoint ip : ((HandlerMethodImpl<? extends Throwable>) handler).getInjectionPoints())
-                {
-                    try
-                    {
-                        beanManager.validate(ip);
-                    }
-                    catch (InjectionException e)
-                    {
-                        afterDeploymentValidation.addDeploymentProblem(e);
-                    }
-                }
-            }
-        }
-    }
-
-    public Map<? super Type, Collection<HandlerMethod<? extends Throwable>>> getAllExceptionHandlers()
-    {
-        return Collections.unmodifiableMap(allHandlers);
-    }
-
-    private <T extends Throwable> void registerHandlerMethod(HandlerMethod<T> handlerMethod)
-    {
-        LOG.fine(String.format("Adding handler %s to known handlers", handlerMethod));
-
-        if (allHandlers.containsKey(handlerMethod.getExceptionType()))
-        {
-            allHandlers.get(handlerMethod.getExceptionType()).add(handlerMethod);
-        }
-        else
-        {
-            allHandlers.put(handlerMethod.getExceptionType(),
-                new HashSet<HandlerMethod<? extends Throwable>>(Arrays.asList(handlerMethod)));
-        }
-    }
-
-    public void initActivation()
-    {
-        if (isActivated == null)
-        {
-            isActivated = ClassDeactivationUtils.isActivated(getClass());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/b2e7b908/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/extension/ExceptionControlExtension.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/extension/ExceptionControlExtension.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/extension/ExceptionControlExtension.java
new file mode 100644
index 0000000..75d6d38
--- /dev/null
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/exception/control/extension/ExceptionControlExtension.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.deltaspike.core.impl.exception.control.extension;
+
+import org.apache.deltaspike.core.api.exception.control.ExceptionHandler;
+import org.apache.deltaspike.core.api.exception.control.HandlerMethod;
+import org.apache.deltaspike.core.impl.exception.control.HandlerMethodImpl;
+import org.apache.deltaspike.core.spi.activation.Deactivatable;
+import org.apache.deltaspike.core.util.ClassDeactivationUtils;
+
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.InjectionException;
+import javax.enterprise.inject.spi.AfterDeploymentValidation;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.BeforeBeanDiscovery;
+import javax.enterprise.inject.spi.Decorator;
+import javax.enterprise.inject.spi.Extension;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.Interceptor;
+import javax.enterprise.inject.spi.ProcessBean;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Logger;
+
+/**
+ * CDI extension to find handlers at startup.
+ */
+@SuppressWarnings({ "unchecked", "CdiManagedBeanInconsistencyInspection" })
+public class ExceptionControlExtension implements Extension, Deactivatable
+{
+    private static final Logger LOG = Logger.getLogger(ExceptionControlExtension.class.getName());
+
+    //this map is application scoped by the def. of the cdi spec.
+    //if it needs to be static a classloader key is needed + a cleanup in a BeforeShutdown observer
+    private Map<? super Type, Collection<HandlerMethod<? extends Throwable>>> allHandlers
+        = new HashMap<Type, Collection<HandlerMethod<? extends Throwable>>>();
+
+    private Boolean isActivated = null;
+
+    @SuppressWarnings("UnusedDeclaration")
+    protected void init(@Observes BeforeBeanDiscovery afterBeanDiscovery)
+    {
+        initActivation();
+    }
+
+    /**
+     * Listener to ProcessBean event to locate handlers.
+     *
+     * @param processBean current {@link AnnotatedType}
+     * @param beanManager  Activated Bean Manager
+     * @throws TypeNotPresentException if any of the actual type arguments refers to a non-existent type declaration
+     *                                 when trying to obtain the actual type arguments from a
+     *                                 {@link java.lang.reflect.ParameterizedType}
+     * @throws java.lang.reflect.MalformedParameterizedTypeException
+     *                                 if any of the actual type parameters refer to a parameterized type that cannot
+     *                                 be instantiated for any reason when trying to obtain the actual type arguments
+     *                                 from a {@link java.lang.reflect.ParameterizedType}
+     */
+    @SuppressWarnings("UnusedDeclaration")
+    public <T> void findHandlers(@Observes final ProcessBean<?> processBean, final BeanManager beanManager)
+    {
+        if (!this.isActivated)
+        {
+            return;
+        }
+
+        if (processBean.getBean() instanceof Interceptor || processBean.getBean() instanceof Decorator ||
+                !(processBean.getAnnotated() instanceof AnnotatedType))
+        {
+            return;
+        }
+
+        AnnotatedType annotatedType = (AnnotatedType)processBean.getAnnotated();
+
+        if (annotatedType.getJavaClass().isAnnotationPresent(ExceptionHandler.class))
+        {
+            final Set<AnnotatedMethod<? super T>> methods = annotatedType.getMethods();
+
+            for (AnnotatedMethod<? super T> method : methods)
+            {
+                if (HandlerMethodImpl.isHandler(method))
+                {
+                    if (method.getJavaMember().getExceptionTypes().length != 0)
+                    {
+                        processBean.addDefinitionError(new IllegalArgumentException(
+                            String.format("Handler method %s must not throw exceptions", method.getJavaMember())));
+                    }
+
+                    //beanManager won't be stored in the instance -> no issue with wls12c
+                    registerHandlerMethod(new HandlerMethodImpl(method, beanManager));
+                }
+            }
+        }
+    }
+
+    /**
+     * Verifies all injection points for every handler are valid.
+     *
+     * @param afterDeploymentValidation Lifecycle event
+     * @param beanManager  BeanManager instance
+     */
+    @SuppressWarnings("UnusedDeclaration")
+    public void verifyInjectionPoints(/*@Observes X TODO fails with OWB -> reactivate as soon as we have a workaround*/
+                                      final AfterDeploymentValidation afterDeploymentValidation,
+                                      final BeanManager beanManager)
+    {
+        if (!this.isActivated)
+        {
+            return;
+        }
+
+        for (Map.Entry<? super Type, Collection<HandlerMethod<? extends Throwable>>> entry : allHandlers.entrySet())
+        {
+            for (HandlerMethod<? extends Throwable> handler : entry.getValue())
+            {
+                for (InjectionPoint ip : ((HandlerMethodImpl<? extends Throwable>) handler).getInjectionPoints())
+                {
+                    try
+                    {
+                        beanManager.validate(ip);
+                    }
+                    catch (InjectionException e)
+                    {
+                        afterDeploymentValidation.addDeploymentProblem(e);
+                    }
+                }
+            }
+        }
+    }
+
+    public Map<? super Type, Collection<HandlerMethod<? extends Throwable>>> getAllExceptionHandlers()
+    {
+        return Collections.unmodifiableMap(allHandlers);
+    }
+
+    private <T extends Throwable> void registerHandlerMethod(HandlerMethod<T> handlerMethod)
+    {
+        LOG.fine(String.format("Adding handler %s to known handlers", handlerMethod));
+
+        if (allHandlers.containsKey(handlerMethod.getExceptionType()))
+        {
+            allHandlers.get(handlerMethod.getExceptionType()).add(handlerMethod);
+        }
+        else
+        {
+            allHandlers.put(handlerMethod.getExceptionType(),
+                new HashSet<HandlerMethod<? extends Throwable>>(Arrays.asList(handlerMethod)));
+        }
+    }
+
+    public void initActivation()
+    {
+        if (isActivated == null)
+        {
+            isActivated = ClassDeactivationUtils.isActivated(getClass());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/b2e7b908/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension b/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
index 1ad276d..a095cac 100644
--- a/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
+++ b/deltaspike/core/impl/src/main/resources/META-INF/services/javax.enterprise.inject.spi.Extension
@@ -20,4 +20,4 @@
 org.apache.deltaspike.core.impl.exclude.ExcludeExtension
 org.apache.deltaspike.core.impl.config.injectable.ConfigPropertyExtension
 org.apache.deltaspike.core.impl.message.MessageBundleExtension
-org.apache.deltaspike.core.impl.exception.control.extension.CatchExtension
+org.apache.deltaspike.core.impl.exception.control.extension.ExceptionControlExtension

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/b2e7b908/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/exception/control/handler/HandlerComparatorTest.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/exception/control/handler/HandlerComparatorTest.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/exception/control/handler/HandlerComparatorTest.java
index 2e4bb85..f79fcc0 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/exception/control/handler/HandlerComparatorTest.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/impl/exception/control/handler/HandlerComparatorTest.java
@@ -66,7 +66,7 @@ public class HandlerComparatorTest
     {
         /*
         List<HandlerMethod<? extends Throwable>> handlers = new ArrayList<HandlerMethod<? extends Throwable>>(
-                CatchExtension.createStorage().getHandlersForException(
+                ExceptionControlExtension.createStorage().getHandlersForException(
                         IllegalArgumentException.class, bm, Collections.<Annotation>emptySet(), false));
 
         System.out.println(handlers);
@@ -84,7 +84,7 @@ public class HandlerComparatorTest
     {
         /*
         List<HandlerMethod<? extends Throwable>> handlers = new ArrayList<HandlerMethod<? extends Throwable>>(
-                CatchExtension.createStorage().getHandlersForException(
+                ExceptionControlExtension.createStorage().getHandlersForException(
                         Exception.class, bm, Collections.<Annotation>emptySet(), true));
 
         assertThat(handlers.size(), is(4));