From 98ebc2b0f6fdde1f7502a35ebe067fb95e5ee336 Mon Sep 17 00:00:00 2001 From: Kostya Date: Fri, 14 Aug 2026 11:02:33 +0000 Subject: Wire buyShares and menu commands, replace factory interfaces with DI Implement LocalGuessMarketContext.buyShares/loadEvents via a new TradingOperation and Loader, backed by in-memory repositories. Replace the ConsoleInputProviderFactory/ConsoleOutputProviderFactory pattern with picocontainer-injected providers, and drive the menu from a list of MenuCommand implementations instead of a hardcoded printout. --- .../guess/service/LocalGuessMarketContext.java | 28 ++++++++++++++++++---- .../market/guess/service/TradingOperation.java | 13 ++++++++++ .../market/guess/service/TradingOperationImpl.java | 22 +++++++++++++++++ .../java/market/guess/service/domain/Event.java | 7 ++++++ .../market/guess/service/domain/Settlement.java | 6 +++++ .../service/infrastructure/provider/XMLLoader.java | 13 ++++++++++ .../repository/InMemoryEventRepository.java | 19 +++++++++++++++ .../service/repository/InMemoryUserRepository.java | 13 ++++++++++ 8 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 service/src/main/java/market/guess/service/TradingOperation.java create mode 100644 service/src/main/java/market/guess/service/TradingOperationImpl.java create mode 100644 service/src/main/java/market/guess/service/domain/Settlement.java create mode 100644 service/src/main/java/market/guess/service/infrastructure/provider/XMLLoader.java create mode 100644 service/src/main/java/market/guess/service/repository/InMemoryEventRepository.java create mode 100644 service/src/main/java/market/guess/service/repository/InMemoryUserRepository.java (limited to 'service/src/main/java/market/guess') diff --git a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java index 67e263f..16ee1b8 100644 --- a/service/src/main/java/market/guess/service/LocalGuessMarketContext.java +++ b/service/src/main/java/market/guess/service/LocalGuessMarketContext.java @@ -10,19 +10,33 @@ import market.guess.api.LoadResultDTO; import market.guess.api.PurchaseReceiptDTO; import market.guess.exception.GuessMarketException; import market.guess.service.domain.Event; +import market.guess.service.infrastructure.provider.Loader; import market.guess.service.repository.EventRepository; +import market.guess.service.repository.UserRepository; public final class LocalGuessMarketContext implements GuessMarketContext { private final EventRepository eventRepository; + private final UserRepository userRepository; - public LocalGuessMarketContext(EventRepository eventRepository) { + private final TradingOperation tradingOperation; + + private final Loader provider; + + public LocalGuessMarketContext( + Loader provider, + EventRepository eventRepository, + UserRepository userRepository, + TradingOperation tradingOperation) { super(); + this.provider = provider; this.eventRepository = eventRepository; + this.userRepository = userRepository; + this.tradingOperation = tradingOperation; } @Override public LoadResultDTO loadEvents(Path path) { - throw new UnsupportedOperationException("Unimplemented method 'loadEvents'"); + return provider.load(path); } @Override @@ -42,15 +56,19 @@ public final class LocalGuessMarketContext implements GuessMarketContext { @Override public PurchaseReceiptDTO buyShares( - String userName, String eventKey, String optionKey, long quantity) + String userName, String eventKey, String optionKey, int quantity) throws GuessMarketException { - throw new UnsupportedOperationException("Unimplemented method 'buyShares'"); + var event = eventRepository.getEvent(eventKey); + var option = event.getOption(optionKey); + var user = userRepository.getUser(userName); + var trade = tradingOperation.buy(event, user, option, quantity); + return new PurchaseReceiptDTO(); } @Override public EventDetailDTO closeEvent(String userName, String eventKey, String winningOptionKey) throws GuessMarketException { - throw new UnsupportedOperationException("Unimplemented method 'closeEvent'"); + throw new UnsupportedOperationException("Unimplemented method 'account'"); } @Override diff --git a/service/src/main/java/market/guess/service/TradingOperation.java b/service/src/main/java/market/guess/service/TradingOperation.java new file mode 100644 index 0000000..c8153c2 --- /dev/null +++ b/service/src/main/java/market/guess/service/TradingOperation.java @@ -0,0 +1,13 @@ +package market.guess.service; + +import market.guess.service.domain.Event; +import market.guess.service.domain.Option; +import market.guess.service.domain.Settlement; +import market.guess.service.domain.Trade; +import market.guess.service.domain.User; + +public interface TradingOperation { + Trade buy(Event event, User user, Option Option, int quantity); + + Settlement settle(Event event, String winningOption); +} diff --git a/service/src/main/java/market/guess/service/TradingOperationImpl.java b/service/src/main/java/market/guess/service/TradingOperationImpl.java new file mode 100644 index 0000000..f6c9aa1 --- /dev/null +++ b/service/src/main/java/market/guess/service/TradingOperationImpl.java @@ -0,0 +1,22 @@ +package market.guess.service; + +import market.guess.service.domain.Event; +import market.guess.service.domain.Option; +import market.guess.service.domain.Settlement; +import market.guess.service.domain.Trade; +import market.guess.service.domain.User; + +public final class TradingOperationImpl implements TradingOperation { + + @Override + public Trade buy(Event event, User user, Option Option, int quantity) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'buy'"); + } + + @Override + public Settlement settle(Event event, String winningOption) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'settle'"); + } +} diff --git a/service/src/main/java/market/guess/service/domain/Event.java b/service/src/main/java/market/guess/service/domain/Event.java index 2d7ac39..cef0840 100644 --- a/service/src/main/java/market/guess/service/domain/Event.java +++ b/service/src/main/java/market/guess/service/domain/Event.java @@ -165,4 +165,11 @@ public final class Event { getOptionsNames(), account.getBalance().toPlainString()); } + + public Option getOption(String optionKey) { + return options.stream() + .filter(option -> option.getKey().equalsIgnoreCase(optionKey)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("No such option.")); + } } diff --git a/service/src/main/java/market/guess/service/domain/Settlement.java b/service/src/main/java/market/guess/service/domain/Settlement.java new file mode 100644 index 0000000..cfc61f5 --- /dev/null +++ b/service/src/main/java/market/guess/service/domain/Settlement.java @@ -0,0 +1,6 @@ +package market.guess.service.domain; + +import java.math.BigDecimal; + +public record Settlement( + String winningOption, BigDecimal commission, BigDecimal paidOutToHolders) {} diff --git a/service/src/main/java/market/guess/service/infrastructure/provider/XMLLoader.java b/service/src/main/java/market/guess/service/infrastructure/provider/XMLLoader.java new file mode 100644 index 0000000..443cd87 --- /dev/null +++ b/service/src/main/java/market/guess/service/infrastructure/provider/XMLLoader.java @@ -0,0 +1,13 @@ +package market.guess.service.infrastructure.provider; + +import java.nio.file.Path; +import market.guess.api.LoadResultDTO; + +public final class XMLLoader implements Loader { + + @Override + public LoadResultDTO load(Path path) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'load'"); + } +} diff --git a/service/src/main/java/market/guess/service/repository/InMemoryEventRepository.java b/service/src/main/java/market/guess/service/repository/InMemoryEventRepository.java new file mode 100644 index 0000000..dad1055 --- /dev/null +++ b/service/src/main/java/market/guess/service/repository/InMemoryEventRepository.java @@ -0,0 +1,19 @@ +package market.guess.service.repository; + +import java.util.List; +import market.guess.service.domain.Event; + +public final class InMemoryEventRepository implements EventRepository { + + @Override + public Event getEvent(String id) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getEvent'"); + } + + @Override + public List getAllEvents() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getAllEvents'"); + } +} diff --git a/service/src/main/java/market/guess/service/repository/InMemoryUserRepository.java b/service/src/main/java/market/guess/service/repository/InMemoryUserRepository.java new file mode 100644 index 0000000..e71c94c --- /dev/null +++ b/service/src/main/java/market/guess/service/repository/InMemoryUserRepository.java @@ -0,0 +1,13 @@ +package market.guess.service.repository; + + +import market.guess.service.domain.User; + +public final class InMemoryUserRepository implements UserRepository { + + @Override + public User getUser(String name) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'getUser'"); + } +} -- cgit v1.2.3