package won.node.facet.businessactivity.coordinatorcompletion;
import won.node.facet.impl.WON_TX;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
/**
* Created with IntelliJ IDEA.
* User: Danijel
* Date: 14.2.14.
* Time: 13.47
* To change this template use File | Settings | File Templates.
*/
public enum BACCEventType {
//in general, be permissive about messages where possible. Don't care about duplicate messages
//close may always be called. It always closes the connection.
///
MESSAGE_CANCEL("MessageCancel", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_CLOSE("MessageClose", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_COMPENSATE("MessageCompensate", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_FAILED("MessageFailed", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_EXITED("MessageExited", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_NOTCOMPLETED("MessageNotCompleted", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_EXIT("MessageExit", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_COMPLETED("MessageCompleted", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_FAIL("MessageFail", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_CANNOTCOMPLETE("MessageCanNotComplete", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_CANCELED("MessageCanceled", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_CLOSED("MessageClosed", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_COMPENSATED("MessageCompensated", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED))),
MESSAGE_COMPLETE("MessageComplete", new ArrayList<BACCState>(Arrays.asList(BACCState.ACTIVE,
BACCState.CANCELING_ACTIVE, BACCState.CANCELING_COMPLETING,
BACCState.COMPLETING, BACCState.COMPLETED,
BACCState.CLOSING, BACCState.COMPENSATING,
BACCState.FAILING_ACTIVE_CANCELING_COMPLETING, BACCState.FAILING_COMPENSATING,
BACCState.NOT_COMPLETING, BACCState.EXITING,
BACCState.ENDED)));
private String name;
private ArrayList<BACCState> permittingPStates;
BACCEventType(String name, ArrayList<BACCState> permittingPStates) {
this.permittingPStates = permittingPStates;
this.name = name;
}
BACCEventType(String name){
this.name = name;
permittingPStates = new ArrayList<BACCState>();
permittingPStates.add(BACCState.ACTIVE);
permittingPStates.add(BACCState.CANCELING_ACTIVE);
permittingPStates.add(BACCState.CANCELING_COMPLETING);
permittingPStates.add(BACCState.COMPLETING);
permittingPStates.add(BACCState.COMPLETED);
permittingPStates.add(BACCState.CLOSING);
permittingPStates.add(BACCState.COMPENSATING);
permittingPStates.add(BACCState.FAILING_ACTIVE_CANCELING_COMPLETING);
permittingPStates.add(BACCState.FAILING_COMPENSATING);
permittingPStates.add(BACCState.NOT_COMPLETING);
permittingPStates.add(BACCState.EXITING);
permittingPStates.add(BACCState.ENDED);
}
public boolean isMessageAllowed(BACCState stateToCheck){
if (this.permittingPStates.contains(stateToCheck))
return true;
else
return false;
}
public URI getURI() {
return URI.create(WON_TX.BASE_URI + name);
}
public BACCEventType getBAEventTypeFromURIParticipantInbound (String sURI)
{
for (BACCEventType eventType: BACCEventType.values()){
if (sURI.equals(eventType.getURI().toString())) return eventType;
}
return null;
}
public static BACCEventType getBAEventTypeFromURI (String sURI)
{
for (BACCEventType eventType: BACCEventType.values()){
if (sURI.equals(eventType.getURI().toString())) return eventType;
}
return null;
}
public static BACCEventType getCoordinationEventTypeFromString(final String fragment)
{
for (BACCEventType event : BACCEventType.values()) {
if (event.name().equals(fragment))
{
return event;
}
}
return null;
}
public static BACCEventType getCoordinationEventTypeFromURI(final String fragment)
{
String s = fragment.substring(fragment.lastIndexOf("#Message")+8,fragment.length());
for (BACCEventType event : BACCEventType.values())
if (event.name().equals("MESSAGE_"+fragment.substring(fragment.lastIndexOf("#Message")+8,fragment.length()).toUpperCase()))
return event;
return null;
}
public static boolean isBACCParticipantEventType(final BACCEventType event)
{
boolean ret = false;
if(event.equals(BACCEventType.MESSAGE_COMPLETED) || event.equals(BACCEventType.MESSAGE_EXIT)
|| event.equals(BACCEventType.MESSAGE_FAIL) || event.equals(BACCEventType.MESSAGE_CANNOTCOMPLETE)
|| event.equals(BACCEventType.MESSAGE_CANCELED) || event.equals(BACCEventType.MESSAGE_COMPENSATED)
|| event.equals(BACCEventType.MESSAGE_CLOSED))
ret=true;
return ret;
}
public static boolean isBACCCoordinatorEventType(final BACCEventType event)
{
return !isBACCParticipantEventType(event);
}
}