2 * Copyright 2017 Huawei Technologies Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.cli.main.utils;
20 import java.io.IOException;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.List;
28 import org.apache.commons.codec.binary.Base64;
29 import org.apache.commons.io.FileUtils;
30 import org.onap.cli.fw.error.OnapCommandException;
31 import org.onap.cli.fw.error.OnapCommandInvalidParameterValue;
32 import org.onap.cli.fw.input.OnapCommandParameter;
33 import org.onap.cli.fw.input.OnapCommandParameterType;
34 import org.onap.cli.main.error.OnapCliArgumentValueMissing;
35 import org.onap.cli.main.error.OnapCliInvalidArgument;
36 import com.esotericsoftware.yamlbeans.YamlReader;
38 import com.google.gson.Gson;
39 import com.google.gson.GsonBuilder;
40 import com.google.gson.JsonElement;
41 import com.google.gson.reflect.TypeToken;
43 import java.io.Reader;
44 import java.io.InputStreamReader;
45 import java.io.FileReader;
48 * Oclip CLI utilities.
51 public class OnapCliArgsParser {
52 private static Gson gson = new GsonBuilder().serializeNulls().create();
55 * private Constructor.
57 private OnapCliArgsParser() {
62 * It read thru the args and populate the given params for short optional, long option and postional args the idx of
63 * positional args, is calculated based on the position at which it present in the params and args.
66 * List of command paramters
69 * @throws OnapCliArgumentValueMissing
70 * ArgumentValueMissing exception
71 * @throws OnapCliInvalidArgument
72 * Invalid argument exception
73 * @throws OnapCommandInvalidParameterValue
76 public static void populateParams(Set<OnapCommandParameter> params, List<String> args)
77 throws OnapCommandException {
78 Map<String, String> shortOptionMap = new HashMap<>();
79 Map<String, String> longOptionMap = new HashMap<>();
80 List<String> positionArgs = new ArrayList<>();
81 Map<String, OnapCommandParameter> paramMap = new HashMap<>();
83 for (OnapCommandParameter param : params) {
84 boolean positional = true;
85 if (param.getShortOption() != null) {
86 shortOptionMap.put(OnapCommandParameter.printShortOption(param.getShortOption()), param.getName());
89 if (param.getLongOption() != null) {
90 longOptionMap.put(OnapCommandParameter.printLongOption(param.getLongOption()), param.getName());
95 positionArgs.add(param.getName());
98 paramMap.put(param.getName(), param);
101 int positionalIdx = 0;
102 for (int i = 0; i < args.size(); i++) {
103 String paramName = null;
104 if (shortOptionMap.containsKey(args.get(i))) {
105 paramName = shortOptionMap.get(args.get(i));
106 } else if (longOptionMap.containsKey(args.get(i))) {
107 paramName = longOptionMap.get(args.get(i));
110 if (paramName != null) {
111 // end of the list or if its option rather than a value
112 if ((i + 1) == args.size() || args.get(i + 1).startsWith("-")) {
113 if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.BOOL)) {
114 paramMap.get(paramName).setValue(true);
117 throw new OnapCliArgumentValueMissing(args.get(i));
120 if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.JSON)) {
121 paramMap.get(paramName).setValue(readJsonStringFromUrl(args.get(i + 1),
122 paramMap.get(paramName).getName()));
126 } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.TEXT)) {
127 paramMap.get(paramName).setValue(readTextStringFromUrl(args.get(i + 1),
128 paramMap.get(paramName).getName()));
132 } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.YAML)) {
133 String value = readYamlStringFromUrl(args.get(i + 1),
134 paramMap.get(paramName).getName());
135 paramMap.get(paramName).setValue(value);
139 } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.BYTE)) {
140 paramMap.get(paramName).setValue(readBytesFromUrl(args.get(i + 1),
141 paramMap.get(paramName).getName()));
145 } else if (paramMap.get(paramName).getParameterType()
146 .equals(OnapCommandParameterType.ARRAY)) {
147 Object value = paramMap.get(paramName).getValue();
148 List<String> list = (List<String>) value;
150 list.add(readTextStringFromUrl(args.get(i + 1), paramMap.get(paramName).getName()));
151 paramMap.get(paramName).setValue(list);
155 } else if (paramMap.get(paramName).getParameterType()
156 .equals(OnapCommandParameterType.MAP)) {
157 Object value = paramMap.get(paramName).getValue();
159 Map<String, String> map = (Map<String, String>) value;
161 String arg = args.get(i + 1);
162 String[] argArr = arg.split("=", 2);
164 if (argArr.length != 2) {
165 throw new OnapCliInvalidArgument(
166 paramMap.get(paramName).getName(),
167 "it should be in the form of <key>=<value>");
170 //Make sure to read values from file, in case file path is given.
171 //map.put(argArr[0], readTextStringFromUrl(argArr[1], paramMap.get(paramName).getName()));
172 map.put(argArr[0], argArr[1]);
173 paramMap.get(paramName).setValue(map);
178 paramMap.get(paramName).setValue(args.get(i + 1));
184 // it is positional option
185 // Positional arg is missing from the params
186 if (positionalIdx >= positionArgs.size()) {
187 throw new OnapCliInvalidArgument(
189 "No positional argument is defined for this one");
192 paramMap.get(positionArgs.get(positionalIdx)).setValue(args.get(i));
197 params.addAll(paramMap.values());
200 public static String readJsonStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
203 File file = new File(input);
205 try(Reader reader = new FileReader(file)){
206 jsonValue = gson.fromJson(reader, JsonElement.class).toString();
209 } else if (input.startsWith("file:") || input.startsWith("http:") || input.startsWith("ftp:")) {
210 URL jsonUrl = new URL(input);
211 try(Reader reader = new InputStreamReader(jsonUrl.openStream())){
212 jsonValue = gson.fromJson(reader, JsonElement.class).toString();
216 return gson.fromJson(input, JsonElement.class).toString();
218 } catch (Exception e) { // NOSONAR
219 throw new OnapCliInvalidArgument(argName, e);
223 public static String readTextStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
225 File file = new File(input);
227 return FileUtils.readFileToString(file);
232 } catch (IOException e) {
233 throw new OnapCliInvalidArgument(argName, e);
237 public static String readYamlStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
239 File file = new File(input);
241 String value = FileUtils.readFileToString(file);
242 YamlReader reader = new YamlReader(value);
243 value = (String) reader.read();
249 } catch (IOException e) {
250 throw new OnapCliInvalidArgument(argName, e);
254 public static String readBytesFromUrl(String input, String argName) throws OnapCliInvalidArgument {
256 File file = new File(input);
258 byte[] encodeBase64 = Base64.encodeBase64(FileUtils.readFileToByteArray(file));
259 return new String(encodeBase64);
261 byte[] encodeBase64 = Base64.encodeBase64(input.getBytes());
262 return new String(encodeBase64);
264 } catch (IOException e) {
265 throw new OnapCliInvalidArgument(argName, e);
269 public static List<String> convertJsonToListString(String arg, String json) throws OnapCliInvalidArgument {
270 TypeToken<List<String>> mapType = new TypeToken<List<String>>() {
273 return gson.fromJson(json, mapType.getType());
274 } catch (Exception e) { // NOSONAR
275 throw new OnapCliInvalidArgument(arg, e);
279 public static Map<String, String> convertJsonToMapString(String arg, String json) throws OnapCliInvalidArgument {
280 TypeToken<Map<String, String>> mapType = new TypeToken<Map<String, String>>() {
283 return gson.fromJson(json, mapType.getType());
284 } catch (Exception e) { // NOSONAR
285 throw new OnapCliInvalidArgument(arg, e);