@startuml package com.iluwatar.hexagonal.service { class LotteryServiceImpl { - bank : WireTransfers - notifications : LotteryNotifications - repository : LotteryTicketRepository + LotteryServiceImpl() + checkTicketForPrize(id : LotteryTicketId, winningNumbers : LotteryNumbers) : LotteryTicketCheckResult + submitTicket(ticket : LotteryTicket) : Optional } interface LotteryService { + checkTicketForPrize(LotteryTicketId, LotteryNumbers) : LotteryTicketCheckResult {abstract} + submitTicket(LotteryTicket) : Optional {abstract} } } package com.iluwatar.hexagonal.domain { class LotteryTicketId { - id : UUID + LotteryTicketId() + getId() : UUID } class LotteryConstants { + PLAYER_MAX_SALDO : int {static} + PRIZE_AMOUNT : int {static} + SERVICE_BANK_ACCOUNT : String {static} + SERVICE_BANK_ACCOUNT_SALDO : int {static} + TICKET_PRIZE : int {static} + LotteryConstants() } class LotteryNumbers { + MAX_NUMBER : int {static} + MIN_NUMBER : int {static} + NUM_NUMBERS : int {static} - numbers : Set - LotteryNumbers() - LotteryNumbers(givenNumbers : Set) + create(givenNumbers : Set) : LotteryNumbers {static} + createRandom() : LotteryNumbers {static} + equals(obj : Object) : boolean - generateRandomNumbers() + getNumbers() : Set + hashCode() : int } class PlayerDetails { - bankAccountNumber : String - emailAddress : String - phoneNumber : String - PlayerDetails(email : String, bankAccount : String, phone : String) + create(email : String, bankAccount : String, phone : String) : PlayerDetails {static} + equals(obj : Object) : boolean + getBankAccount() : String + getEmail() : String + getPhoneNumber() : String + hashCode() : int } class LotteryTicketCheckResult { - checkResult : CheckResult - prizeAmount : int + LotteryTicketCheckResult(result : CheckResult) + LotteryTicketCheckResult(result : CheckResult, amount : int) + equals(obj : Object) : boolean + getPrizeAmount() : int + getResult() : CheckResult + hashCode() : int } class LotteryTicket { - lotteryNumbers : LotteryNumbers - playerDetails : PlayerDetails - LotteryTicket(details : PlayerDetails, numbers : LotteryNumbers) + create(details : PlayerDetails, numbers : LotteryNumbers) : LotteryTicket {static} + equals(obj : Object) : boolean + getNumbers() : LotteryNumbers + getPlayerDetails() : PlayerDetails + hashCode() : int } -class RandomNumberGenerator { - randomIterator : OfInt + RandomNumberGenerator(min : int, max : int) + nextInt() : int } enum CheckResult { + NO_PRIZE {static} + TICKET_NOT_SUBMITTED {static} + WIN_PRIZE {static} + valueOf(name : String) : CheckResult {static} + values() : CheckResult[] {static} } } package com.iluwatar.hexagonal.banking { class WireTransfersImpl { - accounts : Map {static} + WireTransfersImpl() + getFunds(bankAccount : String) : int + setFunds(bankAccount : String, amount : int) + transferFunds(amount : int, sourceBackAccount : String, destinationBankAccount : String) : boolean } interface WireTransfers { + getFunds(String) : int {abstract} + setFunds(String, int) {abstract} + transferFunds(int, String, String) : boolean {abstract} } } package com.iluwatar.hexagonal.database { class LotteryTicketInMemoryRepository { - tickets : Map {static} + LotteryTicketInMemoryRepository() + deleteAll() + findAll() : Map + findById(id : LotteryTicketId) : Optional + save(ticket : LotteryTicket) : Optional } interface LotteryTicketRepository { + deleteAll() {abstract} + findAll() : Map {abstract} + findById(LotteryTicketId) : Optional {abstract} + save(LotteryTicket) : Optional {abstract} } } package com.iluwatar.hexagonal.eventlog { interface LotteryNotifications { + notifyNoWin(PlayerDetails) {abstract} + notifyPrize(PlayerDetails, int) {abstract} + notifyPrizeError(PlayerDetails, int) {abstract} + notifyTicketSubmitError(PlayerDetails) {abstract} + notifyTicketSubmitted(PlayerDetails) {abstract} } class LotteryNotificationsImpl { + LotteryNotificationsImpl() + notifyNoWin(details : PlayerDetails) + notifyPrize(details : PlayerDetails, prizeAmount : int) + notifyPrizeError(details : PlayerDetails, prizeAmount : int) + notifyTicketSubmitError(details : PlayerDetails) + notifyTicketSubmitted(details : PlayerDetails) } } package com.iluwatar.hexagonal { class App { - allPlayerDetails : List {static} + App() - getRandomPlayerDetails() : PlayerDetails {static} + main(args : String[]) {static} - submitTickets(lotteryService : LotteryService, numTickets : int) {static} } } package com.iluwatar.hexagonal.administration { interface LotteryAdministration { + getAllSubmittedTickets() : Map {abstract} + performLottery() : LotteryNumbers {abstract} + resetLottery() {abstract} } class LotteryAdministrationImpl { - bank : WireTransfers - notifications : LotteryNotifications - repository : LotteryTicketRepository - service : LotteryService + LotteryAdministrationImpl() + getAllSubmittedTickets() : Map + performLottery() : LotteryNumbers + resetLottery() } } LotteryTicket --> "-playerDetails" PlayerDetails LotteryAdministrationImpl --> "-bank" WireTransfers App --> "-allPlayerDetails" PlayerDetails RandomNumberGenerator ..+ PrimitiveIterator LotteryAdministrationImpl --> "-repository" LotteryTicketRepository LotteryAdministrationImpl --+ LotteryTicketCheckResult LotteryServiceImpl --> "-notifications" LotteryNotifications LotteryTicket --> "-lotteryNumbers" LotteryNumbers LotteryAdministrationImpl --> "-notifications" LotteryNotifications LotteryServiceImpl --> "-repository" LotteryTicketRepository LotteryServiceImpl --+ LotteryTicketCheckResult LotteryServiceImpl --> "-bank" WireTransfers RandomNumberGenerator ..+ LotteryNumbers LotteryAdministrationImpl --> "-service" LotteryService LotteryTicketCheckResult --> "-checkResult" CheckResult CheckResult ..+ LotteryTicketCheckResult LotteryTicketInMemoryRepository ..|> LotteryTicketRepository WireTransfersImpl ..|> WireTransfers LotteryServiceImpl ..|> LotteryService LotteryNotificationsImpl ..|> LotteryNotifications LotteryAdministrationImpl ..|> LotteryAdministration @enduml