use of com.bluenimble.platform.cli.printing.impls.FriendlyJsonEmitter 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;
}
Aggregations