/* * Copyright 2015-2016 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.region; import java.util.Collection; import java.util.UUID; import org.springframework.messaging.Message; import org.springframework.statemachine.listener.StateMachineListener; import org.springframework.statemachine.state.State; import org.springframework.statemachine.transition.Transition; /** * A region is an orthogonal part of either a composite state or a state * machine. It contains states and transitions. * * @author Janne Valkealahti * * @param <S> the type of state * @param <E> the type of event */ public interface Region<S, E> { /** * Gets the region and state machine unique id. * * @return the region and state machine unique id */ UUID getUuid(); /** * Gets the region and state machine id. This identifier * is provided for users disposal and can be set from * a various ways to build a machines. * * @return the region and state machine id */ String getId(); /** * Start the region. */ void start(); /** * Stop the region. */ void stop(); /** * Send an event {@code E} wrapped with a {@link Message} to the region. * * @param event the wrapped event to send * @return true if event was accepted */ boolean sendEvent(Message<E> event); /** * Send an event {@code E} to the region. * * @param event the event to send * @return true if event was accepted */ boolean sendEvent(E event); /** * Gets the current {@link State}. * * @return current state */ State<S,E> getState(); /** * Gets the {@link State}s defined in this region. Returned collection is * an unmodifiable copy because states in a state machine are immutable. * * @return immutable copy of states */ Collection<State<S, E>> getStates(); /** * Gets a {@link Transition}s for this region. * * @return immutable copy of transitions */ Collection<Transition<S,E>> getTransitions(); /** * Checks if region complete. Region is considered to be completed if it has * reached its end state and no further event processing is happening. * * @return true, if complete */ boolean isComplete(); /** * Adds the state listener. * * @param listener the listener */ void addStateListener(StateMachineListener<S, E> listener); /** * Removes the state listener. * * @param listener the listener */ void removeStateListener(StateMachineListener<S, E> listener); }