Return-Path: X-Original-To: apmail-openwebbeans-commits-archive@www.apache.org Delivered-To: apmail-openwebbeans-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 637F4E3A3 for ; Fri, 11 Jan 2013 18:51:40 +0000 (UTC) Received: (qmail 51750 invoked by uid 500); 11 Jan 2013 18:51:40 -0000 Delivered-To: apmail-openwebbeans-commits-archive@openwebbeans.apache.org Received: (qmail 51703 invoked by uid 500); 11 Jan 2013 18:51:40 -0000 Mailing-List: contact commits-help@openwebbeans.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openwebbeans.apache.org Delivered-To: mailing list commits@openwebbeans.apache.org Received: (qmail 51694 invoked by uid 99); 11 Jan 2013 18:51:40 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 11 Jan 2013 18:51:40 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 11 Jan 2013 18:51:36 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 3D8A923889DE; Fri, 11 Jan 2013 18:51:16 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1432224 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/component/ main/java/org/apache/webbeans/component/creation/ test/java/org/apache/webbeans/newtests/interceptors/resolution/ Date: Fri, 11 Jan 2013 18:51:16 -0000 To: commits@openwebbeans.apache.org From: struberg@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130111185116.3D8A923889DE@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: struberg Date: Fri Jan 11 18:51:15 2013 New Revision: 1432224 URL: http://svn.apache.org/viewvc?rev=1432224&view=rev Log: OWB-344 interceptor checks continued Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java?rev=1432224&r1=1432223&r2=1432224&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/InterceptorBean.java Fri Jan 11 18:51:15 2013 @@ -25,6 +25,7 @@ import javax.enterprise.inject.spi.Inter import javax.interceptor.InvocationContext; import java.lang.annotation.Annotation; import java.lang.reflect.Method; +import java.util.Collections; import java.util.Map; import java.util.Set; @@ -50,7 +51,7 @@ public abstract class InterceptorBean super(webBeansContext, WebBeansType.INTERCEPTOR, annotatedType.getJavaClass(), annotatedType); } - private Set intercepts; + private Set intercepts = Collections.EMPTY_SET; /** * The Methods to be called for InterceptionType.AROUND_INVOKE. @@ -147,7 +148,7 @@ public abstract class InterceptorBean * @param interceptionType * @return the underlying interceptor method for the given InterceptionType or null */ - protected Method[] getInterceptorMethods(InterceptionType interceptionType) + public Method[] getInterceptorMethods(InterceptionType interceptionType) { if (InterceptionType.AROUND_INVOKE.equals(interceptionType)) { Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java?rev=1432224&r1=1432223&r2=1432224&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java Fri Jan 11 18:51:15 2013 @@ -26,6 +26,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -115,6 +116,23 @@ public abstract class AbstractBeanBuilde } /** + * @return the Type hierarchy in the order subclass first. Object.class is not included! + */ + protected List getClassHierarchy() + { + List hierarchy = new ArrayList(); + Class clazz = getBeanType(); + while (clazz != Object.class) + { + hierarchy.add(clazz); + clazz = clazz.getSuperclass(); + } + + return hierarchy; + } + + + /** * {@inheritDoc} */ public void defineApiType() Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java?rev=1432224&r1=1432223&r2=1432224&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java (original) +++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/InterceptorBeanBuilder.java Fri Jan 11 18:51:15 2013 @@ -22,7 +22,11 @@ import javax.enterprise.context.Dependen import javax.enterprise.inject.Produces; import javax.enterprise.inject.spi.AnnotatedMethod; import javax.enterprise.inject.spi.AnnotatedParameter; +import javax.enterprise.inject.spi.InterceptionType; +import javax.interceptor.AroundInvoke; +import java.lang.reflect.Method; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -35,10 +39,12 @@ import org.apache.webbeans.exception.Web */ public abstract class InterceptorBeanBuilder extends AbstractInjectionTargetBeanBuilder { + private final InterceptorBean bean; protected InterceptorBeanBuilder(InterceptorBean bean) { super(bean, Dependent.class); + this.bean = bean; } /** @@ -68,10 +74,62 @@ public abstract class InterceptorBeanBui protected void defineInterceptorRules() { + defineInterceptorMethods(); defineInjectedMethods(); defineInjectedFields(); } + /** + * grab all methods which act as interceptors for the various + * {@link javax.enterprise.inject.spi.InterceptionType}s. + * This method will also check some rules, e.g. that there must not be + * more than a single {@link javax.interceptor.AroundInvoke} method + * on a class. + */ + protected void defineInterceptorMethods() + { + List classHierarchy = getClassHierarchy(); + + AnnotatedMethod aroundInvokeMethod = null; + + Set> methods = getAnnotated().getMethods(); + + for (Class clazz : classHierarchy) + { + + for (AnnotatedMethod m : methods) + { + if (clazz == m.getDeclaringType().getJavaClass()) + { + + // we only take methods from this very class and not sub- or superclasses + if (m.getAnnotation(AroundInvoke.class) != null) + { + if (aroundInvokeMethod != null) + { + throw new WebBeansConfigurationException("only one AroundInvoke allowed per Interceptor"); + } + aroundInvokeMethod = m; + } + + + } + } + } + + // and now for setting the bean info + + Set intercepts = new HashSet(); + + if (aroundInvokeMethod != null) + { + bean.setAroundInvokeMethods(new Method[]{aroundInvokeMethod.getJavaMember()}); + intercepts.add(InterceptionType.AROUND_INVOKE); + } + + + bean.setIntercepts(intercepts); + } } Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java?rev=1432224&r1=1432223&r2=1432224&view=diff ============================================================================== --- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java (original) +++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/interceptors/resolution/InterceptorBeanBuilderTest.java Fri Jan 11 18:51:15 2013 @@ -20,6 +20,7 @@ package org.apache.webbeans.newtests.int import javax.enterprise.inject.spi.AnnotatedType; +import javax.enterprise.inject.spi.InterceptionType; import javax.enterprise.inject.spi.Interceptor; import java.util.ArrayList; import java.util.Collection; @@ -68,9 +69,14 @@ public class InterceptorBeanBuilderTest ibb.defineCdiInterceptorRules(); Interceptor bean = ibb.getBean(); Assert.assertNotNull(bean); + Assert.assertNotNull(bean.getInterceptorBindings()); Assert.assertEquals(1, bean.getInterceptorBindings().size()); + Assert.assertTrue(bean.intercepts(InterceptionType.AROUND_INVOKE)); + Assert.assertFalse(bean.intercepts(InterceptionType.AROUND_TIMEOUT)); + Assert.assertFalse(bean.intercepts(InterceptionType.POST_CONSTRUCT)); + } shutDownContainer();