From b6f1d61b5fa74ccca692351fab9beef5e93eea40 Mon Sep 17 00:00:00 2001 From: zhangsiyuan <3837703520@qq.com> Date: Fri, 1 May 2026 15:39:56 +0800 Subject: [PATCH] =?UTF-8?q?w9-202401070104-=E5=BC=A0=E6=80=9D=E6=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w9/CrawlerController.java | 83 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 w9/CrawlerController.java diff --git a/w9/CrawlerController.java b/w9/CrawlerController.java new file mode 100644 index 0000000..de3d16d --- /dev/null +++ b/w9/CrawlerController.java @@ -0,0 +1,83 @@ +package com.example.datacollect.controller; + +import com.example.datacollect.command.*; +import com.example.datacollect.model.Article; +import com.example.datacollect.view.ConsoleView; + +import java.util.*; +import java.util.regex.Pattern; + +public class CrawlerController { + private final Map commands = new HashMap<>(); + private final Map aliases = new HashMap<>(); + private final ConsoleView view; + private final List
articles; + private final List commandHistory; + private final HistoryCommand historyCommand; + + private static final Pattern URL_PATTERN = Pattern.compile( + "^(https?://)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w.-]*)*(/?)" + ); + + public CrawlerController(ConsoleView view, List
articles) { + this.view = view; + this.articles = articles; + this.commandHistory = new ArrayList<>(); + this.historyCommand = new HistoryCommand(view, commandHistory); + + register(new HelpCommand(view)); + register(new ListCommand(view)); + register(new CrawlCommand(view)); + register(new ExitCommand(view)); + register(historyCommand); + + registerAliases(); + } + + private void register(Command command) { + commands.put(command.getName(), command); + } + + private void registerAliases() { + aliases.put("c", "crawl"); + aliases.put("ls", "list"); + aliases.put("h", "help"); + aliases.put("q", "exit"); + } + + public void handle(String input) { + String text = input == null ? "" : input.trim(); + if (text.isEmpty()) { + return; + } + + commandHistory.add(text); + + String[] args = text.split("\\s+"); + String cmdName = args[0].toLowerCase(); + + String actualCommand = aliases.getOrDefault(cmdName, cmdName); + Command command = commands.get(actualCommand); + + if (command == null) { + view.printError("Unknown command: " + cmdName); + return; + } + + if ("crawl".equals(actualCommand) && args.length >= 2) { + if (!isValidUrl(args[1])) { + view.printError("Invalid URL format: " + args[1]); + return; + } + } + + command.execute(args, articles); + } + + private boolean isValidUrl(String url) { + if (url == null || url.isEmpty()) { + return false; + } + return URL_PATTERN.matcher(url).matches(); + } +}