/*
* 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.listener;
import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.messaging.Message;
import org.springframework.statemachine.StateContext;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.state.State;
import org.springframework.statemachine.transition.Transition;
/**
* Default {@link StateMachineListener} dispatcher.
*
* @author Janne Valkealahti
*
* @param <S> the type of state
* @param <E> the type of event
*/
public class CompositeStateMachineListener<S, E> extends AbstractCompositeListener<StateMachineListener<S, E>>
implements StateMachineListener<S, E> {
private final static Log log = LogFactory.getLog(CompositeStateMachineListener.class);
@Override
public void stateChanged(State<S, E> from, State<S, E> to) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.stateChanged(from, to);
} catch (Throwable e) {
log.warn("Error during stateChanged", e);
}
}
}
@Override
public void stateEntered(State<S, E> state) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.stateEntered(state);
} catch (Throwable e) {
log.warn("Error during stateEntered", e);
}
}
}
@Override
public void stateExited(State<S, E> state) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.stateExited(state);
} catch (Throwable e) {
log.warn("Error during stateExited", e);
}
}
}
@Override
public void eventNotAccepted(Message<E> event) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.eventNotAccepted(event);
} catch (Throwable e) {
log.warn("Error during eventNotAccepted", e);
}
}
}
@Override
public void transition(Transition<S, E> transition) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.transition(transition);
} catch (Throwable e) {
log.warn("Error during transition", e);
}
}
}
@Override
public void transitionStarted(Transition<S, E> transition) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.transitionStarted(transition);
} catch (Throwable e) {
log.warn("Error during transitionStarted", e);
}
}
}
@Override
public void transitionEnded(Transition<S, E> transition) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.transitionEnded(transition);
} catch (Throwable e) {
log.warn("Error during transitionEnded", e);
}
}
}
@Override
public void stateMachineStarted(StateMachine<S, E> stateMachine) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.stateMachineStarted(stateMachine);
} catch (Throwable e) {
log.warn("Error during stateMachineStarted", e);
}
}
}
@Override
public void stateMachineStopped(StateMachine<S, E> stateMachine) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.stateMachineStopped(stateMachine);
} catch (Throwable e) {
log.warn("Error during stateMachineStopped", e);
}
}
}
@Override
public void stateMachineError(StateMachine<S, E> stateMachine, Exception exception) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.stateMachineError(stateMachine, exception);
} catch (Throwable e) {
log.warn("Error during stateMachineError", e);
}
}
}
@Override
public void extendedStateChanged(Object key, Object value) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.extendedStateChanged(key, value);
} catch (Throwable e) {
log.warn("Error during extendedStateChanged", e);
}
}
}
@Override
public void stateContext(StateContext<S, E> stateContext) {
for (Iterator<StateMachineListener<S, E>> iterator = getListeners().reverse(); iterator.hasNext();) {
StateMachineListener<S, E> listener = iterator.next();
try {
listener.stateContext(stateContext);
} catch (Throwable e) {
log.warn("Error during stateContext", e);
}
}
}
}