/** * 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.commands; import java.io.*; import java.util.Arrays; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.tree.ParseTree; import org.cloudml.facade.commands.CloudMlCommand; import org.cloudml.ui.shell.commands.builder.ShellCommandsLexer; import org.cloudml.ui.shell.commands.builder.ShellCommandsParser; import static org.cloudml.ui.shell.terminal.Color.RED; import static org.cloudml.ui.shell.terminal.Message.format; /** * General interface of the shell commands such as exit, help, deploy, etc. * * Commands are either volatile or persistent. Volatile commands are only there * for the convenience of the user, such as help, version, copyright, etc. and * are therefore never saved in scripts. By contrast, persistent commands are * stored in scripts. */ public abstract class ShellCommand { public static final boolean PERSISTENT = true; public static final boolean VOLATILE = !PERSISTENT; private final boolean persistent; public ShellCommand() { this(PERSISTENT); } public ShellCommand(boolean persistent) { this.persistent = persistent; } public final boolean isPersistent() { return this.persistent; } public void execute(ShellCommandHandler handler) { handler.unknownCommand(); } @Override public final boolean equals(Object object) { if (object == null) { return false; } if (object instanceof ShellCommand) { return object.toString().equals(toString()); } return false; } @Override public abstract String toString(); /** * Write this command into the given text file. The file will be be created * if does not already exists, and overridden if it exists. * * @param pathToFile the file to create * * @throws FileNotFoundException */ public void toFile(String pathToFile) throws FileNotFoundException { PrintStream script = null; try { script = new PrintStream(new File(pathToFile)); script.println("#"); script.println("# Generated script. Please edit carefully"); script.println("#"); script.println(toString()); } catch (FileNotFoundException ex) { throw ex; } finally { script.close(); } } /* * Commands factory method */ public static ShellCommand fromText(String text) { return parse(new ANTLRInputStream(text)); } public static ShellCommand fromFile(String pathToFile) throws FileNotFoundException, IOException { final FileInputStream file = new FileInputStream(pathToFile); return parse(new ANTLRInputStream(file)); } private static ShellCommand parse(ANTLRInputStream input) throws RecognitionException { ShellCommandsLexer lexer = new ShellCommandsLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); ShellCommandsParser parser = new ShellCommandsParser(tokens); ParseTree tree = parser.script(); return tree.accept(new ShellCommandBuilder()); } public static ShellCommand script(ShellCommand... commands) { return new Script(Arrays.asList(commands)); } public static ShellCommand exit() { return new Exit(); } public static ShellCommand version() { return new Version(); } public static ShellCommand help() { return new Help(null); } public static ShellCommand help(String subject) { return new Help(subject); } public static ShellCommand history() { return new History(); } public static ShellCommand history(int depth) { return new History(depth); } public static ShellCommand dumpTo(String location) { return new DumpTo(location); } public static ShellCommand dumpTo(int depth, String location) { return new DumpTo(depth, location); } public static ShellCommand replay(String pathToScript) { return new Replay(pathToScript); } public static ShellCommand showMessages() { return new ShowMessages(); } public static ShellCommand showMessages(int depth) { return new ShowMessages(depth); } public static ShellCommand delegate(CloudMlCommand command, boolean runInBackground) { return new DelegatedCommand(command, runInBackground); } }