/* * Copyright (c) 2014 Dennis Fischer. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0+ * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: Dennis Fischer */ package de.chaosfisch.uploader.cli; import com.google.common.eventbus.EventBus; import com.google.inject.Inject; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CLIUtil implements ICLIUtil { private static final String INFO_LINE = "# %-55s #%n"; private static final String PROMPT_LINE = "$> %s%n"; private static final String INPUT_LINE = "$> "; private static final Pattern COMMAND_PATTERN = Pattern.compile("^(\\w+) (\\w+)$", Pattern.MULTILINE); private final Scanner scanner = new Scanner(System.in); private final EventBus eventBus; @Inject public CLIUtil(final EventBus eventBus) { this.eventBus = eventBus; } @Override public void printInfo(final String msg) { System.out.printf(INFO_LINE, msg); } @Override public void printPrompt(final String msg) { System.out.printf(PROMPT_LINE, msg); } @Override public void printInput() { System.out.printf(INPUT_LINE); } @Override public boolean printContinuePrompt(final String msg) { printPrompt(msg); printInput(); final String command = readCommand(); return "y".equals(command) || !"n".equals(command) && printContinuePrompt(msg); } @Override public String readCommand() { return scanner.hasNextLine() ? scanner.nextLine() : "app quitnow"; } @Override public String promptInput(final String msg) { printPrompt(msg); printInput(); return readCommand(); } @Override public String promptInput(final String msg, final String defaultValue) { printPrompt(msg); printInput(); final String command = readCommand(); return command.isEmpty() ? defaultValue : command; } @Override public void listenToCommands() { printInput(); parseCommand(readCommand()); } @Override public void parseCommand(final String command) { final Matcher m = COMMAND_PATTERN.matcher(command); if (!m.find()) { printPrompt(String.format("Invalid command: %s", command)); } else { eventBus.post(new CLIEvent(m.group(1), m.group(2))); } } }