package org.apereo.cas.authentication;
import org.apereo.cas.authentication.principal.PrincipalResolver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.OrderComparator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* This is {@link DefaultAuthenticationEventExecutionPlan}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
public class DefaultAuthenticationEventExecutionPlan implements AuthenticationEventExecutionPlan {
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultAuthenticationEventExecutionPlan.class);
private List<AuthenticationMetaDataPopulator> authenticationMetaDataPopulatorList = new ArrayList<>();
private Map<AuthenticationHandler, PrincipalResolver> authenticationHandlerPrincipalResolverMap = new LinkedHashMap<>();
@Override
public void registerAuthenticationHandler(final AuthenticationHandler handler) {
registerAuthenticationHandlerWithPrincipalResolver(handler, null);
}
@Override
public void registerAuthenticationHandlerWithPrincipalResolver(final AuthenticationHandler handler, final PrincipalResolver principalResolver) {
if (principalResolver == null) {
LOGGER.debug("Registering handler [{}] with no principal resolver into the execution plan", handler.getName());
} else {
LOGGER.debug("Registering handler [{}] principal resolver [{}] into the execution plan", handler.getName(), principalResolver);
}
this.authenticationHandlerPrincipalResolverMap.put(handler, principalResolver);
}
@Override
public void registerAuthenticationHandlerWithPrincipalResolver(final Map<AuthenticationHandler, PrincipalResolver> plan) {
plan.forEach(this::registerAuthenticationHandlerWithPrincipalResolver);
}
@Override
public void registerMetadataPopulator(final AuthenticationMetaDataPopulator populator) {
LOGGER.debug("Registering metadata populator [{}] into the execution plan", populator);
authenticationMetaDataPopulatorList.add(populator);
}
@Override
public void registerMetadataPopulators(final Collection<AuthenticationMetaDataPopulator> populators) {
populators.forEach(this::registerMetadataPopulator);
}
@Override
public Collection<AuthenticationMetaDataPopulator> getAuthenticationMetadataPopulators(final AuthenticationTransaction transaction) {
final List<AuthenticationMetaDataPopulator> list = new ArrayList(this.authenticationMetaDataPopulatorList);
OrderComparator.sort(list);
LOGGER.debug("Sorted and registered metadata populators for this transaction are [{}]", list);
return list;
}
@Override
public Set<AuthenticationHandler> getAuthenticationHandlersForTransaction(final AuthenticationTransaction transaction) {
final AuthenticationHandler[] handlers = authenticationHandlerPrincipalResolverMap.keySet().toArray(new AuthenticationHandler[]{});
OrderComparator.sortIfNecessary(handlers);
return new LinkedHashSet<>(Arrays.stream(handlers).collect(Collectors.toSet()));
}
@Override
public PrincipalResolver getPrincipalResolverForAuthenticationTransaction(final AuthenticationHandler handler,
final AuthenticationTransaction transaction) {
return authenticationHandlerPrincipalResolverMap.get(handler);
}
@Override
public void registerAuthenticationHandlerWithPrincipalResolvers(final Collection<AuthenticationHandler> handlers,
final PrincipalResolver principalResolver) {
handlers.forEach(h -> registerAuthenticationHandlerWithPrincipalResolver(h, principalResolver));
}
}