From: Alexey L. <lou...@us...> - 2004-08-10 17:13:04
|
User: loubyansky Date: 04/08/10 10:12:57 Modified: src/main/org/jboss/ejb Container.java GlobalTxEntityMap.java SecurityActions.java Log: ported get/set tcl optimizations from Branch_3_2 Revision Changes Path 1.158 +11 -6 jboss/src/main/org/jboss/ejb/Container.java Index: Container.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/Container.java,v retrieving revision 1.157 retrieving revision 1.158 diff -u -r1.157 -r1.158 --- Container.java 8 Aug 2004 13:16:34 -0000 1.157 +++ Container.java 10 Aug 2004 17:12:56 -0000 1.158 @@ -34,7 +34,6 @@ import org.jboss.system.ServiceMBeanSupport; import org.jboss.util.NestedError; import org.jboss.util.NestedRuntimeException; -import org.jboss.webservice.WebServiceClientDeployer; import org.jboss.webservice.WebServiceClientHandler; import org.omg.CORBA.ORB; @@ -60,8 +59,6 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; -import java.security.PrivilegedAction; -import java.security.AccessController; /** * This is the base class for all EJB-containers in JBoss. A Container @@ -83,7 +80,7 @@ * @author <a href="bi...@bu...">Bill Burke</a> * @author <a href="mailto:d_j...@us...">David Jencks</a> * @author <a href="mailto:chr...@in...">Christoph G. Jung</a> - * @version $Revision: 1.157 $ + * @version $Revision: 1.158 $ * * @jmx.mbean extends="org.jboss.system.ServiceMBean" */ @@ -803,11 +800,16 @@ long start = System.currentTimeMillis(); Method m = null; + boolean setCl = false; Object type = null; String contextID = getJaccContextID(); try { - SecurityActions.setContextClassLoader(this.classLoader); + if(!callerClassLoader.equals(classLoader)) + { + setCl = true; + SecurityActions.setContextClassLoader(this.classLoader); + } // Set the JACC context id mi.setValue(InvocationKey.JACC_CONTEXT_ID, contextID); @@ -896,7 +898,10 @@ this.invokeStats.callOut(); // Restore the incoming class loader - SecurityActions.setContextClassLoader(callerClassLoader); + if(setCl) + { + SecurityActions.setContextClassLoader(callerClassLoader); + } // Restore the incoming context id contextID = SecurityActions.setContextID(contextID); } 1.14 +5 -48 jboss/src/main/org/jboss/ejb/GlobalTxEntityMap.java Index: GlobalTxEntityMap.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/GlobalTxEntityMap.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- GlobalTxEntityMap.java 3 Aug 2004 14:17:08 -0000 1.13 +++ GlobalTxEntityMap.java 10 Aug 2004 17:12:57 -0000 1.14 @@ -17,8 +17,6 @@ import javax.transaction.Transaction; import java.util.ArrayList; import java.util.List; -import java.security.PrivilegedAction; -import java.security.AccessController; /** * This class provides a way to find out what entities are contained in @@ -31,7 +29,7 @@ * * @author <a href="bi...@bu...">Bill Burke</a> * @author <a href="al...@jb...">Alexey Loubyansky</a> - * @version $Revision: 1.13 $ + * @version $Revision: 1.14 $ */ public class GlobalTxEntityMap { @@ -113,7 +111,7 @@ { EntityContainer container = (EntityContainer) instance.getContainer(); // set the context class loader before calling the store method - SetTCLAction.setContextClassLoader(container.getClassLoader(), thread); + SecurityActions.setContextClassLoader(thread, container.getClassLoader()); // store it container.invokeEjbStore(instance); @@ -130,7 +128,7 @@ EntityContainer container = (EntityContainer) instance.getContainer(); // set the context class loader before calling the store method - SetTCLAction.setContextClassLoader(container.getClassLoader(), thread); + SecurityActions.setContextClassLoader(thread, container.getClassLoader()); // store it container.storeEntity(instance); @@ -223,7 +221,7 @@ // This is an independent point of entry. We need to make sure the // thread is associated with the right context class loader Thread currentThread = Thread.currentThread(); - ClassLoader oldCl = GetTCLAction.getContextClassLoader(); + ClassLoader oldCl = SecurityActions.getContextClassLoader(); EntityEnterpriseContext instance = null; try @@ -285,7 +283,7 @@ } finally { - SetTCLAction.setContextClassLoader(oldCl); + SecurityActions.setContextClassLoader(oldCl); synchronizing = false; } } @@ -309,45 +307,4 @@ //no-op } } - - private static class GetTCLAction implements PrivilegedAction - { - static PrivilegedAction ACTION = new GetTCLAction(); - public Object run() - { - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - return loader; - } - static ClassLoader getContextClassLoader() - { - ClassLoader loader = (ClassLoader) AccessController.doPrivileged(ACTION); - return loader; - } - } - private static class SetTCLAction implements PrivilegedAction - { - ClassLoader loader; - Thread t; - SetTCLAction(ClassLoader loader, Thread t) - { - this.loader = loader; - this.t = t; - } - public Object run() - { - t.setContextClassLoader(loader); - t = null; - loader = null; - return null; - } - static void setContextClassLoader(ClassLoader loader) - { - setContextClassLoader(loader, Thread.currentThread()); - } - static void setContextClassLoader(ClassLoader loader, Thread t) - { - PrivilegedAction action = new SetTCLAction(loader, t); - AccessController.doPrivileged(action); - } - } } 1.3 +130 -28 jboss/src/main/org/jboss/ejb/SecurityActions.java Index: SecurityActions.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/SecurityActions.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- SecurityActions.java 18 Jul 2004 03:47:30 -0000 1.2 +++ SecurityActions.java 10 Aug 2004 17:12:57 -0000 1.3 @@ -14,30 +14,6 @@ */ public class SecurityActions { - private static class GetTCLAction implements PrivilegedAction - { - static PrivilegedAction ACTION = new GetTCLAction(); - public Object run() - { - ClassLoader loader = Thread.currentThread().getContextClassLoader(); - return loader; - } - } - private static class SetTCLAction implements PrivilegedAction - { - ClassLoader loader; - SetTCLAction(ClassLoader loader) - { - this.loader = loader; - } - public Object run() - { - Thread.currentThread().setContextClassLoader(loader); - loader = null; - return null; - } - } - private static class SetContextID implements PrivilegedAction { String contextID; @@ -69,14 +45,24 @@ static ClassLoader getContextClassLoader() { - ClassLoader loader = (ClassLoader) AccessController.doPrivileged(GetTCLAction.ACTION); - return loader; + return TCLAction.UTIL.getContextClassLoader(); + } + + static ClassLoader getContextClassLoader(Thread thread) + { + return TCLAction.UTIL.getContextClassLoader(thread); } + static void setContextClassLoader(ClassLoader loader) { - PrivilegedAction action = new SetTCLAction(loader); - AccessController.doPrivileged(action); + TCLAction.UTIL.setContextClassLoader(loader); } + + static void setContextClassLoader(Thread thread, ClassLoader loader) + { + TCLAction.UTIL.setContextClassLoader(thread, loader); + } + static String setContextID(String contextID) { PrivilegedAction action = new SetContextID(contextID); @@ -90,4 +76,120 @@ return principal; } + interface TCLAction + { + class UTIL + { + static TCLAction getTCLAction() + { + return System.getSecurityManager() == null ? NON_PRIVILEGED : PRIVILEGED; + } + + static ClassLoader getContextClassLoader() + { + return getTCLAction().getContextClassLoader(); + } + + static ClassLoader getContextClassLoader(Thread thread) + { + return getTCLAction().getContextClassLoader(thread); + } + + static void setContextClassLoader(ClassLoader cl) + { + getTCLAction().setContextClassLoader(cl); + } + + static void setContextClassLoader(Thread thread, ClassLoader cl) + { + getTCLAction().setContextClassLoader(thread, cl); + } + } + + TCLAction NON_PRIVILEGED = new TCLAction() + { + public ClassLoader getContextClassLoader() + { + return Thread.currentThread().getContextClassLoader(); + } + + public ClassLoader getContextClassLoader(Thread thread) + { + return thread.getContextClassLoader(); + } + + public void setContextClassLoader(ClassLoader cl) + { + Thread.currentThread().setContextClassLoader(cl); + } + + public void setContextClassLoader(Thread thread, ClassLoader cl) + { + thread.setContextClassLoader(cl); + } + }; + + TCLAction PRIVILEGED = new TCLAction() + { + private final PrivilegedAction getTCLPrivilegedAction = new PrivilegedAction() + { + public Object run() + { + return Thread.currentThread().getContextClassLoader(); + } + }; + + public ClassLoader getContextClassLoader() + { + return (ClassLoader)AccessController.doPrivileged(getTCLPrivilegedAction); + } + + public ClassLoader getContextClassLoader(final Thread thread) + { + return (ClassLoader)AccessController.doPrivileged(new PrivilegedAction() + { + public Object run() + { + return thread.getContextClassLoader(); + } + }); + } + + public void setContextClassLoader(final ClassLoader cl) + { + AccessController.doPrivileged( + new PrivilegedAction() + { + public Object run() + { + Thread.currentThread().setContextClassLoader(cl); + return null; + } + } + ); + } + + public void setContextClassLoader(final Thread thread, final ClassLoader cl) + { + AccessController.doPrivileged( + new PrivilegedAction() + { + public Object run() + { + thread.setContextClassLoader(cl); + return null; + } + } + ); + } + }; + + ClassLoader getContextClassLoader(); + + ClassLoader getContextClassLoader(Thread thread); + + void setContextClassLoader(ClassLoader cl); + + void setContextClassLoader(Thread thread, ClassLoader cl); + } } |