示例#1
0
  //
  // This function is the recursive search of groups for this
  // implementation of the Group. The search proceeds building up
  // a vector of already seen groups. Only new groups are considered,
  // thereby avoiding loops.
  //
  boolean isMemberRecurse(Principal member, Vector<Group> alreadySeen) {
    Enumeration<? extends Principal> e = members();
    while (e.hasMoreElements()) {
      boolean mem = false;
      Principal p = (Principal) e.nextElement();

      // if the member is in this collection, return true
      if (p.equals(member)) {
        return true;
      } else if (p instanceof GroupImpl) {
        //
        // if not recurse if the group has not been checked already.
        // Can call method in this package only if the object is an
        // instance of this class. Otherwise call the method defined
        // in the interface. (This can lead to a loop if a mixture of
        // implementations form a loop, but we live with this improbable
        // case rather than clutter the interface by forcing the
        // implementation of this method.)
        //
        GroupImpl g = (GroupImpl) p;
        alreadySeen.addElement(this);
        if (!alreadySeen.contains(g)) mem = g.isMemberRecurse(member, alreadySeen);
      } else if (p instanceof Group) {
        Group g = (Group) p;
        if (!alreadySeen.contains(g)) mem = g.isMember(member);
      }

      if (mem) return mem;
    }
    return false;
  }
示例#2
0
  /**
   * adds the specified member to the group.
   *
   * @param user The principal to add to the group.
   * @return true if the member was added - false if the member could not be added.
   */
  public boolean addMember(Principal user) {
    if (groupMembers.contains(user)) return false;

    // do not allow groups to be added to itself.
    if (group.equals(user.toString())) throw new IllegalArgumentException();

    groupMembers.addElement(user);
    return true;
  }
示例#3
0
  /**
   * returns true if the passed principal is a member of the group.
   *
   * @param member The principal whose membership must be checked for.
   * @return true if the principal is a member of this group, false otherwise
   */
  public boolean isMember(Principal member) {

    //
    // if the member is part of the group (common case), return true.
    // if not, recursively search depth first in the group looking for the
    // principal.
    //
    if (groupMembers.contains(member)) {
      return true;
    } else {
      Vector<Group> alreadySeen = new Vector<>(10);
      return isMemberRecurse(member, alreadySeen);
    }
  }
示例#4
0
 /** returns the enumeration of the members in the group. */
 public Enumeration<? extends Principal> members() {
   return groupMembers.elements();
 }
示例#5
0
 /**
  * removes the specified member from the group.
  *
  * @param user The principal to remove from the group.
  * @param true if the principal was removed false if the principal was not a member
  */
 public boolean removeMember(Principal user) {
   return groupMembers.removeElement(user);
 }