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.io.FileUtils;
29 import org.onap.cli.fw.error.OnapCommandException;
30 import org.onap.cli.fw.error.OnapCommandInvalidParameterValue;
31 import org.onap.cli.fw.input.OnapCommandParameter;
32 import org.onap.cli.fw.input.OnapCommandParameterType;
33 import org.onap.cli.main.error.OnapCliArgumentValueMissing;
34 import org.onap.cli.main.error.OnapCliInvalidArgument;
36 import com.fasterxml.jackson.core.type.TypeReference;
37 import com.fasterxml.jackson.databind.ObjectMapper;
39 import net.minidev.json.JSONObject;
42 * Oclip CLI utilities.
45 public class OnapCliArgsParser {
48 * private Constructor.
50 private OnapCliArgsParser() {
55 * It read thru the args and populate the given params for short optional, long option and postional args the idx of
56 * positional args, is calculated based on the position at which it present in the params and args.
59 * List of command paramters
62 * @throws OnapCliArgumentValueMissing
63 * ArgumentValueMissing exception
64 * @throws OnapCliInvalidArgument
65 * Invalid argument exception
66 * @throws OnapCommandInvalidParameterValue
69 public static void populateParams(Set<OnapCommandParameter> params, List<String> args)
70 throws OnapCommandException {
71 Map<String, String> shortOptionMap = new HashMap<>();
72 Map<String, String> longOptionMap = new HashMap<>();
73 List<String> positionArgs = new ArrayList<>();
74 Map<String, OnapCommandParameter> paramMap = new HashMap<>();
76 for (OnapCommandParameter param : params) {
77 boolean positional = true;
78 if (param.getShortOption() != null) {
79 shortOptionMap.put(OnapCommandParameter.printShortOption(param.getShortOption()), param.getName());
82 if (param.getLongOption() != null) {
83 longOptionMap.put(OnapCommandParameter.printLongOption(param.getLongOption()), param.getName());
88 positionArgs.add(param.getName());
91 paramMap.put(param.getName(), param);
94 int positionalIdx = 0;
95 // Skip the first args oclip cmd name, so start from 1
96 for (int i = 1; i < args.size(); i++) {
97 String paramName = null;
98 if (shortOptionMap.containsKey(args.get(i))) {
99 paramName = shortOptionMap.get(args.get(i));
100 } else if (longOptionMap.containsKey(args.get(i))) {
101 paramName = longOptionMap.get(args.get(i));
104 if (paramName != null) {
105 // end of the list or if its option rather than a value
106 if ((i + 1) == args.size() || args.get(i + 1).startsWith("-")) {
107 if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.BOOL)) {
108 paramMap.get(paramName).setValue("true");
111 throw new OnapCliArgumentValueMissing(args.get(i));
114 if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.JSON)) {
115 paramMap.get(paramName).setValue(readJsonStringFromUrl(args.get(i + 1),
116 paramMap.get(paramName).getName()));
119 } if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.TEXT)) {
120 paramMap.get(paramName).setValue(readTextStringFromUrl(args.get(i + 1),
121 paramMap.get(paramName).getName()));
124 } else if (paramMap.get(paramName).getParameterType()
125 .equals(OnapCommandParameterType.ARRAY)) {
126 Object value = paramMap.get(paramName).getValue();
129 list = new ArrayList<>();
131 list = convertJsonToListString(paramMap.get(paramName).getName(),
134 list.add(args.get(i + 1));
135 paramMap.get(paramName).setValue(list);
138 } else if (paramMap.get(paramName).getParameterType().equals(OnapCommandParameterType.MAP)) {
139 Object value = paramMap.get(paramName).getValue();
141 Map<String, String> map;
144 map = new HashMap<>();
146 map = convertJsonToMapString(paramMap.get(paramName).getName(),
150 String arg = args.get(i + 1);
151 String[] argArr = arg.split("=");
153 if (argArr.length != 2) {
154 throw new OnapCliInvalidArgument(paramMap.get(paramName).getName());
157 map.put(argArr[0], argArr[1]);
158 paramMap.get(paramName).setValue(map);
163 paramMap.get(paramName).setValue(args.get(i + 1));
169 // it is positional option
170 // Positional arg is missing from the params
171 if (positionalIdx >= positionArgs.size()) {
172 throw new OnapCliInvalidArgument(args.get(i));
175 paramMap.get(positionArgs.get(positionalIdx)).setValue(args.get(i));
180 params.addAll(paramMap.values());
183 private static String readJsonStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
184 ObjectMapper mapper = new ObjectMapper();
186 File file = new File(input);
188 return mapper.readValue(file, JSONObject.class).toJSONString();
189 } else if (input.startsWith("file:") || input.startsWith("http:") || input.startsWith("ftp:")) {
190 URL jsonUrl = new URL(input);
191 return mapper.readValue(jsonUrl, JSONObject.class).toJSONString();
193 return mapper.readValue(input, JSONObject.class).toJSONString();
195 } catch (IOException e) {
196 throw new OnapCliInvalidArgument(argName, e);
200 private static String readTextStringFromUrl(String input, String argName) throws OnapCliInvalidArgument {
202 File file = new File(input);
204 return FileUtils.readFileToString(file);
209 } catch (IOException e) {
210 throw new OnapCliInvalidArgument(argName, e);
214 private static List<String> convertJsonToListString(String arg, String json) throws OnapCliInvalidArgument {
215 TypeReference<List<String>> mapType = new TypeReference<List<String>>() {
218 return new ObjectMapper().readValue(json, mapType);
219 } catch (IOException e) {
220 throw new OnapCliInvalidArgument(arg, e);
224 private static Map<String, String> convertJsonToMapString(String arg, String json) throws OnapCliInvalidArgument {
225 TypeReference<Map<String, String>> mapType = new TypeReference<Map<String, String>>() {
228 return new ObjectMapper().readValue(json, mapType);
229 } catch (IOException e) {
230 throw new OnapCliInvalidArgument(arg, e);