/* * Copyright 2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.statemachine.config.configurers; import java.util.Collection; import java.util.Set; import org.springframework.statemachine.StateMachine; import org.springframework.statemachine.action.Action; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; import org.springframework.statemachine.config.common.annotation.AnnotationConfigurerBuilder; import org.springframework.statemachine.state.State; /** * Base {@code StateConfigurer} interface for configuring {@link State}s. * * @author Janne Valkealahti * * @param <S> the type of state * @param <E> the type of event */ public interface StateConfigurer<S, E> extends AnnotationConfigurerBuilder<StateMachineStateConfigurer<S, E>> { /** * Specify a initial state {@code S}. * * @param initial the initial state * @return configurer for chaining */ StateConfigurer<S, E> initial(S initial); /** * Specify a initial state {@code S} with an {@link Action} to be executed * with it. Action can be i.e. used to init extended variables. * * @param initial the initial state * @param action the action * @return configurer for chaining */ StateConfigurer<S, E> initial(S initial, Action<S, E> action); /** * Specify a states configured by this configurer instance to be * substates of state {@code S}. * * @param state the parent state * @return configurer for chaining */ StateConfigurer<S, E> parent(S state); /** * Specify a state {@code S}. * * @param state the state * @return configurer for chaining */ StateConfigurer<S, E> state(S state); /** * Specify a state {@code S} and its relation with a given * machine as substate machine. * * @param state the state * @param stateMachine the submachine * @return configurer for chaining */ StateConfigurer<S, E> state(S state, StateMachine<S, E> stateMachine); /** * Specify a state {@code S} and its relation with a given * machine as substate machine factory. * * @param state the state * @param stateMachineFactory the submachine factory * @return configurer for chaining */ StateConfigurer<S, E> state(S state, StateMachineFactory<S, E> stateMachineFactory); /** * Specify a state {@code S} with state {@link Action}s. * * @param state the state * @param stateActions the state actions * @return configurer for chaining */ StateConfigurer<S, E> state(S state, Collection<? extends Action<S, E>> stateActions); /** * Specify a state {@code S} with state {@link Action}. * * @param state the state * @param stateAction the state action * @return configurer for chaining */ StateConfigurer<S, E> state(S state, Action<S, E> stateAction); /** * Specify a state {@code S} with state behaviour {@link Action}. * Currently synonym for {@link #state(Object, Action)}. * * @param state the state * @param action the state action * @return configurer for chaining * @see #state(Object, Action) */ StateConfigurer<S, E> stateDo(S state, Action<S, E> action); /** * Specify a state {@code S} with state behaviour {@link Action} and * error {@link Action} callback. * * @param state the state * @param action the state action * @param error action that will be called if any unexpected exception is thrown by the action. * @return configurer for chaining */ StateConfigurer<S, E> stateDo(S state, Action<S, E> action, Action<S, E> error); /** * Specify a state {@code S} with entry and exit {@link Action}s. * * @param state the state * @param entryActions the state entry actions * @param exitActions the state exit actions * @return configurer for chaining */ StateConfigurer<S, E> state(S state, Collection<? extends Action<S, E>> entryActions, Collection<? extends Action<S, E>> exitActions); /** * Specify a state {@code S} with entry and exit {@link Action}. * * @param state the state * @param entryAction the state entry action * @param exitAction the state exit action * @return configurer for chaining */ StateConfigurer<S, E> state(S state, Action<S, E> entryAction, Action<S, E> exitAction); /** * Specify a state {@code S} with state entry {@link Action}. * Currently synonym for {@link #state(Object, Action, Action)} * with no exit action. * * @param state the state * @param action the state entry action * @return configurer for chaining * @see #state(Object, Action, Action) */ StateConfigurer<S, E> stateEntry(S state, Action<S, E> action); /** * Specify a state {@code S} with state entry {@link Action} and * error {@link Action} callback. * Currently synonym for {@link #state(Object, Action, Action)} * with no exit action. * * @param state the state * @param action the state entry action * @param error action that will be called if any unexpected exception is thrown by the action. * @return configurer for chaining * @see #state(Object, Action, Action) */ StateConfigurer<S, E> stateEntry(S state, Action<S, E> action, Action<S, E> error); /** * Specify a state {@code S} with state exit {@link Action}. * Currently synonym for {@link #state(Object, Action, Action)} * with no entry action. * * @param state the state * @param action the state exit action * @return configurer for chaining * @see #state(Object, Action, Action) */ StateConfigurer<S, E> stateExit(S state, Action<S, E> action); /** * Specify a state {@code S} with state exit {@link Action} and * error {@link Action} callback. * Currently synonym for {@link #state(Object, Action, Action)} * with no entry action. * * @param state the state * @param action the state entry action * @param error action that will be called if any unexpected exception is thrown by the action. * @return configurer for chaining * @see #state(Object, Action, Action) */ StateConfigurer<S, E> stateExit(S state, Action<S, E> action, Action<S, E> error); /** * Specify a state {@code S} with a deferred events {@code E}. * * @param state the state * @param deferred the deferred events * @return configurer for chaining */ @SuppressWarnings("unchecked") StateConfigurer<S, E> state(S state, E... deferred); /** * Specify a states {@code S}. * * @param states the states * @return configurer for chaining */ StateConfigurer<S, E> states(Set<S> states); /** * Specify a state {@code S} to be end state. * * @param end the end state * @return configurer for chaining */ StateConfigurer<S, E> end(S end); /** * Specify a state {@code S} to be choice pseudo state. * * @param choice the choice pseudo state * @return configurer for chaining */ StateConfigurer<S, E> choice(S choice); /** * Specify a state {@code S} to be junction pseudo state. * * @param junction the junction pseudo state * @return configurer for chaining */ StateConfigurer<S, E> junction(S junction); /** * Specify a state {@code S} to be fork pseudo state. * * @param fork the fork pseudo state * @return configurer for chaining */ StateConfigurer<S, E> fork(S fork); /** * Specify a state {@code S} to be join pseudo state. * * @param join the join pseudo state * @return configurer for chaining */ StateConfigurer<S, E> join(S join); /** * Specify a state {@code S} to be history pseudo state. * * @param history the history pseudo state * @param type the history pseudo state type * @return configurer for chaining */ StateConfigurer<S, E> history(S history, History type); /** * Specify a state {@code S} to be entrypoint pseudo state. * * @param entry the entrypoint pseudo state * @return configurer for chaining */ StateConfigurer<S, E> entry(S entry); /** * Specify a state {@code S} to be exitpoint pseudo state. * * @param exit the exitpoint pseudo state * @return configurer for chaining */ StateConfigurer<S, E> exit(S exit); /** * Enumeration of a possible history pseudostate type. */ public enum History { /** * Shallow history is a pseudo state representing the most * recent substate of a submachine. */ SHALLOW, /** * Deep history is a shallow history recursively reactivating * the substates of the most recent substate. */ DEEP } }