From f62600050e22532a3fe297b86eb22ca72d786698 Mon Sep 17 00:00:00 2001 From: Kostya Date: Fri, 14 Aug 2026 12:10:52 +0000 Subject: Move IO providers into io package, add InputProcessor, implement menu loop and file load command Wires InputProcessor into the console menu's selection loop and the load-file command's prompt handling, replacing the unimplemented stub. --- .../src/main/java/market/guess/ui/console/App.java | 6 +++ .../guess/ui/console/ConsoleInputProvider.java | 21 -------- .../guess/ui/console/ConsoleOutputProvider.java | 19 ------- .../market/guess/ui/console/InputProvider.java | 5 -- .../main/java/market/guess/ui/console/Menu.java | 28 ++++++++--- .../market/guess/ui/console/OutputProvider.java | 9 ---- .../ui/console/command/LoadFileMenuCommand.java | 17 +++++-- .../guess/ui/console/io/ConsoleInputProvider.java | 17 +++++++ .../guess/ui/console/io/ConsoleOutputProvider.java | 24 +++++++++ .../market/guess/ui/console/io/InputProcessor.java | 58 ++++++++++++++++++++++ .../market/guess/ui/console/io/InputProvider.java | 5 ++ .../market/guess/ui/console/io/OutputProvider.java | 11 ++++ 12 files changed, 156 insertions(+), 64 deletions(-) delete mode 100644 ui-console/src/main/java/market/guess/ui/console/ConsoleInputProvider.java delete mode 100644 ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProvider.java delete mode 100644 ui-console/src/main/java/market/guess/ui/console/InputProvider.java delete 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/io/ConsoleInputProvider.java create mode 100644 ui-console/src/main/java/market/guess/ui/console/io/ConsoleOutputProvider.java create mode 100644 ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java create mode 100644 ui-console/src/main/java/market/guess/ui/console/io/InputProvider.java create mode 100644 ui-console/src/main/java/market/guess/ui/console/io/OutputProvider.java (limited to 'ui-console/src/main/java') diff --git a/ui-console/src/main/java/market/guess/ui/console/App.java b/ui-console/src/main/java/market/guess/ui/console/App.java index ccffc06..148e928 100644 --- a/ui-console/src/main/java/market/guess/ui/console/App.java +++ b/ui-console/src/main/java/market/guess/ui/console/App.java @@ -11,6 +11,11 @@ import market.guess.service.repository.InMemoryEventRepository; import market.guess.service.repository.InMemoryUserRepository; import market.guess.service.repository.UserRepository; import market.guess.ui.console.command.LoadFileMenuCommand; +import market.guess.ui.console.io.ConsoleInputProvider; +import market.guess.ui.console.io.ConsoleOutputProvider; +import market.guess.ui.console.io.InputProcessor; +import market.guess.ui.console.io.InputProvider; +import market.guess.ui.console.io.OutputProvider; import org.picocontainer.DefaultPicoContainer; import org.picocontainer.behaviors.Caching; @@ -29,6 +34,7 @@ public class App { pico.addComponent(InputProvider.class, ConsoleInputProvider.class); pico.addComponent(OutputProvider.class, ConsoleOutputProvider.class); + pico.addComponent(InputProcessor.class); pico.addComponent(Menu.class); pico.start(); 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 deleted file mode 100644 index 38b02a9..0000000 --- a/ui-console/src/main/java/market/guess/ui/console/ConsoleInputProvider.java +++ /dev/null @@ -1,21 +0,0 @@ -package market.guess.ui.console; - -import java.util.Scanner; - -public class ConsoleInputProvider implements InputProvider { - private final Scanner scanner = new Scanner(System.in); - - @Override - public int nextInt() { - while (!scanner.hasNextInt()) { - scanner.next(); - } - - return scanner.nextInt(); - } - - @Override - public void close() throws Exception { - scanner.close(); - } -} 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 deleted file mode 100644 index 3009d95..0000000 --- a/ui-console/src/main/java/market/guess/ui/console/ConsoleOutputProvider.java +++ /dev/null @@ -1,19 +0,0 @@ -package market.guess.ui.console; - -public class ConsoleOutputProvider implements OutputProvider { - - @Override - public void print(Object object) { - IO.print(object); - } - - @Override - public void println(Object object) { - IO.println(object); - } - - @Override - public void newLine() { - IO.println(""); - } -} 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 deleted file mode 100644 index 3579b4a..0000000 --- a/ui-console/src/main/java/market/guess/ui/console/InputProvider.java +++ /dev/null @@ -1,5 +0,0 @@ -package market.guess.ui.console; - -public interface InputProvider extends AutoCloseable { - int nextInt(); -} 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 1f3f2be..0521e5f 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 @@ -2,23 +2,39 @@ package market.guess.ui.console; import java.util.List; import market.guess.ui.console.command.MenuCommand; +import market.guess.ui.console.io.InputProcessor; +import market.guess.ui.console.io.OutputProvider; import org.picocontainer.Startable; public final class Menu implements Startable { private final OutputProvider out; - private final InputProvider in; + private final InputProcessor in; private final List commands; - public Menu( - List commands, OutputProvider outputProvider, InputProvider inputProvider) { + public Menu(List commands, OutputProvider out, InputProcessor in) { this.commands = commands; - this.out = outputProvider; - this.in = inputProvider; + this.out = out; + this.in = in; } @Override public void start() { - printMenu(); + out.splashScreen(); + + while (true) { + printMenu(); + + var selection = in.readInt("Choose a command: ", 1, commands.size()); + var commandOptional = commands.stream().filter(c -> c.getIndex() == selection).findFirst(); + + if (commandOptional.isEmpty()) { + out.println("There is no command %d.".formatted(selection)); + continue; + } + var command = commandOptional.get(); + + command.execute(); + } } @Override 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 deleted file mode 100644 index e49bec5..0000000 --- a/ui-console/src/main/java/market/guess/ui/console/OutputProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package market.guess.ui.console; - -public interface OutputProvider { - void print(Object object); - - void newLine(); - - void println(Object object); -} diff --git a/ui-console/src/main/java/market/guess/ui/console/command/LoadFileMenuCommand.java b/ui-console/src/main/java/market/guess/ui/console/command/LoadFileMenuCommand.java index eddc68f..5a91fe0 100644 --- a/ui-console/src/main/java/market/guess/ui/console/command/LoadFileMenuCommand.java +++ b/ui-console/src/main/java/market/guess/ui/console/command/LoadFileMenuCommand.java @@ -1,15 +1,19 @@ package market.guess.ui.console.command; +import java.nio.file.Path; import market.guess.api.GuessMarketContext; -import market.guess.ui.console.OutputProvider; +import market.guess.ui.console.io.InputProcessor; +import market.guess.ui.console.io.OutputProvider; public final class LoadFileMenuCommand implements MenuCommand { private final GuessMarketContext context; private final OutputProvider out; + private final InputProcessor in; - public LoadFileMenuCommand(GuessMarketContext context, OutputProvider out) { + public LoadFileMenuCommand(GuessMarketContext context, InputProcessor in, OutputProvider out) { this.context = context; this.out = out; + this.in = in; } @Override @@ -29,7 +33,12 @@ public final class LoadFileMenuCommand implements MenuCommand { @Override public void execute() { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("Unimplemented method 'execute'"); + var path = in.readPath("Pleae enter the full file path to the XML file: "); + var result = context.loadEvents(Path.of(path)); + + if (result.success()) { + out.println("Loaded %d event(s) from %s.".formatted(result.eventsLoaded(), result.source())); + return; + } } } diff --git a/ui-console/src/main/java/market/guess/ui/console/io/ConsoleInputProvider.java b/ui-console/src/main/java/market/guess/ui/console/io/ConsoleInputProvider.java new file mode 100644 index 0000000..5c93f71 --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/io/ConsoleInputProvider.java @@ -0,0 +1,17 @@ +package market.guess.ui.console.io; + +import java.util.Scanner; + +public class ConsoleInputProvider implements InputProvider { + private final Scanner scanner = new Scanner(System.in); + + @Override + public void close() throws Exception { + scanner.close(); + } + + @Override + public String nextLine() { + return scanner.hasNextLine() ? scanner.nextLine() : null; + } +} diff --git a/ui-console/src/main/java/market/guess/ui/console/io/ConsoleOutputProvider.java b/ui-console/src/main/java/market/guess/ui/console/io/ConsoleOutputProvider.java new file mode 100644 index 0000000..6fa7595 --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/io/ConsoleOutputProvider.java @@ -0,0 +1,24 @@ +package market.guess.ui.console.io; + +public class ConsoleOutputProvider implements OutputProvider { + + @Override + public void print(Object object) { + IO.print(object); + } + + @Override + public void println(Object object) { + IO.println(object); + } + + @Override + public void newLine() { + IO.println(""); + } + + @Override + public void splashScreen() { + IO.println("<<-- GUESS MARKET -->>"); + } +} diff --git a/ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java b/ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java new file mode 100644 index 0000000..9f03acb --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/io/InputProcessor.java @@ -0,0 +1,58 @@ +package market.guess.ui.console.io; + +public final class InputProcessor { + private final OutputProvider out; + private final InputProvider in; + + public InputProcessor(InputProvider in, OutputProvider out) { + super(); + this.in = in; + this.out = out; + } + + public String readLine(String prompt) { + out.print(prompt); + var line = in.nextLine(); + + return line.trim(); + } + + public int readInt(String prompt, int min, int max) { + while (true) { + var raw = in.nextLine(); + if (raw.isBlank()) { + out.println("Please enter a number between %d and %d.".formatted(min, max)); + continue; + } + try { + var value = Integer.parseInt(raw); + + if (value > max || value < min) { + out.println( + "%d is out of range, please enter a number between %d and %d." + .formatted(value, min, max)); + continue; + } + return value; + } catch (NumberFormatException e) { + out.println( + "%s in not a number, please enter a number between %d and %d." + .formatted(raw, min, max)); + continue; + } + } + } + + public String readPath(String prompt) { + while (true) { + var raw = readLine(prompt); + + if (raw.isBlank()) { + out.println("Please enter a file path."); + continue; + } + + return raw; + } + } +} diff --git a/ui-console/src/main/java/market/guess/ui/console/io/InputProvider.java b/ui-console/src/main/java/market/guess/ui/console/io/InputProvider.java new file mode 100644 index 0000000..9404bb7 --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/io/InputProvider.java @@ -0,0 +1,5 @@ +package market.guess.ui.console.io; + +public interface InputProvider extends AutoCloseable { + String nextLine(); +} diff --git a/ui-console/src/main/java/market/guess/ui/console/io/OutputProvider.java b/ui-console/src/main/java/market/guess/ui/console/io/OutputProvider.java new file mode 100644 index 0000000..e419351 --- /dev/null +++ b/ui-console/src/main/java/market/guess/ui/console/io/OutputProvider.java @@ -0,0 +1,11 @@ +package market.guess.ui.console.io; + +public interface OutputProvider { + void print(Object object); + + void newLine(); + + void splashScreen(); + + void println(Object object); +} -- cgit v1.2.3