[jboss-cvs] JBossAS SVN: r72167 - in projects/ejb3/trunk/interceptors/src: main/java/org/jboss/ejb3/interceptors/container and 3 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Apr 14 07:48:11 EDT 2008


Author: kabir.khan at jboss.com
Date: 2008-04-14 07:48:11 -0400 (Mon, 14 Apr 2008)
New Revision: 72167

Added:
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/util/ThreadLocalStack.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/Interceptions.java
Modified:
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/ManagedObjectAdvisorInstanceInterceptor.java
   projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/ManagedObjectAdvisor.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/MyInterface.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/PerInstanceInterceptor.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/PerJoinpointInterceptor.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/ProxiedBean.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java
   projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/unit/ProxyInstanceAdvisorTestCase.java
Log:
[EJBTHREE-1275] The InstanceAdvisorDelegate storing the PER_INSTANCE and PER_JOINPOINT interceptors should be per thread, not global, in the ManagedObjectAdvisor

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/ManagedObjectAdvisorInstanceInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/ManagedObjectAdvisorInstanceInterceptor.java	2008-04-14 11:35:25 UTC (rev 72166)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/aop/ManagedObjectAdvisorInstanceInterceptor.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -30,6 +30,7 @@
 import org.jboss.aop.advice.Interceptor;
 import org.jboss.aop.joinpoint.Invocation;
 import org.jboss.ejb3.interceptors.container.ManagedObjectAdvisor;
+import org.jboss.logging.Logger;
 
 /**
  * 
@@ -38,6 +39,8 @@
  */
 public class ManagedObjectAdvisorInstanceInterceptor implements Interceptor
 {
+   Logger log = Logger.getLogger(ManagedObjectAdvisorInstanceInterceptor.class);
+   
    private Map<Object, InstanceAdvisorDelegate> instanceAdvisorDelegates;
    
    public String getName()
@@ -51,15 +54,15 @@
       ManagedObjectAdvisor advisor = (ManagedObjectAdvisor)invocation.getAdvisor();
 
       InstanceAdvisorDelegate delegate = getInstanceAdvisorDelegate(invocation.getTargetObject(), advisor, advisor);
-      InstanceAdvisorDelegate oldDelegate = advisor.getThreadedInstanceAdvisorDelegate();
       try
       {
-         advisor.setThreadedInstanceAdvisorDelegate(delegate);
+         log.info("Puxhing ia delegate " + delegate + " for " + invocation.getTargetObject());
+         advisor.pushThreadedInstanceAdvisorDelegate(delegate);
          return invocation.invokeNext();
       }
       finally
       {
-         advisor.setThreadedInstanceAdvisorDelegate(oldDelegate);
+         advisor.popThreadedInstanceAdvisorDelegate();
       }
    }
    

Modified: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/ManagedObjectAdvisor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/ManagedObjectAdvisor.java	2008-04-14 11:35:25 UTC (rev 72166)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/container/ManagedObjectAdvisor.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -43,6 +43,7 @@
 import org.jboss.aop.metadata.SimpleMetaData;
 import org.jboss.ejb3.interceptors.ManagedObject;
 import org.jboss.ejb3.interceptors.aop.ExtendedAdvisor;
+import org.jboss.ejb3.interceptors.util.ThreadLocalStack;
 import org.jboss.ejb3.metadata.annotation.ExtendedAnnotationRepository;
 import org.jboss.logging.Logger;
 
@@ -62,8 +63,9 @@
    private InstanceAdvisorDelegate instanceAdvisorDelegate;
    
    /** The instance advisor delegate set per invocation should be maintained per thread, not globally */ 
-   private ThreadLocal<InstanceAdvisorDelegate> threadedInstanceAdvisorDelegate; 
+   private ThreadLocalStack<InstanceAdvisorDelegate> threadedInstanceAdvisorDelegateStack;
    
