/* See LICENSE for licensing and NOTICE for copyright. */ package org.ldaptive.jaas; import java.io.Serializable; import java.security.Principal; import java.security.acl.Group; import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import org.ldaptive.LdapUtils; /** * Provides a custom implementation for grouping principals. * * @author Middleware Services */ public class LdapGroup implements Group, Serializable { /** hash code seed. */ private static final int HASH_CODE_SEED = 431; /** serial version uid. */ private static final long serialVersionUID = 2075424472884533862L; /** LDAP role name. */ private final String roleName; /** Principal members. */ private final Set<Principal> members = new HashSet<>(); /** * Creates a new ldap group with the supplied name. * * @param name of the group */ public LdapGroup(final String name) { roleName = name; } @Override public String getName() { return roleName; } @Override public boolean addMember(final Principal user) { return members.add(user); } @Override public boolean removeMember(final Principal user) { return members.remove(user); } @Override public boolean isMember(final Principal member) { for (Principal p : members) { if (p.getName() != null && p.getName().equals(member.getName())) { return true; } } return false; } @Override public Enumeration<? extends Principal> members() { return Collections.enumeration(members); } /** * Returns an unmodifiable set of the members in this group. * * @return set of member principals */ public Set<Principal> getMembers() { return Collections.unmodifiableSet(members); } @Override public boolean equals(final Object o) { if (o == this) { return true; } if (o instanceof LdapGroup) { final LdapGroup v = (LdapGroup) o; return LdapUtils.areEqual(roleName, v.roleName) && LdapUtils.areEqual(members, v.members); } return false; } @Override public int hashCode() { return LdapUtils.computeHashCode(HASH_CODE_SEED, roleName, members); } @Override public String toString() { return String.format("[%s@%d::%s%s]", getClass().getName(), hashCode(), roleName, members); } }