Index: jldap/src/java/edu/amc/sakai/user/LdapAttributeMapper.java =================================================================== --- jldap/src/java/edu/amc/sakai/user/LdapAttributeMapper.java (revision 97072) +++ jldap/src/java/edu/amc/sakai/user/LdapAttributeMapper.java (working copy) @@ -22,6 +22,7 @@ package edu.amc.sakai.user; import java.util.Map; +import java.util.Set; import org.sakaiproject.user.api.UserEdit; @@ -152,5 +153,15 @@ * @return the formatted search filter */ public String getFindUserByCrossAttributeSearchFilter(String criteria); + + /** + * Builds a filter to a uid search against many users at once + * For reference, the LDAP search filter is of the form: + * "(|(uid=sample.user)(uid=john.doe)(uid=jane.smith))" + * + * @param the search string + * @return the formatted search filter + */ + public String getManyUsersInOneSearch(Set criteria); } Index: jldap/src/java/edu/amc/sakai/user/SimpleLdapAttributeMapper.java =================================================================== --- jldap/src/java/edu/amc/sakai/user/SimpleLdapAttributeMapper.java (revision 97072) +++ jldap/src/java/edu/amc/sakai/user/SimpleLdapAttributeMapper.java (working copy) @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.Set; @@ -569,4 +570,30 @@ return sb.toString(); } + /** + * @inheritDoc + */ + public String getManyUsersInOneSearch(Set criteria) { + String eidAttr = attributeMappings.get(AttributeMappingConstants.LOGIN_ATTR_MAPPING_KEY); + + StringBuilder sb = new StringBuilder(); + sb.append("(|"); + + for ( Iterator eidIterator = criteria.iterator(); eidIterator.hasNext(); ) { + sb.append("("); + sb.append(eidAttr); + sb.append("="); + sb.append(eidIterator.next()); + sb.append(")"); + } + + sb.append(")"); + + if (M_log.isDebugEnabled()) { + M_log.debug("getManyUsersInOneSearch() completed filter: " + sb.toString()); + } + + return sb.toString(); + } + } Index: jldap/src/java/edu/amc/sakai/user/JLDAPDirectoryProvider.java =================================================================== --- jldap/src/java/edu/amc/sakai/user/JLDAPDirectoryProvider.java (revision 97072) +++ jldap/src/java/edu/amc/sakai/user/JLDAPDirectoryProvider.java (working copy) @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -612,10 +613,8 @@ * returns if a retry exits exceptionally *

*/ - public void getUsers(Collection users) + public void getUsers(Collection users) { - - //TODO: avoid the ripple loading here. should just need one query if ( M_log.isDebugEnabled() ) { M_log.debug("getUsers(): [Collection size = " + users.size() + "]"); } @@ -623,40 +622,27 @@ LDAPConnection conn = null; boolean abortiveSearch = false; UserEdit userEdit = null; + + HashMap usersToSearchInLDAP = new HashMap(); try { - - conn = ldapConnectionManager.getConnection(); - - for ( Iterator userEdits = users.iterator(); userEdits.hasNext(); ) { - - try { - - userEdit = (UserEdit) userEdits.next(); - boolean foundUser = getUserByEid(userEdit, userEdit.getEid(), conn); - if ( !(foundUser) ) { - userEdits.remove(); - } - - } catch ( LDAPException e ) { - - M_log.warn("getUsers(): search failed for user, retrying [eid = " + userEdit.getEid() + "]", - e); - - // lets retry with a new connection, giving up - // for good if the retry fails - ldapConnectionManager.returnConnection(conn); - - conn = ldapConnectionManager.getConnection(); - - // exactly the same calls as above - boolean foundUser = getUserByEid(userEdit, userEdit.getEid(), conn); - if ( !(foundUser) ) { - userEdits.remove(); - } - + + for ( Iterator userEdits = users.iterator(); userEdits.hasNext(); ) { + userEdit = (UserEdit) userEdits.next(); + LdapUserData cachedUserData = getCachedUserEntry(userEdit.getEid()); + if ( cachedUserData == null ) { + usersToSearchInLDAP.put(userEdit.getEid(), userEdit); } - } + + conn = ldapConnectionManager.getConnection(); + String filter = ldapAttributeMapper.getManyUsersInOneSearch(usersToSearchInLDAP.keySet()); + List ldapUsers = searchDirectory(filter, null, null, null, null, 0); + + for (LdapUserData ldapUserData : ldapUsers) { + UserEdit ue = usersToSearchInLDAP.get(ldapUserData.getEid()); + mapUserDataOntoUserEdit(ldapUserData, ue); + } + } catch (LDAPException e) { abortiveSearch = true; throw new RuntimeException("getUsers(): LDAPException during search [eid = " +