@startuml package com.iluwatar.event.asynchronous { class App { - LOGGER : Logger {static} + PROP_FILE_NAME : String {static} ~ interactiveMode : boolean + App() + main(args : String[]) {static} - processOption1(eventManager : EventManager, s : Scanner) - processOption2(eventManager : EventManager, s : Scanner) - processOption3(eventManager : EventManager, s : Scanner) + quickRun() + run() + runInteractiveMode() + setUp() } class AsyncEvent { - LOGGER : Logger {static} - eventId : int - eventListener : ThreadCompleteListener - eventTime : int - isComplete : AtomicBoolean - synchronous : boolean - thread : Thread + AsyncEvent(eventId : int, eventTime : int, synchronous : boolean) + addListener(listener : ThreadCompleteListener) - completed() + isSynchronous() : boolean + removeListener() + run() + start() + status() + stop() } interface Event { + start() {abstract} + status() {abstract} + stop() {abstract} } class EventManager { - DOES_NOT_EXIST : String {static} + MAX_EVENT_TIME : int {static} + MAX_ID : int {static} + MAX_RUNNING_EVENTS : int {static} + MIN_ID : int {static} - currentlyRunningSyncEvent : int - eventPool : Map - rand : SecureRandom + EventManager() + cancel(eventId : int) + completedEventHandler(eventId : int) + create(eventTime : int) : int + createAsync(eventTime : int) : int - createEvent(eventTime : int, isSynchronous : boolean) : int - generateId() : int + getEventPool() : Map + numOfCurrentlyRunningSyncEvent() : int + shutdown() + start(eventId : int) + status(eventId : int) + statusOfAllEvents() } interface ThreadCompleteListener { + completedEventHandler(int) {abstract} } } AsyncEvent --> "-eventListener" ThreadCompleteListener AsyncEvent ..|> Event EventManager ..|> ThreadCompleteListener @enduml