[jboss-cvs] JBossAS SVN: r81594 - projects/security/security-spi/trunk/spi/src/main/org/jboss/security.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Nov 25 21:48:12 EST 2008


Author: anil.saldhana at jboss.com
Date: 2008-11-25 21:48:12 -0500 (Tue, 25 Nov 2008)
New Revision: 81594

Modified:
   projects/security/security-spi/trunk/spi/src/main/org/jboss/security/SecurityContextFactory.java
Log:
SECURITY-328:

Modified: projects/security/security-spi/trunk/spi/src/main/org/jboss/security/SecurityContextFactory.java
===================================================================
--- projects/security/security-spi/trunk/spi/src/main/org/jboss/security/SecurityContextFactory.java	2008-11-26 02:45:41 UTC (rev 81593)
+++ projects/security/security-spi/trunk/spi/src/main/org/jboss/security/SecurityContextFactory.java	2008-11-26 02:48:12 UTC (rev 81594)
@@ -33,11 +33,36 @@
  *  @since  Dec 28, 2006 
  *  @version $Revision$
  */
+ at SuppressWarnings("unchecked")
 public class SecurityContextFactory
 {      
    private static String defaultFQN = "org.jboss.security.plugins.JBossSecurityContext";
    
-   private static String defaultUtilClass = "org.jboss.security.plugins.JBossSecurityContextUtil";
+   private static String defaultUtilClassFQN = "org.jboss.security.plugins.JBossSecurityContextUtil";
+   
+   private static Class<? extends SecurityContext> defaultSecurityContextClass = null;
+   private static Class<? extends SecurityContextUtil> defaultUtilClass = null;
+   
+   /**
+    * Classloader.loadClass is a synchronized method in the JDK. Under heavy concurrent requests,
+    * a loadClass() operation can be extremely troublesome for performance
+    */
+   static
+   {
+      try
+      {
+         defaultSecurityContextClass = (Class<? extends SecurityContext>) SecuritySPIActions.getContextClassLoader().loadClass(defaultFQN);
+      }
+      catch(Exception ignore)
+      {}
+      try
+      {
+         defaultUtilClass = (Class<? extends SecurityContextUtil>) SecuritySPIActions.getContextClassLoader().loadClass(defaultUtilClassFQN); 
+      }
+      catch(Exception ignore)
+      {   
+      }
+   }
 
    /**
     * Create a security context 
@@ -47,6 +72,8 @@
     */
    public static SecurityContext createSecurityContext(String securityDomain) throws Exception
    {
+      if(defaultSecurityContextClass != null)
+         return createSecurityContext(securityDomain, defaultSecurityContextClass);
       return createSecurityContext(securityDomain, defaultFQN);
    }
    
@@ -64,8 +91,8 @@
          throw new IllegalArgumentException("securityDomain is null");
       if(fqnClass == null)
          throw new IllegalArgumentException("fqnClass is null");
-      Class<SecurityContext> clazz = getContextClass(fqnClass);
-      return createSecurityContext(securityDomain, clazz); 
+      defaultSecurityContextClass = getContextClass(fqnClass);
+      return createSecurityContext(securityDomain, defaultSecurityContextClass); 
    }
    
    
@@ -134,10 +161,18 @@
     */
    public static SecurityContextUtil createUtil(SecurityContext sc) throws Exception
    {
-      Class<SecurityContext> clazz = getContextClass(defaultUtilClass);
+      Class<? extends SecurityContextUtil> clazz = defaultUtilClass;
+      
+      if(clazz  == null)
+      {
+         clazz = (Class<? extends SecurityContextUtil>) loadClass(defaultUtilClassFQN);
+         defaultUtilClass = clazz; 
+      }
+      
       //Get the CTR
-      Constructor<SecurityContext> ctr = clazz.getConstructor(new Class[]{SecurityContext.class});
-      return (SecurityContextUtil) ctr.newInstance(new Object[]{sc}); 
+      Constructor<?> ctr = clazz.getConstructor(new Class[]{SecurityContext.class});
+      Object obj = ctr.newInstance(new Object[]{sc});
+      return SecurityContextUtil.class.cast(obj);
    } 
    
    /**
@@ -145,8 +180,7 @@
     * @param sc SecurityContext
     * @param utilFQN fqn of the util class
     * @return
-    */
-   @SuppressWarnings("unchecked")
+    */ 
    public static SecurityContextUtil createUtil(SecurityContext sc, String utilFQN) throws Exception
    {
       ClassLoader tcl = SecuritySPIActions.getContextClassLoader();
@@ -171,7 +205,39 @@
       return ctr.newInstance(new Object[]{sc}); 
    }
    
-   @SuppressWarnings("unchecked")
+   /**
+    * Set the default security context fqn
+    * @param fqn
+    */
+   public static void setDefaultSecurityContextFQN(String fqn)
+   {
+      defaultFQN = fqn;
+      defaultSecurityContextClass = null; 
+   }
+   
+   
+   /**
+    * Set the default util class fqn
+    * @param fqn
+    */
+   public static void setDefaultSecurityContextUtilFQN(String fqn)
+   {
+      defaultUtilClassFQN = fqn;
+      defaultUtilClass = null; //reset
+   }
+   
+   /**
+    * Load a class
+    * @param fqn
+    * @return
+    * @throws Exception
+    */
+   private static Class<?> loadClass(String fqn) throws Exception
+   {
+      ClassLoader tcl = SecuritySPIActions.getContextClassLoader();
+      return tcl.loadClass(fqn);
+   }
+    
    private static Class<SecurityContext> getContextClass(String className) throws Exception
    {
       ClassLoader tcl = SecuritySPIActions.getContextClassLoader();




More information about the jboss-cvs-commits mailing list