package won.node.facet.businessactivity.participantcompletion; 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: 30.1.14. * Time: 18.33 * To change this template use File | Settings | File Templates. */ public enum BAPCState { ACTIVE("Active", Phase.FIRST){ public BAPCState transit(BAPCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return CANCELING; case MESSAGE_EXIT: return EXITING; case MESSAGE_COMPLETED: return COMPLETED; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING; case MESSAGE_CANNOTCOMPLETE: return NOT_COMPLETING; default: return ACTIVE; } } }, CANCELING("Canceling", Phase.FIRST){ public BAPCState transit(BAPCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return CANCELING; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING; case MESSAGE_CANCELED: return ENDED; case MESSAGE_EXIT: return EXITING; case MESSAGE_COMPLETED: return COMPLETED; case MESSAGE_CANNOTCOMPLETE: return NOT_COMPLETING; default: return CANCELING; } } }, COMPLETED("Completed", Phase.FIRST){ public BAPCState transit(BAPCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BAPCEventType.MESSAGE_COMPLETED; 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 BAPCState transit (BAPCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return CLOSING; case MESSAGE_CLOSE: return CLOSING; case MESSAGE_CLOSED: return ENDED; case MESSAGE_COMPLETED: resendEvent = BAPCEventType.MESSAGE_CLOSE; return CLOSING; default: return CLOSING; } } }, COMPENSATING("Compensating", Phase.FIRST){ public BAPCState transit (BAPCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return COMPENSATING; case MESSAGE_COMPENSATE: return COMPENSATING; case MESSAGE_FAIL: return FAILING_COMPENSATING; case MESSAGE_COMPENSATED: return ENDED; case MESSAGE_COMPLETED: resendEvent = BAPCEventType.MESSAGE_COMPENSATE; return COMPENSATING; default: return COMPENSATING; } } }, FAILING_ACTIVE_CANCELING("FailingActiveCanceling", Phase.FIRST) { public BAPCState transit (BAPCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BAPCEventType.MESSAGE_FAIL; return FAILING_ACTIVE_CANCELING; case MESSAGE_FAILED: return ENDED; case MESSAGE_FAIL: return FAILING_ACTIVE_CANCELING; default: return FAILING_ACTIVE_CANCELING; } } }, FAILING_COMPENSATING("FailingCompensating", Phase.FIRST) { public BAPCState transit (BAPCEventType msg) { resendEvent = null; switch (msg) { case MESSAGE_CANCEL: return FAILING_COMPENSATING; case MESSAGE_COMPENSATE: resendEvent = BAPCEventType.MESSAGE_FAIL; return FAILING_COMPENSATING; case MESSAGE_FAILED: return ENDED; case MESSAGE_FAIL: return FAILING_COMPENSATING; case MESSAGE_COMPLETED: return FAILING_COMPENSATING; default: return FAILING_COMPENSATING; } } }, NOT_COMPLETING("NotCompleting", Phase.FIRST){ public BAPCState transit (BAPCEventType msg) { resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BAPCEventType.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 BAPCState transit (BAPCEventType msg) { resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BAPCEventType.MESSAGE_EXIT; return EXITING; case MESSAGE_EXITED: return ENDED; case MESSAGE_EXIT: return EXITING; default: return EXITING; } } }, ENDED("Ended", Phase.FIRST) { public BAPCState transit (BAPCEventType msg){ resendEvent = null; switch (msg) { case MESSAGE_CANCEL: resendEvent = BAPCEventType.MESSAGE_CANCELED; return ENDED; case MESSAGE_CLOSE: resendEvent = BAPCEventType.MESSAGE_CLOSED; return ENDED; case MESSAGE_COMPENSATE: resendEvent = BAPCEventType.MESSAGE_COMPENSATED; return ENDED; case MESSAGE_FAILED: return ENDED; case MESSAGE_EXITED: return ENDED; case MESSAGE_NOTCOMPLETED: return ENDED; case MESSAGE_CANCELED: return ENDED; case MESSAGE_CLOSED: return ENDED; case MESSAGE_COMPENSATED: return ENDED; case MESSAGE_EXIT: resendEvent = BAPCEventType.MESSAGE_EXITED; return ENDED; case MESSAGE_COMPLETED: return ENDED; case MESSAGE_FAIL: resendEvent = BAPCEventType.MESSAGE_FAILED; return ENDED; case MESSAGE_CANNOTCOMPLETE: resendEvent = BAPCEventType.MESSAGE_NOTCOMPLETED; return ENDED; default: return ENDED; } } }, CLOSED("Closed", Phase.FIRST){ public BAPCState transit(BAPCEventType msg){ resendEvent = null; return null; } }; private static final Logger logger = LoggerFactory.getLogger(BAPCState.class); private String name; private Phase phase; private static BAPCEventType resendEvent = null; public static enum Phase{FIRST, SECOND, CANCELED_FROM_COORDINATOR}; private BAPCState(String name, Phase phase) { this.name = name; this.phase = phase; } private BAPCState(String name) { this(name, Phase.FIRST); } public BAPCEventType getResendEvent(){ return resendEvent; } public static BAPCState create(BAPCEventType msg) { switch (msg) { case MESSAGE_CANCEL: return CANCELING; 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; 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 BAPCState transit (BAPCEventType 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 BAPCState parseString(final String fragment) { for (BAPCState state : values()) if (state.getURI().toString().equals(fragment)) return state; logger.debug("2No enum could be matched for: {}", fragment); 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; } logger.debug("1No enum could be matched for: {}", fragment); return null; } public static URI getPhaseURI(Phase phase) { return URI.create(WON_TX.BASE_URI + "baPhase"+phase.toString()); } }