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
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();
|
|
}
|
|
}
|