packagecom.idealisan.cores;importjava.util.HashMap;importjava.util.Scanner;public classConsoleListener {
HashMap answers = new HashMap();
Scanner scanner;
Action defaultAction;/*** Add an action for a message.
*@parammessage A string trimed. Ignore case. It has no inner space sequence of two spaces or more.
* Example:"close connection"
*@paramaction The method action.act() will be called when scanner get the message.*/
public voidaddAction(String message, Action action) {
answers.put(message.toLowerCase(), action);
}/***
*@paramscanner Usually new Scanner(System.in).
* Will not be closed after listening.
*@paramdefaultAction The defaultAction.act() method will be called if an action is not added for a message.*/
publicConsoleListener(Scanner scanner, Action defaultAction) {this.scanner =scanner;this.defaultAction =defaultAction;if (scanner == null || defaultAction == null) {throw new NullPointerException("null params for ConsoleListener");
}
}public voidremoveAction(String message, Action action) {
answers.remove(message, action);
}publicAction replaceAction(String message, Action action) {returnanswers.replace(message, action);
}public voidlistenInNewThread() {
Thread t= newThread() {public voidrun() {
listen();
}
};
t.start();
}/*** Use listenInNewThread() instead.
* Listen to console input in current thread. It blocks the thread.*/
public voidlisten() {while (true) {
String line=scanner.nextLine();
String msg= line.replaceAll("[\\s]+", " ");
msg=msg.trim().toLowerCase();
Action action=answers.get(msg);if (action == null) {
action=defaultAction;
}
action.act(line);
}
}public static interfaceAction {public voidact(String msg);
}
}