/** * This file is part of CloudML [ http://cloudml.org ] * * Copyright (C) 2012 - SINTEF ICT * Contact: Franck Chauvel <franck.chauvel@sintef.no> * * Module: root * * CloudML is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * CloudML is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with CloudML. If not, see * <http://www.gnu.org/licenses/>. */ package org.cloudml.ui.shell.terminal; import java.io.IOException; import java.util.ArrayList; import java.util.List; import jline.console.ConsoleReader; import jline.console.completer.ArgumentCompleter; import jline.console.completer.Completer; import jline.console.completer.FileNameCompleter; import jline.console.completer.StringsCompleter; import jline.console.history.MemoryHistory; import org.cloudml.ui.shell.configuration.Command; import org.cloudml.ui.shell.configuration.Configuration; /** * Wrap the concept of feature from which one can read or paint */ public class Terminal implements InputDevice, OutputDevice { private final Configuration configuration; private final ConsoleReader reader; public Terminal(Configuration configuration) { try { this.configuration = configuration; jline.TerminalFactory.configure("auto"); reader = new ConsoleReader(); reader.setHistory(new MemoryHistory()); reader.addCompleter(new ArgumentCompleter(selectCompleters())); } catch (IOException ex) { throw new RuntimeException(ex); } } private List<Completer> selectCompleters() { final List<Completer> selection = new ArrayList<Completer>(); for (Command eachCommand: configuration.getCommands()) { selection.add(new StringsCompleter(eachCommand.getSyntax())); } selection.add(new FileNameCompleter()); return selection; } /** * Prompt the user for a new CloudML command * * @return the command entered by the user */ @Override public String prompt() { try { reader.println(""); return reader.readLine(Color.CYAN.paint(configuration.getPrompt())); } catch (IOException ex) { throw new RuntimeException(ex); } } @Override public void print(Message message) { try { reader.print(message.toString()); reader.flush(); } catch (IOException ex) { throw new RuntimeException(ex); } } }