/* (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();
    }
  }
  @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();
    }
  }