package org.apereo.cas.authentication;
import org.apereo.cas.authentication.principal.Service;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
* This is {@link AuthenticationTransaction}.
*
* @author Misagh Moayyed
* @since 4.2.0
*/
public class AuthenticationTransaction implements Serializable {
private static final long serialVersionUID = 6213904009424725484L;
private Collection<Credential> credentials;
private Service service;
/**
* Instantiates a new Default authentication transaction.
*
* @param service the service
* @param credentials the credentials
*/
protected AuthenticationTransaction(final Service service, final Collection<Credential> credentials) {
this.credentials = credentials;
this.service = service;
}
public Collection<Credential> getCredentials() {
return this.credentials;
}
/**
* Wrap credentials into an authentication transaction, as a factory method,
* and return the final result.
*
* @param service the service
* @param credentials the credentials
* @return the authentication transaction
*/
public static AuthenticationTransaction wrap(final Service service, final Credential... credentials) {
return new AuthenticationTransaction(service, sanitizeCredentials(credentials));
}
/**
* Wrap credentials into an authentication transaction, as a factory method,
* and return the final result.
*
* @param credentials the credentials
* @return the authentication transaction
*/
public static AuthenticationTransaction wrap(final Credential... credentials) {
return wrap(null, credentials);
}
public Service getService() {
return this.service;
}
/**
* Gets the first (primary) credential in the chain.
*
* @return the credential
*/
public Credential getCredential() {
if (!credentials.isEmpty()) {
return credentials.iterator().next();
}
return null;
}
/**
* Is credential of given type?
*
* @param clazz the clazz
* @return true/false
*/
public boolean isCredentialOfType(final Class clazz) {
try {
final Object object = clazz.cast(getCredential());
return object != null;
} catch (final Exception e) {
return false;
}
}
private static Set<Credential> sanitizeCredentials(final Credential[] credentials) {
if (credentials != null && credentials.length > 0) {
return Arrays.stream(credentials)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}
return Collections.emptySet();
}
}