package org.oddjob.state; import java.util.Date; import org.apache.log4j.Logger; import org.oddjob.arooa.life.ComponentPersistException; import org.oddjob.images.IconHelper; import org.oddjob.images.StateIcons; import org.oddjob.persist.Persistable; /** * Base functionality for changing {@link State}. This utility class is * responsible for notifying the change with the {@link StateHandler}, * changing the icon, and persisting the job if necessary. * * @author rob * * @param <S> The type of State. */ public class BaseStateChanger<S extends State> implements StateChanger<S> { private static final Logger logger = Logger.getLogger(BaseStateChanger.class); private final StateHandler<S> stateHandler; private final IconHelper iconHelper; private final Persistable persistable; private final S exceptionState; public BaseStateChanger(StateHandler<S> stateHandler, IconHelper iconHelper, Persistable persistable, S exceptionState) { this.stateHandler = stateHandler; this.iconHelper = iconHelper; this.persistable = persistable; this.exceptionState = exceptionState; } public void setState(S state) { setState(state, new Date()); } public void setState(S state, Date date) { if (state == stateHandler.getState()) { return; } stateHandler.setState(state, date); iconHelper.changeIcon(StateIcons.iconFor(state)); try { if (new IsSaveable().test(state)) { persistable.persist(); } stateHandler.fireEvent(); } catch (ComponentPersistException e) { logger.error("Failed persisting state " + state, e); setStateException(e); } } public void setStateException(Throwable t) { setStateException(t, new Date()); } public void setStateException(Throwable t, Date date) { if (exceptionState == stateHandler.getState()) { return; } stateHandler.setStateException(exceptionState, t, date); iconHelper.changeIcon(IconHelper.EXCEPTION); if (new IsSaveable().test(exceptionState) && !(t instanceof ComponentPersistException)) { try { persistable.persist(); } catch (ComponentPersistException e) { logger.error("Failed persisting state " + exceptionState, e); stateHandler.setStateException(exceptionState, e, date); } } stateHandler.fireEvent(); } }