implements a dynamic cache configurable tru the ui for ArchivaConfigurableUsersManager

git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@1424673 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Olivier Lamy 2012-12-20 20:32:43 +00:00
parent a86b4e4bac
commit b9f36bd6b9
6 changed files with 146 additions and 14 deletions

View File

@ -1486,6 +1486,13 @@
<multiplicity>*</multiplicity> <multiplicity>*</multiplicity>
</association> </association>
</field> </field>
<field>
<name>useUsersCache</name>
<description>flag to know if redback will use a cache to prevent searching users already found.</description>
<version>1.4.0+</version>
<type>boolean</type>
<defaultValue>false</defaultValue>
</field>
</fields> </fields>
</class> </class>

View File

@ -53,6 +53,12 @@ public class RedbackRuntimeConfiguration
*/ */
private List<PropertyEntry> configurationPropertiesEntries; private List<PropertyEntry> configurationPropertiesEntries;
/**
* flag to know if redback will use a cache to prevent
* searching users already found.
*/
private boolean useUsersCache = false;
public RedbackRuntimeConfiguration() public RedbackRuntimeConfiguration()
{ {
// no op // no op
@ -125,15 +131,28 @@ public class RedbackRuntimeConfiguration
} }
} }
public boolean isUseUsersCache()
{
return useUsersCache;
}
public void setUseUsersCache( boolean useUsersCache )
{
this.useUsersCache = useUsersCache;
}
@Override @Override
public String toString() public String toString()
{ {
return "RedbackRuntimeConfiguration{" + final StringBuilder sb = new StringBuilder();
"userManagerImpls=" + userManagerImpls + sb.append( "RedbackRuntimeConfiguration" );
", ldapConfiguration=" + ldapConfiguration + sb.append( "{userManagerImpls=" ).append( userManagerImpls );
", migratedFromRedbackConfiguration=" + migratedFromRedbackConfiguration + sb.append( ", ldapConfiguration=" ).append( ldapConfiguration );
", configurationProperties=" + configurationProperties + sb.append( ", migratedFromRedbackConfiguration=" ).append( migratedFromRedbackConfiguration );
", configurationPropertiesEntries=" + configurationPropertiesEntries + sb.append( ", configurationProperties=" ).append( configurationProperties );
'}'; sb.append( ", configurationPropertiesEntries=" ).append( configurationPropertiesEntries );
sb.append( ", useUsersCache=" ).append( useUsersCache );
sb.append( '}' );
return sb.toString();
} }
} }

View File

