@Override public Iterator<IEntityGroup> findParentGroups(IGroupMember member) throws GroupsException { /* * This method has the potential to be called A LOT, especially if * there's a lot of portal data (portlets & groups). It's important * not to waste time on nonsensical checks. */ if (!IPERSON_CLASS.equals(member.getLeafType())) { // This is going to happen; GaP code is not responsible for // knowing that PAGS only supports groups of IPerson (we are). return Collections.emptyIterator(); } logger.debug("finding containing groups for member key {}", member.getKey()); final Set<IEntityGroup> set = Collections.emptySet(); Iterator<IEntityGroup> rslt = set.iterator(); // default if (member.isGroup()) { // PAGS groups may only contain other PAGS groups (and people, of course) final IEntityGroup ieg = (IEntityGroup) member; if (PagsService.SERVICE_NAME_PAGS.equals(ieg.getServiceName().toString())) { rslt = findParentGroupsForGroup((IEntityGroup) member); } } else { rslt = findParentGroupsForEntity((IEntity) member); } return rslt; }
/* (non-Javadoc) * @see org.jasig.portal.groups.IEntityGroupStore#findEntitiesForGroup(org.jasig.portal.groups.IEntityGroup) */ @SuppressWarnings("unchecked") public Iterator findEntitiesForGroup(IEntityGroup group) throws GroupsException { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Searching Grouper for members of the group with key: " + group.getKey()); } try { // execute a search for members of the specified group GcGetMembers getGroupsMembers = new GcGetMembers(); getGroupsMembers.addGroupName(group.getLocalKey()); getGroupsMembers.assignIncludeSubjectDetail(true); WsGetMembersResults results = getGroupsMembers.execute(); if (results == null || results.getResults() == null || results.getResults().length == 0 || results.getResults()[0].getWsSubjects() == null) { LOGGER.debug("No members found for Grouper group with key " + group.getLocalKey()); return Collections.<IGroupMember>emptyList().iterator(); } WsSubject[] gInfos = results.getResults()[0].getWsSubjects(); final List<IGroupMember> members = new ArrayList<IGroupMember>(gInfos.length); // add each result to the member list for (WsSubject gInfo : gInfos) { // if the member is not a group (aka person) if (!StringUtils.equals(gInfo.getSourceId(), "g:gsa")) { if (LOGGER.isDebugEnabled()) { LOGGER.debug( "creating leaf member:" + gInfo.getId() + " and name: " + gInfo.getName() + " from group: " + group.getLocalKey()); } // use the name instead of id as it shows better in the display IGroupMember member = new EntityImpl(gInfo.getName(), IPerson.class); members.add(member); } } // return an iterator for the assembled group return members.iterator(); } catch (Exception e) { LOGGER.warn( "Exception while attempting to retrieve " + "member entities of group with key " + group.getKey() + " from Grouper web services: " + e.getMessage()); return Collections.<IGroupMember>emptyList().iterator(); } }
/** * Construct an IEntityGroup from a Grouper WsGroup. * * @param wsGroup * @return the group */ protected IEntityGroup createUportalGroupFromGrouperGroup(WsGroup wsGroup) { IEntityGroup iEntityGroup = new EntityGroupImpl(wsGroup.getName(), IPerson.class); // need to set the group name and description to the actual // display name and description iEntityGroup.setName(wsGroup.getDisplayName()); iEntityGroup.setDescription(wsGroup.getDescription()); return iEntityGroup; }
@SuppressWarnings("unchecked") public Iterator findMemberGroups(IEntityGroup group) throws GroupsException { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Searching for group-type members of group with key: " + group.getKey()); } try { if (!validKey(group.getLocalKey())) { return Collections.<IEntityGroup>emptyList().iterator(); } GcGetMembers gcGetMembers = new GcGetMembers(); gcGetMembers.addGroupName(group.getLocalKey()); gcGetMembers.assignIncludeSubjectDetail(true); gcGetMembers.addSourceId("g:gsa"); WsGetMembersResults results = gcGetMembers.execute(); if (results == null || results.getResults() == null || results.getResults().length == 0 || results.getResults()[0].getWsSubjects() == null) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("No group-type members found for group with key " + group.getKey()); } return Collections.<IEntityGroup>emptyList().iterator(); } final List<IEntityGroup> members = new ArrayList<IEntityGroup>(); WsSubject[] subjects = results.getResults()[0].getWsSubjects(); for (WsSubject wsSubject : subjects) { if (validKey(wsSubject.getName())) { WsGroup wsGroup = findGroupFromKey(wsSubject.getName()); if (wsGroup != null) { IEntityGroup member = createUportalGroupFromGrouperGroup(wsGroup); members.add(member); if (LOGGER.isTraceEnabled()) { LOGGER.trace("found IEntityGroup member: " + member); } } } } return members.iterator(); } catch (Exception e) { LOGGER.warn( "Exception while attempting to retrieve " + "member groups of group with key " + group.getKey() + " from Grouper web services: " + e.getMessage()); return Collections.<IGroupMember>emptyList().iterator(); } }
/** * @see * org.jasig.portal.groups.IEntityGroupStore#updateMembers(org.jasig.portal.groups.IEntityGroup) */ public void updateMembers(IEntityGroup group) throws GroupsException { // assume key is fully qualified group name String groupName = group.getLocalKey(); GcAddMember gcAddMember = new GcAddMember().assignGroupName(groupName); for (IGroupMember iGroupMember : group.getChildren()) { EntityIdentifier entityIdentifier = iGroupMember.getEntityIdentifier(); String identifier = entityIdentifier.getKey(); gcAddMember.addSubjectIdentifier(identifier); } gcAddMember.execute(); }
private IEntityGroup convertPagsGroupToEntity(IPersonAttributesGroupDefinition group) { final String cacheKey = group.getName(); Element element = entityGroupCache.get(cacheKey); if (element == null) { final IEntityGroup entityGroup = new EntityTestingGroupImpl(group.getName(), IPERSON_CLASS); entityGroup.setName(group.getName()); entityGroup.setDescription(group.getDescription()); element = new Element(cacheKey, entityGroup); entityGroupCache.put(element); } return (IEntityGroup) element.getObjectValue(); }
/* (non-Javadoc) * @see org.jasig.portal.groups.IEntityGroupStore#findMemberGroupKeys(org.jasig.portal.groups.IEntityGroup) */ @SuppressWarnings("unchecked") public String[] findMemberGroupKeys(IEntityGroup group) throws GroupsException { // first the get an iterator for the member groups final Iterator<IEntityGroup> it = findMemberGroups(group); // construct a list of group keys from this iterator List<String> keys = new ArrayList<String>(); while (it.hasNext()) { IEntityGroup eg = it.next(); keys.add(eg.getKey()); } // return an iterator over the assembled list return keys.toArray(new String[keys.size()]); }
public Entity getEntity(String entityType, String entityId, boolean populateChildren) { // get the EntityEnum for the specified entity type EntityEnum entityEnum = EntityEnum.getEntityEnum(entityType); // if the entity type is a group, use the group service's findGroup method // to locate it if (entityEnum.isGroup()) { // attempt to find the entity IEntityGroup entityGroup = GroupService.findGroup(entityId); if (entityGroup == null) { return null; } else { Entity entity = EntityFactory.createEntity(entityGroup, entityEnum); if (populateChildren) { @SuppressWarnings("unchecked") Iterator<IGroupMember> members = (Iterator<IGroupMember>) entityGroup.getMembers(); entity = populateChildren(entity, members); } IAuthorizationPrincipal authP = getPrincipalForEntity(entity); Principal principal = new PrincipalImpl(authP.getKey(), authP.getPrincipalString()); entity.setPrincipal(principal); return entity; } } // otherwise use the getGroupMember method else { IGroupMember groupMember = GroupService.getGroupMember(entityId, entityEnum.getClazz()); if (groupMember == null || groupMember instanceof IEntityGroup) { return null; } Entity entity = EntityFactory.createEntity(groupMember, entityEnum); // the group member interface doesn't include the entity name, so // we'll need to look that up manually entity.setName(lookupEntityName(entity)); if (EntityEnum.GROUP.toString().equals(entity.getEntityType()) || EntityEnum.PERSON.toString().equals(entity.getEntityType())) { IAuthorizationPrincipal authP = getPrincipalForEntity(entity); Principal principal = new PrincipalImpl(authP.getKey(), authP.getPrincipalString()); entity.setPrincipal(principal); } return entity; } }
/** * Decorates a group if needed. * * @param group The group to decorate. * @return The decorated group if some grouper grouper groups have to be loaded in it. */ private IEntityGroup decorate(final IEntityGroup group) { if (group == null) { return group; } final String groupName = group.getName(); String eltsToLoad = null; if (groupName != null) { eltsToLoad = grouperMapping.getProperty(groupName); } // Retrieves the name of the Grouper groups to load. String[] grouperGroups = null; if (eltsToLoad != null) { grouperGroups = eltsToLoad.split(ESCOConstants.SEP); } final EntityGroupImpl decoratedGroup = new ESCODynEntityGroupDecorator( group.getKey(), group.getLeafType(), group.getCreatorID(), group.getName(), group.getDescription(), grouperGroups); return decoratedGroup; }
@Override public Iterator<IEntityGroup> findMemberGroups(IEntityGroup group) throws GroupsException { /* * The GaP system prevents this method from being called with a nn-PAGS group. */ IPersonAttributesGroupDefinition pagsGroup = getPagsGroupDefByName(group.getName()); List<IEntityGroup> results = new ArrayList<IEntityGroup>(); for (IPersonAttributesGroupDefinition member : pagsGroup.getMembers()) { results.add(convertPagsGroupToEntity(member)); } return results.iterator(); }
/** @see org.jasig.portal.groups.IEntityGroupStore#update(org.jasig.portal.groups.IEntityGroup) */ public void update(IEntityGroup group) throws GroupsException { // assume key is fully qualified group name String groupName = group.getLocalKey(); String description = group.getDescription(); // the name is the displayExtension String displayExtension = group.getName(); WsGroupToSave wsGroupToSave = new WsGroupToSave(); wsGroupToSave.setCreateParentStemsIfNotExist("T"); wsGroupToSave.setWsGroupLookup(new WsGroupLookup(groupName, null)); WsGroup wsGroup = new WsGroup(); wsGroup.setName(groupName); wsGroup.setDisplayExtension(displayExtension); wsGroup.setDescription(description); wsGroupToSave.setWsGroup(wsGroup); new GcGroupSave().addGroupToSave(wsGroupToSave).execute(); updateMembers(group); }
/* (non-Javadoc) * @see org.jasig.portal.groups.IEntityGroupStore#find(java.lang.String) */ public IEntityGroup find(String key) throws GroupsException { try { // Search the Grouper server for groups with the specified local // key if (LOGGER.isDebugEnabled()) { LOGGER.debug("Searching Grouper for a direct match for key: " + key); } WsGroup wsGroup = findGroupFromKey(key); if (wsGroup == null) { return null; } IEntityGroup group = createUportalGroupFromGrouperGroup(wsGroup); if (LOGGER.isDebugEnabled()) { LOGGER.debug( "Retrieved group from the Grouper server matching key " + key + ": " + group.toString()); } // return the group return group; } catch (Exception e) { LOGGER.warn( "Exception while attempting to retrieve " + "group with key " + key + " from Grouper web services: " + e.getMessage()); return null; } }
/* (non-Javadoc) * @see org.jasig.portal.groups.IEntityGroupStore#contains(org.jasig.portal.groups.IEntityGroup, org.jasig.portal.groups.IGroupMember) */ public boolean contains(IEntityGroup group, IGroupMember member) throws GroupsException { String groupContainerName = group.getLocalKey(); String groupMemberName = member.getKey(); if (!validKey(groupContainerName) || !validKey(groupMemberName)) { return false; } GcHasMember gcHasMember = new GcHasMember(); gcHasMember.assignGroupName(groupContainerName); gcHasMember.addSubjectLookup(new WsSubjectLookup(null, "g:gsa", groupMemberName)); WsHasMemberResults wsHasMemberResults = gcHasMember.execute(); if (GrouperClientUtils.length(wsHasMemberResults.getResults()) == 1) { WsHasMemberResult wsHasMemberResult = wsHasMemberResults.getResults()[0]; return StringUtils.equals("IS_MEMBER", wsHasMemberResult.getResultMetadata().getResultCode()); } return false; }
@Override public boolean contains(IEntityGroup group, IGroupMember member) { /* * This method has the potential to be called A LOT, especially if * there's a lot of portal data (portlets & groups). It's important * not to waste time on nonsensical checks. */ if (!IPERSON_CLASS.equals(member.getLeafType())) { // Maybe this call to contains() shouldn't even happen, since // group.getLeafType() is (presumably) IPerson.class. return false; } if (member.isGroup()) { // PAGS groups may only contain other PAGS groups (and people, of course) final IEntityGroup ieg = (IEntityGroup) member; if (!PagsService.SERVICE_NAME_PAGS.equals(ieg.getServiceName().toString())) { return false; } } final MembershipCacheKey cacheKey = new MembershipCacheKey(group.getEntityIdentifier(), member.getEntityIdentifier()); Element element = membershipCache.get(cacheKey); if (element == null) { logger.debug( "Checking if group {} contains member {}/{}", group.getName(), member.getKey(), member.getLeafType().getSimpleName()); boolean answer = false; // default final PagsGroup groupDef = convertEntityToGroupDef(group); if (member.isGroup()) { final String key = ((IEntityGroup) member).getLocalKey(); answer = groupDef.hasMember(key); } else { try { final IPersonAttributeDao pa = PersonAttributeDaoLocator.getPersonAttributeDao(); final IPersonAttributes personAttributes = pa.getPerson(member.getKey()); if (personAttributes != null) { final RestrictedPerson rp = PersonFactory.createRestrictedPerson(); rp.setAttributes(personAttributes.getAttributes()); answer = groupDef.contains(rp); } } catch (Exception ex) { logger.error( "Exception acquiring attributes for member " + member + " while checking if group " + group + " contains this member.", ex); return false; } } element = new Element(cacheKey, answer); membershipCache.put(element); } return (Boolean) element.getObjectValue(); }
@Override public EntityIdentifier[] searchForGroups(String query, int method, Class leaftype) throws GroupsException { if (leaftype != IPERSON_CLASS) { return EMPTY_SEARCH_RESULTS; } Set<IPersonAttributesGroupDefinition> pagsGroups = personAttributesGroupDefinitionDao.getPersonAttributesGroupDefinitions(); List<EntityIdentifier> results = new ArrayList<EntityIdentifier>(); switch (method) { case IS: for (IPersonAttributesGroupDefinition pagsGroup : pagsGroups) { IEntityGroup g = convertPagsGroupToEntity(pagsGroup); if (g.getName().equalsIgnoreCase(query)) { results.add(g.getEntityIdentifier()); } } break; case STARTS_WITH: for (IPersonAttributesGroupDefinition pagsGroup : pagsGroups) { IEntityGroup g = convertPagsGroupToEntity(pagsGroup); if (g.getName().toUpperCase().startsWith(query.toUpperCase())) { results.add(g.getEntityIdentifier()); } } break; case ENDS_WITH: for (IPersonAttributesGroupDefinition pagsGroup : pagsGroups) { IEntityGroup g = convertPagsGroupToEntity(pagsGroup); if (g.getName().toUpperCase().endsWith(query.toUpperCase())) { results.add(g.getEntityIdentifier()); } } break; case CONTAINS: for (IPersonAttributesGroupDefinition pagsGroup : pagsGroups) { IEntityGroup g = convertPagsGroupToEntity(pagsGroup); if (g.getName().toUpperCase().indexOf(query.toUpperCase()) != -1) { results.add(g.getEntityIdentifier()); } } break; } return results.toArray(new EntityIdentifier[] {}); }
private Iterator<IEntityGroup> findParentGroupsForGroup(IEntityGroup group) { logger.debug( "Finding containing groups for group {} (key {})", group.getName(), group.getKey()); Set<IEntityGroup> parents = getParentGroups(group.getName(), new HashSet<IEntityGroup>()); return parents.iterator(); }
/** @see org.jasig.portal.groups.IEntityGroupStore#delete(org.jasig.portal.groups.IEntityGroup) */ public void delete(IEntityGroup group) throws GroupsException { String groupName = group.getLocalKey(); new GcGroupDelete().addGroupLookup(new WsGroupLookup(groupName, null)).execute(); }
private PagsGroup convertEntityToGroupDef(IEntityGroup group) { IPersonAttributesGroupDefinition pagsGroup = getPagsGroupDefByName(group.getName()); return initGroupDef(pagsGroup); }