You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.5 KiB

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<Article> unused) {
// 1. 校验参数
if (args.length < 2) {
view.printError("用法:analyze <url>");
return;
}
String url = args[1];
// 2. 校验 URL 格式
if (!isValidUrl(url)) {
view.printError("无效的 URL 格式:" + url);
return;
}
try {
// 3. 复用 StrategyFactory 获取策略,解析 URL
List<Article> parsedArticles = strategyFactory.getStrategy(url).crawl(url);
// 4. 关键:只输出统计信息,不存入 ArticleRepository
printAnalysisResult(url, parsedArticles);
} catch (Exception e) {
view.printError("解析失败:" + e.getMessage());
}
}
/**
* 只输出解析结果,不修改任何数据存储
*/
private void printAnalysisResult(String url, List<Article> 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();
}
}