package com.sequenceiq.cloudbreak.core.flow2.helloworld; import static com.sequenceiq.cloudbreak.core.flow2.helloworld.HelloWorldEvent.FINALIZE_HELLO_WORLD_EVENT; import static com.sequenceiq.cloudbreak.core.flow2.helloworld.HelloWorldEvent.HELLO_WORLD_FAIL_HANDLED_EVENT; import static com.sequenceiq.cloudbreak.core.flow2.helloworld.HelloWorldEvent.HELLO_WORLD_FINISHED_EVENT; import java.util.Map; import java.util.Optional; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.StateContext; import org.springframework.statemachine.action.Action; import com.sequenceiq.cloudbreak.cloud.event.Payload; import com.sequenceiq.cloudbreak.cloud.event.Selectable; import com.sequenceiq.cloudbreak.core.flow2.AbstractAction; import com.sequenceiq.cloudbreak.core.flow2.CommonContext; @Configuration public class HelloWorldActions { @Bean(name = "HELLO_WORLD_START_STATE") public Action startAction() { return new AbstractHelloWorldAction<Payload>(Payload.class) { @Override protected void doExecute(CommonContext context, Payload payload, Map<Object, Object> variables) throws Exception { sendEvent(context.getFlowId(), HELLO_WORLD_FINISHED_EVENT.event(), payload); } }; } @Bean(name = "HELLO_WORLD_FINISHED_STATE") public Action finishedAction() { return new AbstractHelloWorldAction<Payload>(Payload.class) { @Override protected void doExecute(CommonContext context, Payload payload, Map<Object, Object> variables) throws Exception { sendEvent(context); } @Override protected Selectable createRequest(CommonContext context) { return new Selectable() { @Override public String selector() { return FINALIZE_HELLO_WORLD_EVENT.event(); } @Override public Long getStackId() { return null; } }; } }; } @Bean(name = "HELLO_WORLD_FAILED_STATE") public Action failedAction() { return new AbstractHelloWorldAction<Payload>(Payload.class) { @Override protected void doExecute(CommonContext context, Payload payload, Map<Object, Object> variables) throws Exception { sendEvent(context.getFlowId(), HELLO_WORLD_FAIL_HANDLED_EVENT.event(), payload); } }; } private abstract static class AbstractHelloWorldAction<P extends Payload> extends AbstractAction<HelloWorldState, HelloWorldEvent, CommonContext, P> { protected AbstractHelloWorldAction(Class<P> payloadClass) { super(payloadClass); } @Override protected CommonContext createFlowContext(String flowId, StateContext<HelloWorldState, HelloWorldEvent> stateContext, P payload) { return new CommonContext(flowId); } @Override protected Object getFailurePayload(P payload, Optional<CommonContext> flowContext, Exception ex) { return (Payload) () -> null; } } }