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
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 Role getRole( String roleName )
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 Role getRole( String roleName )
{
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 void removeRole( Role role )
{
throw new RbacPermanentException( "Unable to delete permanent role [" + role.getName() + "]" );
}
rolesCache.remove( role.getName() );
if ( writableLdap )
{
LdapConnection ldapConnection = null;
@ -790,12 +804,20 @@ public boolean roleExists( String name )
{
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 synchronized Role saveRole( Role role )
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 synchronized Role saveRole( Role role )
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() );
}

View File

@ -31,4 +31,15 @@
<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>