+   
    protected ManagedObjectAdvisor(C container, String name, AspectManager manager)
    {
       this(container, name, manager, null);
@@ -184,9 +186,9 @@
     */
    private final InstanceAdvisorDelegate getInstanceAdvisorDelegate()
    {
-      if (threadedInstanceAdvisorDelegate != null)
+      if (threadedInstanceAdvisorDelegateStack != null)
       {
-         InstanceAdvisorDelegate delegate = threadedInstanceAdvisorDelegate.get();
+         InstanceAdvisorDelegate delegate = threadedInstanceAdvisorDelegateStack.get();
          if (delegate != null)
          {
             return delegate;
@@ -207,22 +209,22 @@
       return instanceAdvisorDelegate;
    }
    
-   public final void setThreadedInstanceAdvisorDelegate(InstanceAdvisorDelegate delegate)
+   public final void pushThreadedInstanceAdvisorDelegate(InstanceAdvisorDelegate delegate)
    {
-      if (threadedInstanceAdvisorDelegate == null)
+      if (threadedInstanceAdvisorDelegateStack == null)
       {
-         threadedInstanceAdvisorDelegate = new ThreadLocal<InstanceAdvisorDelegate>();
+         threadedInstanceAdvisorDelegateStack = new ThreadLocalStack<InstanceAdvisorDelegate>();
       }
-      threadedInstanceAdvisorDelegate.set(delegate);
+      threadedInstanceAdvisorDelegateStack.push(delegate);
    }
    
-   public final InstanceAdvisorDelegate getThreadedInstanceAdvisorDelegate()
+   public final InstanceAdvisorDelegate popThreadedInstanceAdvisorDelegate()
    {
-      if (threadedInstanceAdvisorDelegate == null)
+      if (threadedInstanceAdvisorDelegateStack == null)
       {
          return null;
       }
-      return threadedInstanceAdvisorDelegate.get();
+      return threadedInstanceAdvisorDelegateStack.pop();
    }
    
    public void appendInterceptor(Interceptor interceptor)

Added: projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/util/ThreadLocalStack.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/util/ThreadLocalStack.java	                        (rev 0)
+++ projects/ejb3/trunk/interceptors/src/main/java/org/jboss/ejb3/interceptors/util/ThreadLocalStack.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -0,0 +1,78 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.ejb3.interceptors.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Comment
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @version $Revision: 61136 $
+ */
+public class ThreadLocalStack<T>
+{
+   private ThreadLocal<ArrayList<T>> stack = new ThreadLocal<ArrayList<T>>();
+
+   public void push(T obj)
+   {
+      ArrayList<T> list = stack.get();
+      if (list == null)
+      {
+         list = new ArrayList<T>(1);
+         stack.set(list);
+      }
+      list.add(obj);
+   }
+
+   public T pop()
+   {
+      ArrayList<T> list = stack.get();
+      if (list == null)
+      {
+         return null;
+      }
+      T rtn = list.remove(list.size() - 1);
+      if (list.size() == 0)
+      {
+         stack.set(null);
+         list.clear();
+      }
+      return rtn;
+   }
+
+   public T get()
+   {
+      ArrayList<T> list = (ArrayList<T>)stack.get();
+      if (list == null)
+      {
+         return null;
+      }
+      return list.get(list.size() - 1);
+   }
+
+   public List<T> getList()
+   {
+      return stack.get();     
+   }
+}

Added: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/Interceptions.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/Interceptions.java	                        (rev 0)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/Interceptions.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -0,0 +1,143 @@
+/*
+* JBoss, Home of Professional Open Source.
+* Copyright 2006, Red Hat Middleware LLC, and individual contributors
+* as indicated by the @author tags. See the copyright.txt file in the
+* distribution for a full listing of individual contributors. 
+*
+* This is free software; you can redistribute it and/or modify it
+* under the terms of the GNU Lesser General Public License as
+* published by the Free Software Foundation; either version 2.1 of
+* the License, or (at your option) any later version.
+*
+* This software is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this software; if not, write to the Free
+* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+*/ 
+package org.jboss.ejb3.test.interceptors.proxyinstanceadvisor;
+
+/**
+ * 
+ * @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
+ * @version $Revision: 1.1 $
+ */
+public class Interceptions
+{
+   private static ThreadLocal<PerInstanceInterceptor> perInstanceInterceptor = new ThreadLocal<PerInstanceInterceptor>();
+   
+   private static ThreadLocal<PerJoinpointInterceptor> perJoinpointInterceptor = new ThreadLocal<PerJoinpointInterceptor>();
+   
+   private static ThreadLocal<ProxiedBean> proxiedBean = new ThreadLocal<ProxiedBean>();
+   
+   private static ThreadLocal<Integer> perInstanceCalls = new ThreadLocal<Integer>()
+   {
+      @Override
+      protected Integer initialValue()
+      {
+         return 0;
+      }
+   };
+   
+   private static ThreadLocal<Integer> perJoinpointCalls = new ThreadLocal<Integer>()
+   {
+      @Override
+      protected Integer initialValue()
+      {
+         return 0;
+      }
+   };
+
+   private static ThreadLocal<Integer> proxiedBeanCalls = new ThreadLocal<Integer>()
+   {
+      @Override
+      protected Integer initialValue()
+      {
+         return 0;
+      }
+   };
+
+   public static PerInstanceInterceptor getPerInstanceInterceptor()
+   {
+      return perInstanceInterceptor.get();
+   }
+   
+   public static void setPerInstanceInterceptor(PerInstanceInterceptor perInstanceInterceptor)
+   {
+      Interceptions.perInstanceInterceptor.set(perInstanceInterceptor);
+      addPerInstanceCall();
+   }
+   
+   public static PerJoinpointInterceptor getPerJoinpointInterceptor()
+   {
+      return perJoinpointInterceptor.get();
+   }
+   
+   public static void setPerJoinpointInterceptor(PerJoinpointInterceptor perJoinpointInterceptor)
+   {
+      Interceptions.perJoinpointInterceptor.set(perJoinpointInterceptor);
+      addPerJoinpointCall();
+   }
+   
+   public static ProxiedBean getProxiedBean()
+   {
+      return proxiedBean.get();
+   }
+   
+   public static void setProxiedBean(ProxiedBean proxiedBean)
+   {
+      Interceptions.proxiedBean.set(proxiedBean);
+      addProxiedBeanCall();
+   }
+   
+   public static synchronized int getPerInstanceCalls()
+   {
+      return perInstanceCalls.get();
+   }
+   
+   private static synchronized void addPerInstanceCall()
+   {
+      int calls = getPerInstanceCalls();
+      calls++;
+      Interceptions.perInstanceCalls.set(calls);
+   }
+   
+   public static synchronized int getPerJoinpointCalls()
+   {
+      return perJoinpointCalls.get();
+   }
+   
+   private static void addPerJoinpointCall()
+   {
+      int calls = getPerJoinpointCalls();
+      calls++;
+      Interceptions.perJoinpointCalls.set(calls);
+   }
+   
+   public static synchronized int getProxiedBeanCalls()
+   {
+      return proxiedBeanCalls.get();
+   }
+   
+   private static void addProxiedBeanCall()
+   {
+      int calls = getProxiedBeanCalls();
+      calls++;
+      Interceptions.proxiedBeanCalls.set(calls);
+   }
+   
+   public static void reset()
+   {
+      perInstanceInterceptor.set(null);
+      perJoinpointInterceptor.set(null);
+      proxiedBean.set(null);
+      perInstanceCalls.set(0);
+      perJoinpointCalls.set(0);
+      proxiedBeanCalls.set(0);
+   }
+   
+}

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/MyInterface.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/MyInterface.java	2008-04-14 11:35:25 UTC (rev 72166)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/MyInterface.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -32,4 +32,6 @@
    String sayHi(String name);
    
    String sayBye(String name);
+   
+   String sleepyHello(long ms, String name);
 }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/PerInstanceInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/PerInstanceInterceptor.java	2008-04-14 11:35:25 UTC (rev 72166)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/PerInstanceInterceptor.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -34,8 +34,6 @@
 {
    Logger log = Logger.getLogger(PerInstanceInterceptor.class);
    
-   public static PerInstanceInterceptor instance;
-   
    public String getName()
    {
       return this.getClass().getName();
@@ -43,7 +41,7 @@
 
    public Object invoke(Invocation invocation) throws Throwable
    {
-      instance = this;
+      Interceptions.setPerInstanceInterceptor(this);
       return invocation.invokeNext();
    }
 

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/PerJoinpointInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/PerJoinpointInterceptor.java	2008-04-14 11:35:25 UTC (rev 72166)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/PerJoinpointInterceptor.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -34,8 +34,6 @@
 {
    Logger log = Logger.getLogger(PerJoinpointInterceptor.class);
 
-   public static PerJoinpointInterceptor instance;
-   
    public String getName()
    {
       return this.getClass().getName();
@@ -43,7 +41,7 @@
 
    public Object invoke(Invocation invocation) throws Throwable
    {
-      instance = this;
+      Interceptions.setPerJoinpointInterceptor(this);
       return invocation.invokeNext();
    }
 }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/ProxiedBean.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/ProxiedBean.java	2008-04-14 11:35:25 UTC (rev 72166)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/ProxiedBean.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -36,8 +36,6 @@
 {
    private static final Logger log = Logger.getLogger(ProxiedBean.class);
    
-   public static ProxiedBean instance;
-   
 //   public static int constructors = 0, aroundInvokes = 0;
    
    public ProxiedBean()
@@ -60,15 +58,30 @@
    
    public String sayHi(String name)
    {
-      instance = this;
+      Interceptions.setProxiedBean(this);
       log.debug("sayHi");
       return "Hi " + name;
    }
 
    public String sayBye(String name)
    {
-      instance = this;
+      Interceptions.setProxiedBean(this);
       log.debug("sayBye");
       return "Bye " + name;
    }
+
+   public String sleepyHello(long ms, String name)
+   {
+      log.debug("sleepyHello");
+      try
+      {
+         Thread.sleep(ms);
+      }
+      catch (InterruptedException e)
+      {
+         throw new RuntimeException(e);
+      }
+      Interceptions.setProxiedBean(this);
+      return "Hi " + name;
+   }
 }

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java	2008-04-14 11:35:25 UTC (rev 72166)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/SimplePoolInterceptor.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -39,6 +39,7 @@
    private static ProxiedBean pooledBean;
    
    Logger log = Logger.getLogger(SimplePoolInterceptor.class);
+
    public String getName()
    {
       return this.getClass().getName();
@@ -57,6 +58,9 @@
       SimpleContext ctx = (SimpleContext)mi.getBeanContext(); 
       ProxiedBean bean = createNewInstance ? new ProxiedBean() : pooledBean;
       pooledBean = bean;
+      
+      log.debug("Using instance " + bean);
+      
       ctx.setInstance(bean);
       //mi.setTargetObject(bean);
       mi.setBeanContext(ctx);

Modified: projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/unit/ProxyInstanceAdvisorTestCase.java
===================================================================
--- projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/unit/ProxyInstanceAdvisorTestCase.java	2008-04-14 11:35:25 UTC (rev 72166)
+++ projects/ejb3/trunk/interceptors/src/test/java/org/jboss/ejb3/test/interceptors/proxyinstanceadvisor/unit/ProxyInstanceAdvisorTestCase.java	2008-04-14 11:48:11 UTC (rev 72167)
@@ -24,6 +24,7 @@
 import junit.framework.TestCase;
 
 import org.jboss.ejb3.test.interceptors.common.AOPDeployer;
+import org.jboss.ejb3.test.interceptors.proxyinstanceadvisor.Interceptions;
 import org.jboss.ejb3.test.interceptors.proxyinstanceadvisor.MyInterface;
 import org.jboss.ejb3.test.interceptors.proxyinstanceadvisor.PerInstanceInterceptor;
 import org.jboss.ejb3.test.interceptors.proxyinstanceadvisor.PerJoinpointInterceptor;
@@ -42,68 +43,217 @@
 {
    private static final Logger log = Logger.getLogger(ProxyInstanceAdvisorTestCase.class);
 
+   AOPDeployer deployer = new AOPDeployer("proxyinstanceadvisor/jboss-aop.xml");
+   
+   @Override
+   protected void setUp() throws Exception
+   {
+      log.info(deployer.deploy());
+   }
+
+   @Override
+   protected void tearDown() throws Exception
+   {
+      log.info(deployer.undeploy());
+   }
+
    public void test1() throws Throwable
    {
       log.info("======= ProxyInstanceAdvisor.test1()");
       //AspectManager.verbose = true;
       
-      AOPDeployer deployer = new AOPDeployer("proxyinstanceadvisor/jboss-aop.xml");
-      try
-      {
-         // Bootstrap AOP
-         log.info(deployer.deploy());
+      Thread.currentThread().setContextClassLoader(MyInterface.class.getClassLoader());
+      
+      ProxyContainerWithPool<ProxiedBean> container = new ProxyContainerWithPool<ProxiedBean>("ProxyInstanceAdvisorTestCase", "InterceptorContainer", ProxiedBean.class);
+      
+      
+      Class<?> interfaces[] = { MyInterface.class };
+      MyInterface proxy = container.constructProxy(interfaces);
+      
+      
+      reset(true);
+      String result = proxy.sayHi("Me");
+      assertEquals("Hi Me", result);
+      ProxiedBean bean1hi = Interceptions.getProxiedBean();
+      PerInstanceInterceptor pi1hi = Interceptions.getPerInstanceInterceptor();
+      PerJoinpointInterceptor pj1hi = Interceptions.getPerJoinpointInterceptor();
+      assertEquals(1, Interceptions.getProxiedBeanCalls());
+      assertEquals(1, Interceptions.getPerInstanceCalls());
+      assertEquals(1, Interceptions.getPerJoinpointCalls());
+      
+      reset(false);
+      result = proxy.sayBye("Me");
+      assertEquals("Bye Me", result);
+      ProxiedBean bean1bye = Interceptions.getProxiedBean();
+      PerInstanceInterceptor pi1bye = Interceptions.getPerInstanceInterceptor();
+      PerJoinpointInterceptor pj1bye = Interceptions.getPerJoinpointInterceptor();
+      assertEquals(1, Interceptions.getProxiedBeanCalls());
+      assertEquals(1, Interceptions.getPerInstanceCalls());
+      assertEquals(1, Interceptions.getPerJoinpointCalls());
+      
+      assertSame(bean1hi, bean1bye);
+      assertSame(pi1hi, pi1bye);
+      assertNotSame(pj1hi, pj1bye);
+
+      reset(true);
+      result = proxy.sayHi("Me");
+      assertEquals("Hi Me", result);
+      ProxiedBean bean2hi = Interceptions.getProxiedBean();
+      PerInstanceInterceptor pi2hi = Interceptions.getPerInstanceInterceptor();
+      PerJoinpointInterceptor pj2hi = Interceptions.getPerJoinpointInterceptor();
+      assertNotSame(bean1hi, bean2hi);
+      assertEquals(1, Interceptions.getProxiedBeanCalls());
+      assertEquals(1, Interceptions.getPerInstanceCalls());
+      assertEquals(1, Interceptions.getPerJoinpointCalls());
+      
+      //FIXME - These must be enabled to start the test
+      assertNotSame(pi2hi, pi1hi);
+      assertNotSame(pj2hi, pj1hi);
+
+      log.info("======= Done");
+   }
    
-         Thread.currentThread().setContextClassLoader(MyInterface.class.getClassLoader());
-         
-         ProxyContainerWithPool<ProxiedBean> container = new ProxyContainerWithPool<ProxiedBean>("ProxyInstanceAdvisorTestCase", "InterceptorContainer", ProxiedBean.class);
-         
-         
-         Class<?> interfaces[] = { MyInterface.class };
-         MyInterface proxy = container.constructProxy(interfaces);
-         
-         
-         reset(true);
-         String result = proxy.sayHi("Me");
-         assertEquals("Hi Me", result);
-         ProxiedBean bean1hi = ProxiedBean.instance;
-         PerInstanceInterceptor pi1hi = PerInstanceInterceptor.instance;
-         PerJoinpointInterceptor pj1hi = PerJoinpointInterceptor.instance;
-         
-         reset(false);
-         result = proxy.sayBye("Me");
-         assertEquals("Bye Me", result);
-         ProxiedBean bean1bye = ProxiedBean.instance;
-         PerInstanceInterceptor pi1bye = PerInstanceInterceptor.instance;
-         PerJoinpointInterceptor pj1bye = PerJoinpointInterceptor.instance;
-         
-         assertSame(bean1hi, bean1bye);
-         assertSame(pi1hi, pi1bye);
-         assertNotSame(pj1hi, pj1bye);
+   public void testThreadedDifferentInstance() throws Throwable
+   {
+      log.info("======= ProxyInstanceAdvisor.test1()");
+      runThreadedTest(true);
+      log.info("======= Done");
+   }
    
-         reset(true);
-         result = proxy.sayHi("Me");
-         assertEquals("Hi Me", result);
-         ProxiedBean bean2hi = ProxiedBean.instance;
-         PerInstanceInterceptor pi2hi = PerInstanceInterceptor.instance;
-         PerJoinpointInterceptor pj2hi = PerJoinpointInterceptor.instance;
-         assertNotSame(bean1hi, bean2hi);
-         
-         //FIXME - These must be enabled to start the test
-         assertNotSame(pi2hi, pi1hi);
-         assertNotSame(pj2hi, pj1hi);
+   public void testThreadedSameInstance() throws Throwable
+   {
+      log.info("======= ProxyInstanceAdvisor.test1()");
+      runThreadedTest(false);
+      log.info("======= Done");
+   }
+   
+   private void runThreadedTest(boolean differentInstances) throws Throwable
+   {
+      //AspectManager.verbose = true;
+      
+      Thread.currentThread().setContextClassLoader(MyInterface.class.getClassLoader());
+      
+      ProxyContainerWithPool<ProxiedBean> container = new ProxyContainerWithPool<ProxiedBean>("ProxyInstanceAdvisorTestCase", "InterceptorContainer", ProxiedBean.class);
+
+      Class<?> interfaces[] = { MyInterface.class };
+      MyInterface proxy = container.constructProxy(interfaces);
+
+      CallSleepyHelloRunnable sleepyRunner = new CallSleepyHelloRunnable(proxy, 5000);
+      Thread thread = new Thread(sleepyRunner);
+      System.out.println("My thread " + Thread.currentThread().getName() + " new thread " + thread.getName());
+      thread.start();
+      
+      //Give other thread a chance to start
+      Thread.sleep(1000);         
+      
+      reset(differentInstances);
+      
+      String result = proxy.sleepyHello(0, "Me");
+      assertEquals("Hi Me", result);
+      ProxiedBean beanMine = Interceptions.getProxiedBean();
+      PerInstanceInterceptor piMine = Interceptions.getPerInstanceInterceptor();
+      PerJoinpointInterceptor pjMine = Interceptions.getPerJoinpointInterceptor();
+      assertEquals(1, Interceptions.getProxiedBeanCalls());
+      assertEquals(1, Interceptions.getPerInstanceCalls());
+      assertEquals(1, Interceptions.getPerJoinpointCalls());
+
+      while(thread.isAlive())
+      {
+         Thread.sleep(500);
       }
-      finally
+      
+      ProxiedBean beanThread = sleepyRunner.getProxiedBean();
+      PerInstanceInterceptor piThread = sleepyRunner.getPerInstanceInterceptor();
+      PerJoinpointInterceptor pjThread = sleepyRunner.getPerJoinpointInterceptor();
+      assertEquals(1, sleepyRunner.getProxiedBeanCalls());
+      assertEquals(1, sleepyRunner.getPerInstanceCalls());
+      assertEquals(1, sleepyRunner.getPerJoinpointCalls());
+      
+      assertNotNull(beanThread);
+      assertNotNull(piThread);
+      assertNotNull(pjThread);
+      
+      if (differentInstances)
       {
-         log.info(deployer.undeploy());
+         assertNotSame(beanMine, beanThread);
+         assertNotSame(piMine, piThread);
+         assertNotSame(pjMine, pjThread);
       }
+      else
+      {
+         assertSame(beanMine, beanThread);
+         assertSame(piMine, piThread);
+         assertSame(pjMine, pjThread);
+      }
       log.info("======= Done");
    }
    
-   private void reset(boolean createNewInstance)
+   
+   private static void reset(boolean createNewInstance)
    {
-      ProxiedBean.instance = null;
-      PerInstanceInterceptor.instance = null;
-      PerJoinpointInterceptor.instance = null;
+      Interceptions.reset();
+      System.out.println("Setting createNewInstance " + createNewInstance + " for thread " + Thread.currentThread().getName());
       SimplePoolInterceptor.createNewInstance = createNewInstance;      
    }
+   
+   private static class CallSleepyHelloRunnable implements Runnable
+   {
+      MyInterface proxy;
+      long sleepTime;
+    
+      PerInstanceInterceptor perInstanceInterceptor;
+      PerJoinpointInterceptor perJoinpointInterceptor;
+      ProxiedBean proxiedBean;
+      int proxiedBeanCalls;
+      int perInstanceCalls;
+      int perJoinpointCalls;
+      
+      public CallSleepyHelloRunnable(MyInterface proxy, long sleepTime)
+      {
+         this.proxy = proxy;
+         this.sleepTime = sleepTime;
+      }
+
+      public void run()
+      {
+         reset(true);
+         proxy.sleepyHello(sleepTime, "Kabir");
+         perInstanceInterceptor = Interceptions.getPerInstanceInterceptor();
+         perJoinpointInterceptor = Interceptions.getPerJoinpointInterceptor();
+         proxiedBean = Interceptions.getProxiedBean();
+         proxiedBeanCalls = Interceptions.getProxiedBeanCalls();
+         perInstanceCalls = Interceptions.getPerInstanceCalls();
+         perJoinpointCalls = Interceptions.getPerJoinpointCalls();
+      }
+
+      public PerInstanceInterceptor getPerInstanceInterceptor()
+      {
+         return perInstanceInterceptor;
+      }
+
+      public PerJoinpointInterceptor getPerJoinpointInterceptor()
+      {
+         return perJoinpointInterceptor;
+      }
+
+      public ProxiedBean getProxiedBean()
+      {
+         return proxiedBean;
+      }
+
+      public int getProxiedBeanCalls()
+      {
+         return proxiedBeanCalls;
+      }
+
+      public int getPerInstanceCalls()
+      {
+         return perInstanceCalls;
+      }
+
+      public int getPerJoinpointCalls()
+      {
+         return perJoinpointCalls;
+      }
+   }
 }




More information about the jboss-cvs-commits mailing list