You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2013/10/31 10:57:51 UTC

svn commit: r1537421 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/intercept/ test/java/org/apache/webbeans/newtests/proxy/

Author: rmannibucau
Date: Thu Oct 31 09:57:51 2013
New Revision: 1537421

URL: http://svn.apache.org/r1537421
Log:
serializing self interceptor more particularly than other interceptorssince the bean doesn't exist as a bean in the bm

Added:
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InnerClassProxyTest.java
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InterceptorProxySerializationTest.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java?rev=1537421&r1=1537420&r2=1537421&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DefaultInterceptorHandler.java Thu Oct 31 09:57:51 2013
@@ -18,13 +18,18 @@
  */
 package org.apache.webbeans.intercept;
 
+import org.apache.webbeans.component.InjectionTargetBean;
+import org.apache.webbeans.component.SelfInterceptorBean;
+import org.apache.webbeans.component.WebBeansType;
 import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.portable.InjectionTargetImpl;
 import org.apache.webbeans.proxy.InterceptorHandler;
 import org.apache.webbeans.util.ExceptionUtil;
 import org.apache.webbeans.util.WebBeansUtil;
 
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
+import javax.enterprise.inject.spi.InjectionTarget;
 import javax.enterprise.inject.spi.InterceptionType;
 import javax.enterprise.inject.spi.Interceptor;
 import java.io.Externalizable;
@@ -42,6 +47,8 @@ import java.util.Map;
 
 public class DefaultInterceptorHandler<T> implements InterceptorHandler, Externalizable
 {
+    private static final String SELF_KEY = "SELF_INTERCEPTOR";
+
     /**
      * The native contextual instance target instance.
      * This is the unproxies and undecorated instance.
@@ -180,8 +187,10 @@ public class DefaultInterceptorHandler<T
         for (final Map.Entry<Interceptor<?>, ?> entry : instances.entrySet())
         {
             final Interceptor<?> key = entry.getKey();
-            serializeInterceptor(out, key);
-            out.writeObject(entry.getValue());
+            if (serializeInterceptor(out, key))
+            {
+                out.writeObject(entry.getValue());
+            }
         }
 
         out.writeInt(interceptors.size());
@@ -223,9 +232,16 @@ public class DefaultInterceptorHandler<T
         final Map<Interceptor<?>, Object> tmpInstances = new HashMap<Interceptor<?>, Object>();
         for (int i = 0; i < instancesSize; i++)
         {
-            final Interceptor<?> bean = (Interceptor<?>) beanManager.getPassivationCapableBean(in.readUTF());
-            final Object value = in.readObject();
-            tmpInstances.put(bean, value);
+            final Interceptor<?> interceptor = readInterceptor(in.readUTF(), beanManager);
+            if (!SelfInterceptorBean.class.isInstance(interceptor))
+            {
+                final Object value = in.readObject();
+                tmpInstances.put(interceptor, value);
+            }
+            else
+            {
+                tmpInstances.put(interceptor, target);
+            }
         }
         instances = tmpInstances;
 
@@ -250,7 +266,7 @@ public class DefaultInterceptorHandler<T
             final List<Interceptor<?>> interceptorList = new ArrayList<Interceptor<?>>(interceptorListSize);
             for (int j = 0; j < interceptorListSize; j++)
             {
-                interceptorList.add((Interceptor<?>) beanManager.getPassivationCapableBean(in.readUTF()));
+                interceptorList.add(readInterceptor(in.readUTF(), beanManager));
             }
             interceptors.put(method, interceptorList);
         }
@@ -258,13 +274,52 @@ public class DefaultInterceptorHandler<T
         beanPassivationId = in.readUTF();
     }
 
-    private static void serializeInterceptor(final ObjectOutput out, final Interceptor<?> key) throws IOException
+    /**
+     * @return false if the interceptor value can be ignored
+     */
+    private static boolean serializeInterceptor(final ObjectOutput out, final Interceptor<?> key) throws IOException
     {
+        if (SelfInterceptorBean.class.isInstance(key))
+        {
+            final String beanName = WebBeansUtil.getPassivationId(key)
+                .replace(WebBeansType.INTERCEPTOR.name(), WebBeansType.MANAGED.name());
+            out.writeUTF(SELF_KEY + beanName);
+            return false;
+        }
+
         final String id = WebBeansUtil.getPassivationId(key);
         if (id == null)
         {
             throw new NotSerializableException(key + " is not serializable");
         }
         out.writeUTF(id);
+        return true;
+    }
+
+    private static Interceptor<?> readInterceptor(final String id, final BeanManager beanManager) throws IOException
+    {
+        if (id.startsWith(SELF_KEY))
+        {
+            final Bean<?> bean = beanManager.getPassivationCapableBean(id.substring(SELF_KEY.length()));
+            if (InjectionTargetBean.class.isInstance(bean))
+            {
+                final InjectionTarget<?> it = InjectionTargetBean.class.cast(bean).getInjectionTarget();
+                if (InjectionTargetImpl.class.isInstance(it))
+                {
+                    final InterceptorResolutionService.BeanInterceptorInfo info = InjectionTargetImpl.class.cast(it)
+                                                                                                .getInterceptorInfo();
+                    return info.getSelfInterceptorBean();
+                }
+                else
+                {
+                    throw new NotSerializableException("Can't find self interceptor");
+                }
+            }
+            else
+            {
+                throw new NotSerializableException("Can't find self interceptor");
+            }
+        }
+        return (Interceptor<?>) beanManager.getPassivationCapableBean(id);
     }
 }

