Case Study of Use Case Semantics
B.3 Synchronization of Scenarios
T_Car[1] role car end
association Post_dmAct8_mileage_Car between
Post_dmAct8[*] role postSnapshot_dmAct8_mileage_Car T_RealCls[1] role mileage_Car
end
!set adaRental.finish:=finishDate
!set adaRental.pickedUp:=true
!insert (ada,adaRental) into Registration
!insert (adaRental,bmw) into UsingCar
---Begin Use Case ReturnCar
---!let matchSL = Tuple{actUC:actUC,preSnapshotUC:defaultSnapshot}
!let matchTL = Tuple{actDM:actDM,preSnapshotDM:defaultSnapshot}
!let matchCL = Tuple{corrAct:corrAct}
read uc2dm_start_coEvol.cmd
---NEXT_ActorAct1 ---Post_EnterCustInfo
!create postSnapshot_EnterCustInfo:Post_EnterCustInfo
!create id_Cust:T_StringCls
!set id_Cust.name:=’id_Cust’
!insert(postSnapshot_EnterCustInfo,id_Cust) into Post_EnterCustInfo_id_Cust
---Match SysState
!create idCustStr:StringCls
!set idCustStr.string:=’ada’
!set id_Cust.value:=idCustStr
---Execution
!let currExec=ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let _actorAct_name=’RequireCarReturn’
!let _nextDmAct_name=’getRentalInfo’
!let matchSL = Tuple{
ucAct:ucAct,actUC:actUC,preSnapshotUC:defaultSnapshot, postSnapshotUC:postSnapshot_EnterCustInfo,
_actorAct_name:_actorAct_name}
!let matchTL = Tuple{dmAct:dmAct,actDM:actDM,
postSnapshotDM:defaultSnapshot,_nextDmAct_name:_nextDmAct_name}
!let matchCL = Tuple{currExec:currExec}
read uc2dm_nextActorAct_coEvol.cmd
---NEXT_SysAct2 ---Pre/Postcondition_UC
---Pre/Postcondition_DM
!create preSnapshot_dmAct2:Pre_dmAct2
!create cust:T_Customer
!set cust.name:=’cust’
!insert (preSnapshot_dmAct2,cust) into Pre_dmAct2_cust
!insert (preSnapshot_dmAct2,id_Cust) into Pre_dmAct2_id_Cust
---Match SysState
!set cust.value:=Customer.allInstances->any(id=id_Cust.value.string) ---Execution
!let currExec=ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!create retCar:T_ReturningCar
!let _actGrp_opName=’getRentalInfo()’
!let _sysAct_name=’RetrieveRentalInfo’
!let _nextDmAct_name=’getCustomer’
!let matchSL=Tuple{
ucAct:ucAct,actUC:actUC,preSnapshotUC:defaultSnapshot, postSnapshotUC:defaultSnapshot,_sysAct_name:_sysAct_name}
!let matchTL=Tuple{dmAct:dmAct,actDM:actDM,objNode:retCar,
preSnapshotDM:preSnapshot_dmAct2,postSnapshotDM:preSnapshot_dmAct2, _actGrp_opName:_actGrp_opName,_nextDmAct_name:_nextDmAct_name}
!let matchCL=Tuple{currExec:currExec}
read uc2dm_nextSysAct_coEvol.cmd
---NEXT_DMAct3_newActGrp ---Pre/Postcondition_UC ---Pre/Postcondition_DM
!create preSnapshot_dmAct3:Pre_dmAct3
!create rental:T_Rental
!set rental.name:=’rental’
!insert (preSnapshot_dmAct3,cust) into Pre_dmAct3_cust
!insert (preSnapshot_dmAct3,rental) into Pre_dmAct3_rental
---Match SysState
!set rental.value:=cust.value.rental->any(return=oclUndefined(Date)) ---Execution
!let currExec=ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let superActGrp = dmAct.actGrp->any(true)
!let _actGrp_opName=’getRental()’
!let _nextDmAct_name=’getRental’
!let matchSL=Tuple{ucAct:ucAct}
!let matchTL=Tuple{
dmAct:dmAct,actDM:actDM,superActGrp:superActGrp,objNode:cust,
preSnapshotDM:preSnapshot_dmAct3,postSnapshotDM:preSnapshot_dmAct3, _actGrp_opName:_actGrp_opName,_nextDmAct_name:_nextDmAct_name}
!let matchCL=Tuple{currExec:currExec}
read uc2dm_nextDMAct_newActGroup_coEvol.cmd
---NEXT_ActorAct3_ConditionalBranch_coEvol ---Post_EnterCustInfo
!create postSnapshot_UpdateCarInfo:Post_UpdateCarInfo
!create mileage_Car:T_RealCls
!set mileage_Car.name:=’mileage_Car’
!insert(postSnapshot_UpdateCarInfo,mileage_Car) into Post_UpdateCarInfo_mileage_Car
---!create guard_RetrieveRentalInfo_UpdateCarInfo:
Guard_RetrieveRentalInfo_UpdateCarInfo
!insert (guard_RetrieveRentalInfo_UpdateCarInfo,cust) into Guard_RetrieveRentalInfo_UpdateCarInfo_cust
!insert (guard_RetrieveRentalInfo_UpdateCarInfo,rental) into Guard_RetrieveRentalInfo_UpdateCarInfo_rental
!insert (guard_RetrieveRentalInfo_UpdateCarInfo,id_Cust) into Guard_RetrieveRentalInfo_UpdateCarInfo_id_Cust
---Match SysState
!create mileageCarReal:RealCls
!set mileageCarReal.real:=10000
!set mileage_Car.value:=mileageCarReal
---Execution
!let currExec = ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let _actorAct_name=’supplyRentalInfo’
!let _nextDmAct_name=’updateRentalInfo’
!let matchSL = Tuple{ucAct:ucAct,actUC:actUC, preSnapshotUC:defaultSnapshot,
postSnapshotUC:postSnapshot_UpdateCarInfo,
guardSnapshotUC:guard_RetrieveRentalInfo_UpdateCarInfo, _actorAct_name:_actorAct_name}
!let matchTL = Tuple{dmAct:dmAct,actDM:actDM,
postSnapshotDM:defaultSnapshot,_nextDmAct_name:_nextDmAct_name}
!let matchCL = Tuple{currExec:currExec}
read uc2dm_nextActorAct_ConditionalBranch_coEvol.cmd
---NEXT_SysAct4 ---Pre/Postcondition_UC
!create preSnapshot_UpdateRental:Pre_UpdateRental
!create car:T_Car
!set car.name:=’car’
!insert(preSnapshot_UpdateRental,rental) into Pre_UpdateRental_rental
!insert(preSnapshot_UpdateRental,car) into Pre_UpdateRental_car
!insert(preSnapshot_UpdateRental,mileage_Car) into Pre_UpdateRental_mileage_Car
---!create postSnapshot_UpdateRental:Post_UpdateRental
!insert(postSnapshot_UpdateRental,rental) into Post_UpdateRental_rental
!insert(postSnapshot_UpdateRental,car) into Post_UpdateRental_car
!insert(postSnapshot_UpdateRental,mileage_Car) into Post_UpdateRental_mileage_Car
---Pre/Postcondition_DM
!create preSnapshot_dmAct5:Pre_dmAct5
!create today:T_DateCls
!set today.name:=’today’
!insert (preSnapshot_dmAct5,today) into Pre_dmAct5_today
---Match SysState
!create todayDateCls:DateCls
!set todayDateCls.date:=currentDate
!set today.value:=todayDateCls
---Execution
!let currExec = ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let _actGrp_opName=’updateRentalInfo()’
!let _sysAct_name=’UpdateRentalInfo’
!let _nextDmAct_name=’getCurrDay’
!let matchSL=Tuple{ucAct:ucAct,
actUC:actUC,preSnapshotUC:preSnapshot_UpdateRental,
postSnapshotUC:postSnapshot_UpdateRental,_sysAct_name:_sysAct_name}
!let matchTL=Tuple{dmAct:dmAct,actDM:actDM,objNode:retCar,
preSnapshotDM:preSnapshot_dmAct5,postSnapshotDM:preSnapshot_dmAct5, _actGrp_opName:_actGrp_opName,_nextDmAct_name:_nextDmAct_name}
!let matchCL=Tuple{currExec:currExec}
read uc2dm_nextSysAct_coEvol.cmd
---NEXT_DMCondBranch56_NewActGrp ---Pre/Postcondition_UC ---Pre/Postcondition_DM
!create preSnapshot_dmAct6:Pre_dmAct6
!insert (preSnapshot_dmAct6,rental) into Pre_dmAct6_rental
!insert (preSnapshot_dmAct6,today) into Pre_dmAct6_today
---!create postSnapshot_dmAct6:Post_dmAct6
!insert(postSnapshot_dmAct6,rental) into Post_dmAct6_rental
!insert (postSnapshot_dmAct6,today) into Post_dmAct6_today
---!create guard_dmAct5_dmAct6:Guard_dmAct5_dmAct6
!insert(guard_dmAct5_dmAct6,rental) into Guard_dmAct5_dmAct6_rental
!insert(guard_dmAct5_dmAct6,today) into Guard_dmAct5_dmAct6_today
---Match SysState ---Execution
!let currExec = ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let superActGrp = dmAct.actGrp->any(true)
!let _dmCondEdge_guard=’else’
!let _actGrp_opName=’updateRental’
!let _nextDmAct_name=’updateReturn’
!let matchSL=Tuple{ucAct:ucAct}
!let matchTL=Tuple{dmAct:dmAct,actDM:actDM,superActGrp:superActGrp, objNode:rental,preSnapshotDM:preSnapshot_dmAct6,
postSnapshotDM:postSnapshot_dmAct6, guardSnapshotDM:guard_dmAct5_dmAct6,
_dmCondEdge_guard:_dmCondEdge_guard,_actGrp_opName:_actGrp_opName, _nextDmAct_name:_nextDmAct_name}
!let matchCL=Tuple{currExec:currExec}
read uc2dm_nextDMCondBranch_NewActGrp_coEvol.cmd
---Update SysState
!set rental.value.return:=today.value.date
---NEXT_DMAct7 ---Pre/Postcondition_UC ---Pre/Postcondition_DM
!create preSnapshot_dmAct7:Pre_dmAct7
!insert (preSnapshot_dmAct7,rental) into Pre_dmAct7_rental
!insert (preSnapshot_dmAct7,car) into Pre_dmAct7_car
---Match SysState
!set car.value:=rental.value.car
---Execution
!let currExec = ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let actGrp = dmAct.actGrp->any(true)
!let _nextDmAct_name=’getCar’
!let matchSL=Tuple{ucAct:ucAct}
!let matchTL=Tuple{dmAct:dmAct,actDM:actDM,actGrp:actGrp,
preSnapshotDM:preSnapshot_dmAct7,postSnapshotDM:preSnapshot_dmAct7, _nextDmAct_name:_nextDmAct_name}
!let matchCL=Tuple{currExec:currExec}
read uc2dm_nextDMAct_coEvol.cmd
---NEXT_DMAct8_newActGroup ---Pre/Postcondition_DM
!create preSnapshot_dmAct8:Pre_dmAct8
!insert (preSnapshot_dmAct8,car) into Pre_dmAct8_car
!insert (preSnapshot_dmAct8,mileage_Car) into Pre_dmAct8_mileage_Car
---!create postSnapshot_dmAct8:Post_dmAct8
!insert (postSnapshot_dmAct8,car) into Post_dmAct8_car
!insert (postSnapshot_dmAct8,mileage_Car) into Post_dmAct8_mileage_Car
---Match SysState ---Execution
!let currExec = ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let superActGrp = dmAct.actGrp->any(true).superGroup
!let _actGrp_opName=’updateCar’
!let _nextDmAct_name=’updateCar’
!let matchSL=Tuple{ucAct:ucAct}
!let matchTL=Tuple{dmAct:dmAct,actDM:actDM,superActGrp:superActGrp, objNode:car,preSnapshotDM:preSnapshot_dmAct8,
postSnapshotDM:postSnapshot_dmAct8,_actGrp_opName:_actGrp_opName, _nextDmAct_name:_nextDmAct_name}
!let matchCL=Tuple{currExec:currExec}
read uc2dm_nextDMAct_newActGroup_coEvol.cmd
---Update SysState
!set car.value.mileage:=mileage_Car.value.real
---NEXT_ucAct ---Pre/Postcondition_UC ---Pre/Postcondition_DM ---Match SysState ---Execution
!let currExec = ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let _includedUcAct_name=’ProcessPayment’
!let _actGrp_opName = ’processPayment’
!let _nextDmAct_name=’processPayment’
!create processPayment:T_ProcessPayment
!let matchSL=Tuple{ucAct:ucAct,actUC:actUC,
preSnapshotUC:defaultSnapshot,postSnapshotUC:defaultSnapshot, _includedUcAct_name:_includedUcAct_name}
!let matchTL=Tuple{dmAct:dmAct,actDM:actDM,objNode:processPayment, preSnapshotDM:defaultSnapshot,postSnapshotDM:defaultSnapshot, _actGrp_opName:_actGrp_opName,_nextDmAct_name:_nextDmAct_name}
!let matchCL=Tuple{currExec:currExec}
read uc2dm_nextUCAct_coEvol.cmd
---Finish UC ---Pre/Postcondition_UC ---Pre/Postcondition_DM ---Match SysState
---Execution
!let currExec = ExecControl.allInstances->any(
next=oclUndefined(ExecControl))
!let ucAct = currExec.ucAct
!let dmAct = currExec.dmAct
!let matchSL=Tuple{ucAct:ucAct,actUC:actUC, guardSnapshotUC:defaultSnapshot}
!let matchTL=Tuple{dmAct:dmAct,actDM:actDM}
!let matchCL=Tuple{currExec:currExec}
read uc2dm_finish_coEvol.cmd