/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.utils.incubator; import de.rcenvironment.core.utils.common.StringUtils; /** * Represents an error that prevented a transition in a state machine to happen. * * @author Robert Mischke */ public class StateChangeException extends Exception { private static final long serialVersionUID = 6118361184020269248L; private final Enum<?> oldState; private final Enum<?> targetState; public StateChangeException(StateChangeException cause, Enum<?> oldState, Enum<?> targetState) { // re-wrap; do not add an extra layer to the stacktrace super(cause.getMessage(), cause.getCause()); this.oldState = oldState; this.targetState = targetState; } public StateChangeException(String message, Throwable cause) { super(message, cause); oldState = null; targetState = null; } public StateChangeException(String message) { super(message); oldState = null; targetState = null; } public Enum<?> getOldState() { return oldState; } public Enum<?> getTargetState() { return targetState; } @Override public String toString() { if (oldState == null && targetState == null) { return getMessage(); } else { return StringUtils.format("%s (old state: %s, target state: %s)", getMessage(), oldState, targetState); } } }