docs: @Override
      public boolean deepContains(IGroupMember gm) throws GroupsException {
          if (this.contains(gm)) {
              return true;
          }
  
          boolean found = false;
          Iterator<IEntityGroup> it = getMemberGroups();
          while (it.hasNext() && !found) {
              IEntityGroup group = it.next();
              if (group != null) {
                  found = group.deepContains(gm);
              } else {
                  // Something bad has happened:  we've abruptly lost a group node to
                  // which this group node refers.  This is an ERROR condition, but we
                  // shouldn't simply throw an exception because we know (from
                  // experience) it could make the portal unusable.  We definitely,
                  // need, however, to send a strong message.
                  String msg =
                          "Groups Integrety Error:  Group '"
                                  + this.getName()
                                  + "' refers to a child group that is no longer available";
                  logger.error(msg);
              }
          }
  
          return found;
      }