@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();
  }
  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();
  }
 private PagsGroup initGroupDef(IPersonAttributesGroupDefinition group) {
   Element element = this.pagsGroupCache.get(group.getName());
   if (element != null) {
     return (PagsGroup) element.getObjectValue();
   }
   PagsGroup groupDef = new PagsGroup();
   groupDef.setKey(group.getName());
   groupDef.setName(group.getName());
   groupDef.setDescription(group.getDescription());
   addMemberKeys(groupDef, group.getMembers());
   Set<IPersonAttributesGroupTestGroupDefinition> testGroups = group.getTestGroups();
   for (IPersonAttributesGroupTestGroupDefinition testGroup : testGroups) {
     TestGroup tg = new TestGroup();
     Set<IPersonAttributesGroupTestDefinition> tests = testGroup.getTests();
     for (IPersonAttributesGroupTestDefinition test : tests) {
       IPersonTester testerInst = initializeTester(test);
       if (testerInst == null) {
         /*
          * A tester was intended that we cannot now recreate.  This
          * is a potentially dangerous situation, since tests in PAGS
          * are "or-ed" together;  a functioning group with a missing
          * test would have a wider membership, not narrower.  (And
          * remember -- permissions are tied to groups.)  We need to
          * play it safe and keep this group out of the mix.
          */
         return null;
       }
       tg.addTest(testerInst);
     }
     groupDef.addTestGroup(tg);
   }
   element = new Element(group.getName(), groupDef);
   this.pagsGroupCache.put(element);
   return groupDef;
 }
 private Set<IEntityGroup> getParentGroups(String name, Set<IEntityGroup> groups)
     throws GroupsException {
   logger.debug("Looking up containing groups for {}", name);
   IPersonAttributesGroupDefinition pagsGroup = getPagsGroupDefByName(name);
   Set<IPersonAttributesGroupDefinition> pagsParentGroups =
       personAttributesGroupDefinitionDao.getParentPersonAttributesGroupDefinitions(pagsGroup);
   for (IPersonAttributesGroupDefinition pagsParent : pagsParentGroups) {
     IEntityGroup parent = convertPagsGroupToEntity(pagsParent);
     if (!groups.contains(parent)) {
       groups.add(parent);
       getParentGroups(pagsParent.getName(), groups);
     } else {
       throw new RuntimeException(
           "Recursive grouping detected! for " + name + " and parent " + pagsParent.getName());
     }
   }
   return groups;
 }
 private void addMemberKeys(PagsGroup groupDef, Set<IPersonAttributesGroupDefinition> members) {
   for (IPersonAttributesGroupDefinition member : members) {
     groupDef.addMember(member.getName());
   }
 }