From 9dd3ec7ff11839503e4d5ef6639d0faa21403095 Mon Sep 17 00:00:00 2001 From: Kostya Date: Thu, 13 Aug 2026 15:39:56 +0000 Subject: Move I/O provider abstraction to ui-console, add ledger/account/problem DTOs InputProvider/OutputProvider were api-layer types only ever implemented by the console UI; relocate them there. Drop the unused GuessMarketEngine/LocalGuessMarketService pair, flesh out LoadResultDTO with success/failure variants, and make LocalGuessMarketContext.LoadAsync report real outcomes instead of an empty placeholder. --- api/src/main/java/market/guess/InputProvider.java | 5 ----- .../main/java/market/guess/InputProviderFactory.java | 5 ----- api/src/main/java/market/guess/OutputProvider.java | 7 ------- .../java/market/guess/OutputProviderFactory.java | 5 ----- api/src/main/java/market/guess/api/AccountDTO.java | 6 ++++++ .../java/market/guess/api/GuessMarketContext.java | 3 +-- .../java/market/guess/api/GuessMarketEngine.java | 7 ------- .../main/java/market/guess/api/LedgerEntryDTO.java | 4 ++++ api/src/main/java/market/guess/api/LedgerType.java | 10 ++++++++++ .../main/java/market/guess/api/LoadResultDTO.java | 14 +++++++++++++- api/src/main/java/market/guess/api/ProblemDTO.java | 3 +++ .../market/guess/engine/LocalGuessMarketService.java | 20 -------------------- .../engine/provider/LocalGuessMarketContext.java | 11 ++++++----- .../guess/ui/console/ConsoleInputProvider.java | 1 - .../ui/console/ConsoleInputProviderFactory.java | 3 --- .../guess/ui/console/ConsoleOutputProvider.java | 2 -- .../ui/console/ConsoleOutputProviderFactory.java | 3 --- .../java/market/guess/ui/console/InputProvider.java | 5 +++++ .../guess/ui/console/InputProviderFactory.java | 5 +++++ .../src/main/java/market/guess/ui/console/Menu.java | 2 -- .../java/market/guess/ui/console/OutputProvider.java | 7 +++++++ .../guess/ui/console/OutputProviderFactory.java | 5 +++++ 22 files changed, 65 insertions(+), 68 deletions(-) delete mode 100644 api/src/main/java/market/guess/InputProvider.java delete mode 100644 api/src/main/java/market/guess/InputProviderFactory.java delete mode 100644 api/src/main/java/market/guess/OutputProvider.java delete mode 100644 api/src/main/java/market/guess/OutputProviderFactory.java create mode 100644 api/src/main/java/market/guess/api/AccountDTO.java delete mode 100644 api/src/main/java/market/guess/api/GuessMarketEngine.java create mode 100644 api/src/main/java/market/guess/api/LedgerEntryDTO.java create mode 100644 api/src/main/java/market/guess/api/LedgerType.java create mode 100644 api/src/main/java/market/guess/api/ProblemDTO.java delete mode 100644 engine/src/main/java/market/guess/engine/LocalGuessMarketService.java create mode 100644 ui-console/src/main/java/market/guess/ui/console/InputProvider.java create mode 100644 ui-console/src/main/java/market/guess/ui/console/InputProviderFactory.java create mode 100644 ui-console/src/main/java/market/guess/ui/console/OutputProvider.java create mode 100644 ui-console/src/main/java/market/guess/ui/console/OutputProviderFactory.java diff --git a/api/src/main/java/market/guess/InputProvider.java b/api/src/main/java/market/guess/InputProvider.java deleted file mode 100644 index be7372b..0000000 --- a/api/src/main/java/market/guess/InputProvider.java +++ /dev/null @@ -1,5 +0,0 @@ -package market.guess; - -public interface InputProvider extends AutoCloseable { - int nextInt(); -} diff --git a/api/src/main/java/market/guess/InputProviderFactory.java b/api/src/main/java/market/guess/InputProviderFactory.java deleted file mode 100644 index 6801103..0000000 --- a/api/src/main/java/market/guess/InputProviderFactory.java +++ /dev/null @@ -1,5 +0,0 @@ -package market.guess; - -public interface InputProviderFactory { - InputProvider create(); -} diff --git a/api/src/main/java/market/guess/OutputProvider.java b/api/src/main/java/market/guess/OutputProvider.java deleted file mode 100644 index 774408e..0000000 --- a/api/src/main/java/market/guess/OutputProvider.java +++ /dev/null @@ -1,7 +0,0 @@ -package market.guess; - -public interface OutputProvider { - void print(Object object); - - void println(Object object); -} diff --git a/api/src/main/java/market/guess/OutputProviderFactory.java b/api/src/main/java/market/guess/OutputProviderFactory.java deleted file mode 100644 index b4eb7f5..0000000 --- a/api/src/main/java/market/guess/OutputProviderFactory.java +++ /dev/null @@ -1,5 +0,0 @@ -package market.guess; - -public interface OutputProviderFactory { - OutputProvider create(); -} diff --git a/api/src/main/java/market/guess/api/AccountDTO.java b/api/src/main/java/market/guess/api/AccountDTO.java new file mode 100644 index 0000000..8e7123e --- /dev/null +++ b/api/src/main/java/market/guess/api/AccountDTO.java @@ -0,0 +1,6 @@ +package market.guess.api; + +import java.util.List; + +public record AccountDTO( + String owner, String balance, boolean blocked, List entries) {} diff --git a/api/src/main/java/market/guess/api/GuessMarketContext.java b/api/src/main/java/market/guess/api/GuessMarketContext.java index 12ffbeb..2d7af4c 100644 --- a/api/src/main/java/market/guess/api/GuessMarketContext.java +++ b/api/src/main/java/market/guess/api/GuessMarketContext.java @@ -1,10 +1,9 @@ package market.guess.api; import java.util.List; -import java.util.concurrent.CompletableFuture; public interface GuessMarketContext { - CompletableFuture LoadAsync(); + LoadResultDTO LoadAsync(); void SaveChangesAsync(); diff --git a/api/src/main/java/market/guess/api/GuessMarketEngine.java b/api/src/main/java/market/guess/api/GuessMarketEngine.java deleted file mode 100644 index b6d44a4..0000000 --- a/api/src/main/java/market/guess/api/GuessMarketEngine.java +++ /dev/null @@ -1,7 +0,0 @@ -package market.guess.api; - -import java.util.concurrent.CompletableFuture; - -public interface GuessMarketEngine { - CompletableFuture loadEvents(); -} diff --git a/api/src/main/java/market/guess/api/LedgerEntryDTO.java b/api/src/main/java/market/guess/api/LedgerEntryDTO.java new file mode 100644 index 0000000..b8f994c --- /dev/null +++ b/api/src/main/java/market/guess/api/LedgerEntryDTO.java @@ -0,0 +1,4 @@ +package market.guess.api; + +public record LedgerEntryDTO( + long seq, String at, LedgerType type, String amount, String balanceAfter, String note) {} diff --git a/api/src/main/java/market/guess/api/LedgerType.java b/api/src/main/java/market/guess/api/LedgerType.java new file mode 100644 index 0000000..3402b84 --- /dev/null +++ b/api/src/main/java/market/guess/api/LedgerType.java @@ -0,0 +1,10 @@ +package market.guess.api; + +public enum LedgerType { + SUBSIDY, + PURCHASE, + COMMISSION, + PAYOUT, + REFUND, + DEPOSIT +} diff --git a/api/src/main/java/market/guess/api/LoadResultDTO.java b/api/src/main/java/market/guess/api/LoadResultDTO.java index cf3630b..8cae3c0 100644 --- a/api/src/main/java/market/guess/api/LoadResultDTO.java +++ b/api/src/main/java/market/guess/api/LoadResultDTO.java @@ -1,3 +1,15 @@ package market.guess.api; -public record LoadResultDTO() {} +import java.util.List; + +public record LoadResultDTO( + boolean success, String source, int eventsLoaded, List issues) { + + public static LoadResultDTO success(String sourceLabel, int eventsLoaded) { + return new LoadResultDTO(true, sourceLabel, eventsLoaded, List.of()); + } + + public static LoadResultDTO failure(String sourceLabel, List problems) { + return new LoadResultDTO(false, sourceLabel, 0, List.copyOf(problems)); + } +} diff --git a/api/src/main/java/market/guess/api/ProblemDTO.java b/api/src/main/java/market/guess/api/ProblemDTO.java new file mode 100644 index 0000000..682372b --- /dev/null +++ b/api/src/main/java/market/guess/api/ProblemDTO.java @@ -0,0 +1,3 @@ +package market.guess.api; + +public record ProblemDTO(String code, String humanizedMessage, String location) {} diff --git a/engine/src/main/java/market/guess/engine/LocalGuessMarketService.java b/engine/src/main/java/market/guess/engine/LocalGuessMarketService.java deleted file mode 100644 index dafbef6..0000000 --- a/engine/src/main/java/market/guess/engine/LocalGuessMarketService.java +++ /dev/null @@ -1,20 +0,0 @@ -package market.guess.engine; - -import java.util.concurrent.CompletableFuture; -import market.guess.api.GuessMarketContext; -import market.guess.api.GuessMarketEngine; -import market.guess.api.LoadResultDTO; - -public class LocalGuessMarketService implements GuessMarketEngine { - private final GuessMarketContext context; - - public LocalGuessMarketService(GuessMarketContext context) { - super(); - this.context = context; - } - - @Override - public CompletableFuture loadEvents() { - return context.LoadAsync(); - } -} diff --git a/engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java b/engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java index 628038d..cf0923b 100644 --- a/engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java +++ b/engine/src/main/java/market/guess/engine/provider/LocalGuessMarketContext.java @@ -4,30 +4,31 @@ import jakarta.xml.bind.JAXBContext; import jakarta.xml.bind.Marshaller; import java.io.File; import java.util.List; -import java.util.concurrent.CompletableFuture; import market.guess.api.CommissionChargeType; import market.guess.api.EventDTO; import market.guess.api.EventStatus; import market.guess.api.GuessMarketContext; import market.guess.api.LoadResultDTO; +import market.guess.api.ProblemDTO; import market.guess.engine.model.GuessMarket; public class LocalGuessMarketContext implements GuessMarketContext { private GuessMarket context; @Override - public CompletableFuture LoadAsync() { + public LoadResultDTO LoadAsync() { + var file = new File("test-data/ex-1/multiple.xml"); try { - var file = new File("test-data/ex-1/multiple.xml"); var ctx = JAXBContext.newInstance(GuessMarket.class); var unmarshaller = ctx.createUnmarshaller(); context = (GuessMarket) unmarshaller.unmarshal(file); - + return LoadResultDTO.success(file.getPath(), context.getGMEvents().getGMEvent().size()); } catch (Exception e) { e.printStackTrace(); + return LoadResultDTO.failure( + file.getPath(), List.of(new ProblemDTO("LOAD_FAILED", e.getMessage(), file.getPath()))); } - return CompletableFuture.completedFuture(new LoadResultDTO()); } @Override diff --git a/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProvider.java b/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProvider.java index 71de3be..38b02a9 100644 --- a/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProvider.java +++ b/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProvider.java @@ -1,7 +1,6 @@ package market.guess.ui.console; import java.util.Scanner; -import market.guess.InputProvider; public class ConsoleInputProvider implements InputProvider { private final Scanner scanner = new Scanner(System.in); diff --git a/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProviderFactory.java b/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProviderFactory.java index d122549..a7433b7 100644 --- a/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProviderFactory.java +++ b/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProviderFactory.java @@ -1,8 +1,5 @@ package market.guess.ui.console; -import market.guess.InputProvider; -import market.guess.InputProviderFactory; - public class ConsoleInputProviderFactory implements InputProviderFactory { @Override diff --git a/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProvider.java b/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProvider.java index eb9f31b..84017ac 100644 --- a/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProvider.java +++ b/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProvider.java @@ -1,7 +1,5 @@ package market.guess.ui.console; -import market.guess.OutputProvider; - public class ConsoleOutputProvider implements OutputProvider { @Override diff --git a/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProviderFactory.java b/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProviderFactory.java index 6db91fc..3665df3 100644 --- a/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProviderFactory.java +++ b/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProviderFactory.java @@ -1,8 +1,5 @@ package market.guess.ui.console; -import market.guess.OutputProvider; -import market.guess.OutputProviderFactory; - public class ConsoleOutputProviderFactory implements OutputProviderFactory { @Override diff --git a/ui-console/src/main/java/market/guess/ui/console/InputProvider.java b/ui-console/src/main/java/market/guess/ui/console/InputProvider.java new file mode 100644 index 0000000..3579b4a --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/InputProvider.java @@ -0,0 +1,5 @@ +package market.guess.ui.console; + +public interface InputProvider extends AutoCloseable { + int nextInt(); +} diff --git a/ui-console/src/main/java/market/guess/ui/console/InputProviderFactory.java b/ui-console/src/main/java/market/guess/ui/console/InputProviderFactory.java new file mode 100644 index 0000000..dcbb1c6 --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/InputProviderFactory.java @@ -0,0 +1,5 @@ +package market.guess.ui.console; + +public interface InputProviderFactory { + InputProvider create(); +} diff --git a/ui-console/src/main/java/market/guess/ui/console/Menu.java b/ui-console/src/main/java/market/guess/ui/console/Menu.java index a5217a4..4bf8929 100644 --- a/ui-console/src/main/java/market/guess/ui/console/Menu.java +++ b/ui-console/src/main/java/market/guess/ui/console/Menu.java @@ -1,7 +1,5 @@ package market.guess.ui.console; -import market.guess.OutputProvider; -import market.guess.OutputProviderFactory; import org.picocontainer.Startable; public class Menu implements Startable { diff --git a/ui-console/src/main/java/market/guess/ui/console/OutputProvider.java b/ui-console/src/main/java/market/guess/ui/console/OutputProvider.java new file mode 100644 index 0000000..57ff001 --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/OutputProvider.java @@ -0,0 +1,7 @@ +package market.guess.ui.console; + +public interface OutputProvider { + void print(Object object); + + void println(Object object); +} diff --git a/ui-console/src/main/java/market/guess/ui/console/OutputProviderFactory.java b/ui-console/src/main/java/market/guess/ui/console/OutputProviderFactory.java new file mode 100644 index 0000000..6d6601f --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/OutputProviderFactory.java @@ -0,0 +1,5 @@ +package market.guess.ui.console; + +public interface OutputProviderFactory { + OutputProvider create(); +} -- cgit v1.2.3