diff --git a/src/main/java/internal/hw/crawler/Main.java b/src/main/java/internal/hw/crawler/Main.java index f2ebc7a..a9a03ed 100644 --- a/src/main/java/internal/hw/crawler/Main.java +++ b/src/main/java/internal/hw/crawler/Main.java @@ -14,9 +14,9 @@ public class Main { ArticleRepository repository = new ArticleRepository(); controller.registerCommand(new ExitCommand()); - controller.registerCommand(new CrawlCommand(repository)); - controller.registerCommand(new ListCommand(repository)); - controller.registerCommand(new HelpCommand(controller.getCommands())); + controller.registerCommand(new CrawlCommand(repository, view)); + controller.registerCommand(new ListCommand(repository, view)); + controller.registerCommand(new HelpCommand(controller.getCommands(), view)); view.printSuccess("Welcome to crawler. Type `help` for a list of available commands."); while (true) { diff --git a/src/main/java/internal/hw/crawler/commands/CrawlCommand.java b/src/main/java/internal/hw/crawler/commands/CrawlCommand.java index 21bd8ad..821f94e 100644 --- a/src/main/java/internal/hw/crawler/commands/CrawlCommand.java +++ b/src/main/java/internal/hw/crawler/commands/CrawlCommand.java @@ -4,6 +4,7 @@ import internal.hw.crawler.models.Article; import internal.hw.crawler.repositories.ArticleRepository; import internal.hw.crawler.strategies.crawl.CrawlStrategy; import internal.hw.crawler.strategies.crawl.CrawlStrategyFactory; +import internal.hw.crawler.views.CommandOutput; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; @@ -12,10 +13,12 @@ import java.util.List; public class CrawlCommand implements Command { private final ArticleRepository repository; + private final CommandOutput out; private final CrawlStrategyFactory crawlStrategyFactory = new CrawlStrategyFactory(); - public CrawlCommand(ArticleRepository repository) { + public CrawlCommand(ArticleRepository repository, CommandOutput out) { this.repository = repository; + this.out = out; } @Override @@ -35,7 +38,7 @@ public class CrawlCommand implements Command { URL url = new URL(urlRaw); CrawlStrategy strategy = crawlStrategyFactory.getStrategy(url); if (strategy == null) { - System.err.println("Unsupported URL: " + urlRaw); + out.error("Unsupported URL: " + urlRaw); return; } @@ -44,6 +47,7 @@ public class CrawlCommand implements Command { for (Article article : articles) { repository.add(article); } + out.success(String.format("Crawled %d articles from %s", articles.size(), urlRaw)); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/src/main/java/internal/hw/crawler/commands/HelpCommand.java b/src/main/java/internal/hw/crawler/commands/HelpCommand.java index 60d7557..b9b3109 100644 --- a/src/main/java/internal/hw/crawler/commands/HelpCommand.java +++ b/src/main/java/internal/hw/crawler/commands/HelpCommand.java @@ -1,13 +1,17 @@ package internal.hw.crawler.commands; +import internal.hw.crawler.views.CommandOutput; + import java.util.List; import java.util.Map; public class HelpCommand implements Command { private final Map commands; + private final CommandOutput out; - public HelpCommand(Map commands) { + public HelpCommand(Map commands, CommandOutput out) { this.commands = commands; + this.out = out; } @Override @@ -32,34 +36,33 @@ public class HelpCommand implements Command { } private void showAll() { - System.out.println("Available commands:"); + out.info("Available commands:"); for (Command cmd : commands.values()) { - System.out.printf(" %s", cmd.getName()); - System.out.println(); + out.print(" " + cmd.getName()); } - System.out.println("Type `help ` to show detailed help for a specific command."); + out.info("Type `help ` to show detailed help for a specific command."); } private void showDetail(String name) { Command cmd = commands.get(name); if (cmd == null) { - System.out.println("Unknown command: " + name); + out.error("Unknown command: " + name); return; } - System.out.println("Command: " + cmd.getName()); + out.info("Command: " + cmd.getName()); List cmdArgs = cmd.getArgs(); if (cmdArgs.isEmpty()) { - System.out.println(" No arguments."); + out.print(" No arguments."); return; } - System.out.println("Arguments:"); + out.info("Arguments:"); for (CommandArg arg : cmdArgs) { - System.out.printf(" %s %s %s%n", - arg.required() ? "[R]" : " ", + out.print(String.format(" %s %s %s", + arg.required() ? "[Required]" : " ", arg.name(), - arg.description()); + arg.description())); } } } diff --git a/src/main/java/internal/hw/crawler/commands/ListCommand.java b/src/main/java/internal/hw/crawler/commands/ListCommand.java index 9526507..46c464a 100644 --- a/src/main/java/internal/hw/crawler/commands/ListCommand.java +++ b/src/main/java/internal/hw/crawler/commands/ListCommand.java @@ -2,12 +2,15 @@ package internal.hw.crawler.commands; import internal.hw.crawler.models.Article; import internal.hw.crawler.repositories.ArticleRepository; +import internal.hw.crawler.views.CommandOutput; public class ListCommand implements Command { private final ArticleRepository articleRepository; + private final CommandOutput out; - public ListCommand(ArticleRepository articleRepository) { + public ListCommand(ArticleRepository articleRepository, CommandOutput out) { this.articleRepository = articleRepository; + this.out = out; } @Override @@ -18,7 +21,7 @@ public class ListCommand implements Command { @Override public void execute(String[] args) { for (Article article : articleRepository.getAll()) { - System.out.println(article); + out.print(article.toString()); } } } diff --git a/src/main/java/internal/hw/crawler/views/CommandOutput.java b/src/main/java/internal/hw/crawler/views/CommandOutput.java new file mode 100644 index 0000000..2d6c1ae --- /dev/null +++ b/src/main/java/internal/hw/crawler/views/CommandOutput.java @@ -0,0 +1,8 @@ +package internal.hw.crawler.views; + +public interface CommandOutput { + void print(String msg); + void info(String msg); + void success(String msg); + void error(String msg); +} diff --git a/src/main/java/internal/hw/crawler/views/ConsoleView.java b/src/main/java/internal/hw/crawler/views/ConsoleView.java index 6caac9d..a8416c7 100644 --- a/src/main/java/internal/hw/crawler/views/ConsoleView.java +++ b/src/main/java/internal/hw/crawler/views/ConsoleView.java @@ -2,7 +2,7 @@ package internal.hw.crawler.views; import java.util.Scanner; -public class ConsoleView { +public class ConsoleView implements CommandOutput { private static final String ANSI_RESET = "\u001B[0m"; private static final String ANSI_GREEN = "\u001B[32m"; private static final String ANSI_RED = "\u001B[31m"; @@ -15,6 +15,11 @@ public class ConsoleView { return scanner.nextLine(); } + @Override + public void print(String msg) { + System.out.println(msg); + } + public void printSuccess(String msg) { System.out.println(ANSI_GREEN + msg + ANSI_RESET); } @@ -26,4 +31,19 @@ public class ConsoleView { public void printInfo(String msg) { System.out.println(ANSI_BLUE + msg + ANSI_RESET); } + + @Override + public void success(String msg) { + printSuccess(msg); + } + + @Override + public void error(String msg) { + printError(msg); + } + + @Override + public void info(String msg) { + printInfo(msg); + } }