package org.apereo.cas.authentication;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apereo.cas.authentication.principal.Principal;
import org.apereo.cas.util.CollectionUtils;
import org.springframework.util.Assert;
import java.util.Collections;
import java.util.List;
/**
* Contains information about a successful authentication produced by an {@link AuthenticationHandler}.
* Handler results are naturally immutable since they contain sensitive information that should not be modified outside
* the {@link AuthenticationHandler} that produced it.
*
* @author Marvin S. Addison
* @since 4.0.0
*/
public class DefaultHandlerResult implements HandlerResult {
/**
* Serialization support.
*/
private static final long serialVersionUID = -3113998493287982485L;
/**
* The name of the authentication handler that successfully authenticated a credential.
*/
private String handlerName;
/**
* Credential meta data.
*/
private CredentialMetaData credentialMetaData;
/**
* Resolved principal for authenticated credential.
*/
private Principal principal;
/**
* List of warnings issued by the authentication source while authenticating the credential.
*/
private List<MessageDescriptor> warnings;
/**
* No-arg constructor for serialization support.
*/
private DefaultHandlerResult() {
}
/**
* Instantiates a new handler result.
*
* @param source the source
* @param metaData the meta data
*/
public DefaultHandlerResult(final AuthenticationHandler source, final CredentialMetaData metaData) {
this(source, metaData, null, null);
}
/**
* Instantiates a new handler result.
*
* @param source the source
* @param metaData the meta data
* @param p the p
*/
public DefaultHandlerResult(final AuthenticationHandler source, final CredentialMetaData metaData, final Principal p) {
this(source, metaData, p, null);
}
/**
* Instantiates a new handler result.
*
* @param source the source
* @param metaData the meta data
* @param warnings the warnings
*/
public DefaultHandlerResult(final AuthenticationHandler source, final CredentialMetaData metaData,
final List<MessageDescriptor> warnings) {
this(source, metaData, null, warnings);
}
/**
* Instantiates a new handler result.
*
* @param source the source
* @param metaData the meta data
* @param p the p
* @param warnings the warnings
*/
public DefaultHandlerResult(
final AuthenticationHandler source,
final CredentialMetaData metaData,
final Principal p,
final List<MessageDescriptor> warnings) {
this(StringUtils.isBlank(source.getName()) ? source.getClass().getSimpleName() : source.getName(),
metaData, p, warnings);
}
/**
* Instantiates a new Default handler result.
*
* @param handlerName the handler name
* @param metaData the meta data
* @param p the p
* @param warnings the warnings
*/
public DefaultHandlerResult(
final String handlerName,
final CredentialMetaData metaData,
final Principal p, final List<MessageDescriptor> warnings) {
Assert.notNull(metaData, "Credential metadata cannot be null.");
this.handlerName = handlerName;
this.credentialMetaData = metaData;
this.principal = p;
this.warnings = warnings;
}
@Override
public String getHandlerName() {
return this.handlerName;
}
@Override
public CredentialMetaData getCredentialMetaData() {
return this.credentialMetaData;
}
@Override
public Principal getPrincipal() {
return this.principal;
}
@Override
public List<MessageDescriptor> getWarnings() {
return this.warnings == null
? Collections.emptyList()
: Collections.unmodifiableList(this.warnings);
}
@Override
public int hashCode() {
final HashCodeBuilder builder = new HashCodeBuilder(109, 31);
builder.append(this.handlerName);
builder.append(this.credentialMetaData);
builder.append(this.principal);
builder.append(this.warnings);
return builder.toHashCode();
}
@Override
public boolean equals(final Object obj) {
if (!(obj instanceof DefaultHandlerResult)) {
return false;
}
if (obj == this) {
return true;
}
final DefaultHandlerResult other = (DefaultHandlerResult) obj;
final EqualsBuilder builder = new EqualsBuilder();
builder.append(this.handlerName, other.handlerName);
builder.append(this.credentialMetaData, other.credentialMetaData);
builder.append(this.principal, other.principal);
builder.append(CollectionUtils.wrap(this.warnings), CollectionUtils.wrap(other.warnings));
return builder.isEquals();
}
@Override
public String toString() {
return this.handlerName + ':' + this.credentialMetaData;
}
}