329 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			329 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								@startuml
							 | 
						||
| 
								 | 
							
								package com.iluwatar.commander.queue {
							 | 
						||
| 
								 | 
							
								  class Queue<T> {
							 | 
						||
| 
								 | 
							
								    - front : Queue.Node<T>
							 | 
						||
| 
								 | 
							
								    - rear : Queue.Node<T>
							 | 
						||
| 
								 | 
							
								    - size : int
							 | 
						||
| 
								 | 
							
								    ~ Queue<T>()
							 | 
						||
| 
								 | 
							
								    ~ dequeue() : T
							 | 
						||
| 
								 | 
							
								    ~ enqueue(obj : T)
							 | 
						||
| 
								 | 
							
								    ~ isEmpty() : boolean
							 | 
						||
| 
								 | 
							
								    ~ peek() : T
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ~class Node<V> {
							 | 
						||
| 
								 | 
							
								    ~ next : Queue.Node<V>
							 | 
						||
| 
								 | 
							
								    ~ value : V
							 | 
						||
| 
								 | 
							
								    ~ Node<V>(obj : V, b : Queue.Node<V>)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class QueueDatabase {
							 | 
						||
| 
								 | 
							
								    - data : Queue<QueueTask>
							 | 
						||
| 
								 | 
							
								    + exceptionsList : List<Exception>
							 | 
						||
| 
								 | 
							
								    + QueueDatabase(exc : Exception[])
							 | 
						||
| 
								 | 
							
								    + add(t : QueueTask) : QueueTask
							 | 
						||
| 
								 | 
							
								    + dequeue() : QueueTask
							 | 
						||
| 
								 | 
							
								    + get(taskId : String) : QueueTask
							 | 
						||
| 
								 | 
							
								    + peek() : QueueTask
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class QueueTask {
							 | 
						||
| 
								 | 
							
								    + firstAttemptTime : long
							 | 
						||
| 
								 | 
							
								    + messageType : int
							 | 
						||
| 
								 | 
							
								    + order : Order
							 | 
						||
| 
								 | 
							
								    + taskType : TaskType
							 | 
						||
| 
								 | 
							
								    + QueueTask(o : Order, t : TaskType, messageType : int)
							 | 
						||
| 
								 | 
							
								    + getType() : String
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  enum TaskType {
							 | 
						||
| 
								 | 
							
								    + EmployeeDb {static}
							 | 
						||
| 
								 | 
							
								    + Messaging {static}
							 | 
						||
| 
								 | 
							
								    + Payment {static}
							 | 
						||
| 
								 | 
							
								    + valueOf(name : String) : TaskType {static}
							 | 
						||
| 
								 | 
							
								    + values() : TaskType[] {static}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								package com.iluwatar.commander.messagingservice {
							 | 
						||
| 
								 | 
							
								  class MessagingDatabase {
							 | 
						||
| 
								 | 
							
								    - data : Hashtable<String, MessageRequest>
							 | 
						||
| 
								 | 
							
								    + MessagingDatabase()
							 | 
						||
| 
								 | 
							
								    + add(r : MessageRequest) : MessageRequest
							 | 
						||
| 
								 | 
							
								    + get(requestId : String) : MessageRequest
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class MessagingService {
							 | 
						||
| 
								 | 
							
								    - LOGGER : Logger {static}
							 | 
						||
| 
								 | 
							
								    + MessagingService(db : MessagingDatabase, exc : Exception[])
							 | 
						||
| 
								 | 
							
								    + receiveRequest(parameters : Object[]) : String
							 | 
						||
| 
								 | 
							
								    ~ sendMessage(m : MessageToSend) : String
							 | 
						||
| 
								 | 
							
								    # updateDb(parameters : Object[]) : String
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ~class MessageRequest {
							 | 
						||
| 
								 | 
							
								    ~ msg : MessageToSend
							 | 
						||
| 
								 | 
							
								    ~ reqId : String
							 | 
						||
| 
								 | 
							
								    ~ MessageRequest(this$0 : String, reqId : MessageToSend)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ~enum MessageToSend {
							 | 
						||
| 
								 | 
							
								    + PaymentFail {static}
							 | 
						||
| 
								 | 
							
								    + PaymentSuccessful {static}
							 | 
						||
| 
								 | 
							
								    + PaymentTrying {static}
							 | 
						||
| 
								 | 
							
								    + valueOf(name : String) : MessageToSend {static}
							 | 
						||
| 
								 | 
							
								    + values() : MessageToSend[] {static}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								package com.iluwatar.commander {
							 | 
						||
| 
								 | 
							
								  class AppEmployeeDbFailCases {
							 | 
						||
| 
								 | 
							
								    - employeeTime : long
							 | 
						||
| 
								 | 
							
								    - messageTime : long
							 | 
						||
| 
								 | 
							
								    - numOfRetries : int
							 | 
						||
| 
								 | 
							
								    - paymentTime : long
							 | 
						||
| 
								 | 
							
								    - queueTaskTime : long
							 | 
						||
| 
								 | 
							
								    - queueTime : long
							 | 
						||
| 
								 | 
							
								    - retryDuration : long
							 | 
						||
| 
								 | 
							
								    + AppEmployeeDbFailCases()
							 | 
						||
| 
								 | 
							
								    ~ employeeDatabaseUnavailableCase()
							 | 
						||
| 
								 | 
							
								    ~ employeeDbSuccessCase()
							 | 
						||
| 
								 | 
							
								    + main(args : String[]) {static}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class AppMessagingFailCases {
							 | 
						||
| 
								 | 
							
								    - employeeTime : long
							 | 
						||
| 
								 | 
							
								    - messageTime : long
							 | 
						||
| 
								 | 
							
								    - numOfRetries : int
							 | 
						||
| 
								 | 
							
								    - paymentTime : long
							 | 
						||
| 
								 | 
							
								    - queueTaskTime : long
							 | 
						||
| 
								 | 
							
								    - queueTime : long
							 | 
						||
| 
								 | 
							
								    - retryDuration : long
							 | 
						||
| 
								 | 
							
								    + AppMessagingFailCases()
							 | 
						||
| 
								 | 
							
								    + main(args : String[]) {static}
							 | 
						||
| 
								 | 
							
								    ~ messagingDatabaseUnavailableCasePaymentError()
							 | 
						||
| 
								 | 
							
								    ~ messagingDatabaseUnavailableCasePaymentFailure()
							 | 
						||
| 
								 | 
							
								    ~ messagingDatabaseUnavailableCasePaymentSuccess()
							 | 
						||
| 
								 | 
							
								    ~ messagingSuccessCase()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class AppPaymentFailCases {
							 | 
						||
| 
								 | 
							
								    - employeeTime : long
							 | 
						||
| 
								 | 
							
								    - messageTime : long
							 | 
						||
| 
								 | 
							
								    - numOfRetries : int
							 | 
						||
| 
								 | 
							
								    - paymentTime : long
							 | 
						||
| 
								 | 
							
								    - queueTaskTime : long
							 | 
						||
| 
								 | 
							
								    - queueTime : long
							 | 
						||
| 
								 | 
							
								    - retryDuration : long
							 | 
						||
| 
								 | 
							
								    + AppPaymentFailCases()
							 | 
						||
| 
								 | 
							
								    + main(args : String[]) {static}
							 | 
						||
| 
								 | 
							
								    ~ paymentDatabaseUnavailableCase()
							 | 
						||
| 
								 | 
							
								    ~ paymentNotPossibleCase()
							 | 
						||
| 
								 | 
							
								    ~ paymentSuccessCase()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class AppQueueFailCases {
							 | 
						||
| 
								 | 
							
								    - employeeTime : long
							 | 
						||
| 
								 | 
							
								    - messageTime : long
							 | 
						||
| 
								 | 
							
								    - numOfRetries : int
							 | 
						||
| 
								 | 
							
								    - paymentTime : long
							 | 
						||
| 
								 | 
							
								    - queueTaskTime : long
							 | 
						||
| 
								 | 
							
								    - queueTime : long
							 | 
						||
| 
								 | 
							
								    - retryDuration : long
							 | 
						||
| 
								 | 
							
								    + AppQueueFailCases()
							 | 
						||
| 
								 | 
							
								    + main(args : String[]) {static}
							 | 
						||
| 
								 | 
							
								    ~ queueEmployeeDbTaskDatabaseUnavailableCase()
							 | 
						||
| 
								 | 
							
								    ~ queueMessageTaskDatabaseUnavailableCase()
							 | 
						||
| 
								 | 
							
								    ~ queuePaymentTaskDatabaseUnavailableCase()
							 | 
						||
| 
								 | 
							
								    ~ queueSuccessCase()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class AppShippingFailCases {
							 | 
						||
| 
								 | 
							
								    - employeeTime : long
							 | 
						||
| 
								 | 
							
								    - messageTime : long
							 | 
						||
| 
								 | 
							
								    - numOfRetries : int
							 | 
						||
| 
								 | 
							
								    - paymentTime : long
							 | 
						||
| 
								 | 
							
								    - queueTaskTime : long
							 | 
						||
| 
								 | 
							
								    - queueTime : long
							 | 
						||
| 
								 | 
							
								    - retryDuration : long
							 | 
						||
| 
								 | 
							
								    + AppShippingFailCases()
							 | 
						||
| 
								 | 
							
								    ~ itemUnavailableCase()
							 | 
						||
| 
								 | 
							
								    + main(args : String[]) {static}
							 | 
						||
| 
								 | 
							
								    ~ shippingDatabaseUnavailableCase()
							 | 
						||
| 
								 | 
							
								    ~ shippingNotPossibleCase()
							 | 
						||
| 
								 | 
							
								    ~ shippingSuccessCase()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class Commander {
							 | 
						||
| 
								 | 
							
								    - LOG : Logger {static}
							 | 
						||
| 
								 | 
							
								    - employeeDb : EmployeeHandle
							 | 
						||
| 
								 | 
							
								    - employeeTime : long
							 | 
						||
| 
								 | 
							
								    - finalSiteMsgShown : boolean
							 | 
						||
| 
								 | 
							
								    - messageTime : long
							 | 
						||
| 
								 | 
							
								    - messagingService : MessagingService
							 | 
						||
| 
								 | 
							
								    - numOfRetries : int
							 | 
						||
| 
								 | 
							
								    - paymentService : PaymentService
							 | 
						||
| 
								 | 
							
								    - paymentTime : long
							 | 
						||
| 
								 | 
							
								    - queue : QueueDatabase
							 | 
						||
| 
								 | 
							
								    - queueItems : int
							 | 
						||
| 
								 | 
							
								    - queueTaskTime : long
							 | 
						||
| 
								 | 
							
								    - queueTime : long
							 | 
						||
| 
								 | 
							
								    - retryDuration : long
							 | 
						||
| 
								 | 
							
								    - shippingService : ShippingService
							 | 
						||
| 
								 | 
							
								    ~ Commander(empDb : EmployeeHandle, paymentService : PaymentService, shippingService : ShippingService, messagingService : MessagingService, qdb : QueueDatabase, numOfRetries : int, retryDuration : long, queueTime : long, queueTaskTime : long, paymentTime : long, messageTime : long, employeeTime : long)
							 | 
						||
| 
								 | 
							
								    - doTasksInQueue()
							 | 
						||
| 
								 | 
							
								    - employeeHandleIssue(order : Order)
							 | 
						||
| 
								 | 
							
								    ~ placeOrder(order : Order)
							 | 
						||
| 
								 | 
							
								    - sendPaymentFailureMessage(order : Order)
							 | 
						||
| 
								 | 
							
								    - sendPaymentPossibleErrorMsg(order : Order)
							 | 
						||
| 
								 | 
							
								    - sendPaymentRequest(order : Order)
							 | 
						||
| 
								 | 
							
								    - sendShippingRequest(order : Order)
							 | 
						||
| 
								 | 
							
								    - sendSuccessMessage(order : Order)
							 | 
						||
| 
								 | 
							
								    - tryDequeue()
							 | 
						||
| 
								 | 
							
								    - tryDoingTasksInQueue()
							 | 
						||
| 
								 | 
							
								    - updateQueue(qt : QueueTask)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  abstract class Database<T> {
							 | 
						||
| 
								 | 
							
								    + Database<T>()
							 | 
						||
| 
								 | 
							
								    + add(T) : T {abstract}
							 | 
						||
| 
								 | 
							
								    + get(String) : T {abstract}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class Order {
							 | 
						||
| 
								 | 
							
								    - ALL_CHARS : String {static}
							 | 
						||
| 
								 | 
							
								    - RANDOM : Random {static}
							 | 
						||
| 
								 | 
							
								    - USED_IDS : Hashtable<String, Boolean> {static}
							 | 
						||
| 
								 | 
							
								    ~ addedToEmployeeHandle : boolean
							 | 
						||
| 
								 | 
							
								    ~ createdTime : long
							 | 
						||
| 
								 | 
							
								    + id : String
							 | 
						||
| 
								 | 
							
								    ~ item : String
							 | 
						||
| 
								 | 
							
								    ~ messageSent : MessageSent
							 | 
						||
| 
								 | 
							
								    ~ paid : PaymentStatus
							 | 
						||
| 
								 | 
							
								    ~ price : float
							 | 
						||
| 
								 | 
							
								    ~ user : User
							 | 
						||
| 
								 | 
							
								    ~ Order(user : User, item : String, price : float)
							 | 
						||
| 
								 | 
							
								    - createUniqueId() : String
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ~enum MessageSent {
							 | 
						||
| 
								 | 
							
								    + NoneSent {static}
							 | 
						||
| 
								 | 
							
								    + PaymentFail {static}
							 | 
						||
| 
								 | 
							
								    + PaymentSuccessful {static}
							 | 
						||
| 
								 | 
							
								    + PaymentTrying {static}
							 | 
						||
| 
								 | 
							
								    + valueOf(name : String) : MessageSent {static}
							 | 
						||
| 
								 | 
							
								    + values() : MessageSent[] {static}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ~enum PaymentStatus {
							 | 
						||
| 
								 | 
							
								    + Done {static}
							 | 
						||
| 
								 | 
							
								    + NotDone {static}
							 | 
						||
| 
								 | 
							
								    + Trying {static}
							 | 
						||
| 
								 | 
							
								    + valueOf(name : String) : PaymentStatus {static}
							 | 
						||
| 
								 | 
							
								    + values() : PaymentStatus[] {static}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class Retry<T> {
							 | 
						||
| 
								 | 
							
								    - RANDOM : Random {static}
							 | 
						||
| 
								 | 
							
								    - attempts : AtomicInteger
							 | 
						||
| 
								 | 
							
								    - errors : List<Exception>
							 | 
						||
| 
								 | 
							
								    - handleError : Retry.HandleErrorIssue<T>
							 | 
						||
| 
								 | 
							
								    - maxAttempts : int
							 | 
						||
| 
								 | 
							
								    - maxDelay : long
							 | 
						||
| 
								 | 
							
								    - op : Operation
							 | 
						||
| 
								 | 
							
								    - test : Predicate<Exception>
							 | 
						||
| 
								 | 
							
								    ~ Retry<T>(op : Operation, handleError : Retry.HandleErrorIssue<T>, maxAttempts : int, maxDelay : long, ignoreTests : Predicate<Exception>[])
							 | 
						||
| 
								 | 
							
								    + perform(list : List<Exception>, obj : T)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  interface HandleErrorIssue<T> {
							 | 
						||
| 
								 | 
							
								    + handleIssue(T, Exception) {abstract}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  interface Operation {
							 | 
						||
| 
								 | 
							
								    + operation(List<Exception>) {abstract}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  abstract class Service {
							 | 
						||
| 
								 | 
							
								    - ALL_CHARS : String {static}
							 | 
						||
| 
								 | 
							
								    - RANDOM : Random {static}
							 | 
						||
| 
								 | 
							
								    - USED_IDS : Hashtable<String, Boolean> {static}
							 | 
						||
| 
								 | 
							
								    # database : Database<T>
							 | 
						||
| 
								 | 
							
								    + exceptionsList : ArrayList<Exception>
							 | 
						||
| 
								 | 
							
								    # Service(db : Database<T>, exc : Exception[])
							 | 
						||
| 
								 | 
							
								    # generateId() : String
							 | 
						||
| 
								 | 
							
								    + receiveRequest(Object[]) : String {abstract}
							 | 
						||
| 
								 | 
							
								    # updateDb(Object[]) : String {abstract}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class User {
							 | 
						||
| 
								 | 
							
								    ~ address : String
							 | 
						||
| 
								 | 
							
								    ~ name : String
							 | 
						||
| 
								 | 
							
								    ~ User(name : String, address : String)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								package com.iluwatar.commander.shippingservice {
							 | 
						||
| 
								 | 
							
								  class ShippingDatabase {
							 | 
						||
| 
								 | 
							
								    - data : Hashtable<String, ShippingRequest>
							 | 
						||
| 
								 | 
							
								    + ShippingDatabase()
							 | 
						||
| 
								 | 
							
								    + add(r : ShippingRequest) : ShippingRequest
							 | 
						||
| 
								 | 
							
								    + get(trasnactionId : String) : ShippingRequest
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class ShippingService {
							 | 
						||
| 
								 | 
							
								    + ShippingService(db : ShippingDatabase, exc : Exception[])
							 | 
						||
| 
								 | 
							
								    + receiveRequest(parameters : Object[]) : String
							 | 
						||
| 
								 | 
							
								    # updateDb(parameters : Object[]) : String
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ~class ShippingRequest {
							 | 
						||
| 
								 | 
							
								    ~ address : String
							 | 
						||
| 
								 | 
							
								    ~ item : String
							 | 
						||
| 
								 | 
							
								    ~ transactionId : String
							 | 
						||
| 
								 | 
							
								    ~ ShippingRequest(transactionId : String, item : String, address : String)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								package com.iluwatar.commander.paymentservice {
							 | 
						||
| 
								 | 
							
								  class PaymentDatabase {
							 | 
						||
| 
								 | 
							
								    - data : Hashtable<String, PaymentRequest>
							 | 
						||
| 
								 | 
							
								    + PaymentDatabase()
							 | 
						||
| 
								 | 
							
								    + add(r : PaymentRequest) : PaymentRequest
							 | 
						||
| 
								 | 
							
								    + get(requestId : String) : PaymentRequest
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class PaymentService {
							 | 
						||
| 
								 | 
							
								    + PaymentService(db : PaymentDatabase, exc : Exception[])
							 | 
						||
| 
								 | 
							
								    + receiveRequest(parameters : Object[]) : String
							 | 
						||
| 
								 | 
							
								    # updateDb(parameters : Object[]) : String
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  ~class PaymentRequest {
							 | 
						||
| 
								 | 
							
								    ~ paid : boolean
							 | 
						||
| 
								 | 
							
								    ~ payment : float
							 | 
						||
| 
								 | 
							
								    ~ transactionId : String
							 | 
						||
| 
								 | 
							
								    ~ PaymentRequest(this$0 : String, transactionId : float)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								package com.iluwatar.commander.employeehandle {
							 | 
						||
| 
								 | 
							
								  class EmployeeDatabase {
							 | 
						||
| 
								 | 
							
								    - data : Hashtable<String, Order>
							 | 
						||
| 
								 | 
							
								    + EmployeeDatabase()
							 | 
						||
| 
								 | 
							
								    + add(o : Order) : Order
							 | 
						||
| 
								 | 
							
								    + get(orderId : String) : Order
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  class EmployeeHandle {
							 | 
						||
| 
								 | 
							
								    + EmployeeHandle(db : EmployeeDatabase, exc : Exception[])
							 | 
						||
| 
								 | 
							
								    + receiveRequest(parameters : Object[]) : String
							 | 
						||
| 
								 | 
							
								    # updateDb(parameters : Object[]) : String
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								Order -->  "-messageSent" MessageSent
							 | 
						||
| 
								 | 
							
								MessageSent ..+ Order
							 | 
						||
| 
								 | 
							
								MessageToSend ..+ MessagingService
							 | 
						||
| 
								 | 
							
								Retry -->  "-op" Operation
							 | 
						||
| 
								 | 
							
								Operation ..+ Retry
							 | 
						||
| 
								 | 
							
								Service -->  "-database" Database
							 | 
						||
| 
								 | 
							
								Node -->  "-next" Node
							 | 
						||
| 
								 | 
							
								PaymentRequest --+ PaymentService
							 | 
						||
| 
								 | 
							
								Commander -->  "-messagingService" MessagingService
							 | 
						||
| 
								 | 
							
								ShippingRequest ..+ ShippingService
							 | 
						||
| 
								 | 
							
								Commander -->  "-shippingService" ShippingService
							 | 
						||
| 
								 | 
							
								Commander -->  "-paymentService" PaymentService
							 | 
						||
| 
								 | 
							
								MessageRequest --+ MessagingService
							 | 
						||
| 
								 | 
							
								Commander -->  "-employeeDb" EmployeeHandle
							 | 
						||
| 
								 | 
							
								HandleErrorIssue ..+ Retry
							 | 
						||
| 
								 | 
							
								Retry -->  "-handleError" HandleErrorIssue
							 | 
						||
| 
								 | 
							
								QueueTask -->  "-taskType" TaskType
							 | 
						||
| 
								 | 
							
								TaskType ..+ QueueTask
							 | 
						||
| 
								 | 
							
								Order -->  "-user" User
							 | 
						||
| 
								 | 
							
								MessageRequest -->  "-msg" MessageToSend
							 | 
						||
| 
								 | 
							
								QueueTask -->  "-order" Order
							 | 
						||
| 
								 | 
							
								Commander -->  "-queue" QueueDatabase
							 | 
						||
| 
								 | 
							
								QueueDatabase -->  "-data" Queue
							 | 
						||
| 
								 | 
							
								Queue -->  "-front" Node
							 | 
						||
| 
								 | 
							
								Node ..+ Queue
							 | 
						||
| 
								 | 
							
								Order -->  "-paid" PaymentStatus
							 | 
						||
| 
								 | 
							
								PaymentStatus ..+ Order
							 | 
						||
| 
								 | 
							
								EmployeeDatabase --|> Database 
							 | 
						||
| 
								 | 
							
								EmployeeHandle --|> Service 
							 | 
						||
| 
								 | 
							
								MessagingDatabase --|> Database 
							 | 
						||
| 
								 | 
							
								MessagingService --|> Service 
							 | 
						||
| 
								 | 
							
								PaymentDatabase --|> Database 
							 | 
						||
| 
								 | 
							
								PaymentService --|> Service 
							 | 
						||
| 
								 | 
							
								QueueDatabase --|> Database 
							 | 
						||
| 
								 | 
							
								ShippingDatabase --|> Database 
							 | 
						||
| 
								 | 
							
								ShippingService --|> Service 
							 | 
						||
| 
								 | 
							
								@enduml
							 |