use of cz.metacentrum.perun.core.api.exceptions.ExtSourceUnsupportedOperationException in project perun by CESNET.
the class VosManagerBlImpl method findCandidates.
public List<Candidate> findCandidates(PerunSession sess, Vo vo, String searchString, int maxNumOfResults) throws InternalErrorException {
List<Candidate> candidates = new ArrayList<Candidate>();
int numOfResults = 0;
try {
// Iterate through all registered extSources
for (ExtSource source : getPerunBl().getExtSourcesManagerBl().getVoExtSources(sess, vo)) {
// Info if this is only simple ext source, change behavior if not
boolean simpleExtSource = true;
// Get potential subjects from the extSource
List<Map<String, String>> subjects;
try {
if (source instanceof ExtSourceApi) {
// find subjects with all their properties
subjects = ((ExtSourceApi) source).findSubjects(searchString, maxNumOfResults);
simpleExtSource = false;
} else {
// find subjects only with logins - they then must be retrieved by login
subjects = ((ExtSourceSimpleApi) source).findSubjectsLogins(searchString, maxNumOfResults);
}
} catch (ExtSourceUnsupportedOperationException e1) {
log.warn("ExtSource {} doesn't support findSubjects", source.getName());
continue;
} catch (InternalErrorException e) {
log.error("Error occurred on ExtSource {}, Exception {}.", source.getName(), e);
continue;
} finally {
try {
((ExtSourceSimpleApi) source).close();
} catch (ExtSourceUnsupportedOperationException e) {
// ExtSource doesn't support that functionality, so silently skip it.
} catch (InternalErrorException e) {
log.error("Can't close extSource connection. Cause: {}", e);
}
}
Set<String> uniqueLogins = new HashSet<>();
for (Map<String, String> s : subjects) {
// Check if the user has unique identifier within extSource
if ((s.get("login") == null) || (s.get("login") != null && ((String) s.get("login")).isEmpty())) {
log.error("User '{}' cannot be added, because he/she doesn't have a unique identifier (login)", s);
// Skip to another user
continue;
}
String extLogin = (String) s.get("login");
// check uniqueness of every login in extSource
if (uniqueLogins.contains(extLogin)) {
throw new InternalErrorException("There are more than 1 login '" + extLogin + "' getting from extSource '" + source + "'");
} else {
uniqueLogins.add(extLogin);
}
// Get Candidate
Candidate candidate;
try {
if (simpleExtSource) {
// retrieve data about subjects from ext source based on ext. login
candidate = getPerunBl().getExtSourcesManagerBl().getCandidate(sess, source, extLogin);
} else {
// retrieve data about subjects from subjects we already have locally
candidate = getPerunBl().getExtSourcesManagerBl().getCandidate(sess, s, source, extLogin);
}
} catch (ExtSourceNotExistsException e) {
throw new ConsistencyErrorException("Getting candidate from non-existing extSource " + source, e);
} catch (CandidateNotExistsException e) {
throw new ConsistencyErrorException("findSubjects returned that candidate, but getCandidate cannot find him using login " + extLogin, e);
} catch (ExtSourceUnsupportedOperationException e) {
throw new InternalErrorException("extSource supports findSubjects but not getCandidate???", e);
}
try {
getPerunBl().getMembersManagerBl().getMemberByUserExtSources(sess, vo, candidate.getUserExtSources());
// Candidate is already a member of the VO, so do not add him to the list of candidates
continue;
} catch (MemberNotExistsException e) {
// This is OK
}
// Add candidate to the list of candidates
log.debug("findCandidates: returning candidate: {}", candidate);
candidates.add(candidate);
numOfResults++;
// Stop getting new members if the number of already retrieved members exceeded the maxNumOfResults
if (maxNumOfResults > 0 && numOfResults >= maxNumOfResults) {
break;
}
}
// Stop walking through next sources if the number of already retrieved members exceeded the maxNumOfResults
if (maxNumOfResults > 0 && numOfResults >= maxNumOfResults) {
break;
}
}
log.debug("Returning {} potential members for vo {}", candidates.size(), vo);
return candidates;
} catch (RuntimeException e) {
throw new InternalErrorException(e);
}
}
use of cz.metacentrum.perun.core.api.exceptions.ExtSourceUnsupportedOperationException in project perun by CESNET.
the class ExtSourcesManagerBlImpl method getInvalidUsers.
@Override
public List<User> getInvalidUsers(PerunSession sess, ExtSource source) {
List<Integer> usersIds;
List<User> invalidUsers = new ArrayList<>();
// Get all users, who are associated with this extSource
usersIds = getExtSourcesManagerImpl().getAssociatedUsersIdsWithExtSource(sess, source);
List<User> users = getPerunBl().getUsersManagerBl().getUsersByIds(sess, usersIds);
for (User user : users) {
// From user's userExtSources get the login
String userLogin = "";
List<UserExtSource> userExtSources = getPerunBl().getUsersManagerBl().getUserExtSources(sess, user);
for (UserExtSource userExtSource : userExtSources) {
if (userExtSource.getExtSource().equals(source)) {
// It is enough to have at least one login from the extSource
// TODO jak budeme kontrolovat, ze mu zmizel jeden login a zustal jiny, zajima nas to?
userLogin = userExtSource.getLogin();
}
}
// Check if the login is still present in the extSource
try {
((ExtSourceSimpleApi) source).getSubjectByLogin(userLogin);
} catch (SubjectNotExistsException e) {
invalidUsers.add(user);
} catch (ExtSourceUnsupportedOperationException e) {
log.warn("ExtSource {} doesn't support getSubjectByLogin", source.getName());
} finally {
if (source instanceof ExtSourceSimpleApi) {
try {
((ExtSourceSimpleApi) source).close();
} catch (ExtSourceUnsupportedOperationException e) {
// silently skip
} catch (Exception e) {
log.error("Failed to close connection to extsource", e);
}
}
}
}
return invalidUsers;
}
use of cz.metacentrum.perun.core.api.exceptions.ExtSourceUnsupportedOperationException in project perun by CESNET.
the class MembersManagerBlImpl method createMember.
@Override
public Member createMember(PerunSession sess, Vo vo, ExtSource extSource, String login, List<Group> groups) throws WrongAttributeValueException, WrongReferenceAttributeValueException, AlreadyMemberException, ExtendMembershipException {
// First of all get candidate from extSource directly
Candidate candidate = null;
try {
if (extSource instanceof ExtSourceApi) {
// get first subject, then create candidate
Map<String, String> subject = ((ExtSourceSimpleApi) extSource).getSubjectByLogin(login);
candidate = new Candidate(getPerunBl().getExtSourcesManagerBl().getCandidate(sess, subject, extSource, login));
} else if (extSource instanceof ExtSourceSimpleApi) {
// get candidates from external source by login
candidate = new Candidate(getPerunBl().getExtSourcesManagerBl().getCandidate(sess, extSource, login));
}
} catch (CandidateNotExistsException | SubjectNotExistsException ex) {
throw new InternalErrorException("Can't find candidate for login " + login + " in extSource " + extSource, ex);
} catch (ExtSourceUnsupportedOperationException ex) {
throw new InternalErrorException("Some operation is not allowed for extSource " + extSource, ex);
} finally {
if (extSource instanceof ExtSourceSimpleApi) {
try {
((ExtSourceSimpleApi) extSource).close();
} catch (ExtSourceUnsupportedOperationException e) {
// silently skip
} catch (Exception e) {
log.error("Failed to close connection to extsource", e);
}
}
}
return this.createMember(sess, vo, candidate, groups);
}
use of cz.metacentrum.perun.core.api.exceptions.ExtSourceUnsupportedOperationException in project perun by CESNET.
the class GroupsManagerBlImpl method getSubjectsFromExtSource.
/**
* Return List of subjects, where subject is map of attribute names and attribute values.
* Every subject is structure for creating Candidate from ExtSource.
*
* @param sess
* @param source to get subjects from
* @param group to be synchronized
*
* @return list of subjects
*
* @throws InternalErrorException if internal error occurs
*/
private List<Map<String, String>> getSubjectsFromExtSource(PerunSession sess, ExtSource source, Group group) {
// Get all group attributes and store tham to map (info like query, time interval etc.)
List<Attribute> groupAttributes = getPerunBl().getAttributesManagerBl().getAttributes(sess, group);
Map<String, String> groupAttributesMap = new HashMap<>();
for (Attribute attr : groupAttributes) {
String value = BeansUtils.attributeValueToString(attr);
String name = attr.getName();
groupAttributesMap.put(name, value);
}
// -- Get Subjects in form of map where left string is name of attribute and right string is value of attribute, every subject is one map
List<Map<String, String>> subjects;
try {
subjects = ((ExtSourceSimpleApi) source).getGroupSubjects(groupAttributesMap);
log.debug("Group synchronization {}: external group contains {} members.", group, subjects.size());
} catch (ExtSourceUnsupportedOperationException e2) {
throw new InternalErrorException("ExtSource " + source.getName() + " doesn't support getGroupSubjects", e2);
}
return subjects;
}
use of cz.metacentrum.perun.core.api.exceptions.ExtSourceUnsupportedOperationException in project perun by CESNET.
the class GroupsManagerBlImpl method synchronizeGroupStructure.
@Override
public List<String> synchronizeGroupStructure(PerunSession sess, Group baseGroup) throws AttributeNotExistsException, WrongAttributeAssignmentException, ExtSourceNotExistsException, WrongAttributeValueException, WrongReferenceAttributeValueException {
List<String> skippedGroups = new ArrayList<>();
log.info("Group structure synchronization {}: started.", baseGroup);
// get extSource for group structure
ExtSource source = getGroupExtSourceForSynchronization(sess, baseGroup);
try {
// get login attribute for structure
AttributeDefinition loginAttributeDefinition = getLoginAttributeForGroupStructure(sess, baseGroup);
// get login prefix if exists
String loginPrefix = getLoginPrefixForGroupStructure(sess, baseGroup);
List<CandidateGroup> candidateGroupsToAdd = new ArrayList<>();
Map<CandidateGroup, Group> groupsToUpdate = new HashMap<>();
List<Group> groupsToRemove = new ArrayList<>();
Map<String, Group> actualGroups = getAllSubGroupsWithLogins(sess, baseGroup, loginAttributeDefinition);
List<Map<String, String>> subjectGroups = getSubjectGroupsFromExtSource(sess, source, baseGroup);
if (isThisFlatSynchronization(sess, baseGroup)) {
for (Map<String, String> subjectGroup : subjectGroups) {
subjectGroup.put(PARENT_GROUP_LOGIN, null);
}
}
List<String> mergeAttributes = getAttributesListFromExtSource(source, MERGE_GROUP_ATTRIBUTES);
List<CandidateGroup> candidateGroups = getPerunBl().getExtSourcesManagerBl().generateCandidateGroups(sess, subjectGroups, source, loginPrefix);
categorizeGroupsForSynchronization(actualGroups, candidateGroups, candidateGroupsToAdd, groupsToUpdate, groupsToRemove);
// order of operations is important here
// removing need to go first to be able to replace groups with same name but different login
// updating need to be last to set right order of groups again
List<Integer> removedGroupsIds = removeFormerGroupsWhileSynchronization(sess, baseGroup, groupsToRemove, skippedGroups);
addMissingGroupsWhileSynchronization(sess, baseGroup, candidateGroupsToAdd, loginAttributeDefinition, skippedGroups, mergeAttributes);
updateExistingGroupsWhileSynchronization(sess, baseGroup, groupsToUpdate, removedGroupsIds, loginAttributeDefinition, skippedGroups, mergeAttributes);
setUpSynchronizationAttributesForAllSubGroups(sess, baseGroup, source, loginAttributeDefinition, loginPrefix);
syncResourcesForSynchronization(sess, baseGroup, loginAttributeDefinition, skippedGroups);
log.info("Group structure synchronization {}: ended.", baseGroup);
return skippedGroups;
} finally {
if (source instanceof ExtSourceSimpleApi) {
try {
((ExtSourceSimpleApi) source).close();
} catch (ExtSourceUnsupportedOperationException e) {
// silently skip
} catch (Exception e) {
log.error("Failed to close extsource after structure synchronization.", e);
}
}
}
}
Aggregations