@ -20,6 +20,7 @@ package org.apache.archiva.web.security;
import org.apache.archiva.admin.model.RepositoryAdminException; import org.apache.archiva.admin.model.RepositoryAdminException;
import org.apache.archiva.admin.model.runtime.ArchivaRuntimeConfigurationAdmin; import org.apache.archiva.admin.model.runtime.ArchivaRuntimeConfigurationAdmin;
import org.apache.archiva.redback.components.cache.Cache;
import org.apache.archiva.redback.users.User; import org.apache.archiva.redback.users.User;
import org.apache.archiva.redback.users.UserManager; import org.apache.archiva.redback.users.UserManager;
import org.apache.archiva.redback.users.UserManagerException; import org.apache.archiva.redback.users.UserManagerException;
@ -31,6 +32,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
@ -55,6 +57,10 @@ public class ArchivaConfigurableUsersManager
private List<UserManagerListener> listeners = new ArrayList<UserManagerListener>(); private List<UserManagerListener> listeners = new ArrayList<UserManagerListener>();
@Inject
@Named( value = "cache#users" )
private Cache usersCache;
@Override @Override
public void initialize() public void initialize()
{ {
@ -80,11 +86,31 @@ public class ArchivaConfigurableUsersManager
} }
} }
protected boolean useUsersCache()
{
try
{
return archivaRuntimeConfigurationAdmin.getArchivaRuntimeConfiguration().isUseUsersCache();
}
catch ( RepositoryAdminException e )
{
log.warn( "skip fail to get RedbackRuntimeConfiguration: {}, use false", e.getMessage(), e );
return false;
}
}
@Override @Override
public User addUser( User user ) public User addUser( User user )
throws UserManagerException throws UserManagerException
{ {
return userManagerPerId.get( user.getUserManagerId() ).addUser( user ); user = userManagerPerId.get( user.getUserManagerId() ).addUser( user );
if ( useUsersCache() )
{
usersCache.put( user.getUsername(), user );
}
return user;
} }
@Override @Override
@ -92,6 +118,11 @@ public class ArchivaConfigurableUsersManager
throws UserManagerException throws UserManagerException
{ {
userManagerPerId.get( user.getUserManagerId() ).addUserUnchecked( user ); userManagerPerId.get( user.getUserManagerId() ).addUserUnchecked( user );
if ( useUsersCache() )
{
usersCache.put( user.getUsername(), user );
}
} }
protected UserManager findFirstWritable() protected UserManager findFirstWritable()
@ -116,7 +147,12 @@ public class ArchivaConfigurableUsersManager
log.warn( "cannot find writable user manager implementation, skip user creation" ); log.warn( "cannot find writable user manager implementation, skip user creation" );
return null; return null;
} }
return userManager.createUser( username, fullName, emailAddress ); User user = userManager.createUser( username, fullName, emailAddress );
if ( useUsersCache() )
{
usersCache.put( user.getUsername(), user );
}
return user;
} }
@Override @Override
@ -137,6 +173,10 @@ public class ArchivaConfigurableUsersManager
return; return;
} }
userManager.deleteUser( username ); userManager.deleteUser( username );
if ( useUsersCache() )
{
usersCache.remove( username );
}
} }
@Override @Override
@ -152,7 +192,17 @@ public class ArchivaConfigurableUsersManager
public User findUser( String username ) public User findUser( String username )
throws UserManagerException throws UserManagerException
{ {
User user = null; User user = null;
if ( useUsersCache() )
{
user = (User) usersCache.get( username );
if ( user != null )
{
return user;
}
}
UserManagerException lastException = null; UserManagerException lastException = null;
for ( UserManager userManager : userManagerPerId.values() ) for ( UserManager userManager : userManagerPerId.values() )
{ {
@ -161,6 +211,10 @@ public class ArchivaConfigurableUsersManager
user = userManager.findUser( username ); user = userManager.findUser( username );
if ( user != null ) if ( user != null )
{ {
if ( useUsersCache() )
{
usersCache.put( username, user );
}
return user; return user;
} }
} }
@ -191,6 +245,14 @@ public class ArchivaConfigurableUsersManager
throws UserNotFoundException, UserManagerException throws UserNotFoundException, UserManagerException
{ {
User user = null; User user = null;
if ( useUsersCache() )
{
user = (User) usersCache.get( GUEST_USERNAME );
if ( user != null )
{
return user;
}
}
UserNotFoundException lastException = null; UserNotFoundException lastException = null;
for ( UserManager userManager : userManagerPerId.values() ) for ( UserManager userManager : userManagerPerId.values() )
{ {
@ -334,14 +396,28 @@ public class ArchivaConfigurableUsersManager
public User updateUser( User user ) public User updateUser( User user )
throws UserNotFoundException, UserManagerException throws UserNotFoundException, UserManagerException
{ {
return userManagerPerId.get( user.getUserManagerId() ).updateUser( user ); user = userManagerPerId.get( user.getUserManagerId() ).updateUser( user );
if ( useUsersCache() )
{
usersCache.put( user.getUsername(), user );
}
return user;
} }
@Override @Override
public User updateUser( User user, boolean passwordChangeRequired ) public User updateUser( User user, boolean passwordChangeRequired )
throws UserNotFoundException, UserManagerException throws UserNotFoundException, UserManagerException
{ {
return userManagerPerId.get( user.getUserManagerId() ).updateUser( user, passwordChangeRequired ); user = userManagerPerId.get( user.getUserManagerId() ).updateUser( user, passwordChangeRequired );
if ( useUsersCache() )
{
usersCache.put( user.getUsername(), user );
}
return user;
} }
@Override @Override

View File

@ -630,5 +630,6 @@ redback.runtime.user-managers.impls.available=UserManager(s) availables
redback.runtime.ldap.verified=Ldap connection verified. redback.runtime.ldap.verified=Ldap connection verified.
redback.runtime.ldap.checkModification=Verify LDAP changes. redback.runtime.ldap.checkModification=Verify LDAP changes.
redback.runtime.ldap.checkServer=Verify LDAP configuration on server side. redback.runtime.ldap.checkServer=Verify LDAP configuration on server side.
redback.runtime.useUsersCache.label=Use a cache for users.

View File

@ -1151,7 +1151,9 @@ define("archiva.general-admin",["jquery","i18n","utils","jquery.tmpl","knockout"
} }
RedbackRuntimeConfiguration=function(userManagerImpls,ldapConfiguration,migratedFromRedbackConfiguration,configurationPropertiesEntries){ RedbackRuntimeConfiguration=function(userManagerImpls,ldapConfiguration,migratedFromRedbackConfiguration,configurationPropertiesEntries
,useUsersCache){
$.log("new RedbackRuntimeConfiguration");
var self=this; var self=this;
this.modified=ko.observable(false); this.modified=ko.observable(false);
this.modified.subscribe(function(newValue){$.log("RedbackRuntimeConfiguration modified")}); this.modified.subscribe(function(newValue){$.log("RedbackRuntimeConfiguration modified")});
@ -1164,12 +1166,16 @@ define("archiva.general-admin",["jquery","i18n","utils","jquery.tmpl","knockout"
this.migratedFromRedbackConfiguration=ko.observable(migratedFromRedbackConfiguration); this.migratedFromRedbackConfiguration=ko.observable(migratedFromRedbackConfiguration);
$.log("new RedbackRuntimeConfiguration before configurationPropertiesEntries mapping:");
this.configurationPropertiesEntries=ko.observableArray(configurationPropertiesEntries?configurationPropertiesEntries:[]); this.configurationPropertiesEntries=ko.observableArray(configurationPropertiesEntries?configurationPropertiesEntries:[]);
this.configurationPropertiesEntries.subscribe(function(newValue){ this.configurationPropertiesEntries.subscribe(function(newValue){
self.modified(true); self.modified(true);
$.log("configurationPropertiesEntries modified") $.log("configurationPropertiesEntries modified")
}); });
$.log("new RedbackRuntimeConfiguration before configurationPropertiesEntries mapping done");
this.findPropertyValue=function(key){ this.findPropertyValue=function(key){
for(var i=0;i<self.configurationPropertiesEntries().length;i++){ for(var i=0;i<self.configurationPropertiesEntries().length;i++){
if(self.configurationPropertiesEntries()[i].key==key){ if(self.configurationPropertiesEntries()[i].key==key){
@ -1179,12 +1185,20 @@ define("archiva.general-admin",["jquery","i18n","utils","jquery.tmpl","knockout"
} }
} }
} }
this.useUsersCache=ko.observable(useUsersCache);
this.useUsersCache.subscribe(function(newValue){self.modified(true)});
} }
mapRedbackRuntimeConfiguration=function(data){ mapRedbackRuntimeConfiguration=function(data){
var redbackRuntimeConfiguration = $.log("mapRedbackRuntimeConfiguration");
new RedbackRuntimeConfiguration(data.userManagerImpls,mapLdapConfiguration(data.ldapConfiguration),data.migratedFromRedbackConfiguration); var ldapConfiguration=mapLdapConfiguration(data.ldapConfiguration);
$.log("mapLdapConfiguration done for ");
var redbackRuntimeConfiguration =
new RedbackRuntimeConfiguration(data.userManagerImpls,ldapConfiguration,data.migratedFromRedbackConfiguration,[],data.useUsersCache);
$.log("mapRedbackRuntimeConfiguration done");
var configurationPropertiesEntries = data.configurationPropertiesEntries == null ? []: $.each(data.configurationPropertiesEntries,function(item){ var configurationPropertiesEntries = data.configurationPropertiesEntries == null ? []: $.each(data.configurationPropertiesEntries,function(item){
return new Entry(item.key, item.value,function(newValue){ return new Entry(item.key, item.value,function(newValue){
redbackRuntimeConfiguration.modified(true); redbackRuntimeConfiguration.modified(true);
@ -1242,6 +1256,7 @@ define("archiva.general-admin",["jquery","i18n","utils","jquery.tmpl","knockout"
} }
mapLdapConfiguration=function(data){ mapLdapConfiguration=function(data){
$.log("mapLdapConfiguration");
if(data){ if(data){
var extraPropertiesEntries = data.extraPropertiesEntries == null ? []: $.each(data.extraPropertiesEntries,function(item){ var extraPropertiesEntries = data.extraPropertiesEntries == null ? []: $.each(data.extraPropertiesEntries,function(item){
return new Entry(item.key, item.value); return new Entry(item.key, item.value);
@ -1249,6 +1264,7 @@ define("archiva.general-admin",["jquery","i18n","utils","jquery.tmpl","knockout"
if (!$.isArray(extraPropertiesEntries)){ if (!$.isArray(extraPropertiesEntries)){
extraPropertiesEntries=[]; extraPropertiesEntries=[];
} }
$.log("mapLdapConfiguration done");
return new LdapConfiguration(data.hostName,data.port,data.ssl,data.baseDn,data.contextFactory,data.bindDn,data.password, return new LdapConfiguration(data.hostName,data.port,data.ssl,data.baseDn,data.contextFactory,data.bindDn,data.password,
data.authenticationMethod,extraPropertiesEntries); data.authenticationMethod,extraPropertiesEntries);
} }

View File

@ -904,6 +904,19 @@
<div class="tab-content"> <div class="tab-content">
<div class="tab-pane active" id="redback-runtime-general-content"> <div class="tab-pane active" id="redback-runtime-general-content">
<div class="well"> <div class="well">
<div class="row-fluid">
<form class="form-horizontal" id="redback-runtime-general-form-id">
<div class="control-group">
<label for="redback-runtime-useUsersCache" class="control-label">
${$.i18n.prop('redback.runtime.useUsersCache.label')}
</label>
<div class="controls">
<input type="checkbox" id="redback-runtime-useUsersCache" name="redback-runtime-useUsersCache"
data-bind="checked: redbackRuntimeConfiguration().useUsersCache"/>
</div>
</div>
</form>
</div>
<div class="row-fluid"> <div class="row-fluid">
<div class="span4 dotted"> <div class="span4 dotted">
<h5>${$.i18n.prop('redback.runtime.user-managers.impls.choosed')}</h5> <h5>${$.i18n.prop('redback.runtime.user-managers.impls.choosed')}</h5>