Added: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InnerClassProxyTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InnerClassProxyTest.java?rev=1537421&view=auto
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InnerClassProxyTest.java (added)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InnerClassProxyTest.java Thu Oct 31 09:57:51 2013
@@ -0,0 +1,99 @@
+/*
+ * 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.newtests.proxy;
+
+import org.apache.webbeans.newtests.AbstractUnitTest;
+import org.junit.Test;
+
+import javax.inject.Inject;
+import javax.interceptor.AroundInvoke;
+import javax.interceptor.Interceptor;
+import javax.interceptor.InterceptorBinding;
+import javax.interceptor.InvocationContext;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.Arrays;
+import java.util.Collections;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+public class InnerClassProxyTest extends AbstractUnitTest {
+    @Inject
+    private Foo foo;
+
+    @Test
+    public void proxy() throws IllegalAccessException, InstantiationException {
+        addInterceptor(InInterceptor.class);
+        startContainer(Arrays.asList(Foo.class, Inner.class), Collections.<String>emptyList(), true);
+        assertNotNull(foo);
+        try {
+            assertEquals("ok", foo.bar(false));
+        } catch (final Exception e) {
+            fail();
+        }
+        try {
+            foo.bar(true);
+            fail();
+        } catch (final Exception e) {
+            // no-op: ok
+        }
+        shutDownContainer();
+    }
+
+    @In
+    public static class Foo {
+        public String bar(final boolean b) throws Inner {
+            if (b) {
+                throw new Inner("fail");
+            }
+            return "ok";
+        }
+    }
+
+    @Interceptor
+    @In
+    public static class InInterceptor
+    {
+        @AroundInvoke
+        public Object invoke(InvocationContext context) throws Exception
+        {
+            return context.proceed();
+        }
+    }
+
+    @InterceptorBinding
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target( { ElementType.TYPE, ElementType.METHOD })
+    public static @interface In {
+    }
+
+    public static class Inner extends RuntimeException {
+        public Inner() {
+            // no-op
+        }
+
+        public Inner(final String message) {
+            super(message);
+        }
+    }
+}

Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InterceptorProxySerializationTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InterceptorProxySerializationTest.java?rev=1537421&r1=1537420&r2=1537421&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InterceptorProxySerializationTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/proxy/InterceptorProxySerializationTest.java Thu Oct 31 09:57:51 2013
@@ -21,6 +21,7 @@ package org.apache.webbeans.newtests.pro
 import org.apache.webbeans.newtests.AbstractUnitTest;
 import org.junit.Test;
 
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.interceptor.AroundInvoke;
 import javax.interceptor.Interceptor;
@@ -32,6 +33,7 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import java.util.ArrayList;
+import java.util.Arrays;
 
 import static org.apache.webbeans.newtests.util.Serializations.deserialize;
 import static org.apache.webbeans.newtests.util.Serializations.serialize;
@@ -43,11 +45,14 @@ public class InterceptorProxySerializati
     @Inject
     private Intercepted client;
 
+    @Inject
+    private AutoIntercepted auto;
+
     @Test
     public void testProxyMappingConfig() throws Exception
     {
         addInterceptor(IBInterceptor.class);
-        startContainer(new ArrayList<Class<?>>() {{ add(Intercepted.class); }}, null, true);
+        startContainer(Arrays.<Class<?>>asList(Intercepted.class, AutoIntercepted.class), null, true);
 
         try
         {
@@ -67,6 +72,35 @@ public class InterceptorProxySerializati
         }
     }
 
+    @Test
+    public void testSerializableEvenIfAutoIntercepted() throws Exception
+    {
+        addInterceptor(IBInterceptor.class);
+        startContainer(Arrays.<Class<?>>asList(Intercepted.class, AutoIntercepted.class), null, true);
+
+        try
+        {
+            AutoIntercepted.called = false;
+            auto.touch();
+            assertTrue(AutoIntercepted.called);
+
+            final AutoIntercepted deserializeInit = AutoIntercepted.class.cast(deserialize(serialize(auto)));
+
+            AutoIntercepted.called = false;
+            auto.touch();
+            assertTrue(AutoIntercepted.called);
+
+            final AutoIntercepted deserializeState = AutoIntercepted.class.cast(deserialize(serialize(deserializeInit)));
+            AutoIntercepted.called = false;
+            auto.touch();
+            assertTrue(AutoIntercepted.called);
+        }
+        finally
+        {
+            shutDownContainer();
+        }
+    }
+
     @InterceptorBinding
     @Target({ElementType.METHOD, ElementType.TYPE})
     @Retention(RetentionPolicy.RUNTIME)
@@ -117,4 +151,18 @@ public class InterceptorProxySerializati
             return false;
         }
     }
+
+    @IB
+    public static class AutoIntercepted implements Serializable
+    {
+        public static boolean called = false;
+
+        @AroundInvoke
+        public Object auto(final InvocationContext ic)  throws Exception {
+            called = true;
+            return ic.proceed();
+        }
+
+        public void touch() {}
+    }
 }