@startuml
!include style.puml

box Logic LOGIC_COLOR_T1
participant ":LogicDispatcherManager" as LogicDispatcherManager LOGIC_COLOR
participant ":XYZLogicManager" as XYZLogicManager LOGIC_COLOR
participant ":XYZBookParser" as XYZBookParser LOGIC_COLOR
participant ":GeneralParser" as GeneralParser LOGIC_COLOR
participant ":ABCCommandParser" as ABCCommandParser LOGIC_COLOR
participant "abcCommand:ABCCommand" as ABCCommand LOGIC_COLOR
participant ":CommandResult" as CommandResult LOGIC_COLOR

end box

box Model MODEL_COLOR_T1
participant ":XYZModel" as XYZModel MODEL_COLOR
end box

[-> LogicDispatcherManager : execute(command, XYZ)
activate LogicDispatcherManager
note left
XYZ = Deliverable,
Meeting or Person
end note

alt LOGIC_COLOR_T1 commands that affect model
LogicDispatcherManager -> XYZLogicManager : execute(command)
activate XYZLogicManager

XYZLogicManager -> XYZBookParser : parseCommand(command)
activate XYZBookParser

create ABCCommandParser
XYZBookParser -> ABCCommandParser
activate ABCCommandParser

ABCCommandParser --> XYZBookParser
deactivate ABCCommandParser

XYZBookParser -> ABCCommandParser : parse(command)
activate ABCCommandParser

create ABCCommand
ABCCommandParser -> ABCCommand
activate ABCCommand


ABCCommand --> ABCCommandParser : abcCommand
deactivate ABCCommand
note right
ABC = Add, Find, Delete, etc
Similarly, abc = add, find, delete, etc
end note

ABCCommandParser --> XYZBookParser : abcCommand
deactivate ABCCommandParser
'Hidden arrow to position the destroy marker below the end of the activation bar.
ABCCommandParser -[hidden]-> XYZBookParser
destroy ABCCommandParser

XYZBookParser --> XYZLogicManager : abcCommand
deactivate XYZBookParser

XYZLogicManager -> ABCCommand : execute()
activate ABCCommand

ABCCommand -> XYZModel
activate XYZModel

XYZModel --> ABCCommand
deactivate XYZModel

create CommandResult
ABCCommand -> CommandResult
activate CommandResult

CommandResult --> ABCCommand
deactivate CommandResult

ABCCommand --> XYZLogicManager : result
deactivate ABCCommand

LogicDispatcherManager<--XYZLogicManager
deactivate XYZLogicManager

else #yellow commands that do not affect model

LogicDispatcherManager -> GeneralParser : parseCommand(command)
activate GeneralParser

create ABCCommandParser
GeneralParser -> ABCCommandParser
activate ABCCommandParser

ABCCommandParser --> GeneralParser
deactivate ABCCommandParser

GeneralParser -> ABCCommandParser : parse(command)
activate ABCCommandParser

create ABCCommand
ABCCommandParser -> ABCCommand
activate ABCCommand


ABCCommand --> ABCCommandParser : abcCommand
deactivate ABCCommand

ABCCommandParser --> GeneralParser : abcCommand
deactivate ABCCommandParser
'Hidden arrow to position the destroy marker below the end of the activation bar.
ABCCommandParser -[hidden]-> GeneralParser
destroy ABCCommandParser

GeneralParser -->LogicDispatcherManager : abcCommand
deactivate GeneralParser

LogicDispatcherManager -> ABCCommand : execute()
activate ABCCommand

create CommandResult
ABCCommand -> CommandResult
activate CommandResult

CommandResult --> ABCCommand
deactivate CommandResult

ABCCommand --> LogicDispatcherManager : result
deactivate ABCCommand

end
[<--LogicDispatcherManager
deactivate LogicDispatcherManager

@enduml
