remm        01/02/09 11:05:38

  Modified:    src/share/org/apache/slide/security SecurityImpl.java
  Log:
  - Avoid doing a Class.forName on a non existing class (which would check
    all classloaders up to the root classloader).
  - Cache the retrieved class (since there is a limited number of roles defined).
  
  Revision  Changes    Path
  1.14      +32 -13    
jakarta-slide/src/share/org/apache/slide/security/SecurityImpl.java
  
  Index: SecurityImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-slide/src/share/org/apache/slide/security/SecurityImpl.java,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- SecurityImpl.java 2000/12/26 17:16:42     1.13
  +++ SecurityImpl.java 2001/02/09 19:05:33     1.14
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-slide/src/share/org/apache/slide/security/SecurityImpl.java,v 1.13 
2000/12/26 17:16:42 remm Exp $
  - * $Revision: 1.13 $
  - * $Date: 2000/12/26 17:16:42 $
  + * $Header: 
/home/cvs/jakarta-slide/src/share/org/apache/slide/security/SecurityImpl.java,v 1.14 
2001/02/09 19:05:33 remm Exp $
  + * $Revision: 1.14 $
  + * $Date: 2001/02/09 19:05:33 $
    *
    * ====================================================================
    *
  @@ -64,6 +64,7 @@
   package org.apache.slide.security;
   
   import java.util.Enumeration;
  +import java.util.Hashtable;
   import java.util.Vector;
   import org.apache.slide.common.*;
   import org.apache.slide.structure.*;
  @@ -74,7 +75,7 @@
    * Security helper.
    * 
    * @author <a href="mailto:[EMAIL PROTECTED]">Remy Maucherat</a>
  - * @version $Revision: 1.13 $
  + * @version $Revision: 1.14 $
    */
   public final class SecurityImpl implements Security {
       
  @@ -91,6 +92,7 @@
       public SecurityImpl(Namespace namespace, NamespaceConfig namespaceConfig) {
           this.namespace = namespace;
           this.namespaceConfig = namespaceConfig;
  +        this.rolesCache = new Hashtable();
       }
       
       
  @@ -109,6 +111,13 @@
       private NamespaceConfig namespaceConfig;
       
       
  +    /**
  +     * Roles cache.
  +     * Role name -> Role interface.
  +     */
  +    private Hashtable rolesCache;
  +    
  +    
       // ------------------------------------------------------- Security Methods
       
       
  @@ -515,17 +524,27 @@
               && (associatedRole.equals(namespaceConfig.NOBODY)))
               return true;
           
  -        Class roleClass = null;
  -        try {
  -            roleClass = Class.forName(role);
  -        } catch (ClassNotFoundException e) {
  -            if (associatedRole == null)
  -                return false;
  +        Class roleClass = (Class) rolesCache.get(role);
  +        if ((roleClass == null) && (associatedRole != null)) {
  +            roleClass = (Class) rolesCache.get(associatedRole);
  +            if (roleClass == null) {
  +                try {
  +                    roleClass = Class.forName(associatedRole);
  +                    rolesCache.put(role, roleClass);
  +                    rolesCache.put(associatedRole, roleClass);
  +                } catch (ClassNotFoundException ex) {
  +                }
  +            }
  +        }
  +        if (roleClass == null) {
               try {
  -                roleClass = Class.forName(associatedRole);
  -            } catch (ClassNotFoundException ex) {
  -                return false;
  +                roleClass = Class.forName(role);
  +                rolesCache.put(role, roleClass);
  +            } catch (ClassNotFoundException e) {
               }
  +        }
  +        if (roleClass == null) {
  +            return false;
           }
           
           if (roleClass.isInstance(object))
  
  
  

Reply via email to