]> source.dussan.org Git - archiva.git/commitdiff
use cache for ldap roles
authorOlivier Lamy <olamy@apache.org>
Sat, 19 Jan 2013 16:38:38 +0000 (16:38 +0000)
committerOlivier Lamy <olamy@apache.org>
Sat, 19 Jan 2013 16:38:38 +0000 (16:38 +0000)
git-svn-id: https://svn.apache.org/repos/asf/archiva/redback/redback-core/trunk@1435593 13f79535-47bb-0310-9956-ffa450edef68

redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/java/org/apache/archiva/redback/rbac/ldap/LdapRbacManager.java
redback-rbac/redback-rbac-providers/redback-rbac-ldap/src/main/resources/META-INF/spring-context.xml

index b3b6b0003172942b3d4983442156c6f4d9cb1922..4ac0fd64eb7c59c1aa7b70401fc769b7e81b9786 100644 (file)
@@ -102,8 +102,13 @@ public class LdapRbacManager
     @Inject
     private LdapController ldapController;
 
+    @Inject
+    @Named( value = "cache#ldapRoles" )
+    private Cache<String, Role> rolesCache;
+
     private boolean writableLdap = false;
 
+
     @PostConstruct
     public void initialize()
     {
@@ -472,6 +477,11 @@ public class LdapRbacManager
         throws RbacManagerException
     {
 
+        Role role = rolesCache.get( roleName );
+        if ( role != null )
+        {
+            return role;
+        }
         LdapConnection ldapConnection = null;
         DirContext context = null;
         //verify it's a ldap group
@@ -492,9 +502,12 @@ public class LdapRbacManager
         {
             throw new RbacManagerException( e.getMessage(), e );
         }
-        Role role = this.rbacImpl.getRole( roleName );
-        return ( role == null ) ? new RoleImpl( roleName ) : role;
+        role = this.rbacImpl.getRole( roleName );
+        role = ( role == null ) ? new RoleImpl( roleName ) : role;
+
+        rolesCache.put( roleName, role );
 
+        return role;
     }
 
     public Map<String, Role> getRoles( Collection<String> roleNames )
@@ -715,6 +728,7 @@ public class LdapRbacManager
         {
             throw new RbacPermanentException( "Unable to delete permanent role [" + role.getName() + "]" );
         }
+        rolesCache.remove( role.getName() );
         if ( writableLdap )
         {
             LdapConnection ldapConnection = null;
@@ -790,12 +804,20 @@ public class LdapRbacManager
         {
             return false;
         }
+        if ( rolesCache.get( name ) != null )
+        {
+            return true;
+        }
         LdapConnection ldapConnection = null;
         DirContext context = null;
         try
         {
             ldapConnection = ldapConnectionFactory.getConnection();
             context = ldapConnection.getDirContext();
+            if ( rolesCache.hasKey( name ) )
+            {
+                return true;
+            }
             return ldapRoleMapper.hasRole( context, name );
         }
         catch ( MappingException e )
@@ -843,6 +865,7 @@ public class LdapRbacManager
                 ldapConnection = ldapConnectionFactory.getConnection();
                 context = ldapConnection.getDirContext();
                 ldapRoleMapper.saveRole( role.getName(), context );
+
                 if ( !role.getChildRoleNames().isEmpty() )
                 {
                     for ( String roleName : role.getChildRoleNames() )
@@ -861,7 +884,10 @@ public class LdapRbacManager
                 throw new RbacManagerException( e.getMessage(), e );
             }
         }
-        return this.rbacImpl.saveRole( role );
+        role = this.rbacImpl.saveRole( role );
+        rolesCache.put( role.getName(), role );
+
+        return role;
         //return new RoleImpl( role.getName(), role.getPermissions() );
     }
 
index b8f9da7416ff09dec69f2492957d7c7ee7c0d8d5..645d8637b56220af31c89a2908c9fadebe80a35c 100644 (file)
   <context:component-scan 
     base-package="org.apache.archiva.redback.rbac.ldap"/>
 
+  <bean name="cache#ldapRoles" class="org.apache.archiva.redback.components.cache.ehcache.EhcacheCache"
+        init-method="initialize">
+    <property name="diskPersistent" value="false"/>
+    <property name="eternal" value="false"/>
+    <property name="maxElementsInMemory" value="1000"/>
+    <property name="memoryEvictionPolicy" value="LRU"/>
+    <property name="name" value="ldapRoles"/>
+    <property name="timeToIdleSeconds" value="300"/>
+    <property name="timeToLiveSeconds" value="600"/>
+  </bean>
+
 </beans>
\ No newline at end of file