use cache for ldap roles

git-svn-id: https://svn.apache.org/repos/asf/archiva/redback/redback-core/trunk@1435593 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Olivier Lamy 2013-01-19 16:38:38 +00:00
parent c40d920036
commit aa0cbd265e
2 changed files with 40 additions and 3 deletions

View File

@ -102,8 +102,13 @@ public class LdapRbacManager
@Inject @Inject
private LdapController ldapController; private LdapController ldapController;
@Inject
@Named( value = "cache#ldapRoles" )
private Cache<String, Role> rolesCache;
private boolean writableLdap = false; private boolean writableLdap = false;
@PostConstruct @PostConstruct
public void initialize() public void initialize()
{ {
@ -472,6 +477,11 @@ public Role getRole( String roleName )
throws RbacManagerException throws RbacManagerException
{ {
Role role = rolesCache.get( roleName );
if ( role != null )
{
return role;
}
LdapConnection ldapConnection = null; LdapConnection ldapConnection = null;
DirContext context = null; DirContext context = null;
//verify it's a ldap group //verify it's a ldap group
@ -492,9 +502,12 @@ public Role getRole( String roleName )
{ {
throw new RbacManagerException( e.getMessage(), e ); throw new RbacManagerException( e.getMessage(), e );
} }
Role role = this.rbacImpl.getRole( roleName ); role = this.rbacImpl.getRole( roleName );
return ( role == null ) ? new RoleImpl( roleName ) : role; role = ( role == null ) ? new RoleImpl( roleName ) : role;
rolesCache.put( roleName, role );
return role;
} }
public Map<String, Role> getRoles( Collection<String> roleNames ) public Map<String, Role> getRoles( Collection<String> roleNames )
@ -715,6 +728,7 @@ public void removeRole( Role role )
{ {
throw new RbacPermanentException( "Unable to delete permanent role [" + role.getName() + "]" ); throw new RbacPermanentException( "Unable to delete permanent role [" + role.getName() + "]" );
} }
rolesCache.remove( role.getName() );
if ( writableLdap ) if ( writableLdap )
{ {
LdapConnection ldapConnection = null; LdapConnection ldapConnection = null;
@ -790,12 +804,20 @@ public boolean roleExists( String name )
{ {
return false; return false;
} }
if ( rolesCache.get( name ) != null )
{
return true;
}
LdapConnection ldapConnection = null; LdapConnection ldapConnection = null;
DirContext context = null; DirContext context = null;
try try
{ {
ldapConnection = ldapConnectionFactory.getConnection(); ldapConnection = ldapConnectionFactory.getConnection();
context = ldapConnection.getDirContext(); context = ldapConnection.getDirContext();
if ( rolesCache.hasKey( name ) )
{
return true;
}
return ldapRoleMapper.hasRole( context, name ); return ldapRoleMapper.hasRole( context, name );
} }
catch ( MappingException e ) catch ( MappingException e )
@ -843,6 +865,7 @@ public synchronized Role saveRole( Role role )
ldapConnection = ldapConnectionFactory.getConnection(); ldapConnection = ldapConnectionFactory.getConnection();
context = ldapConnection.getDirContext(); context = ldapConnection.getDirContext();
ldapRoleMapper.saveRole( role.getName(), context ); ldapRoleMapper.saveRole( role.getName(), context );
if ( !role.getChildRoleNames().isEmpty() ) if ( !role.getChildRoleNames().isEmpty() )
{ {
for ( String roleName : role.getChildRoleNames() ) for ( String roleName : role.getChildRoleNames() )
@ -861,7 +884,10 @@ public synchronized Role saveRole( Role role )
throw new RbacManagerException( e.getMessage(), e ); 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() ); //return new RoleImpl( role.getName(), role.getPermissions() );
} }

View File

@ -31,4 +31,15 @@
<context:component-scan <context:component-scan
base-package="org.apache.archiva.redback.rbac.ldap"/> 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> </beans>