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 org.yaml.snakeyaml.Yaml;
38 import com.fasterxml.jackson.core.type.TypeReference;
39 import com.fasterxml.jackson.databind.ObjectMapper;
41 import net.minidev.json.JSONObject;
44 * Oclip CLI utilities.
47 public class OnapCliArgsParser {
50 * private Constructor.
52 private OnapCliArgsParser() {
57 * It read thru the args and populate the given params for short optional, long option and postional args the idx of
58 * positional args, is calculated based on the position at which it present in the params and args.
61 * List of command paramters
64 * @throws OnapCliArgumentValueMissing
65 * ArgumentValueMissing exception
66 * @throws OnapCliInvalidArgument
67 * Invalid argument exception
68 * @throws OnapCommandInvalidParameterValue
71 public static void populateParams(Set<OnapCommandParameter> params, List<String> args)
72 throws OnapCommandException {
73 Map<String, String> shortOptionMap = new HashMap<>();
74 Map<String, String> longOptionMap = new HashMap<>();
75 List<String> positionArgs = new ArrayList<>();
76 Map<String, OnapCommandParameter> paramMap = new HashMap<>();
78 for (OnapCommandParameter param : params) {
79 boolean positional = true;
80 if (param.getShortOption() != null) {
81 shortOptionMap.put(OnapCommandParameter.printShortOption(param.getShortOption()), param.getName());
84 if (param.getLongOption() != null) {
85 longOptionMap.put(OnapCommandParameter.printLongOption(param.getLongOption()), param.getName());
90 positionArgs.add(param.getName());
93 paramMap.put(param.getName(), param);
96 int positionalIdx = 0;
97 for (int i = 0; i < args.size(); i++) {
98 String paramName = null;
99 if (shortOptionMap.containsKey(args.get(i))) {
100 paramName = shortOptionMap.get(args.get(i));
101 } else if (longOptionMap.containsKey(args.get(i))) {
102 paramName = longOptionMap.get(args.get(i));
105 if (paramName != null) {
106 // end of the list or if its option rather than a value
107 if ((i + 1) == args.size() || args.get(i + 1).startsWith("-")) {
108 if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.BOOL)) {
109 paramMap.get(paramName).setValue(true);
112 throw new OnapCliArgumentValueMissing(args.get(i));
115 if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.JSON)) {
116 paramMap.get(paramName).setValue(readJsonStringFromUrl(args.get(i + 1),
117 paramMap.get(paramName).getName()));
121 } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.TEXT)) {
122 paramMap.get(paramName).setValue(readTextStringFromUrl(args.get(i + 1),
123 paramMap.get(paramName).getName()));
127 } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.YAML)) {
128 String value = readYamlStringFromUrl(args.get(i + 1),
129 paramMap.get(paramName).getName());
130 paramMap.get(paramName).setValue(value);
134 } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.BYTE)) {
135 paramMap.get(paramName).setValue(readBytesFromUrl(args.get(i + 1),
136 paramMap.get(paramName).getName()));
140 } else if (paramMap.get(paramName).getParameterType()
141 .equals(OnapCommandParameterType.ARRAY)) {
142 Object value = paramMap.get(paramName).getValue();
143 List<String> list = (List<String>) value;
145 list.add(readTextStringFromUrl(args.get(i + 1), paramMap.get(paramName).getName()));
146 paramMap.get(paramName).setValue(list);
150 } else if (paramMap.get(paramName).getParameterType()
151 .equals(OnapCommandParameterType.MAP)) {
152 Object value = paramMap.get(paramName).getValue();
154 Map<String, String> map = (Map<String, String>) value;
156 String arg = args.get(i + 1);
157 String[] argArr = arg.split("=", 2);
159 if (argArr.length != 2) {
160 throw new OnapCliInvalidArgument(
161 paramMap.get(paramName).getName(),
162 "it should be in the form of <key>=<value>");
165 //Make sure to read values from file, in case file path is given.
166 //map.put(argArr[0], readTextStringFromUrl(argArr[1], paramMap.get(paramName).getName()));
167 map.put(argArr[0], argArr[1]);
168 paramMap.get(paramName).setValue(map);
173 paramMap.get(paramName).setValue(args.get(i + 1));
179 // it is positional option
180 // Positional arg is missing from the params
181 if (positionalIdx >= positionArgs.size()) {
182 throw new OnapCliInvalidArgument(
184 "No positional argument is defined for this one");
187 paramMap.get(positionArgs.get(positionalIdx)).setValue(args.get(i));
192 params.addAll(paramMap.values());
195 public static String readJsonStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
196 ObjectMapper mapper = new ObjectMapper();
198 File file = new File(input);
200 return mapper.readValue(file, JSONObject.class).toJSONString();
201 } else if (input.startsWith("file:") || input.startsWith("http:") || input.startsWith("ftp:")) {
202 URL jsonUrl = new URL(input);
203 return mapper.readValue(jsonUrl, JSONObject.class).toJSONString();
205 return mapper.readValue(input, JSONObject.class).toJSONString();
207 } catch (IOException e) {
208 throw new OnapCliInvalidArgument(argName, e);
212 public static String readTextStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
214 File file = new File(input);
216 return FileUtils.readFileToString(file);
221 } catch (IOException e) {
222 throw new OnapCliInvalidArgument(argName, e);
226 public static String readYamlStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
228 File file = new File(input);
230 String value = FileUtils.readFileToString(file);
231 new Yaml().load(value);
237 } catch (IOException e) {
238 throw new OnapCliInvalidArgument(argName, e);
242 public static String readBytesFromUrl(String input, String argName) throws OnapCliInvalidArgument {
244 File file = new File(input);
246 byte[] encodeBase64 = Base64.encodeBase64(FileUtils.readFileToByteArray(file));
247 return new String(encodeBase64);
249 byte[] encodeBase64 = Base64.encodeBase64(input.getBytes());
250 return new String(encodeBase64);
252 } catch (IOException e) {
253 throw new OnapCliInvalidArgument(argName, e);
257 public static List<String> convertJsonToListString(String arg, String json) throws OnapCliInvalidArgument {
258 TypeReference<List<String>> mapType = new TypeReference<List<String>>() {
261 return new ObjectMapper().readValue(json, mapType);
262 } catch (IOException e) {
263 throw new OnapCliInvalidArgument(arg, e);
267 public static Map<String, String> convertJsonToMapString(String arg, String json) throws OnapCliInvalidArgument {
268 TypeReference<Map<String, String>> mapType = new TypeReference<Map<String, String>>() {
271 return new ObjectMapper().readValue(json, mapType);
272 } catch (IOException e) {
273 throw new OnapCliInvalidArgument(arg, e);