openwebbeans-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From strub...@apache.org
Subject svn commit: r902270 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/event/ main/java/org/apache/webbeans/intercept/ test/java/org/apache/webbeans/test/ test/java/org/apache/webbeans/test/component/event/normal/ test/java/org/a...
Date Fri, 22 Jan 2010 21:17:33 GMT
Author: struberg
Date: Fri Jan 22 21:17:31 2010
New Revision: 902270

URL: http://svn.apache.org/viewvc?rev=902270&view=rev
Log:
OWB-249 use a bean reference instead of the internal instance to enable interceptors and decorators
for eventing methods

Added:
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/Transactional.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/ComponentWithObserves2.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/component/ObserversComponentTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java?rev=902270&r1=902269&r2=902270&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
Fri Jan 22 21:17:31 2010
@@ -160,7 +160,7 @@
         AbstractBean<Object> specializedComponent = null;
         Object object = null;
         
-        CreationalContext<?> creationalContext = null;
+        CreationalContext<Object> creationalContext = null;
         
         try
         {
@@ -189,15 +189,15 @@
                 
                 creationalContext = manager.createCreationalContext(specializedComponent);
                 
-                // lookup the contextual instance if one already exists
-                object = context.get(specializedComponent);
-                
-                if(object == null && !this.ifExist)
+                // on Reception.IF_EXISTS: ignore this bean if a the contextual instance
doesn't already exist
+                if (ifExist && context.get(specializedComponent) == null) 
                 {
-                    // on Reception.ALWAYS we must get a contextual reference if we didn't
find the contextual instance
-                    object = manager.getReference(specializedComponent, specializedComponent.getBeanClass(),
creationalContext);
+                    return;
                 }
                 
+                // on Reception.ALWAYS we must get a contextual reference if we didn't find
the contextual instance
+                object = manager.getReference(specializedComponent, specializedComponent.getBeanClass(),
creationalContext);
+                
                 if (object != null)
                 {
                     //Invoke Method

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java?rev=902270&r1=902269&r2=902270&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/WebBeansInterceptorConfig.java
Fri Jan 22 21:17:31 2010
@@ -165,7 +165,7 @@
     private static void addMethodInterceptors(Class<?> clazz, List<InterceptorData>
stack, Set<Interceptor<?>> componentInterceptors)
     {
         Method[] methods = clazz.getDeclaredMethods();
-        Set<Annotation> set = new HashSet<Annotation>();
+        Set<Annotation> interceptorAnns = new HashSet<Annotation>();
 
         for (Method method : methods)
         {
@@ -176,12 +176,12 @@
 
                 for (Annotation ann : anns)
                 {
-                    set.add(ann);
+                    interceptorAnns.add(ann);
                 }
 
                 for (Annotation ann : annsClazz)
                 {
-                    set.add(ann);
+                    interceptorAnns.add(ann);
                 }
             }
 
@@ -194,30 +194,33 @@
 
                     for (Annotation ann : steroInterceptorBindings)
                     {
-                        set.add(ann);
+                        interceptorAnns.add(ann);
                     }
                 }
             }
 
-            Annotation[] result = new Annotation[set.size()];
-            result = set.toArray(result);
-
-            Set<Interceptor<?>> setInterceptors = findDeployedWebBeansInterceptor(result);
-            
-            if(componentInterceptors != null)
-            {
-                setInterceptors.removeAll(componentInterceptors);   
-            }
-
-            Iterator<Interceptor<?>> it = setInterceptors.iterator();
-
-            while (it.hasNext())
+            if (!interceptorAnns.isEmpty())
             {
-                WebBeansInterceptor<?> interceptor = (WebBeansInterceptor<?>)
it.next();
-
-                WebBeansUtil.configureInterceptorMethods(interceptor, interceptor.getClazz(),
AroundInvoke.class, true, true, stack, method, true);
-                WebBeansUtil.configureInterceptorMethods(interceptor, interceptor.getClazz(),
PostConstruct.class, true, true, stack, method, true);
-                WebBeansUtil.configureInterceptorMethods(interceptor, interceptor.getClazz(),
PreDestroy.class, true, true, stack, method, true);
+                Annotation[] result = new Annotation[interceptorAnns.size()];
+                result = interceptorAnns.toArray(result);
+    
+                Set<Interceptor<?>> setInterceptors = findDeployedWebBeansInterceptor(result);
+                
+                if(componentInterceptors != null)
+                {
+                    setInterceptors.removeAll(componentInterceptors);   
+                }
+    
+                Iterator<Interceptor<?>> it = setInterceptors.iterator();
+    
+                while (it.hasNext())
+                {
+                    WebBeansInterceptor<?> interceptor = (WebBeansInterceptor<?>)
it.next();
+    
+                    WebBeansUtil.configureInterceptorMethods(interceptor, interceptor.getClazz(),
AroundInvoke.class, true, true, stack, method, true);
+                    WebBeansUtil.configureInterceptorMethods(interceptor, interceptor.getClazz(),
PostConstruct.class, true, true, stack, method, true);
+                    WebBeansUtil.configureInterceptorMethods(interceptor, interceptor.getClazz(),
PreDestroy.class, true, true, stack, method, true);
+                }
             }
         }
 

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java?rev=902270&r1=902269&r2=902270&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/TestContext.java
Fri Jan 22 21:17:31 2010
@@ -419,17 +419,13 @@
         ManagedBean<T> component = null;
 
         ManagedBeanConfigurator.checkManagedBeanCondition(clazz);
