/**
* 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;
import java.util.Arrays;
import java.util.List;
import org.cloudml.facade.CloudML;
import org.cloudml.facade.Factory;
import org.cloudml.ui.shell.configuration.Loader;
import org.cloudml.ui.shell.terminal.Terminal;
/**
* The CloudML shell can be run in two different modes: batch or interactive.
* When running in batch mode, it takes a command to be executed.
*/
public abstract class ShellMode {
/**
* @return a string explaining how to start the CloudML shell
*/
public static String usage() {
String result = "";
result += "Usage: java -jar cloudml-shell.jar [-i | -b <command>]" + EOL;
result += "where:" + EOL;
result += " -b, --batch: run the given command in 'batch' mode." + EOL ;
result += " -i, --interactive: run in 'interactive' mode. " + EOL;
return result;
}
private static final String EOL = System.getProperty("line.separator");
public static ShellMode from(String... arguments) {
if (runInBatchMode(arguments)) {
return new BatchMode(extractCommand(arguments));
}
return new InteractiveMode();
}
public static ShellMode batch(String command) {
return new BatchMode(command);
}
public static ShellMode interactive() {
return new InteractiveMode();
}
private static boolean runInBatchMode(String[] arguments) {
final List<String> batchFlags
= Arrays.asList(new String[]{"-b",
"--batch"});
final List<String> interactiveFlags
= Arrays.asList(new String[]{"-i",
"--interactive"});
for (String any: arguments) {
if (any.startsWith("-")) {
if (batchFlags.contains(any)) {
return BATCH;
}
if (interactiveFlags.contains(any)) {
return INTERACTIVE;
}
throw new IllegalArgumentException(String.format("Unknown option '%s'", any));
}
}
return INTERACTIVE;
}
private static final boolean BATCH = true;
private static final boolean INTERACTIVE = false;
private static String extractCommand(String[] arguments) {
final StringBuilder buffer = new StringBuilder();
for (String each: arguments) {
if (isNotFlag(each)) {
buffer.append(each).append(" ");
}
}
return buffer.toString();
}
private static boolean isNotFlag(String each) {
return !each.startsWith("-");
}
public abstract void start();
@Override
public final boolean equals(Object object) {
if (object == null) {
return false;
}
if (object instanceof ShellMode) {
ShellMode mode = (ShellMode) object;
return toString().trim().equals(mode.toString().trim());
}
return false;
}
@Override
public abstract String toString();
}
/**
* The 'batch' mode, where the CloudML shell simply runs the given command until
* completion.
*/
class BatchMode extends ShellMode {
private final String command;
public BatchMode(String command) {
this.command = command;
}
@Override
public void start() {
final CloudML proxy = Factory.getInstance().getCloudML();
final Terminal device = new Terminal(Loader.getInstance().getConfiguration());
final Shell shell = new Shell(device, device, proxy);
shell.execute(command);
}
@Override
public String toString() {
return String.format("-b %s", command);
}
}
/**
* The 'interactive' mode where the CloudML Shell prompts the user for commands
* to be executed.
*/
class InteractiveMode extends ShellMode {
public InteractiveMode() {
}
@Override
public void start() {
final CloudML proxy = Factory.getInstance().getCloudML();
final Terminal device = new Terminal(Loader.getInstance().getConfiguration());
new Shell(device, device, proxy).start();
}
@Override
public String toString() {
return "-i";
}
}