|
Coordination State Machine
[Previous]  [Next] 
|
![]() |
User Manual [Previous]  [Next] Coordination State MachineThis example has been built for the Comparing Modeling Approaches Workshop Note that this file is too large for the 'Open In UmpleOnline' to work in most browsers. You will need to copy the text to the clipboard and paste it into UmpleOnline. Example
// CoordinationStateMachine.ump
// This UML state machine diagram in Umple is for the
// bCMS car crash management system
// See http://cserg0.site.uottawa.ca/cma2012/CaseStudy.pdf
// and http://www.cs.colostate.edu/remodd/v1/content/repository-model-driven-development-remodd-overview
// Author: Timothy C. Lethbridge
/*
* State machine for co-ordination of the
* crisis, as seen from one SC. If
* communication is operating properly the
* other coordinators' state machines will
* generally be in the same states and
* substates.
*
* Modelled given Section 4 of the requirements
* This is a mixin to class crisis.
*/
class Crisis {
// Number of ms allowed to negotiate routes,
// establish credentials
Integer timeoutInMs = 20000;
// True if we are the initiator of the crisis
// request, false otherwise
Boolean thisSideInitiator;
Boolean thisSideInitiatorOfTermination;
Boolean routeAgreedYet;
// True of we are the PSC, false of we are
// the FSC
Boolean police;
// Top level state machine
crisisCoordinationStage {
// 0. When initiated the crisis is in
// noCrisis state
// It has been created but not yet
// populated, awaiting initiation
// of coordination and data..
noCrisis {
entry / {setThisSideInitiator(false);}
// We are initiating and requesting the
// other side to respond
initiateCrisis / {
setThisSideInitiator(true);
sendInitiateCrisisRequestToOtherSC();
} -> establishingCommunication;
// We are responding to a request from
// the other SC
receiveInitiateCrisisRequest ->
establishingCommunication;
}
// 1. Establish communication and
// identification when a crisis begins
establishingCommunication {
entry / {sendSecureCredentials();}
secureCredentialsConfirmed ->
managingCrisis;
// Return to idle after some delay if
// other side initiated and did not
// respond. It might have been a
// hacker. Alternatively if there is a
// real crisis, normal manual processes
// would happen.
after (timeoutInMs)
[!isThisSideInitiator()] -> noCrisis;
}
// Managing crisis involves continually
// exchanging information
// Negotiating or renegotiating routes and
// other crisis details
// These are handled concurrently.
managingCrisis {
// A crisis is underway. We initially
// start with empty data
// which will be populated over time
entry / {initiateEmptyCrisis(); }
// 2,4,5,6. Exchanging details about what
// each knows about the crisis
// So the information each coordinator
// has is the same.
exchangingDetails {
// Requirement Scenario 2
ourUpdateToCrisisData
/ {sendCrisisData();}
-> exchangingDetails;
receiveCrisisData
/ {updateCrisisData();}
-> exchangingDetails;
// Requirement Scenario 4
ourVehicleDispatched
/ {sendVehicleDispatch();}
-> exchangingDetails;
receiveVehicleDispatched
/ {updateTheirDispatch();}
-> exchangingDetails;
// Requirement Scenario 5
ourVehicleArrived
/ {sendVehicleArrived();}
-> exchangingDetails;
receiveVehicleArrived
/ {updateTheirArrival();}
-> exchangingDetails;
// Requirement Scenario 6
ourVehicleMetObjective
/ {sendVehicleMetObjective();}
-> exchangingDetails;
receiveMetObjective
/ {updateTheirMetObjective();}
-> exchangingDetails;
// Requirement 5.a - breakdown
breakdown / {dispatchAndUpdateOther();}
-> exchangingDetails;
// Requirement 5.b -
// congestion/blockage
// TO DO
// Requirement 5.c escalate crisis -
// renegotiate routes
// TO DO
} // End of exchangingDetails
//concurrent substate
||
// 7. Both parties must agree to close
// the crisis; either can initiate
crisisEndManagement {
// Normal substate of crisisEndManagement - no end in sight yet
ongoingCrisis {
// We could initiate termination
initiateTermination / {
setThisSideInitiatorOfTermination(true);
sendTerminationRequestToOtherSC();
} -> waitingForTerminationConfirmation;
receiveTerminationRequestFromOtherSC
->
waitingForUserTerminationAgreement;
}
waitingForUserTerminationAgreement {
do {confirmWithUserToTerminate();}
confirmTermination -> tearDown;
after (timeoutInMs) -> ongoingCrisis;
}
// Substate of where we are waiting for
// the other end to agree
waitingForTerminationConfirmation {
receiveTerminationConfirmation
-> tearDown;
// If the other side has not agreed,
// we keep the crisis active
after (timeoutInMs) -> ongoingCrisis;
}
// End of crisis
tearDown {
entry / {deleteCrisis();}
-> noCrisis;
}
} // End of crisisEndManagement
// concurrent substate
||
// 3. Negotiating route plan
negotiatingRoutePlan {
// Negotiation happens in parallel with
// reporting timeout
negotiation {
entry / {setRouteAgreedYet(false);}
informOfNumberOfVehicles
/ {sendNumberOfVehicles();}
-> negotiation;
receiveNumberOfVehicles [isPolice()]
-> planningRoute;
receiveRouteProposal [!isPolice()]
-> approvingRoute;
// Requirement 3.3.a2.a1
receiveNoAgreeableRoute
[!isPolice()] -> noRouteAgreement;
// The PSC plans the route -- only
// PSC can be in this state
planningRoute {
do {planRoute();}
routePlanComplete
/ {sendPlanToFSC(); }
-> awaitingRouteApproval;
// Requirement 3.3.a2.a1 - no more
// possible routes
noMoreRoutes
/ {sendNoMoreRoutesToFSC(); }
-> noRouteAgreement;
}
// The FSC approves the route --
// only FSC can be in this state
approvingRoute {
do {userConfirmRouteAcceptable();}
routeAcceptable
/ {sendApprovalToPSC();}
-> routeAgreed;
routeUnacceptable
/ {sendDisapprovalToFSC();}
-> negotiation;
}
// The PSC awaits for approval from
// the FSC. Only the PSC can be in
// this state
awaitingRouteApproval {
receiveApprovalFromFSC
-> routeAgreed;
// Requirement 3.3.a - FSC
// disagrees
receiveDisapprovalFromFSC / {
addRouteToDisapprovedChoices();
} -> planningRoute;
}
routeAgreed {
entry / {setRouteAgreedYet(true);}
}
noRouteAgreement {
// requirement 3.3.a2.a1
}
} // End of Negotiation concurrent
// substate of negotiatingRoutePlan
||
managingTimeliness {
timeAcceptable {
// Requirement 3.a1. Negotiations
// are taking excessive time
after (timeoutInMs)
[!isRouteAgreedYet()]
-> timeUnacceptable;
}
timeUnacceptable {
// Although negotiations may yet
// complete, we are going to send
// out our own vehicles because too
// much time has passed
do {
promptAndLogReasonForTimeout(); }
}
} // End of managingTimeiness
//concurrent substate of
// negotiatingRoutePlan
} // End of NegotiatingRoutePlan
//concurrent substate
} // End of Managing Crisis top level state
} // End of crisisCoordinationStage state
// machine
} // End of state machine mixin for
// Crisis
Load the above code into UmpleOnline |