2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.ccsdk.sli.plugins.restapicall;
24 import java.util.ArrayList;
25 import java.util.HashMap;
26 import java.util.List;
28 import org.apache.commons.text.StringEscapeUtils;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
32 public final class XmlJsonUtil {
34 private static final Logger log = LoggerFactory.getLogger(XmlJsonUtil.class);
36 private XmlJsonUtil() {
37 // Preventing instantiation of the same.
40 public static String getXml(Map<String, String> varmap, String var) {
41 boolean escape = true;
42 if (var.startsWith("'")) {
43 var = var.substring(1);
47 Object o = createStructure(varmap, var);
48 return generateXml(o, 0, escape);
51 public static String getJson(Map<String, String> varmap, String var) {
52 boolean escape = true;
53 if (var.startsWith("'")) {
54 var = var.substring(1);
58 boolean quotes = true;
59 if (var.startsWith("\"")) {
60 var = var.substring(1);
64 Object o = createStructure(varmap, var);
65 return generateJson(o, escape, quotes);
68 private static Object createStructure(Map<String, String> flatmap, String var) {
69 if (flatmap.containsKey(var)) {
70 if (var.endsWith("_length") || var.endsWith("].key")) {
73 return flatmap.get(var);
76 Map<String, Object> mm = new HashMap<>();
77 for (String k : flatmap.keySet()) {
78 if (k.startsWith(var + ".")) {
79 int i1 = k.indexOf('.', var.length() + 1);
80 int i2 = k.indexOf('[', var.length() + 1);
82 if (i1 > 0 && i1 < i3) {
85 if (i2 > 0 && i2 < i3) {
88 String k1 = k.substring(var.length() + 1, i3);
89 String var1 = k.substring(0, i3);
90 if (!mm.containsKey(k1)) {
91 Object str = createStructure(flatmap, var1);
92 if (str != null && (!(str instanceof String) || ((String) str).trim().length() > 0)) {
102 boolean arrayFound = false;
103 for (String k : flatmap.keySet()) {
104 if (k.startsWith(var + "[")) {
111 List<Object> ll = new ArrayList<>();
113 int length = Integer.MAX_VALUE;
114 String lengthStr = flatmap.get(var + "_length");
115 if (lengthStr != null) {
117 length = Integer.parseInt(lengthStr);
118 } catch (Exception e) {
119 log.warn("Invalid number for {}_length:{}", var, lengthStr, e);
123 for (int i = 0; i < length; i++) {
124 Object v = createStructure(flatmap, var + '[' + i + ']');
139 @SuppressWarnings("unchecked")
140 private static String generateXml(Object o, int indent, boolean escape) {
145 if (o instanceof String) {
146 return escape ? StringEscapeUtils.escapeXml10((String) o) : (String) o;
149 if (o instanceof Map) {
150 StringBuilder ss = new StringBuilder();
151 Map<String, Object> mm = (Map<String, Object>) o;
152 for (Map.Entry<String, Object> entry : mm.entrySet()) {
153 Object v = entry.getValue();
154 String key = entry.getKey();
155 if (v instanceof String) {
156 String s = escape ? StringEscapeUtils.escapeXml10((String) v) : (String) v;
157 ss.append(pad(indent)).append('<').append(key).append('>');
159 ss.append("</").append(key).append('>').append('\n');
160 } else if (v instanceof Map) {
161 ss.append(pad(indent)).append('<').append(key).append('>').append('\n');
162 ss.append(generateXml(v, indent + 1, escape));
163 ss.append(pad(indent)).append("</").append(key).append('>').append('\n');
164 } else if (v instanceof List) {
165 List<Object> ll = (List<Object>) v;
166 for (Object o1 : ll) {
167 ss.append(pad(indent)).append('<').append(key).append('>').append('\n');
168 ss.append(generateXml(o1, indent + 1, escape));
169 ss.append(pad(indent)).append("</").append(key).append('>').append('\n');
173 return ss.toString();
178 private static String generateJson(Object o, boolean escape, boolean quotes) {
182 if (o instanceof String && ((String) o).length() == 0) {
186 StringBuilder ss = new StringBuilder();
187 generateJson(ss, o, 0, false, escape, quotes);
188 return ss.toString();
191 @SuppressWarnings("unchecked")
192 private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape, boolean quotes) {
193 if (o instanceof String) {
194 String s = escape ? StringEscapeUtils.escapeJson((String) o) : (String) o;
196 ss.append(pad(indent));
199 ss.append('"').append(s).append('"');
206 if (o instanceof Map) {
207 Map<String, Object> mm = (Map<String, Object>) o;
210 ss.append(pad(indent));
214 boolean first = true;
215 for (Map.Entry<String, Object> entry : mm.entrySet()) {
220 Object v = entry.getValue();
221 String key = entry.getKey();
222 ss.append(pad(indent + 1)).append('"').append(key).append("\": ");
223 generateJson(ss, v, indent + 1, false, escape, true);
227 ss.append(pad(indent)).append('}');
232 if (o instanceof List) {
233 List<Object> ll = (List<Object>) o;
236 ss.append(pad(indent));
240 boolean first = true;
241 for (Object o1 : ll) {
247 generateJson(ss, o1, indent + 1, true, escape, quotes);
251 ss.append(pad(indent)).append(']');
255 public static String removeLastCommaJson(String s) {
256 StringBuilder sb = new StringBuilder();
259 while (k < s.length()) {
260 int i11 = s.indexOf('}', k);
261 int i12 = s.indexOf(']', k);
265 } else if (i12 < 0) {
268 i1 = i11 < i12 ? i11 : i12;
274 int i2 = s.lastIndexOf(',', i1);
280 String between = s.substring(i2 + 1, i1);
281 if (between.trim().length() > 0) {
286 sb.append(s.substring(start, i2));
291 sb.append(s.substring(start, s.length()));
293 return sb.toString();
296 public static String removeEmptyStructJson(String template, String s) {
298 while (k < s.length()) {
299 boolean curly = true;
300 int i11 = s.indexOf('{', k);
301 int i12 = s.indexOf('[', k);
306 } else if (i12 < 0) {
308 } else if (i11 < i12) {
316 int i2 = curly ? s.indexOf('}', i1) : s.indexOf(']', i1);
318 String value = s.substring(i1 + 1, i2);
319 if (value.trim().length() == 0) {
320 int i4 = s.lastIndexOf('\n', i1);
324 int i5 = s.indexOf('\n', i2);
330 /*If template mandates empty construct to be present, those should not be removed.*/
331 if (template != null && template.contains(s.substring(i4))) {
334 s = s.substring(0, i4) + s.substring(i5);
351 public static String removeEmptyStructXml(String s) {
353 while (k < s.length()) {
354 int i1 = s.indexOf('<', k);
355 if (i1 < 0 || i1 == s.length() - 1) {
359 char c1 = s.charAt(i1 + 1);
360 if (c1 == '?' || c1 == '!') {
365 int i2 = s.indexOf('>', i1);
371 String closingTag = "</" + s.substring(i1 + 1, i2 + 1);
372 int i3 = s.indexOf(closingTag, i2 + 1);
378 String value = s.substring(i2 + 1, i3);
379 if (value.trim().length() > 0) {
384 int i4 = s.lastIndexOf('\n', i1);
388 int i5 = s.indexOf('\n', i3);
393 s = s.substring(0, i4) + s.substring(i5);
400 private static String pad(int n) {
401 StringBuilder s = new StringBuilder();
402 for (int i = 0; i < n; i++) {
403 s.append(Character.toString('\t'));