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 |