-        {
-            // This is the interceptor class
-            if (InterceptorsManager.getInstance().isInterceptorEnabled(clazz))
-            {
-                InterceptorUtil.checkInterceptorConditions(clazz);
-                component = ManagedBeanConfigurator.define(clazz, WebBeansType.INTERCEPTOR);
-                WebBeansInterceptorConfig.configureInterceptorClass((ManagedBean<Object>)
component, 
-                        AnnotationUtil.getInterceptorBindingMetaAnnotations(clazz.getDeclaredAnnotations()));
-            }
+        
+        InterceptorsManager.getInstance().addNewInterceptor(clazz);
+        InterceptorUtil.checkInterceptorConditions(clazz);
+        component = ManagedBeanConfigurator.define(clazz, WebBeansType.INTERCEPTOR);
+        WebBeansInterceptorConfig.configureInterceptorClass((ManagedBean<Object>) component,

+                AnnotationUtil.getInterceptorBindingMetaAnnotations(clazz.getDeclaredAnnotations()));
 
-        }
 
         return component;
     }

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/ComponentWithObserves2.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/ComponentWithObserves2.java?rev=902270&r1=902269&r2=902270&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/ComponentWithObserves2.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/ComponentWithObserves2.java
Fri Jan 22 21:17:31 2010
@@ -1,15 +1,18 @@
 /*
- * 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.
+ *  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.webbeans.test.component.event.normal;
 
@@ -28,12 +31,20 @@
 
     private String user;
 
+    /** This gets set via the TransactionalInterceptor */
+    public static boolean hasBeenIntercepted;
+
     public void afterLogin(@Observes @Role(value = "USER") LoggedInEvent event, PaymentProcessorComponent
payment)
     {
+        hasBeenIntercepted = false;
         this.payment = payment.getPaymentCheck();
         this.user = event.getUserName();
     }
 
+    /**
+     * Test if observer functions can be intercepted
+     */
+    @Transactional
     public void afterAdminLogin(@Observes @Role(value = "ADMIN") LoggedInEvent event, PaymentProcessorComponent
payment)
     {
         this.payment = payment.getPaymentCheck();

Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/Transactional.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/Transactional.java?rev=902270&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/Transactional.java
(added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/Transactional.java
Fri Jan 22 21:17:31 2010
@@ -0,0 +1,32 @@
+/*
+ *  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.webbeans.test.component.event.normal;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.interceptor.InterceptorBinding;
+
+@InterceptorBinding
+@Retention(RetentionPolicy.RUNTIME)
+@Target( { ElementType.TYPE, ElementType.METHOD })
+public @interface Transactional 
+{
+
+}

Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java?rev=902270&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java
(added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/component/event/normal/TransactionalInterceptor.java
Fri Jan 22 21:17:31 2010
@@ -0,0 +1,43 @@
+/*
+ *  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.webbeans.test.component.event.normal;
+
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptor;
+import javax.interceptor.InvocationContext;
+
+@Interceptor
+@Transactional
+public class TransactionalInterceptor
+{
+
+    @AroundInvoke
+    public Object caller(InvocationContext context) throws Exception
+    {
+        try
+        {
+            ComponentWithObserves2.hasBeenIntercepted = true;
+            return context.proceed();
+            
+        }catch(Exception e)
+        {
+            ComponentWithObserves2.hasBeenIntercepted = false;
+        }
+        
+        return null;
+    }
+}

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/component/ObserversComponentTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/component/ObserversComponentTest.java?rev=902270&r1=902269&r2=902270&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/component/ObserversComponentTest.java
(original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/event/component/ObserversComponentTest.java
Fri Jan 22 21:17:31 2010
@@ -1,15 +1,18 @@
 /*
- * 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.
+ *  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.webbeans.test.unittests.event.component;
 
@@ -31,6 +34,7 @@
 import org.apache.webbeans.test.component.event.normal.ComponentWithObservable1;
 import org.apache.webbeans.test.component.event.normal.ComponentWithObserves1;
 import org.apache.webbeans.test.component.event.normal.ComponentWithObserves2;
+import org.apache.webbeans.test.component.event.normal.TransactionalInterceptor;
 import org.apache.webbeans.test.event.LoggedInEvent;
 import org.apache.webbeans.util.WebBeansUtil;
 import org.junit.Before;
@@ -152,6 +156,7 @@
     {
         clear();
 
+        defineInterceptor(TransactionalInterceptor.class);
         defineManagedBean(CheckWithCheckPayment.class);
         defineManagedBean(CheckWithMoneyPayment.class);
         defineManagedBean(PaymentProcessorComponent.class);
@@ -180,21 +185,35 @@
 
         }
 
+        ComponentWithObserves2.hasBeenIntercepted = false;
+        
         Annotation[] anns = new Annotation[1];
         anns[0] = new RoleUser();
 
         getManager().fireEvent(event, anns);
         ComponentWithObserves2 instance = getManager().getInstance(component);
 
+        Assert.assertFalse(ComponentWithObserves2.hasBeenIntercepted);
+        
         Assert.assertNotNull(instance.getPayment());
         Assert.assertEquals("USER", instance.getUser());
 
         anns[0] = new RoleAdmin();
         event = new LoggedInEvent("ADMIN");
+        
+        getManager().fireEvent(event, anns);
+        instance = getManager().getInstance(component);
+
+        Assert.assertTrue(ComponentWithObserves2.hasBeenIntercepted);
+        Assert.assertNotNull(instance.getPayment());
+        Assert.assertEquals("ADMIN", instance.getUser());
 
+        // lessons learned: do it again sam! ;)
+        ComponentWithObserves2.hasBeenIntercepted = false;
         getManager().fireEvent(event, anns);
         instance = getManager().getInstance(component);
 
+        Assert.assertTrue(ComponentWithObserves2.hasBeenIntercepted);
         Assert.assertNotNull(instance.getPayment());
         Assert.assertEquals("ADMIN", instance.getUser());
 



Mime
View raw message