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.

98 lines
2.9 KiB

package cli;
import command.Command;
import command.CrawlCommand;
import command.HelpCommand;
import command.ListCommand;
import controller.CrawlerController;
import exception.CLIException;
import exception.CrawlerException;
import view.CrawlerView;
import java.util.HashMap;
import java.util.Map;
public class CLI {
private final CrawlerController controller;
private final CrawlerView view;
private final Map<String, Command> commands;
public CLI(CrawlerController controller, CrawlerView view) {
this.controller = controller;
this.view = view;
this.commands = new HashMap<>();
initializeCommands();
}
private void initializeCommands() {
commands.put("help", new HelpCommand(controller));
commands.put("list", new ListCommand(controller));
commands.put("crawl", new CrawlCommand(controller));
}
public void process(String[] args) {
try {
Command command = parseArgs(args);
if (command != null) {
command.execute();
}
} catch (CLIException e) {
view.displayError(e.getMessage());
view.displayHelp();
} catch (CrawlerException e) {
view.displayError(e.getMessage());
}
}
private Command parseArgs(String[] args) throws CLIException {
if (args == null || args.length == 0) {
return new CrawlCommand(controller);
}
String strategy = "all";
boolean verbose = false;
String outputDir = null;
for (int i = 0; i < args.length; i++) {
String arg = args[i];
switch (arg) {
case "-h":
case "--help":
return new HelpCommand(controller);
case "-l":
case "--list":
return new ListCommand(controller);
case "-s":
case "--strategy":
if (i + 1 >= args.length) {
throw new CLIException("缺少策略参数值", arg);
}
strategy = args[++i];
break;
case "-v":
case "--verbose":
verbose = true;
controller.setVerbose(true);
break;
case "-o":
case "--output":
if (i + 1 >= args.length) {
throw new CLIException("缺少输出目录参数值", arg);
}
outputDir = args[++i];
controller.setOutputDir(outputDir);
break;
default:
throw new CLIException("未知的参数: " + arg, arg);
}
}
return new CrawlCommand(controller, strategy);
}
}