Guten Abend,
ich habe gerade ein Problem bei meiner Befehlseingabe entdeckt, welches ich einfach nicht behoben bekomme.
Hier wird der eingegebene Befehl erkannt und weiterverarbeitet:
Und hier werden die Argumente extrahiert:
Jede Befehlsklasse hat die Methode getName(). Für den ExitCommand sieht das beispielsweise so aus:
Das funktioniert so im Grund genommen einwandfrei, allerdings werden die Befehle auch angenommen, wenn am Ende beliebig viele Leerzeichen eingegeben werden. Es darf also z.B. "exit " nicht akzeptiert werden. Das ganze ist deshalb so "kompliziert", da es Befehle gibt, die aus ein, zwei, oder drei Wörtern besteht. Beispiele: "exit", "delete rolling stock", "list trains".
Ich wäre über jegliche Hilfe sehr dankbar!
Viele Grüße
ich habe gerade ein Problem bei meiner Befehlseingabe entdeckt, welches ich einfach nicht behoben bekomme.
Hier wird der eingegebene Befehl erkannt und weiterverarbeitet:
Java:
while (running) {
String input = Terminal.readLine();
try {
final List<Command> commands = CommandParser.initialiseCommands();
final List<String> inputSplit = Arrays.asList(input.split(" "));
final Command command = commands.stream()
.filter(cmd -> (input.startsWith(cmd.getName()) && (input.length() == cmd.getName().length()
|| input.charAt(cmd.getName().length()) == ' ')))
.findAny()
.orElseThrow(() -> new InvalidInputException("unknown command"));
final List<String> arguments = CommandParser.getArguments(inputSplit, command);
if (command.getNumberOfArguments() > 0) {
command.setArguments(arguments);
}
command.setSession(this);
command.execute();
} catch (InvalidInputException e) {
Terminal.printError(e.getMessage());
}
}
Und hier werden die Argumente extrahiert:
Java:
public static List<String> getArguments(final List<String> inputSplit, final Command command)
throws InvalidInputException {
int commandCount = command.getName().split(" ").length;
final List<String> arguments = inputSplit.subList(commandCount, inputSplit.size());
if (arguments.size() != command.getNumberOfArguments()) {
throw new InvalidInputException("invalid number of arguments. Expected " + command.getNumberOfArguments()
+ " arguments of the form '" + command.getCommandDescription() + "'");
}
return arguments;
}
Jede Befehlsklasse hat die Methode getName(). Für den ExitCommand sieht das beispielsweise so aus:
Java:
@Override
public String getName() {
return "exit";
}
Das funktioniert so im Grund genommen einwandfrei, allerdings werden die Befehle auch angenommen, wenn am Ende beliebig viele Leerzeichen eingegeben werden. Es darf also z.B. "exit " nicht akzeptiert werden. Das ganze ist deshalb so "kompliziert", da es Befehle gibt, die aus ein, zwei, oder drei Wörtern besteht. Beispiele: "exit", "delete rolling stock", "list trains".
Ich wäre über jegliche Hilfe sehr dankbar!
Viele Grüße