package won.node.facet.businessactivity.coordinatorcompletion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import won.node.facet.impl.WON_TX; import java.net.URI; /** * Created with IntelliJ IDEA. * User: Danijel * Date: 6.2.14. * Time: 15.53 * To change this template use File | Settings | File Templates. */ public enum BACCState { ACTIVE("Active", Phase.FIRST){ public BACCState transit(BACCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return CANCELING_ACTIVE; case MESSAGE_COMPLETE: return COMPLETING; case MESSAGE_EXIT: return EXITING; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING_COMPLETING; case MESSAGE_CANNOTCOMPLETE: return NOT_COMPLETING; default: return ACTIVE; } } }, CANCELING_ACTIVE("CancelingActive", Phase.FIRST){ public BACCState transit(BACCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return CANCELING_ACTIVE; case MESSAGE_COMPLETE: return CANCELING_ACTIVE; case MESSAGE_EXIT: return EXITING; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING_COMPLETING; case MESSAGE_CANCELED: return ENDED; case MESSAGE_CANNOTCOMPLETE: return NOT_COMPLETING; default: return CANCELING_ACTIVE; } } }, CANCELING_COMPLETING("CancelingCompleting", Phase.FIRST){ public BACCState transit(BACCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return CANCELING_COMPLETING; case MESSAGE_COMPLETE: return CANCELING_COMPLETING; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING_COMPLETING; case MESSAGE_CANCELED: return ENDED; case MESSAGE_EXIT: return EXITING; case MESSAGE_COMPLETED: return COMPLETED; case MESSAGE_CANNOTCOMPLETE: return NOT_COMPLETING; default: return CANCELING_ACTIVE; } } }, COMPLETING("Completing", Phase.FIRST){ public BACCState transit(BACCEventType msg) { resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return CANCELING_COMPLETING; case MESSAGE_COMPLETE: return COMPLETING; case MESSAGE_EXIT: return EXITING; case MESSAGE_COMPLETED: return COMPLETED; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING_COMPLETING; case MESSAGE_CANNOTCOMPLETE: return NOT_COMPLETING; default: return CANCELING_ACTIVE; } } }, COMPLETED("Completed", Phase.FIRST){ public BACCState transit(BACCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BACCEventType.MESSAGE_COMPLETED; return COMPLETED; case MESSAGE_COMPLETE: return COMPLETED; case MESSAGE_CLOSE: return CLOSING; case MESSAGE_COMPENSATE: return COMPENSATING; case MESSAGE_COMPLETED: return COMPLETED; default: return COMPLETED; } } }, CLOSING("Closing", Phase.FIRST) { public BACCState transit (BACCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return CLOSING; case MESSAGE_COMPLETE: return CLOSING; case MESSAGE_CLOSED: return ENDED; case MESSAGE_COMPLETED: resendEvent = BACCEventType.MESSAGE_CLOSE; return CLOSING; case MESSAGE_CLOSE: return CLOSING; default: return CLOSING; } } }, COMPENSATING("Compensating", Phase.FIRST){ public BACCState transit (BACCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return COMPENSATING; case MESSAGE_COMPLETE: return COMPENSATING; case MESSAGE_COMPENSATE: return COMPENSATING; case MESSAGE_FAIL: return FAILING_COMPENSATING; case MESSAGE_COMPENSATED: return ENDED; case MESSAGE_COMPLETED: resendEvent = BACCEventType.MESSAGE_COMPENSATE; return COMPENSATING; default: return COMPENSATING; } } }, FAILING_ACTIVE_CANCELING_COMPLETING("FailingActiveCancelingCompleting", Phase.FIRST) { public BACCState transit (BACCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BACCEventType.MESSAGE_FAIL; return FAILING_ACTIVE_CANCELING_COMPLETING; case MESSAGE_COMPLETE: resendEvent = BACCEventType.MESSAGE_FAIL; return FAILING_ACTIVE_CANCELING_COMPLETING; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING_COMPLETING; case MESSAGE_FAILED: return ENDED; default: return FAILING_ACTIVE_CANCELING_COMPLETING; } } }, FAILING_COMPENSATING("FailingCompensating", Phase.FIRST) { public BACCState transit (BACCEventType msg) { resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return FAILING_COMPENSATING; case MESSAGE_COMPLETE: return FAILING_COMPENSATING; case MESSAGE_COMPENSATE: resendEvent = BACCEventType.MESSAGE_FAIL; return FAILING_COMPENSATING; case MESSAGE_FAIL: return FAILING_COMPENSATING; case MESSAGE_COMPLETED: return FAILING_COMPENSATING; case MESSAGE_FAILED: return ENDED; default: return FAILING_COMPENSATING; } } }, NOT_COMPLETING("NotCompleting", Phase.FIRST){ public BACCState transit (BACCEventType msg) { resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BACCEventType.MESSAGE_CANNOTCOMPLETE; return NOT_COMPLETING; case MESSAGE_COMPLETE: resendEvent = BACCEventType.MESSAGE_CANNOTCOMPLETE; return NOT_COMPLETING; case MESSAGE_NOTCOMPLETED: return ENDED; case MESSAGE_CANNOTCOMPLETE: return NOT_COMPLETING; default: return NOT_COMPLETING; } } }, EXITING("Exiting", Phase.FIRST) { public BACCState transit (BACCEventType msg) { resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BACCEventType.MESSAGE_EXIT; return EXITING; case MESSAGE_COMPLETE: resendEvent = BACCEventType.MESSAGE_EXIT; case MESSAGE_EXIT: return EXITING; case MESSAGE_EXITED: return ENDED; default: return EXITING; } } }, ENDED("Ended", Phase.FIRST) { public BACCState transit (BACCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BACCEventType.MESSAGE_CANCELED; return ENDED; case MESSAGE_COMPLETE: resendEvent = BACCEventType.MESSAGE_FAIL; return ENDED; case MESSAGE_CLOSE: resendEvent = BACCEventType.MESSAGE_CLOSED; return ENDED; case MESSAGE_COMPENSATE: resendEvent = BACCEventType.MESSAGE_COMPENSATED; return ENDED; case MESSAGE_FAILED: return ENDED; case MESSAGE_EXITED: return ENDED; case MESSAGE_NOTCOMPLETED: return ENDED; case MESSAGE_EXIT: resendEvent = BACCEventType.MESSAGE_EXITED; return ENDED; case MESSAGE_CANCELED: return ENDED; case MESSAGE_CLOSED: return ENDED; case MESSAGE_COMPENSATED: return ENDED; case MESSAGE_COMPLETED: return ENDED; case MESSAGE_FAIL: resendEvent = BACCEventType.MESSAGE_FAILED; return ENDED; case MESSAGE_CANNOTCOMPLETE: resendEvent = BACCEventType.MESSAGE_NOTCOMPLETED; return ENDED; default: return ENDED; } } }, CLOSED("Closed", Phase.FIRST){ public BACCState transit(BACCEventType msg){ resendEvent = null; return null; } }; private static final Logger logger = LoggerFactory.getLogger(BACCState.class); private String name; private Phase phase; private static BACCEventType resendEvent = null; public static enum Phase {FIRST, SECOND, CANCELED_FROM_COORDINATOR}; private BACCState(String name, Phase phase) { this.name = name; this.phase = phase; } private BACCState(String name) { this(name, Phase.FIRST); } public BACCEventType getResendEvent(){ return resendEvent; } public static BACCState create(BACCEventType msg) { switch (msg) { case MESSAGE_CANCEL: return CANCELING_ACTIVE; case MESSAGE_COMPLETE: return COMPLETING; case MESSAGE_CLOSE: return CLOSING; case MESSAGE_COMPENSATE: return COMPENSATING; case MESSAGE_FAILED: return ENDED; case MESSAGE_EXITED: return ENDED; case MESSAGE_NOTCOMPLETED: return ENDED; case MESSAGE_EXIT: return EXITING; case MESSAGE_COMPLETED: return COMPLETED; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING_COMPLETING; case MESSAGE_CANNOTCOMPLETE: return NOT_COMPLETING; case MESSAGE_CANCELED: return ENDED; case MESSAGE_CLOSED: return ENDED; case MESSAGE_COMPENSATED: return ENDED; } throw new IllegalArgumentException("The received message is not allowed."); } public abstract BACCState transit (BACCEventType msg); public URI getURI() { return URI.create(WON_TX.BASE_URI+ name); } public Phase getPhase() { return phase; } public void setPhase (Phase phase) { this.phase = phase; } /** * Tries to match the given string against all enum values. * * @param fragment string to match * @return matched enum, null otherwise */ public static BACCState parseString(final String fragment) { for (BACCState state : values()) if (state.getURI().toString().equals(fragment)) return state; return null; } public static Phase parsePhase(final String fragment) { String comparedString = fragment; comparedString = fragment.substring(fragment.lastIndexOf("#baPhase")+8); for(Phase phase : Phase.values()) { if (phase.toString().equals(comparedString)) return phase; } return null; } public static URI getPhaseURI(Phase phase) { return URI.create(WON_TX.BASE_URI + "baPhase"+phase.toString()); } }