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.

63 lines
1.8 KiB

public class AnalyzeCommand implements Command {
private static final Pattern URL_PATTERN =
Pattern.compile("^(https?://)?([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)*$");
private final ConsoleView view;
private final StrategyFactory strategyFactory;
public AnalyzeCommand(ConsoleView view, StrategyFactory strategyFactory) {
this.view = view;
this.strategyFactory = strategyFactory;
}
@Override
public String getName() {
return "analyze";
}
@Override
public void execute(String[] args, List<Article> unused) {
if (args.length < 2) {
view.printError("用法:analyze <url>");
return;
}
String url = args[1];
if (!isValidUrl(url)) {
view.printError("无效的URL格式:" + url);
return;
}
try {
List<Article> parsedArticles = strategyFactory.getStrategy(url).crawl(url);
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();
}
}