package org.apereo.cas.authentication.principal; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.springframework.util.Assert; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; /** * Simple implementation of a {@link Principal} that exposes an unmodifiable * map of attributes. The attributes are cached upon construction and * will not be updated unless the principal is entirely and newly * resolved again. * * @author Scott Battaglia * @author Marvin S. Addison * @since 3.1 */ @JsonIgnoreProperties(ignoreUnknown = true) public class SimplePrincipal implements Principal { /** * Serialization support. */ private static final long serialVersionUID = -1255260750151385796L; /** * The unique identifier for the principal. */ @JsonProperty private String id; /** * Principal attributes. **/ private Map<String, Object> attributes; /** * No-arg constructor for serialization support. */ private SimplePrincipal() { this.id = null; this.attributes = new HashMap<>(); } /** * Instantiates a new simple principal. * * @param id the id */ private SimplePrincipal(final String id) { this(id, new HashMap<>()); } /** * Instantiates a new simple principal. * * @param id the id * @param attributes the attributes */ @JsonCreator protected SimplePrincipal(@JsonProperty("id") final String id, @JsonProperty("attributes") final Map<String, Object> attributes) { Assert.notNull(id, "Principal id cannot be null"); this.id = id; if (attributes == null) { this.attributes = new HashMap<>(); } else { this.attributes = attributes; } } /** * @return An immutable map of principal attributes */ @Override public Map<String, Object> getAttributes() { final Map<String, Object> attrs = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); attrs.putAll(this.attributes); return attrs; } @Override public String toString() { return this.id; } @Override public int hashCode() { final HashCodeBuilder builder = new HashCodeBuilder(83, 31); builder.append(this.id.toLowerCase()); return builder.toHashCode(); } @Override public String getId() { return this.id; } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } final SimplePrincipal rhs = (SimplePrincipal) obj; return StringUtils.equalsIgnoreCase(this.id, rhs.getId()); } }