package org.ovirt.engine.core.bll.adbroker;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.AdUser;
import org.ovirt.engine.core.common.businessentities.ad_groups;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
/**
* This command Responcible to bring large amount of data from Active Directory with smallest amount of Active directory
* Queries. First - all users retrieved from AD. All groups of all users gathered together. All parent groups of all
* groups retrieved by single query. Maximum number of AD queries equal to AD tree depth + 1(for users query).
*/
public class LdapGetAdUserByUserIdListCommand extends LdapBrokerCommandBase {
private java.util.ArrayList<Guid> getUserIds() {
return ((LdapSearchByIdListParameters) getParameters()).getUserIds();
}
public LdapGetAdUserByUserIdListCommand(LdapSearchByIdListParameters parameters) {
super(parameters);
}
@Override
protected void executeQuery(DirectorySearcher directorySearcher) {
PopulateUsers();
PopulateGroups();
setSucceeded(true);
}
/**
* Bring all users data from ldap provider
*/
private void PopulateUsers() {
List<LdapQueryData> queries = GenerateUsersQuery();
List<AdUser> results = new ArrayList<AdUser>();
for (LdapQueryData queryData : queries) {
java.util.ArrayList<AdUser> tempUsers = (java.util.ArrayList<AdUser>) LdapFactory
.getInstance(getDomain())
.RunAdAction(AdActionType.SearchUserByQuery,
new LdapSearchByQueryParameters(getParameters().getSessionId(), getDomain(), queryData))
.getReturnValue();
if (tempUsers != null) {
results.addAll(tempUsers);
}
}
setReturnValue(results);
}
/**
* Generate Queries to search all users
*
* @return
*/
private List<LdapQueryData> GenerateUsersQuery() {
UsersObjectGuidQueryGenerator generator = new UsersObjectGuidQueryGenerator();
for (Guid id : getUserIds()) {
generator.add(id);
}
return generator.getLdapQueriesData(getDomain());
}
private void PopulateGroups() {
try {
boolean performPopulate = true;
List<AdUser> users = (List<AdUser>) getReturnValue();
if (getParameters() instanceof LdapSearchByUserIdListParameters) {
LdapSearchByUserIdListParameters params = (LdapSearchByUserIdListParameters) getParameters();
performPopulate = params.getPerformGroupsQueryInsideCmd();
}
if (performPopulate) {
LdapBrokerUtils.performGroupPopulationForUsers(users,
getLoginName(),
getPassword(),
getDomain(),
new ArrayList<ad_groups>());
}
} catch (RuntimeException ex) {
log.infoFormat("GetAdUserByUserIdListCommand failed. Exception: {0}", ex);
}
}
private static LogCompat log = LogFactoryCompat.getLog(LdapGetAdUserByUserIdListCommand.class);
}