package org.oddjob.state; import java.util.Date; /** * A {@link StateChanger} that uses a {@link StateLock} * to ensure updates or ordered. * * @author rob * */ public class OrderedStateChanger<S extends State> implements StateChanger<S> { private final StateChanger<S> stateChanger; private final StateLock stateLock; public OrderedStateChanger(StateChanger<S> stateChanger, StateLock stateLock) { this.stateChanger = stateChanger; this.stateLock = stateLock; } public void setStateException(final Throwable t, final Date date) { runLocked(new Runnable() { public void run() { stateChanger.setStateException(t, date); } }); } public void setStateException(final Throwable t) { runLocked(new Runnable() { public void run() { stateChanger.setStateException(t); } }); } public void setState(final S state, final Date date) { runLocked(new Runnable() { public void run() { stateChanger.setState(state, date); } }); } public void setState(final S state) { runLocked(new Runnable() { public void run() { stateChanger.setState(state); } }); } private void runLocked(Runnable runnable) { stateLock.waitToWhen(new IsAnyState(), runnable); } }