From 9f26a5983e007f8e888af3dd8d1382c83fce446b Mon Sep 17 00:00:00 2001 From: Kanagaraj Manickam k00365106 Date: Thu, 28 Feb 2019 12:29:27 +0530 Subject: CMD: Enhace command profile with additional macros Issue-ID: CLI-129 Change-Id: I612ecfe2c25f73714a8759ce87fdc373c8d5a7f0 Signed-off-by: Kanagaraj Manickam k00365106 --- .../org/onap/cli/fw/output/OnapCommandResult.java | 73 +++++---- .../java/org/onap/cli/fw/utils/ProcessRunner.java | 166 +++++++++++++++++++++ 2 files changed, 209 insertions(+), 30 deletions(-) create mode 100644 framework/src/main/java/org/onap/cli/fw/utils/ProcessRunner.java (limited to 'framework/src/main/java') diff --git a/framework/src/main/java/org/onap/cli/fw/output/OnapCommandResult.java b/framework/src/main/java/org/onap/cli/fw/output/OnapCommandResult.java index 0b9f9be7..ca0f04e7 100644 --- a/framework/src/main/java/org/onap/cli/fw/output/OnapCommandResult.java +++ b/framework/src/main/java/org/onap/cli/fw/output/OnapCommandResult.java @@ -42,7 +42,7 @@ public class OnapCommandResult { * * if type=TEXT, then it holds the result in text format such as help message */ - private Object output; + private Object output = new String(""); /* * Type requested by user @@ -84,6 +84,13 @@ public class OnapCommandResult { */ private boolean isDebug = false; + /** + * Command passed/failed + * @return + */ + + private boolean passed = true; + public OnapCommandPrintDirection getPrintDirection() { return printDirection; } @@ -192,43 +199,41 @@ public class OnapCommandResult { * exception */ public String print() throws OnapCommandException { - if (this.getRecords().isEmpty()) { - return ""; - } else if (this.getType().equals(OnapCommandResultType.TEXT)) { - return this.getOutput().toString(); + if (this.getType().equals(OnapCommandResultType.TEXT)) { + return this.getOutput().toString(); } OnapCommandPrint print = new OnapCommandPrint(); print.setPrintTitle(this.isIncludeTitle()); - if (this.getPrintDirection().equals(OnapCommandPrintDirection.LANDSCAPE)) { - for (OnapCommandResultAttribute record : this.getScopedRecords()) { - if (record.getType().equals(OnapCommandParameterType.JSON)) { - print.addColumn(record.getName(), OnapCommandUtils.jsonFlatten(record.getValues())); - } else { + print.setDirection(this.printDirection); + + if (!this.getRecords().isEmpty()) { + if (this.getPrintDirection().equals(OnapCommandPrintDirection.LANDSCAPE)) { + for (OnapCommandResultAttribute record : this.getScopedRecords()) { print.addColumn(record.getName(), record.getValues()); } - } - } else { - // Add property column - OnapCommandResultAttribute prp = new OnapCommandResultAttribute(); - prp.setName(OnapCommandConstants.PORTRAINT_COLUMN_NAME_PROPERTY); - prp.setScope(OnapCommandResultAttributeScope.SHORT); - // Add value column - OnapCommandResultAttribute val = new OnapCommandResultAttribute(); - val.setName(OnapCommandConstants.PORTRAINT_COLUMN_NAME_VALUE); - val.setScope(OnapCommandResultAttributeScope.SHORT); - - for (OnapCommandResultAttribute record : this.getScopedRecords()) { - prp.getValues().add(record.getName()); - if (record.getValues().size() == 1) { - val.getValues().add(record.getValues().get(0)); - } else { - val.getValues().add(record.getValues().toString()); + } else { + // Add property column + OnapCommandResultAttribute prp = new OnapCommandResultAttribute(); + prp.setName(OnapCommandConstants.PORTRAINT_COLUMN_NAME_PROPERTY); + prp.setScope(OnapCommandResultAttributeScope.SHORT); + // Add value column + OnapCommandResultAttribute val = new OnapCommandResultAttribute(); + val.setName(OnapCommandConstants.PORTRAINT_COLUMN_NAME_VALUE); + val.setScope(OnapCommandResultAttributeScope.SHORT); + + for (OnapCommandResultAttribute record : this.getScopedRecords()) { + prp.getValues().add(record.getName()); + if (record.getValues().size() == 1) { + val.getValues().add(record.getValues().get(0)); + } else { + val.getValues().add(record.getValues().toString()); + } } - } - print.addColumn(prp.getName(), prp.getValues()); - print.addColumn(val.getName(), val.getValues()); + print.addColumn(prp.getName(), prp.getValues()); + print.addColumn(val.getName(), val.getValues()); + } } if (this.getType().equals(OnapCommandResultType.JSON)) { @@ -255,4 +260,12 @@ public class OnapCommandResult { return recordList; } + + public boolean isPassed() { + return passed; + } + + public void setPassed(boolean passed) { + this.passed = passed; + } } diff --git a/framework/src/main/java/org/onap/cli/fw/utils/ProcessRunner.java b/framework/src/main/java/org/onap/cli/fw/utils/ProcessRunner.java new file mode 100644 index 00000000..b373a913 --- /dev/null +++ b/framework/src/main/java/org/onap/cli/fw/utils/ProcessRunner.java @@ -0,0 +1,166 @@ +/* + * Copyright 2018 Huawei Technologies Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.cli.fw.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.io.IOUtils; + +public class ProcessRunner { + public static final String WIN_SHELL = "cmd.exe /c "; + public static final String UNIX_SHELL = "sh -c "; + private String []cmd = null; + private String shell = System.getProperty("os.name").toLowerCase().startsWith("windows") ? WIN_SHELL : UNIX_SHELL; + private String cwd = System.getProperty("user.home"); + private String []env = null; + private int exitCode = -1; + private String output; + private String error; + private Map results; + + public ProcessRunner(String []cmd, String []env, String cwd) { + this.cmd = cmd; + + if (cwd != null && !cwd.isEmpty()) { + this.cwd = cwd; + } + + this.env = env; + } + + public void overrideToUnix() { + this.shell = UNIX_SHELL; + } + + public ProcessRunner(String []cmd, String cwd) { + this(cmd, null, cwd); + } + + public ProcessRunner(String []cmd) { + this(cmd, null, null); + } + + public ProcessRunner(String cmd, String []env, String cwd) { + this(new String []{cmd}, env, cwd); + } + + public ProcessRunner(String cmd, String cwd) { + this(new String []{cmd}, null, cwd); + } + + public ProcessRunner(String cmd) { + this(new String []{cmd}, null, null); + } + + @SuppressWarnings("unchecked") + public void run() throws InterruptedException, IOException { + Process p = null; + final StringWriter writerOutput = new StringWriter(); + final StringWriter writerError = new StringWriter(); + if (this.cmd.length == 1) { + p = Runtime.getRuntime().exec(this.shell + this.cmd[0], this.env, null); + } else { + List list = new ArrayList(Arrays.asList(this.shell.split(" "))); + list.addAll(Arrays.asList(this.cmd)); + String []cmds = Arrays.copyOf(list.toArray(), list.size(), String[].class); + p = Runtime.getRuntime().exec(cmds, this.env, null); + } + + final Process p1 = p; + new Thread(new Runnable() { + public void run() { + try { + IOUtils.copy(p1.getInputStream(), writerOutput); + } catch (IOException e) { + } + } + }).start(); + + new Thread(new Runnable() { + public void run() { + try { + IOUtils.copy(p1.getErrorStream(), writerError); + } catch (IOException e) { + } + } + }).start(); + + //mrkanag: handle the case if the given cmd does not exist + p.waitFor(1, TimeUnit.MINUTES); + this.exitCode = p.exitValue(); + this.output = writerOutput.toString(); + this.error = writerError.toString(); + p.destroy(); + } + + public String streamToString(InputStream stream) throws IOException { + StringBuilder sb = new StringBuilder(); + BufferedReader br = null; + try { + br = new BufferedReader(new InputStreamReader(stream)); + String line = null; + while ((line = br.readLine()) != null) { + sb.append(line + System.getProperty("line.separator")); + } + } finally { + if (br != null) { + br.close(); + } + } + return sb.toString(); + } + + public int getExitCode() { + return this.exitCode; + } + + public String getOutput() { + return this.output; + } + + public String getError() { + return this.error; + } + + public static void main(String[] args) { + try { + ProcessRunner pr = new ProcessRunner("dir", null); + pr.run(); + System.out.println(pr.getOutput()); + System.out.println(pr.getError()); + System.out.println(pr.getExitCode()); + + pr = new ProcessRunner(new String [] {"dir", "c:"}, null); + pr.run(); + System.out.println(pr.getOutput()); + System.out.println(pr.getError()); + System.out.println(pr.getExitCode()); + + } catch (InterruptedException | IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file -- cgit 1.2.3-korg