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