mirror of
https://github.com/tiennm99/java-design-patterns.git
synced 2026-05-16 14:59:21 +00:00
Java 11 migrate remaining (g,h,i) (#1116)
* Moves game-loop to Java 11 * Moves guarded-suspension to Java 11 * Moves half-sync-half-async to Java 11 * Moves hexagonal to Java 11 * Moves intercepting-filter to Java 11 * Moves interpreter to Java 11 * Moves iterator to Java 11
This commit is contained in:
committed by
Ilkka Seppälä
parent
7d0a5c0edb
commit
f835d3d516
@@ -24,7 +24,6 @@
|
||||
package com.iluwatar.hexagonal;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.iluwatar.hexagonal.domain.LotteryAdministration;
|
||||
import com.iluwatar.hexagonal.domain.LotteryService;
|
||||
import com.iluwatar.hexagonal.module.LotteryTestingModule;
|
||||
@@ -63,14 +62,14 @@ public class App {
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
|
||||
Injector injector = Guice.createInjector(new LotteryTestingModule());
|
||||
var injector = Guice.createInjector(new LotteryTestingModule());
|
||||
|
||||
// start new lottery round
|
||||
LotteryAdministration administration = injector.getInstance(LotteryAdministration.class);
|
||||
var administration = injector.getInstance(LotteryAdministration.class);
|
||||
administration.resetLottery();
|
||||
|
||||
// submit some lottery tickets
|
||||
LotteryService service = injector.getInstance(LotteryService.class);
|
||||
var service = injector.getInstance(LotteryService.class);
|
||||
SampleData.submitTickets(service, 20);
|
||||
|
||||
// perform lottery
|
||||
|
||||
+7
-9
@@ -24,7 +24,6 @@
|
||||
package com.iluwatar.hexagonal.administration;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.iluwatar.hexagonal.domain.LotteryAdministration;
|
||||
import com.iluwatar.hexagonal.domain.LotteryService;
|
||||
import com.iluwatar.hexagonal.module.LotteryModule;
|
||||
@@ -46,17 +45,16 @@ public class ConsoleAdministration {
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
MongoConnectionPropertiesLoader.load();
|
||||
Injector injector = Guice.createInjector(new LotteryModule());
|
||||
LotteryAdministration administration = injector.getInstance(LotteryAdministration.class);
|
||||
LotteryService service = injector.getInstance(LotteryService.class);
|
||||
var injector = Guice.createInjector(new LotteryModule());
|
||||
var administration = injector.getInstance(LotteryAdministration.class);
|
||||
var service = injector.getInstance(LotteryService.class);
|
||||
SampleData.submitTickets(service, 20);
|
||||
ConsoleAdministrationSrv consoleAdministration =
|
||||
new ConsoleAdministrationSrvImpl(administration, LOGGER);
|
||||
try (Scanner scanner = new Scanner(System.in)) {
|
||||
boolean exit = false;
|
||||
var consoleAdministration = new ConsoleAdministrationSrvImpl(administration, LOGGER);
|
||||
try (var scanner = new Scanner(System.in)) {
|
||||
var exit = false;
|
||||
while (!exit) {
|
||||
printMainMenu();
|
||||
String cmd = readString(scanner);
|
||||
var cmd = readString(scanner);
|
||||
if ("1".equals(cmd)) {
|
||||
consoleAdministration.getAllSubmittedTickets();
|
||||
} else if ("2".equals(cmd)) {
|
||||
|
||||
+1
-1
@@ -50,7 +50,7 @@ public class ConsoleAdministrationSrvImpl implements ConsoleAdministrationSrv {
|
||||
|
||||
@Override
|
||||
public void performLottery() {
|
||||
LotteryNumbers numbers = administration.performLottery();
|
||||
var numbers = administration.performLottery();
|
||||
logger.info("The winning numbers: {}", numbers.getNumbersAsString());
|
||||
logger.info("Time to reset the database for next round, eh?");
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@ import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import com.mongodb.client.model.UpdateOptions;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.bson.Document;
|
||||
|
||||
/**
|
||||
@@ -107,30 +106,31 @@ public class MongoBank implements WireTransfers {
|
||||
|
||||
@Override
|
||||
public void setFunds(String bankAccount, int amount) {
|
||||
Document search = new Document("_id", bankAccount);
|
||||
Document update = new Document("_id", bankAccount).append("funds", amount);
|
||||
accountsCollection
|
||||
.updateOne(search, new Document("$set", update), new UpdateOptions().upsert(true));
|
||||
var search = new Document("_id", bankAccount);
|
||||
var update = new Document("_id", bankAccount).append("funds", amount);
|
||||
var updateOptions = new UpdateOptions().upsert(true);
|
||||
accountsCollection.updateOne(search, new Document("$set", update), updateOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getFunds(String bankAccount) {
|
||||
Document search = new Document("_id", bankAccount);
|
||||
List<Document> results = accountsCollection.find(search).limit(1).into(new ArrayList<>());
|
||||
if (results.size() > 0) {
|
||||
return results.get(0).getInteger("funds");
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
return accountsCollection
|
||||
.find(new Document("_id", bankAccount))
|
||||
.limit(1)
|
||||
.into(new ArrayList<>())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(x -> x.getInteger("funds"))
|
||||
.orElse(0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean transferFunds(int amount, String sourceAccount, String destinationAccount) {
|
||||
int sourceFunds = getFunds(sourceAccount);
|
||||
var sourceFunds = getFunds(sourceAccount);
|
||||
if (sourceFunds < amount) {
|
||||
return false;
|
||||
} else {
|
||||
int destFunds = getFunds(destinationAccount);
|
||||
var destFunds = getFunds(destinationAccount);
|
||||
setFunds(sourceAccount, sourceFunds - amount);
|
||||
setFunds(destinationAccount, destFunds + amount);
|
||||
return true;
|
||||
|
||||
+2
-7
@@ -38,17 +38,12 @@ public class InMemoryTicketRepository implements LotteryTicketRepository {
|
||||
|
||||
@Override
|
||||
public Optional<LotteryTicket> findById(LotteryTicketId id) {
|
||||
LotteryTicket ticket = tickets.get(id);
|
||||
if (ticket == null) {
|
||||
return Optional.empty();
|
||||
} else {
|
||||
return Optional.of(ticket);
|
||||
}
|
||||
return Optional.ofNullable(tickets.get(id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<LotteryTicketId> save(LotteryTicket ticket) {
|
||||
LotteryTicketId id = new LotteryTicketId();
|
||||
var id = new LotteryTicketId();
|
||||
tickets.put(id, ticket);
|
||||
return Optional.of(id);
|
||||
}
|
||||
|
||||
+26
-30
@@ -32,11 +32,9 @@ import com.mongodb.client.MongoCollection;
|
||||
import com.mongodb.client.MongoDatabase;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import org.bson.Document;
|
||||
|
||||
@@ -95,7 +93,7 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
}
|
||||
|
||||
private void initCounters() {
|
||||
Document doc = new Document("_id", "ticketId").append("seq", 1);
|
||||
var doc = new Document("_id", "ticketId").append("seq", 1);
|
||||
countersCollection.insertOne(doc);
|
||||
}
|
||||
|
||||
@@ -105,10 +103,10 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
* @return next ticket id
|
||||
*/
|
||||
public int getNextId() {
|
||||
Document find = new Document("_id", "ticketId");
|
||||
Document increase = new Document("seq", 1);
|
||||
Document update = new Document("$inc", increase);
|
||||
Document result = countersCollection.findOneAndUpdate(find, update);
|
||||
var find = new Document("_id", "ticketId");
|
||||
var increase = new Document("seq", 1);
|
||||
var update = new Document("$inc", increase);
|
||||
var result = countersCollection.findOneAndUpdate(find, update);
|
||||
return result.getInteger("seq");
|
||||
}
|
||||
|
||||
@@ -132,20 +130,19 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
|
||||
@Override
|
||||
public Optional<LotteryTicket> findById(LotteryTicketId id) {
|
||||
Document find = new Document("ticketId", id.getId());
|
||||
List<Document> results = ticketsCollection.find(find).limit(1).into(new ArrayList<>());
|
||||
if (results.size() > 0) {
|
||||
LotteryTicket lotteryTicket = docToTicket(results.get(0));
|
||||
return Optional.of(lotteryTicket);
|
||||
} else {
|
||||
return Optional.empty();
|
||||
}
|
||||
return ticketsCollection
|
||||
.find(new Document("ticketId", id.getId()))
|
||||
.limit(1)
|
||||
.into(new ArrayList<>())
|
||||
.stream()
|
||||
.findFirst()
|
||||
.map(this::docToTicket);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<LotteryTicketId> save(LotteryTicket ticket) {
|
||||
int ticketId = getNextId();
|
||||
Document doc = new Document("ticketId", ticketId);
|
||||
var ticketId = getNextId();
|
||||
var doc = new Document("ticketId", ticketId);
|
||||
doc.put("email", ticket.getPlayerDetails().getEmail());
|
||||
doc.put("bank", ticket.getPlayerDetails().getBankAccount());
|
||||
doc.put("phone", ticket.getPlayerDetails().getPhoneNumber());
|
||||
@@ -156,13 +153,12 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
|
||||
@Override
|
||||
public Map<LotteryTicketId, LotteryTicket> findAll() {
|
||||
Map<LotteryTicketId, LotteryTicket> map = new HashMap<>();
|
||||
List<Document> docs = ticketsCollection.find(new Document()).into(new ArrayList<>());
|
||||
for (Document doc : docs) {
|
||||
LotteryTicket lotteryTicket = docToTicket(doc);
|
||||
map.put(lotteryTicket.getId(), lotteryTicket);
|
||||
}
|
||||
return map;
|
||||
return ticketsCollection
|
||||
.find(new Document())
|
||||
.into(new ArrayList<>())
|
||||
.stream()
|
||||
.map(this::docToTicket)
|
||||
.collect(Collectors.toMap(LotteryTicket::getId, Function.identity()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -171,13 +167,13 @@ public class MongoTicketRepository implements LotteryTicketRepository {
|
||||
}
|
||||
|
||||
private LotteryTicket docToTicket(Document doc) {
|
||||
PlayerDetails playerDetails = new PlayerDetails(doc.getString("email"), doc.getString("bank"),
|
||||
var playerDetails = new PlayerDetails(doc.getString("email"), doc.getString("bank"),
|
||||
doc.getString("phone"));
|
||||
Set<Integer> numbers = Arrays.stream(doc.getString("numbers").split(","))
|
||||
var numbers = Arrays.stream(doc.getString("numbers").split(","))
|
||||
.map(Integer::parseInt)
|
||||
.collect(Collectors.toSet());
|
||||
LotteryNumbers lotteryNumbers = LotteryNumbers.create(numbers);
|
||||
return new LotteryTicket(new LotteryTicketId(doc
|
||||
.getInteger("ticketId")), playerDetails, lotteryNumbers);
|
||||
var lotteryNumbers = LotteryNumbers.create(numbers);
|
||||
var ticketId = new LotteryTicketId(doc.getInteger("ticketId"));
|
||||
return new LotteryTicket(ticketId, playerDetails, lotteryNumbers);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import static com.iluwatar.hexagonal.domain.LotteryConstants.PRIZE_AMOUNT;
|
||||
import static com.iluwatar.hexagonal.domain.LotteryConstants.SERVICE_BANK_ACCOUNT;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.iluwatar.hexagonal.banking.WireTransfers;
|
||||
import com.iluwatar.hexagonal.database.LotteryTicketRepository;
|
||||
@@ -60,23 +63,21 @@ public class LotteryAdministration {
|
||||
* Draw lottery numbers.
|
||||
*/
|
||||
public LotteryNumbers performLottery() {
|
||||
LotteryNumbers numbers = LotteryNumbers.createRandom();
|
||||
Map<LotteryTicketId, LotteryTicket> tickets = getAllSubmittedTickets();
|
||||
for (LotteryTicketId id : tickets.keySet()) {
|
||||
LotteryTicketCheckResult result = LotteryUtils.checkTicketForPrize(repository, id, numbers);
|
||||
if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) {
|
||||
boolean transferred = wireTransfers.transferFunds(LotteryConstants.PRIZE_AMOUNT,
|
||||
LotteryConstants.SERVICE_BANK_ACCOUNT, tickets.get(id).getPlayerDetails()
|
||||
.getBankAccount());
|
||||
if (transferred) {
|
||||
notifications
|
||||
.ticketWon(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT);
|
||||
var numbers = LotteryNumbers.createRandom();
|
||||
var tickets = getAllSubmittedTickets();
|
||||
for (var id : tickets.keySet()) {
|
||||
var lotteryTicket = tickets.get(id);
|
||||
var playerDetails = lotteryTicket.getPlayerDetails();
|
||||
var playerAccount = playerDetails.getBankAccount();
|
||||
var result = LotteryUtils.checkTicketForPrize(repository, id, numbers).getResult();
|
||||
if (result == LotteryTicketCheckResult.CheckResult.WIN_PRIZE) {
|
||||
if (wireTransfers.transferFunds(PRIZE_AMOUNT, SERVICE_BANK_ACCOUNT, playerAccount)) {
|
||||
notifications.ticketWon(playerDetails, PRIZE_AMOUNT);
|
||||
} else {
|
||||
notifications
|
||||
.prizeError(tickets.get(id).getPlayerDetails(), LotteryConstants.PRIZE_AMOUNT);
|
||||
notifications.prizeError(playerDetails, PRIZE_AMOUNT);
|
||||
}
|
||||
} else if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.NO_PRIZE)) {
|
||||
notifications.ticketDidNotWin(tickets.get(id).getPlayerDetails());
|
||||
} else if (result == LotteryTicketCheckResult.CheckResult.NO_PRIZE) {
|
||||
notifications.ticketDidNotWin(playerDetails);
|
||||
}
|
||||
}
|
||||
return numbers;
|
||||
|
||||
@@ -99,9 +99,9 @@ public class LotteryNumbers {
|
||||
*/
|
||||
private void generateRandomNumbers() {
|
||||
numbers.clear();
|
||||
RandomNumberGenerator generator = new RandomNumberGenerator(MIN_NUMBER, MAX_NUMBER);
|
||||
var generator = new RandomNumberGenerator(MIN_NUMBER, MAX_NUMBER);
|
||||
while (numbers.size() < NUM_NUMBERS) {
|
||||
int num = generator.nextInt();
|
||||
var num = generator.nextInt();
|
||||
numbers.add(num);
|
||||
}
|
||||
}
|
||||
@@ -141,8 +141,8 @@ public class LotteryNumbers {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
final var prime = 31;
|
||||
var result = 1;
|
||||
result = prime * result + ((numbers == null) ? 0 : numbers.hashCode());
|
||||
return result;
|
||||
}
|
||||
@@ -158,14 +158,11 @@ public class LotteryNumbers {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
LotteryNumbers other = (LotteryNumbers) obj;
|
||||
var other = (LotteryNumbers) obj;
|
||||
if (numbers == null) {
|
||||
if (other.numbers != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!numbers.equals(other.numbers)) {
|
||||
return false;
|
||||
return other.numbers == null;
|
||||
} else {
|
||||
return numbers.equals(other.numbers);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,9 @@
|
||||
|
||||
package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import static com.iluwatar.hexagonal.domain.LotteryConstants.SERVICE_BANK_ACCOUNT;
|
||||
import static com.iluwatar.hexagonal.domain.LotteryConstants.TICKET_PRIZE;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.iluwatar.hexagonal.banking.WireTransfers;
|
||||
import com.iluwatar.hexagonal.database.LotteryTicketRepository;
|
||||
@@ -53,15 +56,16 @@ public class LotteryService {
|
||||
* Submit lottery ticket to participate in the lottery.
|
||||
*/
|
||||
public Optional<LotteryTicketId> submitTicket(LotteryTicket ticket) {
|
||||
boolean result = wireTransfers.transferFunds(LotteryConstants.TICKET_PRIZE,
|
||||
ticket.getPlayerDetails().getBankAccount(), LotteryConstants.SERVICE_BANK_ACCOUNT);
|
||||
var playerDetails = ticket.getPlayerDetails();
|
||||
var playerAccount = playerDetails.getBankAccount();
|
||||
var result = wireTransfers.transferFunds(TICKET_PRIZE, playerAccount, SERVICE_BANK_ACCOUNT);
|
||||
if (!result) {
|
||||
notifications.ticketSubmitError(ticket.getPlayerDetails());
|
||||
notifications.ticketSubmitError(playerDetails);
|
||||
return Optional.empty();
|
||||
}
|
||||
Optional<LotteryTicketId> optional = repository.save(ticket);
|
||||
var optional = repository.save(ticket);
|
||||
if (optional.isPresent()) {
|
||||
notifications.ticketSubmitted(ticket.getPlayerDetails());
|
||||
notifications.ticketSubmitted(playerDetails);
|
||||
}
|
||||
return optional;
|
||||
}
|
||||
|
||||
@@ -82,8 +82,8 @@ public class LotteryTicket {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
final var prime = 31;
|
||||
var result = 1;
|
||||
result = prime * result + ((lotteryNumbers == null) ? 0 : lotteryNumbers.hashCode());
|
||||
result = prime * result + ((playerDetails == null) ? 0 : playerDetails.hashCode());
|
||||
return result;
|
||||
@@ -100,7 +100,7 @@ public class LotteryTicket {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
LotteryTicket other = (LotteryTicket) obj;
|
||||
var other = (LotteryTicket) obj;
|
||||
if (lotteryNumbers == null) {
|
||||
if (other.lotteryNumbers != null) {
|
||||
return false;
|
||||
@@ -109,12 +109,9 @@ public class LotteryTicket {
|
||||
return false;
|
||||
}
|
||||
if (playerDetails == null) {
|
||||
if (other.playerDetails != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!playerDetails.equals(other.playerDetails)) {
|
||||
return false;
|
||||
return other.playerDetails == null;
|
||||
} else {
|
||||
return playerDetails.equals(other.playerDetails);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,8 +76,8 @@ public class LotteryTicketCheckResult {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
final var prime = 31;
|
||||
var result = 1;
|
||||
result = prime * result + ((checkResult == null) ? 0 : checkResult.hashCode());
|
||||
result = prime * result + prizeAmount;
|
||||
return result;
|
||||
@@ -94,7 +94,7 @@ public class LotteryTicketCheckResult {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
LotteryTicketCheckResult other = (LotteryTicketCheckResult) obj;
|
||||
var other = (LotteryTicketCheckResult) obj;
|
||||
return checkResult == other.checkResult && prizeAmount == other.prizeAmount;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,10 +59,9 @@ public class LotteryTicketId {
|
||||
return false;
|
||||
}
|
||||
|
||||
LotteryTicketId that = (LotteryTicketId) o;
|
||||
var that = (LotteryTicketId) o;
|
||||
|
||||
return id == that.id;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -25,7 +25,6 @@ package com.iluwatar.hexagonal.domain;
|
||||
|
||||
import com.iluwatar.hexagonal.database.LotteryTicketRepository;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult.CheckResult;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* Lottery utilities.
|
||||
@@ -43,7 +42,7 @@ public class LotteryUtils {
|
||||
LotteryTicketId id,
|
||||
LotteryNumbers winningNumbers
|
||||
) {
|
||||
Optional<LotteryTicket> optional = repository.findById(id);
|
||||
var optional = repository.findById(id);
|
||||
if (optional.isPresent()) {
|
||||
if (optional.get().getNumbers().equals(winningNumbers)) {
|
||||
return new LotteryTicketCheckResult(CheckResult.WIN_PRIZE, 1000);
|
||||
|
||||
@@ -77,8 +77,8 @@ public class PlayerDetails {
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = 1;
|
||||
final var prime = 31;
|
||||
var result = 1;
|
||||
result = prime * result + ((bankAccountNumber == null) ? 0 : bankAccountNumber.hashCode());
|
||||
result = prime * result + ((emailAddress == null) ? 0 : emailAddress.hashCode());
|
||||
result = prime * result + ((phoneNumber == null) ? 0 : phoneNumber.hashCode());
|
||||
@@ -96,7 +96,7 @@ public class PlayerDetails {
|
||||
if (getClass() != obj.getClass()) {
|
||||
return false;
|
||||
}
|
||||
PlayerDetails other = (PlayerDetails) obj;
|
||||
var other = (PlayerDetails) obj;
|
||||
if (bankAccountNumber == null) {
|
||||
if (other.bankAccountNumber != null) {
|
||||
return false;
|
||||
@@ -112,12 +112,9 @@ public class PlayerDetails {
|
||||
return false;
|
||||
}
|
||||
if (phoneNumber == null) {
|
||||
if (other.phoneNumber != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!phoneNumber.equals(other.phoneNumber)) {
|
||||
return false;
|
||||
return other.phoneNumber == null;
|
||||
} else {
|
||||
return phoneNumber.equals(other.phoneNumber);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketSubmitted(PlayerDetails details) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document
|
||||
@@ -118,7 +118,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketSubmitError(PlayerDetails details) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document.put("message", "Lottery ticket could not be submitted because lack of funds.");
|
||||
@@ -128,7 +128,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketDidNotWin(PlayerDetails details) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document.put("message", "Lottery ticket was checked and unfortunately did not win this time.");
|
||||
@@ -138,7 +138,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketWon(PlayerDetails details, int prizeAmount) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document.put("message", String
|
||||
@@ -150,7 +150,7 @@ public class MongoEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void prizeError(PlayerDetails details, int prizeAmount) {
|
||||
Document document = new Document("email", details.getEmail());
|
||||
var document = new Document("email", details.getEmail());
|
||||
document.put("phone", details.getPhoneNumber());
|
||||
document.put("bank", details.getBankAccount());
|
||||
document.put("message", String
|
||||
|
||||
@@ -42,9 +42,8 @@ public class StdOutEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void ticketDidNotWin(PlayerDetails details) {
|
||||
LOGGER
|
||||
.info("Lottery ticket for {} was checked and unfortunately did not win this time.", details
|
||||
.getEmail());
|
||||
LOGGER.info("Lottery ticket for {} was checked and unfortunately did not win this time.",
|
||||
details.getEmail());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -55,9 +54,8 @@ public class StdOutEventLog implements LotteryEventLog {
|
||||
|
||||
@Override
|
||||
public void prizeError(PlayerDetails details, int prizeAmount) {
|
||||
LOGGER
|
||||
.error("Lottery ticket for {} has won! Unfortunately the bank credit transfer of"
|
||||
+ " {} failed.", details.getEmail(), prizeAmount);
|
||||
LOGGER.error("Lottery ticket for {} has won! Unfortunately the bank credit transfer of"
|
||||
+ " {} failed.", details.getEmail(), prizeAmount);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-5
@@ -38,12 +38,12 @@ public class MongoConnectionPropertiesLoader {
|
||||
* Try to load connection properties from file. Fall back to default connection properties.
|
||||
*/
|
||||
public static void load() {
|
||||
String host = DEFAULT_HOST;
|
||||
int port = DEFAULT_PORT;
|
||||
String path = System.getProperty("hexagonal.properties.path");
|
||||
Properties properties = new Properties();
|
||||
var host = DEFAULT_HOST;
|
||||
var port = DEFAULT_PORT;
|
||||
var path = System.getProperty("hexagonal.properties.path");
|
||||
var properties = new Properties();
|
||||
if (path != null) {
|
||||
try (FileInputStream fin = new FileInputStream(path)) {
|
||||
try (var fin = new FileInputStream(path)) {
|
||||
properties.load(fin);
|
||||
host = properties.getProperty("mongo-host");
|
||||
port = Integer.parseInt(properties.getProperty("mongo-port"));
|
||||
|
||||
@@ -30,8 +30,10 @@ import com.iluwatar.hexagonal.domain.LotteryService;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicket;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketId;
|
||||
import com.iluwatar.hexagonal.domain.PlayerDetails;
|
||||
import java.util.AbstractMap.SimpleEntry;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Utilities for creating sample lottery tickets.
|
||||
@@ -83,26 +85,28 @@ public class SampleData {
|
||||
new PlayerDetails("xavier@google.com", "143-947", "+375245"),
|
||||
new PlayerDetails("harriet@google.com", "842-404", "+131243252")
|
||||
);
|
||||
InMemoryBank wireTransfers = new InMemoryBank();
|
||||
for (PlayerDetails player : PLAYERS) {
|
||||
wireTransfers.setFunds(player.getBankAccount(),
|
||||
RANDOM.nextInt(LotteryConstants.PLAYER_MAX_BALANCE));
|
||||
}
|
||||
var wireTransfers = new InMemoryBank();
|
||||
PLAYERS.stream()
|
||||
.map(PlayerDetails::getBankAccount)
|
||||
.map(e -> new SimpleEntry<>(e, RANDOM.nextInt(LotteryConstants.PLAYER_MAX_BALANCE)))
|
||||
.collect(Collectors.toMap(SimpleEntry::getKey, SimpleEntry::getValue))
|
||||
.forEach(wireTransfers::setFunds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts lottery tickets into the database based on the sample data.
|
||||
*/
|
||||
public static void submitTickets(LotteryService lotteryService, int numTickets) {
|
||||
for (int i = 0; i < numTickets; i++) {
|
||||
LotteryTicket ticket = new LotteryTicket(new LotteryTicketId(),
|
||||
getRandomPlayerDetails(), LotteryNumbers.createRandom());
|
||||
for (var i = 0; i < numTickets; i++) {
|
||||
var randomPlayerDetails = getRandomPlayerDetails();
|
||||
var lotteryNumbers = LotteryNumbers.createRandom();
|
||||
var lotteryTicketId = new LotteryTicketId();
|
||||
var ticket = new LotteryTicket(lotteryTicketId, randomPlayerDetails, lotteryNumbers);
|
||||
lotteryService.submitTicket(ticket);
|
||||
}
|
||||
}
|
||||
|
||||
private static PlayerDetails getRandomPlayerDetails() {
|
||||
int idx = RANDOM.nextInt(PLAYERS.size());
|
||||
return PLAYERS.get(idx);
|
||||
return PLAYERS.get(RANDOM.nextInt(PLAYERS.size()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
package com.iluwatar.hexagonal.service;
|
||||
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.iluwatar.hexagonal.banking.WireTransfers;
|
||||
import com.iluwatar.hexagonal.domain.LotteryService;
|
||||
import com.iluwatar.hexagonal.module.LotteryModule;
|
||||
@@ -45,15 +44,15 @@ public class ConsoleLottery {
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
MongoConnectionPropertiesLoader.load();
|
||||
Injector injector = Guice.createInjector(new LotteryModule());
|
||||
LotteryService service = injector.getInstance(LotteryService.class);
|
||||
WireTransfers bank = injector.getInstance(WireTransfers.class);
|
||||
var injector = Guice.createInjector(new LotteryModule());
|
||||
var service = injector.getInstance(LotteryService.class);
|
||||
var bank = injector.getInstance(WireTransfers.class);
|
||||
try (Scanner scanner = new Scanner(System.in)) {
|
||||
boolean exit = false;
|
||||
var exit = false;
|
||||
while (!exit) {
|
||||
printMainMenu();
|
||||
String cmd = readString(scanner);
|
||||
LotteryConsoleService lotteryConsoleService = new LotteryConsoleServiceImpl(LOGGER);
|
||||
var cmd = readString(scanner);
|
||||
var lotteryConsoleService = new LotteryConsoleServiceImpl(LOGGER);
|
||||
if ("1".equals(cmd)) {
|
||||
lotteryConsoleService.queryLotteryAccountFunds(bank, scanner);
|
||||
} else if ("2".equals(cmd)) {
|
||||
|
||||
+26
-33
@@ -31,10 +31,7 @@ import com.iluwatar.hexagonal.domain.LotteryTicketCheckResult;
|
||||
import com.iluwatar.hexagonal.domain.LotteryTicketId;
|
||||
import com.iluwatar.hexagonal.domain.PlayerDetails;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.Scanner;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
@@ -55,20 +52,18 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
|
||||
@Override
|
||||
public void checkTicket(LotteryService service, Scanner scanner) {
|
||||
logger.info("What is the ID of the lottery ticket?");
|
||||
String id = readString(scanner);
|
||||
var id = readString(scanner);
|
||||
logger.info("Give the 4 comma separated winning numbers?");
|
||||
String numbers = readString(scanner);
|
||||
var numbers = readString(scanner);
|
||||
try {
|
||||
String[] parts = numbers.split(",");
|
||||
Set<Integer> winningNumbers = new HashSet<>();
|
||||
for (int i = 0; i < 4; i++) {
|
||||
winningNumbers.add(Integer.parseInt(parts[i]));
|
||||
}
|
||||
var winningNumbers = Arrays.stream(numbers.split(","))
|
||||
.map(Integer::parseInt)
|
||||
.limit(4)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
final LotteryTicketId lotteryTicketId = new LotteryTicketId(Integer.parseInt(id));
|
||||
final LotteryNumbers lotteryNumbers = LotteryNumbers.create(winningNumbers);
|
||||
LotteryTicketCheckResult result =
|
||||
service.checkTicketForPrize(lotteryTicketId, lotteryNumbers);
|
||||
final var lotteryTicketId = new LotteryTicketId(Integer.parseInt(id));
|
||||
final var lotteryNumbers = LotteryNumbers.create(winningNumbers);
|
||||
var result = service.checkTicketForPrize(lotteryTicketId, lotteryNumbers);
|
||||
|
||||
if (result.getResult().equals(LotteryTicketCheckResult.CheckResult.WIN_PRIZE)) {
|
||||
logger.info("Congratulations! The lottery ticket has won!");
|
||||
@@ -85,26 +80,24 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
|
||||
@Override
|
||||
public void submitTicket(LotteryService service, Scanner scanner) {
|
||||
logger.info("What is your email address?");
|
||||
String email = readString(scanner);
|
||||
var email = readString(scanner);
|
||||
logger.info("What is your bank account number?");
|
||||
String account = readString(scanner);
|
||||
var account = readString(scanner);
|
||||
logger.info("What is your phone number?");
|
||||
String phone = readString(scanner);
|
||||
PlayerDetails details = new PlayerDetails(email, account, phone);
|
||||
var phone = readString(scanner);
|
||||
var details = new PlayerDetails(email, account, phone);
|
||||
logger.info("Give 4 comma separated lottery numbers?");
|
||||
String numbers = readString(scanner);
|
||||
var numbers = readString(scanner);
|
||||
try {
|
||||
String[] parts = numbers.split(",");
|
||||
Set<Integer> chosen = Arrays.stream(parts).map(Integer::parseInt).collect(Collectors.toSet());
|
||||
LotteryNumbers lotteryNumbers = LotteryNumbers.create(chosen);
|
||||
LotteryTicket lotteryTicket =
|
||||
new LotteryTicket(new LotteryTicketId(), details, lotteryNumbers);
|
||||
Optional<LotteryTicketId> id = service.submitTicket(lotteryTicket);
|
||||
if (id.isPresent()) {
|
||||
logger.info("Submitted lottery ticket with id: {}", id.get());
|
||||
} else {
|
||||
logger.info("Failed submitting lottery ticket - please try again.");
|
||||
}
|
||||
var chosen = Arrays.stream(numbers.split(","))
|
||||
.map(Integer::parseInt)
|
||||
.collect(Collectors.toSet());
|
||||
var lotteryNumbers = LotteryNumbers.create(chosen);
|
||||
var lotteryTicket = new LotteryTicket(new LotteryTicketId(), details, lotteryNumbers);
|
||||
service.submitTicket(lotteryTicket).ifPresentOrElse(
|
||||
(id) -> logger.info("Submitted lottery ticket with id: {}", id),
|
||||
() -> logger.info("Failed submitting lottery ticket - please try again.")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
logger.info("Failed submitting lottery ticket - please try again.");
|
||||
}
|
||||
@@ -113,9 +106,9 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
|
||||
@Override
|
||||
public void addFundsToLotteryAccount(WireTransfers bank, Scanner scanner) {
|
||||
logger.info("What is the account number?");
|
||||
String account = readString(scanner);
|
||||
var account = readString(scanner);
|
||||
logger.info("How many credits do you want to deposit?");
|
||||
String amount = readString(scanner);
|
||||
var amount = readString(scanner);
|
||||
bank.setFunds(account, Integer.parseInt(amount));
|
||||
logger.info("The account {} now has {} credits.", account, bank.getFunds(account));
|
||||
}
|
||||
@@ -123,7 +116,7 @@ public class LotteryConsoleServiceImpl implements LotteryConsoleService {
|
||||
@Override
|
||||
public void queryLotteryAccountFunds(WireTransfers bank, Scanner scanner) {
|
||||
logger.info("What is the account number?");
|
||||
String account = readString(scanner);
|
||||
var account = readString(scanner);
|
||||
logger.info("The account {} has {} credits.", account, bank.getFunds(account));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user