use of com.bluenimble.platform.cli.command.CommandResult in project serverless by bluenimble.
the class ScriptSourceCommand method execute.
@SuppressWarnings("unchecked")
@Override
public CommandResult execute(Tool tool, Map<String, CommandOption> options) throws CommandExecutionException {
BufferedReader reader = null;
if (!script.exists()) {
throw new CommandExecutionException("Script file " + script.getAbsolutePath() + " not found");
}
String cmd = (String) tool.currentContext().get(ToolContext.CommandLine);
if (!Lang.isNullOrEmpty(cmd)) {
Map<String, Object> vars = (Map<String, Object>) tool.getContext(Tool.ROOT_CTX).get(ToolContext.VARS);
String[] args = args(cmd);
for (int i = 0; i < args.length; i++) {
vars.put("arg." + i, args[i]);
}
}
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(script)));
CommandResult result = runCommands(name, reader, tool);
if (result != null) {
return result;
}
} catch (Exception ex) {
throw new CommandExecutionException(ex.getMessage(), ex);
} finally {
IOUtils.closeQuietly(reader);
}
return null;
}
use of com.bluenimble.platform.cli.command.CommandResult in project serverless by bluenimble.
the class AbstractTool method processCommand.
@SuppressWarnings({ "unchecked" })
@Override
public int processCommand(String cmdLine) throws IOException {
if (!isAllowed()) {
writeln("not allowed to write commands.");
return FAILURE;
}
if (cmdLine == null) {
cmdLine = readLine();
}
if (cmdLine == null || cmdLine.trim().isEmpty()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
return SUCCESS;
}
String delimeter = getDelimeter();
if (!delimeter.equals("\n")) {
runingCommand.setCmdLine(runingCommand.getCmdLine() + "\n" + cmdLine);
if (!cmdLine.endsWith(currentContext.getDelimiter())) {
return UNTERMINATED;
} else {
cmdLine = runingCommand.getCmdLine();
runingCommand.setCmdLine("");
}
}
if (!delimeter.equals("\n")) {
cmdLine = cmdLine.substring(0, cmdLine.length() - delimeter.length());
}
String commandName;
String params;
String out = null;
cmdLine = cmdLine.trim();
// multiple commands
if (cmdLine.indexOf(COMMAND_CHAINING_TOKEN) > 0) {
String[] aCommands = Lang.split(cmdLine, COMMAND_CHAINING_TOKEN, true);
for (String cmd : aCommands) {
processCommand(cmd);
}
return MULTIPLE;
}
final Map<String, Object> vars = (Map<String, Object>) getContext(Tool.ROOT_CTX).get(ToolContext.VARS);
Calendar now = Calendar.getInstance();
vars.put("day", now.get(Calendar.DAY_OF_MONTH));
vars.put("month", now.get(Calendar.MONTH) + 1);
vars.put("year", now.get(Calendar.YEAR));
vars.put("hour", now.get(Calendar.HOUR));
vars.put("min", now.get(Calendar.MINUTE));
vars.put("sec", now.get(Calendar.SECOND));
vars.put("uuid", Lang.UUID(20).toString());
cmdLine = Lang.resolve(cmdLine, ExpStart, ExpEnd, new Lang.VariableResolver() {
@Override
public String resolve(String ns, String p) {
Object o = vars.get(ns == null ? p : ns + Lang.DOT + p);
if (o == null) {
return null;
}
return String.valueOf(o);
}
});
int indexOfSpace = cmdLine.indexOf(' ');
if (indexOfSpace > 0) {
commandName = cmdLine.substring(0, indexOfSpace);
params = cmdLine.substring(indexOfSpace + 1);
int outIndex = params.lastIndexOf(OUT_TOKEN);
if (outIndex >= 0) {
out = params.substring(outIndex + OUT_TOKEN.length());
params = params.substring(0, outIndex);
}
} else {
commandName = cmdLine;
params = null;
}
if (Lang.isNullOrEmpty(out)) {
out = null;
} else {
out = out.trim();
if (out.startsWith(FilePrefix)) {
vars.put(CMD_OUT, CMD_OUT_FILE);
}
}
commandName = commandName.trim().toLowerCase();
params = onCommand(commandName, params);
Command cmd = getCommand(commandName);
if (cmd == null) {
String synCommandName = getCommandForSynonym(commandName);
if (synCommandName != null) {
cmd = getCommand(synCommandName);
}
}
if (cmd != null) {
if (!cmd.forContext(currentContext)) {
printer.error("Command [" + commandName + "] not found in current context");
} else {
history.add(cmdLine);
if (!cmd.isSingleton(this)) {
try {
cmd = (Command) cmd.getClass().newInstance();
} catch (Throwable th) {
if (isTestMode()) {
printer().content(th.getMessage(), Lang.toString(th));
}
onException(cmd, th);
return FAILURE;
}
}
CommandResult result = null;
try {
final Map<String, CommandOption> options = commandParser.parse(cmd, params);
if (options != null && !options.isEmpty()) {
Iterator<CommandOption> optIter = options.values().iterator();
while (optIter.hasNext()) {
CommandOption option = optIter.next();
if (option.isMasked() && option.acceptsArgs() != CommandOption.NO_ARG && option.getArgsCount() == 0) {
if (System.console() != null) {
char[] aArg = System.console().readPassword("\t- " + option.label() + "? ");
if ((aArg == null || aArg.length == 0)) {
printer.error("'" + option.label() + "' requires at least one argument.");
}
option.addArg(new String(aArg));
} else {
printer.error("'" + option.label() + "' requires at least one argument.");
return FAILURE;
}
}
}
}
if (Lang.AMP.equals(out)) {
final Command tCmd = cmd;
new Thread() {
public void run() {
try {
tCmd.execute(AbstractTool.this, options);
} catch (CommandExecutionException th) {
if (isTestMode()) {
th.printStackTrace(System.out);
}
try {
onException(tCmd, th);
} catch (IOException ioex) {
// ignore
}
}
}
}.start();
printer.info("command is running in background");
} else {
result = cmd.execute(this, options);
}
} catch (Throwable th) {
if (isTestMode()) {
printer.content("Error", Lang.toString(Lang.getRootCause(th)));
} else {
onException(cmd, th);
}
return FAILURE;
}
if (result != null) {
if (result.getType() == CommandResult.OK) {
if (out != null && !Lang.AMP.equals(out) && result.getContent() != null) {
if (out.startsWith(FilePrefix)) {
out = out.substring(FilePrefix.length());
InputStream is = null;
if (result.getContent() instanceof InputStream) {
is = (InputStream) result.getContent();
} else {
Object content = result.getContent();
if (content instanceof YamlObject) {
content = ((YamlObject) content).toJson();
}
is = new ByteArrayInputStream(content.toString().getBytes());
}
OutputStream os = null;
try {
os = new FileOutputStream(new File(out));
IOUtils.copy(is, os);
} catch (Exception e) {
onException(cmd, e);
return FAILURE;
} finally {
IOUtils.closeQuietly(os);
IOUtils.closeQuietly(is);
vars.remove(CMD_OUT);
}
} else {
Object content = result.getContent();
if (content instanceof YamlObject) {
content = ((YamlObject) content).toJson();
}
vars.put(out, content);
}
} else if (result.getContent() != null) {
if (result.getContent() instanceof JsonObject) {
printer().success(Lang.BLANK);
if (printer().isOn()) {
((JsonObject) result.getContent()).write(new FriendlyJsonEmitter(this));
writeln(Lang.BLANK);
}
} else if (result.getContent() instanceof YamlObject) {
printer().success(Lang.BLANK);
if (printer().isOn()) {
YamlObject yaml = (YamlObject) result.getContent();
yaml.print(this, 4);
writeln(Lang.BLANK);
}
} else if (result.getContent() instanceof InputStream) {
System.out.println("result.getContent () instanceof InputStream");
OutputStream os = null;
try {
os = new FileOutputStream(new File(out));
IOUtils.copy(new ByteArrayInputStream(result.getContent().toString().getBytes()), os);
} catch (Exception e) {
onException(cmd, e);
return FAILURE;
} finally {
IOUtils.closeQuietly(os);
}
} else {
printer().success(String.valueOf(result.getContent()));
if (printer().isOn()) {
writeln(Lang.BLANK);
}
}
}
} else if (result.getContent() != null) {
if (result.getContent() instanceof JsonObject) {
printer().error(Lang.BLANK);
((JsonObject) result.getContent()).write(new FriendlyJsonEmitter(this));
writeln(Lang.BLANK);
} else if (result.getContent() instanceof YamlObject) {
printer().error(Lang.BLANK);
if (printer().isOn()) {
YamlObject yaml = (YamlObject) result.getContent();
yaml.print(this, 4);
writeln(Lang.BLANK);
}
} else {
printer.error(String.valueOf(result.getContent()));
writeln(Lang.BLANK);
}
}
}
}
} else {
printer.error("command '" + commandName + "' not found. Type in 'help' to list all available commands");
}
return SUCCESS;
}
use of com.bluenimble.platform.cli.command.CommandResult in project serverless by bluenimble.
the class PrefixedCommand method execute.
@Override
public CommandResult execute(Tool tool, Map<String, CommandOption> options) throws CommandExecutionException {
String cmd = (String) tool.currentContext().get(ToolContext.CommandLine);
if (Lang.isNullOrEmpty(cmd)) {
throw new CommandExecutionException("Command '" + name + "' missing arguments").showUsage();
}
String subject = cmd;
int indexOfSapce = cmd.indexOf(Lang.SPACE);
if (indexOfSapce > 0) {
subject = cmd.substring(0, indexOfSapce).trim();
cmd = cmd.substring(indexOfSapce + 1);
} else {
cmd = null;
}
CommandHandler handler = handlers.get(subject);
if (handler == null) {
throw new CommandExecutionException("'" + getName() + " " + subject + "' not found");
}
// list of commands
String[] commands = Lang.split(cmd, Lang.SEMICOLON);
if (commands != null && commands.length > 1) {
for (String c : commands) {
c = c.trim();
CommandResult result = handler.execute(tool, args(handler.getArgs(), c));
try {
if (result != null && result.getContent() != null) {
if (result.getType() == CommandResult.OK) {
tool.printer().content(null, String.valueOf(result.getContent()));
} else {
tool.printer().error(String.valueOf(result.getContent()));
}
}
} catch (Exception ex) {
// Ignore
}
}
return null;
}
return handler.execute(tool, args(handler.getArgs(), cmd));
}
use of com.bluenimble.platform.cli.command.CommandResult in project serverless by bluenimble.
the class ScriptCommand method execute.
@Override
public CommandResult execute(Tool tool, Map<String, CommandOption> options) throws CommandExecutionException {
CommandOption f = options.get("f");
CommandOption v = options.get("v");
if (f == null && v == null) {
throw new CommandExecutionException("One of the options 'v' or 'f' must be set");
}
String name = null;
BufferedReader reader = null;
if (f != null) {
name = (String) f.getArg(0);
File file = new File(name);
if (!file.exists()) {
throw new CommandExecutionException("File " + name + " not found");
}
if (!file.isFile()) {
throw new CommandExecutionException(name + " is not a valid file");
}
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
} catch (FileNotFoundException e) {
throw new CommandExecutionException(e.getMessage(), e);
}
} else {
name = (String) v.getArg(0);
Object value = tool.currentContext().get(name.trim().toLowerCase());
if (value == null) {
return null;
}
StringBuilder script = new StringBuilder("");
if (value instanceof String[]) {
String[] commands = (String[]) value;
for (String c : commands) {
if (c != null) {
script.append(c).append("\n");
}
}
} else if (Iterable.class.isAssignableFrom(value.getClass())) {
Iterable<?> commands = (Iterable<?>) value;
for (Object c : commands) {
if (c != null) {
script.append(c).append("\n");
}
}
} else {
script.append(value);
}
String s = script.toString().trim();
script.setLength(0);
if (s.isEmpty()) {
return null;
}
reader = new BufferedReader(new StringReader(s));
}
/*
if (reader == null) {
return new DefaultCommandResult (CommandResult.OK, "WARN: Empty Script");
}*/
CommandOption sm = options.get("sm");
if (sm != null) {
tool.writeln("Running script [" + name + "] using safe mode");
}
long start = System.currentTimeMillis();
try {
CommandResult result = runCommands(name, reader, tool, sm != null);
if (result != null) {
return result;
}
} finally {
try {
reader.close();
} catch (IOException ioex) {
// IGNORE
}
}
long end = System.currentTimeMillis();
return new DefaultCommandResult(CommandResult.OK, "\n'" + name + "' executed with success. Time ( " + ((end - start) / 1000) + " seconds)");
}
Aggregations