use of cz.metacentrum.perun.core.api.exceptions.ExtSourceUnsupportedOperationException in project perun by CESNET.
the class GroupsManagerBlImpl method getSubjectGroupsFromExtSource.
/**
* Return List of subjects, where subject is map of attribute names and attribute values.
* Every subject is structure for creating CandidateGroup from ExtSource.
*
* Method used by group structure synchronization
*
* @param sess
* @param source to get subjects from
* @param group under which we will be synchronizing groups
*
* @return list of subjects
*
* @throws InternalErrorException if internal error occurs
*/
private List<Map<String, String>> getSubjectGroupsFromExtSource(PerunSession sess, ExtSource source, Group group) {
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);
}
List<Map<String, String>> subjects;
try {
subjects = ((ExtSourceSimpleApi) source).getSubjectGroups(groupAttributesMap);
log.debug("Group synchronization {}: external source contains {} group.", group, subjects.size());
} catch (ExtSourceUnsupportedOperationException e2) {
throw new InternalErrorException("ExtSource " + source.getName() + " doesn't support getSubjectGroups", e2);
}
return subjects;
}
use of cz.metacentrum.perun.core.api.exceptions.ExtSourceUnsupportedOperationException in project perun by CESNET.
the class GroupsManagerBlImpl method convertSubjectsToCandidates.
/**
* Convert List of subjects to list of Candidates.
*
* To getting Candidate can use 1 of 3 possible options:
* 1] membersSource and source are not equals => we have just login, other attributes neet to get from membersSource
* 2] membersSource==source and membersSource is instance of ExtSourceApi => we already have all attributes in subject
* 3] membersSource==source and membersSource is instance of SimplExtSourceApi => we have just login, need to read other attributes again
*
* If candidate cannot be get for some reason, add this reason to skippedMembers list and skip him.
*
* @param sess
* @param subjects list of subjects from ExtSource (at least login should be here)
* @param membersSource optional member ExtSource (if members attributes are from other source then their logins)
* @param source default group ExtSource
* @param actualGroupMembers actual members of synchronized group
* @param skippedMembers not successfully synchronized members are skipped and information about it should be added here
*
* @return list of successfully created candidates from subjects
*
* @throws InternalErrorException if some internal error occurs
*/
private List<Candidate> convertSubjectsToCandidates(PerunSession sess, List<Map<String, String>> subjects, ExtSource membersSource, ExtSource source, List<RichMember> actualGroupMembers, List<String> skippedMembers) {
List<Candidate> candidates = new ArrayList<>();
// mapping structure for more efficient searching of actual group members
Map<UserExtSource, RichMember> mappingStructure = this.createMappingStructure(actualGroupMembers);
for (Map<String, String> subject : subjects) {
String login = subject.get("login");
// Skip subjects, which doesn't have login
if (login == null || login.isEmpty()) {
log.debug("Subject {} doesn't contain attribute login, skipping.", subject);
skippedMembers.add("MemberEntry:[" + subject + "] was skipped because login is missing");
continue;
}
try {
// 1] sources of login and other attributes are not same
if (!membersSource.equals(source)) {
// need to read attributes from the new memberSource, we can't use locally data there (there are from other extSource)
candidates.add(new Candidate(getPerunBl().getExtSourcesManagerBl().getCandidate(sess, membersSource, login)));
// 2] sources are same and we work with source which is instance of ExtSourceApi
} else if (membersSource instanceof ExtSourceApi) {
// we can use the data from this source without reading them again (all exists in the map of subject attributes)
candidates.add(new Candidate(getPerunBl().getExtSourcesManagerBl().getCandidate(sess, subject, membersSource, login)));
// 3] sources are same and we work with source which is instace of ExtSourceSimpleApi
} else if (membersSource instanceof ExtSourceSimpleApi) {
// we can't use the data from this source, we need to read them again (they are not in the map of subject attributes)
candidates.add(new Candidate(getPerunBl().getExtSourcesManagerBl().getCandidate(sess, membersSource, login)));
} else {
// this could not happen without change in extSource API code
throw new InternalErrorException("ExtSource is other instance than SimpleApi or Api and this is not supported!");
}
} catch (CandidateNotExistsException e) {
log.warn("getGroupSubjects subjects returned login {}, but it cannot be obtained using getCandidate()", login);
// If member can't be find in the member's extSource (we are missing other attributes) we can try find him in the group
UserExtSource subjectUserExtSource = new UserExtSource(membersSource, login);
// If member is in the group, we can create a simple object from him to preserve his existence in the group
if (mappingStructure.containsKey(subjectUserExtSource)) {
RichMember richMember = mappingStructure.get(subjectUserExtSource);
// convert richMember to simple candidate object (to prevent wrong attribute updating)
candidates.add(BeansUtils.convertRichMemberToCandidate(richMember, subjectUserExtSource));
skippedMembers.add("MemberEntry:[" + richMember + "] was skipped from updating in the group, because he can't be found by login:'" + login + "' in extSource " + membersSource);
} else {
skippedMembers.add("MemberEntry:[" + subject + "] was skipped from adding to the group because he can't be found by login:'" + login + "' in extSource " + membersSource);
}
} catch (ExtSourceUnsupportedOperationException e) {
log.warn("ExtSource {} doesn't support getCandidate operation.", membersSource);
skippedMembers.add("MemberEntry:[" + subject + "] was skipped because extSource " + membersSource + " not support method getCandidate");
} catch (ParserException e) {
log.warn("Can't parse value {} from candidate with login {}", e.getParsedValue(), login);
skippedMembers.add("MemberEntry:[" + subject + "] was skipped because of problem with parsing value '" + e.getParsedValue() + "'");
}
}
return candidates;
}
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, List<ExtSource> extSources, boolean filterExistingMembers) {
List<Candidate> candidates = new ArrayList<>();
int numOfResults = 0;
try {
// Iterate through given extSources
for (ExtSource source : extSources) {
try {
// 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.", 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 && 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 = 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 = new Candidate(getPerunBl().getExtSourcesManagerBl().getCandidate(sess, source, extLogin));
} else {
// retrieve data about subjects from subjects we already have locally
candidate = new Candidate(getPerunBl().getExtSourcesManagerBl().getCandidate(sess, s, source, extLogin));
}
} 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);
}
if (filterExistingMembers) {
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;
}
}
} catch (InternalErrorException e) {
log.error("Failed to get candidates from ExtSource: {}", source);
} 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);
}
}
}
// 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 VosManagerBlImpl method findCandidates.
public List<Candidate> findCandidates(PerunSession sess, Group group, String searchString) throws InternalErrorException {
List<Candidate> candidates = new ArrayList<>();
try {
// Iterate through all registered extSources in the group
for (ExtSource source : getPerunBl().getExtSourcesManagerBl().getGroupExtSources(sess, group)) {
// 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);
simpleExtSource = false;
} else {
// find subjects only with logins - they then must be retrieved by login
subjects = ((ExtSourceSimpleApi) source).findSubjectsLogins(searchString);
}
} 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 {
Vo vo = getPerunBl().getVosManagerBl().getVoById(sess, group.getVoId());
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 (VoNotExistsException e) {
throw new InternalErrorException(e);
} catch (MemberNotExistsException e) {
// This is OK
}
// Add candidate to the list of candidates
log.debug("findCandidates: returning candidate: {}", candidate);
candidates.add(candidate);
}
}
log.debug("Returning {} potential members for group {}", candidates.size(), group);
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 ExtSourcesManagerEntry method getCandidate.
@Override
public Candidate getCandidate(PerunSession sess, ExtSource source, String login) throws PrivilegeException, ExtSourceNotExistsException, CandidateNotExistsException, ExtSourceUnsupportedOperationException {
Utils.checkPerunSession(sess);
getExtSourcesManagerBl().checkExtSourceExists(sess, source);
// Authorization
if (!AuthzResolver.authorizedInternal(sess, "getCandidate_ExtSource_String_policy", source))
throw new PrivilegeException(sess, "getCandidate");
try {
return new Candidate(getExtSourcesManagerBl().getCandidate(sess, source, login));
// we need to close the extsource here because we don't want to always do it in the BL layer
} 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);
}
}
}
}
Aggregations