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))