[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