import java.io.File;
import java.io.IOException;
import java.net.URL;
+import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.onap.cli.fw.error.OnapCommandException;
import org.onap.cli.fw.error.OnapCommandInvalidParameterValue;
import org.onap.cli.fw.input.OnapCommandParameterType;
import org.onap.cli.main.error.OnapCliArgumentValueMissing;
import org.onap.cli.main.error.OnapCliInvalidArgument;
+import com.esotericsoftware.yamlbeans.YamlReader;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonElement;
+import com.google.gson.reflect.TypeToken;
-import net.minidev.json.JSONObject;
+import java.io.Reader;
+import java.io.InputStreamReader;
+import java.io.FileReader;
/**
* Oclip CLI utilities.
*
*/
public class OnapCliArgsParser {
+ private static Gson gson = new GsonBuilder().serializeNulls().create();
/**
* private Constructor.
}
int positionalIdx = 0;
- // Skip the first args oclip cmd name, so start from 1
- for (int i = 1; i < args.size(); i++) {
+ for (int i = 0; i < args.size(); i++) {
String paramName = null;
if (shortOptionMap.containsKey(args.get(i))) {
paramName = shortOptionMap.get(args.get(i));
// end of the list or if its option rather than a value
if ((i + 1) == args.size() || args.get(i + 1).startsWith("-")) {
if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.BOOL)) {
- paramMap.get(paramName).setValue("true");
+ paramMap.get(paramName).setValue(true);
continue;
}
throw new OnapCliArgumentValueMissing(args.get(i));
paramMap.get(paramName).getName()));
i++;
continue;
- } if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.TEXT)) {
+
+ } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.TEXT)) {
paramMap.get(paramName).setValue(readTextStringFromUrl(args.get(i + 1),
paramMap.get(paramName).getName()));
i++;
continue;
+
+ } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.YAML)) {
+ String value = readYamlStringFromUrl(args.get(i + 1),
+ paramMap.get(paramName).getName());
+ paramMap.get(paramName).setValue(value);
+ i++;
+ continue;
+
+ } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.BYTE)) {
+ paramMap.get(paramName).setValue(readBytesFromUrl(args.get(i + 1),
+ paramMap.get(paramName).getName()));
+ i++;
+ continue;
+
} else if (paramMap.get(paramName).getParameterType()
.equals(OnapCommandParameterType.ARRAY)) {
Object value = paramMap.get(paramName).getValue();
- List<String> list;
- if (value == "") {
- list = new ArrayList<>();
- } else {
- list = convertJsonToListString(paramMap.get(paramName).getName(),
- value.toString());
- }
- list.add(args.get(i + 1));
+ List<String> list = (List<String>) value;
+
+ list.add(readTextStringFromUrl(args.get(i + 1), paramMap.get(paramName).getName()));
paramMap.get(paramName).setValue(list);
i++;
continue;
- } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.MAP)) {
- Object value = paramMap.get(paramName).getValue();
- Map<String, String> map;
+ } else if (paramMap.get(paramName).getParameterType()
+ .equals(OnapCommandParameterType.MAP)) {
+ Object value = paramMap.get(paramName).getValue();
- if (value == "") {
- map = new HashMap<>();
- } else {
- map = convertJsonToMapString(paramMap.get(paramName).getName(),
- value.toString());
- }
+ Map<String, String> map = (Map<String, String>) value;
String arg = args.get(i + 1);
- String[] argArr = arg.split("=");
+ String[] argArr = arg.split("=", 2);
if (argArr.length != 2) {
- throw new OnapCliInvalidArgument(paramMap.get(paramName).getName());
+ throw new OnapCliInvalidArgument(
+ paramMap.get(paramName).getName(),
+ "it should be in the form of <key>=<value>");
}
+ //Make sure to read values from file, in case file path is given.
+ //map.put(argArr[0], readTextStringFromUrl(argArr[1], paramMap.get(paramName).getName()));
map.put(argArr[0], argArr[1]);
paramMap.get(paramName).setValue(map);
i++;
// it is positional option
// Positional arg is missing from the params
if (positionalIdx >= positionArgs.size()) {
- throw new OnapCliInvalidArgument(args.get(i));
+ throw new OnapCliInvalidArgument(
+ args.get(i),
+ "No positional argument is defined for this one");
}
paramMap.get(positionArgs.get(positionalIdx)).setValue(args.get(i));
params.addAll(paramMap.values());
}
- private static String readJsonStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
- ObjectMapper mapper = new ObjectMapper();
+ public static String readJsonStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
+ String jsonValue;
try {
File file = new File(input);
if (file.isFile()) {
- return mapper.readValue(file, JSONObject.class).toJSONString();
+ try(Reader reader = new FileReader(file)){
+ jsonValue = gson.fromJson(reader, JsonElement.class).toString();
+ }
+ return jsonValue;
} else if (input.startsWith("file:") || input.startsWith("http:") || input.startsWith("ftp:")) {
URL jsonUrl = new URL(input);
- return mapper.readValue(jsonUrl, JSONObject.class).toJSONString();
+ try(Reader reader = new InputStreamReader(jsonUrl.openStream())){
+ jsonValue = gson.fromJson(reader, JsonElement.class).toString();
+ }
+ return jsonValue;
+ } else {
+ return gson.fromJson(input, JsonElement.class).toString();
+ }
+ } catch (Exception e) { // NOSONAR
+ throw new OnapCliInvalidArgument(argName, e);
+ }
+ }
+
+ public static String readTextStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
+ try {
+ File file = new File(input);
+ if (file.isFile()) {
+ return FileUtils.readFileToString(file, (Charset) null);
} else {
- return mapper.readValue(input, JSONObject.class).toJSONString();
+ return input;
}
+
} catch (IOException e) {
throw new OnapCliInvalidArgument(argName, e);
}
}
- private static String readTextStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
+ public static String readYamlStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
try {
File file = new File(input);
if (file.isFile()) {
- return FileUtils.readFileToString(file);
+ String value = FileUtils.readFileToString(file, (Charset) null);
+ YamlReader reader = new YamlReader(value);
+ value = (String) reader.read();
+ return value;
} else {
return input;
}
}
}
- private static List<String> convertJsonToListString(String arg, String json) throws OnapCliInvalidArgument {
- TypeReference<List<String>> mapType = new TypeReference<List<String>>() {
- };
+ public static String readBytesFromUrl(String input, String argName) throws OnapCliInvalidArgument {
try {
- return new ObjectMapper().readValue(json, mapType);
+ File file = new File(input);
+ if (file.isFile()) {
+ byte[] encodeBase64 = Base64.encodeBase64(FileUtils.readFileToByteArray(file));
+ return new String(encodeBase64);
+ } else {
+ byte[] encodeBase64 = Base64.encodeBase64(input.getBytes());
+ return new String(encodeBase64);
+ }
} catch (IOException e) {
+ throw new OnapCliInvalidArgument(argName, e);
+ }
+ }
+
+ public static List<String> convertJsonToListString(String arg, String json) throws OnapCliInvalidArgument {
+ TypeToken<List<String>> mapType = new TypeToken<List<String>>() {
+ };
+ try {
+ return gson.fromJson(json, mapType.getType());
+ } catch (Exception e) { // NOSONAR
throw new OnapCliInvalidArgument(arg, e);
}
}
- private static Map<String, String> convertJsonToMapString(String arg, String json) throws OnapCliInvalidArgument {
- TypeReference<Map<String, String>> mapType = new TypeReference<Map<String, String>>() {
+ public static Map<String, String> convertJsonToMapString(String arg, String json) throws OnapCliInvalidArgument {
+ TypeToken<Map<String, String>> mapType = new TypeToken<Map<String, String>>() {
};
try {
- return new ObjectMapper().readValue(json, mapType);
- } catch (IOException e) {
+ return gson.fromJson(json, mapType.getType());
+ } catch (Exception e) { // NOSONAR
throw new OnapCliInvalidArgument(arg, e);
}
}