From 5de9c7e6b4a4783afab4f7da87153733bdb06fc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Sat, 9 Apr 2016 16:53:34 +0300 Subject: [PATCH] Lots of improvements to the example --- .../main/java/com/iluwatar/hexagonal/App.java | 88 ++++++++++--------- .../LotteryAdministrationImpl.java | 14 +-- .../hexagonal/banking/WireTransfersImpl.java | 4 +- .../hexagonal/domain/LotteryConstants.java | 38 ++++++++ .../domain/LotteryTicketCheckResult.java | 2 +- .../notifications/LotteryNotifications.java | 2 + .../LotteryNotificationsImpl.java | 14 +++ .../hexagonal/service/LotteryServiceImpl.java | 12 +-- .../hexagonal/lottery/LotteryTest.java | 14 ++- 9 files changed, 130 insertions(+), 58 deletions(-) create mode 100644 hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryConstants.java diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java index 58b84f2ee..754f301b3 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/App.java @@ -28,6 +28,8 @@ import java.util.Random; import com.iluwatar.hexagonal.administration.LotteryAdministration; import com.iluwatar.hexagonal.administration.LotteryAdministrationImpl; +import com.iluwatar.hexagonal.banking.WireTransfersImpl; +import com.iluwatar.hexagonal.domain.LotteryConstants; import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.PlayerDetails; @@ -46,44 +48,50 @@ public class App { static { allPlayerDetails = new ArrayList<>(); allPlayerDetails.add(PlayerDetails.create("john@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("mary@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("steve@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("wayne@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("johnie@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("andy@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("richard@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("kevin@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("arnold@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("ian@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("robin@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("ted@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("larry@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("calvin@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("jacob@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("edwin@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("mary@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("lolita@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("bruno@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("peter@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("warren@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("monica@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("ollie@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("yngwie@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("lars@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("bobbie@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("tyron@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("tyrell@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("nadja@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("wendy@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("luke@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("bjorn@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("lisa@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("anton@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("bruce@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("ray@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("ron@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("xavier@google.com", "312-342", "+3242434242")); - allPlayerDetails.add(PlayerDetails.create("harriet@google.com", "312-342", "+3242434242")); + allPlayerDetails.add(PlayerDetails.create("mary@google.com", "234-987", "+23452346")); + allPlayerDetails.add(PlayerDetails.create("steve@google.com", "833-836", "+63457543")); + allPlayerDetails.add(PlayerDetails.create("wayne@google.com", "319-826", "+24626")); + allPlayerDetails.add(PlayerDetails.create("johnie@google.com", "983-322", "+3635635")); + allPlayerDetails.add(PlayerDetails.create("andy@google.com", "934-734", "+0898245")); + allPlayerDetails.add(PlayerDetails.create("richard@google.com", "536-738", "+09845325")); + allPlayerDetails.add(PlayerDetails.create("kevin@google.com", "453-936", "+2423532")); + allPlayerDetails.add(PlayerDetails.create("arnold@google.com", "114-988", "+5646346524")); + allPlayerDetails.add(PlayerDetails.create("ian@google.com", "663-765", "+928394235")); + allPlayerDetails.add(PlayerDetails.create("robin@google.com", "334-763", "+35448")); + allPlayerDetails.add(PlayerDetails.create("ted@google.com", "735-964", "+98752345")); + allPlayerDetails.add(PlayerDetails.create("larry@google.com", "734-853", "+043842423")); + allPlayerDetails.add(PlayerDetails.create("calvin@google.com", "334-746", "+73294135")); + allPlayerDetails.add(PlayerDetails.create("jacob@google.com", "444-766", "+358042354")); + allPlayerDetails.add(PlayerDetails.create("edwin@google.com", "895-345", "+9752435")); + allPlayerDetails.add(PlayerDetails.create("mary@google.com", "760-009", "+34203542")); + allPlayerDetails.add(PlayerDetails.create("lolita@google.com", "425-907", "+9872342")); + allPlayerDetails.add(PlayerDetails.create("bruno@google.com", "023-638", "+673824122")); + allPlayerDetails.add(PlayerDetails.create("peter@google.com", "335-886", "+5432503945")); + allPlayerDetails.add(PlayerDetails.create("warren@google.com", "225-946", "+9872341324")); + allPlayerDetails.add(PlayerDetails.create("monica@google.com", "265-748", "+134124")); + allPlayerDetails.add(PlayerDetails.create("ollie@google.com", "190-045", "+34453452")); + allPlayerDetails.add(PlayerDetails.create("yngwie@google.com", "241-465", "+9897641231")); + allPlayerDetails.add(PlayerDetails.create("lars@google.com", "746-936", "+42345298345")); + allPlayerDetails.add(PlayerDetails.create("bobbie@google.com", "946-384", "+79831742")); + allPlayerDetails.add(PlayerDetails.create("tyron@google.com", "310-992", "+0498837412")); + allPlayerDetails.add(PlayerDetails.create("tyrell@google.com", "032-045", "+67834134")); + allPlayerDetails.add(PlayerDetails.create("nadja@google.com", "000-346", "+498723")); + allPlayerDetails.add(PlayerDetails.create("wendy@google.com", "994-989", "+987324454")); + allPlayerDetails.add(PlayerDetails.create("luke@google.com", "546-634", "+987642435")); + allPlayerDetails.add(PlayerDetails.create("bjorn@google.com", "342-874", "+7834325")); + allPlayerDetails.add(PlayerDetails.create("lisa@google.com", "024-653", "+980742154")); + allPlayerDetails.add(PlayerDetails.create("anton@google.com", "834-935", "+876423145")); + allPlayerDetails.add(PlayerDetails.create("bruce@google.com", "284-936", "+09843212345")); + allPlayerDetails.add(PlayerDetails.create("ray@google.com", "843-073", "+678324123")); + allPlayerDetails.add(PlayerDetails.create("ron@google.com", "637-738", "+09842354")); + allPlayerDetails.add(PlayerDetails.create("xavier@google.com", "143-947", "+375245")); + allPlayerDetails.add(PlayerDetails.create("harriet@google.com", "842-404", "+131243252")); + WireTransfersImpl wireTransfers = new WireTransfersImpl(); + Random random = new Random(); + for (int i = 0; i < allPlayerDetails.size(); i++) { + wireTransfers.setFunds(allPlayerDetails.get(i).getBankAccount(), + random.nextInt(LotteryConstants.PLAYER_MAX_SALDO)); + } } /** @@ -98,14 +106,12 @@ public class App { LotteryServiceImpl service = new LotteryServiceImpl(); submitTickets(service, 20); - int i = administartion.getAllSubmittedTickets().size(); - // perform lottery administartion.performLottery(); } private static void submitTickets(LotteryService lotteryService, int numTickets) { - for (int i=0; i accounts = new HashMap<>(); static { - accounts.put("123-123", 50000); + accounts.put(LotteryConstants.SERVICE_BANK_ACCOUNT, LotteryConstants.SERVICE_BANK_ACCOUNT_SALDO); } @Override diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryConstants.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryConstants.java new file mode 100644 index 000000000..fb4c8025f --- /dev/null +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryConstants.java @@ -0,0 +1,38 @@ +/** + * The MIT License + * Copyright (c) 2014 Ilkka Seppälä + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.iluwatar.hexagonal.domain; + +/** + * + * Lottery domain constants + * + */ +public class LotteryConstants { + + public static final int PRIZE_AMOUNT = 100000; + public static final String SERVICE_BANK_ACCOUNT = "123-123"; + public static final int TICKET_PRIZE = 3; + public static final int SERVICE_BANK_ACCOUNT_SALDO = 150000; + public static final int PLAYER_MAX_SALDO = 100; + +} diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketCheckResult.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketCheckResult.java index d36dd28b7..534dc685f 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketCheckResult.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/domain/LotteryTicketCheckResult.java @@ -29,7 +29,7 @@ package com.iluwatar.hexagonal.domain; */ public class LotteryTicketCheckResult { - public enum CheckResult {WIN_PRIZE, NO_PRIZE, TICKET_NOT_SUBMITTED}; + public enum CheckResult { WIN_PRIZE, NO_PRIZE, TICKET_NOT_SUBMITTED }; private final CheckResult checkResult; diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotifications.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotifications.java index c9917cb07..cc9f9d6e5 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotifications.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotifications.java @@ -32,7 +32,9 @@ import com.iluwatar.hexagonal.domain.PlayerDetails; public interface LotteryNotifications { void notifyTicketSubmitted(PlayerDetails details); + void notifyTicketSubmitError(PlayerDetails details); void notifyNoWin(PlayerDetails details); void notifyPrize(PlayerDetails details, int prizeAmount); + void notifyPrizeError(PlayerDetails details, int prizeAmount); } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotificationsImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotificationsImpl.java index c2e02ddbd..c59a47970 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotificationsImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/notifications/LotteryNotificationsImpl.java @@ -44,4 +44,18 @@ public class LotteryNotificationsImpl implements LotteryNotifications { .println(String.format("Lottery ticket for %s has won! The bank account %s was deposited with %d credits.", details.getEmail(), details.getBankAccount(), prizeAmount)); } + + @Override + public void notifyPrizeError(PlayerDetails details, int prizeAmount) { + System.out + .println(String.format("Lottery ticket for %s has won! Unfortunately the bank credit transfer of %d failed.", + details.getEmail(), prizeAmount)); + } + + @Override + public void notifyTicketSubmitError(PlayerDetails details) { + System.out.println( + String.format("Lottery ticket for %s could not be submitted because the credit transfer of 3 credits failed.", + details.getEmail())); + } } diff --git a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java index e595393df..d9a948597 100644 --- a/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java +++ b/hexagonal/src/main/java/com/iluwatar/hexagonal/service/LotteryServiceImpl.java @@ -28,6 +28,7 @@ import com.iluwatar.hexagonal.banking.WireTransfers; import com.iluwatar.hexagonal.banking.WireTransfersImpl; import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepositoryMock; +import com.iluwatar.hexagonal.domain.LotteryConstants; import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; @@ -43,10 +44,6 @@ import com.iluwatar.hexagonal.notifications.LotteryNotificationsImpl; */ public class LotteryServiceImpl implements LotteryService { - private static final String LOTTERY_SERVICE_BANK_ACCOUNT = "123-123"; - - private static final int TICKET_PRIZE = 3; - private final LotteryTicketRepository repository; private final WireTransfers bank = new WireTransfersImpl(); @@ -59,7 +56,12 @@ public class LotteryServiceImpl implements LotteryService { @Override public Optional submitTicket(LotteryTicket ticket) { - bank.transferFunds(TICKET_PRIZE, ticket.getPlayerDetails().getBankAccount(), LOTTERY_SERVICE_BANK_ACCOUNT); + boolean result = bank.transferFunds(LotteryConstants.TICKET_PRIZE, ticket.getPlayerDetails().getBankAccount(), + LotteryConstants.SERVICE_BANK_ACCOUNT); + if (result == false) { + notifications.notifyTicketSubmitError(ticket.getPlayerDetails()); + return Optional.empty(); + } Optional optional = repository.save(ticket); if (optional.isPresent()) { notifications.notifyTicketSubmitted(ticket.getPlayerDetails()); diff --git a/hexagonal/src/test/java/com/iluwatar/hexagonal/lottery/LotteryTest.java b/hexagonal/src/test/java/com/iluwatar/hexagonal/lottery/LotteryTest.java index 1da92023d..0c5bb5216 100644 --- a/hexagonal/src/test/java/com/iluwatar/hexagonal/lottery/LotteryTest.java +++ b/hexagonal/src/test/java/com/iluwatar/hexagonal/lottery/LotteryTest.java @@ -35,13 +35,15 @@ import org.junit.Test; import com.iluwatar.hexagonal.administration.LotteryAdministration; import com.iluwatar.hexagonal.administration.LotteryAdministrationImpl; +import com.iluwatar.hexagonal.banking.WireTransfers; +import com.iluwatar.hexagonal.banking.WireTransfersImpl; import com.iluwatar.hexagonal.database.LotteryTicketRepository; import com.iluwatar.hexagonal.database.LotteryTicketRepositoryMock; import com.iluwatar.hexagonal.domain.LotteryNumbers; import com.iluwatar.hexagonal.domain.LotteryTicket; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult; -import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult; +import com.iluwatar.hexagonal.domain.LotteryTicketId; import com.iluwatar.hexagonal.service.LotteryService; import com.iluwatar.hexagonal.service.LotteryServiceImpl; import com.iluwatar.hexagonal.test.LotteryTestUtils; @@ -56,6 +58,7 @@ public class LotteryTest { private final LotteryAdministration admin = new LotteryAdministrationImpl(); private final LotteryService service = new LotteryServiceImpl(); private final LotteryTicketRepository repository = new LotteryTicketRepositoryMock(); + private final WireTransfers wireTransfers = new WireTransfersImpl(); @Before public void clear() { @@ -65,6 +68,9 @@ public class LotteryTest { @Test public void testLottery() { + // setup bank account with funds + wireTransfers.setFunds("123-12312", 100); + // admin resets the lottery admin.resetLottery(); assertEquals(admin.getAllSubmittedTickets().size(), 0); @@ -74,10 +80,10 @@ public class LotteryTest { "123-12312", "+32425255", new HashSet<>(Arrays.asList(1, 2, 3, 4)))); assertTrue(ticket1.isPresent()); Optional ticket2 = service.submitTicket(LotteryTestUtils.createLotteryTicket("ant@bac.com", - "123-12345", "+32423455", new HashSet<>(Arrays.asList(11, 12, 13, 14)))); + "123-12312", "+32423455", new HashSet<>(Arrays.asList(11, 12, 13, 14)))); assertTrue(ticket2.isPresent()); Optional ticket3 = service.submitTicket(LotteryTestUtils.createLotteryTicket("arg@boo.com", - "123-12367", "+32421255", new HashSet<>(Arrays.asList(6, 8, 13, 19)))); + "123-12312", "+32421255", new HashSet<>(Arrays.asList(6, 8, 13, 19)))); assertTrue(ticket3.isPresent()); assertEquals(admin.getAllSubmittedTickets().size(), 3); @@ -86,7 +92,7 @@ public class LotteryTest { // cheat a bit for testing sake, use winning numbers to submit another ticket Optional ticket4 = service.submitTicket(LotteryTestUtils.createLotteryTicket("lucky@orb.com", - "123-12399", "+12421255", winningNumbers.getNumbers())); + "123-12312", "+12421255", winningNumbers.getNumbers())); assertTrue(ticket4.isPresent()); assertEquals(admin.getAllSubmittedTickets().size(), 4);