package com.example.datacollect.command; import com.example.datacollect.factory.StrategyFactory; import com.example.datacollect.model.Article; import com.example.datacollect.view.ConsoleView; import java.util.List; import java.util.regex.Pattern; public class AnalyzeCommand implements Command { // URL 格式校验正则(和 CrawlCommand 保持一致) private static final Pattern URL_PATTERN = Pattern.compile("^(https?://)?([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)*$"); private final ConsoleView view; private final StrategyFactory strategyFactory; // 构造方法:只依赖 View 和 StrategyFactory,不依赖 Repository public AnalyzeCommand(ConsoleView view, StrategyFactory strategyFactory) { this.view = view; this.strategyFactory = strategyFactory; } @Override public String getName() { // 命令名:analyze return "analyze"; } @Override public void execute(String[] args, List
unused) { // 1. 校验参数 if (args.length < 2) { view.printError("用法:analyze "); return; } String url = args[1]; // 2. 校验 URL 格式 if (!isValidUrl(url)) { view.printError("无效的 URL 格式:" + url); return; } try { // 3. 复用 StrategyFactory 获取策略,解析 URL List
parsedArticles = strategyFactory.getStrategy(url).crawl(url); // 4. 关键:只输出统计信息,不存入 ArticleRepository printAnalysisResult(url, parsedArticles); } catch (Exception e) { view.printError("解析失败:" + e.getMessage()); } } /** * 只输出解析结果,不修改任何数据存储 */ private void printAnalysisResult(String url, List
articles) { view.printInfo("===== 解析统计结果 ====="); view.printInfo("目标 URL:" + url); view.printInfo("解析到文章数量:" + articles.size()); if (!articles.isEmpty()) { Article first = articles.get(0); view.printInfo("首篇文章标题:" + first.getTitle()); view.printInfo("首篇文章作者:" + first.getAuthor()); view.printInfo("首篇发布日期:" + first.getPublishDate()); } } private boolean isValidUrl(String url) { return url != null && URL_PATTERN.matcher(url).matches(); } }