/* See LICENSE for licensing and NOTICE for copyright. */
package org.ldaptive.jaas;
import java.io.Serializable;
import java.security.Principal;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import org.ldaptive.LdapAttribute;
import org.ldaptive.LdapEntry;
import org.ldaptive.LdapUtils;
import org.ldaptive.SearchResult;
/**
* Provides a custom implementation for adding LDAP principals to a subject that represent roles.
*
* @author Middleware Services
*/
public class LdapRole implements Principal, Serializable, Comparable<Principal>
{
/** hash code seed. */
private static final int HASH_CODE_SEED = 421;
/** serial version uid. */
private static final long serialVersionUID = 1578734888816839199L;
/** LDAP role name. */
private final String roleName;
/**
* Creates a new ldap role with the supplied name.
*
* @param name of this role
*/
public LdapRole(final String name)
{
roleName = name;
}
@Override
public String getName()
{
return roleName;
}
@Override
public boolean equals(final Object o)
{
if (o == this) {
return true;
}
if (o instanceof LdapRole) {
final LdapRole v = (LdapRole) o;
return LdapUtils.areEqual(roleName, v.roleName);
}
return false;
}
@Override
public int hashCode()
{
return LdapUtils.computeHashCode(HASH_CODE_SEED, roleName);
}
@Override
public String toString()
{
return String.format("[%s@%d::%s]", getClass().getName(), hashCode(), roleName);
}
@Override
public int compareTo(final Principal p)
{
return roleName.compareTo(p.getName());
}
/**
* Iterates over the supplied result and returns all attributes as a set of ldap roles.
*
* @param result to read
*
* @return ldap roles
*/
public static Set<LdapRole> toRoles(final SearchResult result)
{
final Set<LdapRole> r = new HashSet<>();
for (LdapEntry le : result.getEntries()) {
r.addAll(toRoles(le));
}
return r;
}
/**
* Iterates over the supplied entry and returns all attributes as a set of ldap roles.
*
* @param entry to read
*
* @return ldap roles
*/
public static Set<LdapRole> toRoles(final LdapEntry entry)
{
return toRoles(entry.getAttributes());
}
/**
* Iterates over the supplied attributes and returns all values as a set of ldap roles.
*
* @param attributes to read
*
* @return ldap roles
*/
public static Set<LdapRole> toRoles(final Collection<LdapAttribute> attributes)
{
final Set<LdapRole> r = new HashSet<>();
if (attributes != null) {
for (LdapAttribute ldapAttr : attributes) {
r.addAll(ldapAttr.getStringValues().stream().map(LdapRole::new).collect(Collectors.toList()));
}
}
return r;
}
}