package org.apereo.cas.web.flow;
import org.springframework.webflow.definition.registry.FlowDefinitionRegistry;
import org.springframework.webflow.engine.ActionState;
import org.springframework.webflow.engine.Flow;
import org.springframework.webflow.engine.builder.support.FlowBuilderServices;
import org.springframework.webflow.execution.Action;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
/**
* This is {@link ConsentWebflowConfigurer}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
public class ConsentWebflowConfigurer extends AbstractCasWebflowConfigurer {
private static final String VIEW_ID_CONSENT_VIEW = "casConsentView";
public ConsentWebflowConfigurer(final FlowBuilderServices flowBuilderServices,
final FlowDefinitionRegistry loginFlowDefinitionRegistry) {
super(flowBuilderServices, loginFlowDefinitionRegistry);
}
@Override
protected void doInitialize() throws Exception {
final Flow flow = getLoginFlow();
if (flow != null) {
createConsentRequiredCheckAction(flow);
createConsentTransitions(flow);
createConsentView(flow);
}
}
private void createConsentView(final Flow flow) {
createViewState(flow, VIEW_ID_CONSENT_VIEW, VIEW_ID_CONSENT_VIEW);
}
private void createConsentTransitions(final Flow flow) {
final ActionState sendTicket = (ActionState) flow.getState(CasWebflowConstants.STATE_ID_GENERATE_SERVICE_TICKET);
createTransitionForState(sendTicket, CheckConsentRequiredAction.EVENT_ID_CONSENT_REQUIRED, VIEW_ID_CONSENT_VIEW);
}
private void createConsentRequiredCheckAction(final Flow flow) {
final ActionState sendTicket = (ActionState) flow.getState(CasWebflowConstants.STATE_ID_GENERATE_SERVICE_TICKET);
final List<Action> actions = StreamSupport.stream(sendTicket.getActionList().spliterator(), false)
.collect(Collectors.toList());
actions.add(0, createEvaluateAction("checkConsentRequiredAction"));
sendTicket.getActionList().forEach(a -> sendTicket.getActionList().remove(a));
actions.forEach(sendTicket.getActionList()::add);
}
}