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;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
32 public class XmlJsonUtil {
34 private static final Logger log = LoggerFactory.getLogger(XmlJsonUtil.class);
36 public static String getXml(Map<String, String> varmap, String var) {
37 boolean escape = true;
38 if (var.startsWith("'")) {
39 var = var.substring(1);
43 Object o = createStructure(varmap, var);
44 return generateXml(o, 0, escape);
47 public static String getJson(Map<String, String> varmap, String var) {
48 boolean escape = true;
49 if (var.startsWith("'")) {
50 var = var.substring(1);
54 Object o = createStructure(varmap, var);
55 return generateJson(o, escape);
58 private static Object createStructure(Map<String, String> flatmap, String var) {
59 if (flatmap.containsKey(var)) {
60 if (var.endsWith("_length") || var.endsWith("].key"))
62 return flatmap.get(var);
65 Map<String, Object> mm = new HashMap<>();
66 for (String k : flatmap.keySet())
67 if (k.startsWith(var + ".")) {
68 int i1 = k.indexOf('.', var.length() + 1);
69 int i2 = k.indexOf('[', var.length() + 1);
71 if (i1 > 0 && i1 < i3)
73 if (i2 > 0 && i2 < i3)
75 String k1 = k.substring(var.length() + 1, i3);
76 String var1 = k.substring(0, i3);
77 if (!mm.containsKey(k1)) {
78 Object str = createStructure(flatmap, var1);
79 if (str != null && (!(str instanceof String) || ((String) str).trim().length() > 0))
86 boolean arrayFound = false;
87 for (String k : flatmap.keySet())
88 if (k.startsWith(var + "[")) {
94 List<Object> ll = new ArrayList<>();
96 int length = Integer.MAX_VALUE;
97 String lengthStr = flatmap.get(var + "_length");
98 if (lengthStr != null) {
100 length = Integer.parseInt(lengthStr);
101 } catch (Exception e) {
102 log.warn("Invalid number for " + var + "_length:" + lengthStr);
106 for (int i = 0; i < length; i++) {
107 Object v = createStructure(flatmap, var + '[' + i + ']');
120 @SuppressWarnings("unchecked")
121 private static String generateXml(Object o, int indent, boolean escape) {
125 if (o instanceof String)
126 return escape ? escapeXml((String) o) : (String) o;;
128 if (o instanceof Map) {
129 StringBuilder ss = new StringBuilder();
130 Map<String, Object> mm = (Map<String, Object>) o;
131 for (String k : mm.keySet()) {
132 Object v = mm.get(k);
133 if (v instanceof String) {
134 String s = escape ? escapeXml((String) v) : (String) v;
135 ss.append(pad(indent)).append('<').append(k).append('>');
137 ss.append("</").append(k).append('>').append('\n');
138 } else if (v instanceof Map) {
139 ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
140 ss.append(generateXml(v, indent + 1, escape));
141 ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
142 } else if (v instanceof List) {
143 List<Object> ll = (List<Object>) v;
144 for (Object o1 : ll) {
145 ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
146 ss.append(generateXml(o1, indent + 1, escape));
147 ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
151 return ss.toString();
157 private static String generateJson(Object o, boolean escape) {
161 StringBuilder ss = new StringBuilder();
162 generateJson(ss, o, 0, false, escape);
163 return ss.toString();
166 @SuppressWarnings("unchecked")
167 private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape) {
168 if (o instanceof String) {
169 String s = escape ? escapeJson((String) o) : (String) o;
171 ss.append(pad(indent));
172 ss.append('"').append(s).append('"');
176 if (o instanceof Map) {
177 Map<String, Object> mm = (Map<String, Object>) o;
180 ss.append(pad(indent));
183 boolean first = true;
184 for (String k : mm.keySet()) {
189 Object v = mm.get(k);
190 ss.append(pad(indent + 1)).append('"').append(k).append("\": ");
191 generateJson(ss, v, indent + 1, false, escape);
195 ss.append(pad(indent)).append('}');
200 if (o instanceof List) {
201 List<Object> ll = (List<Object>) o;
204 ss.append(pad(indent));
207 boolean first = true;
208 for (Object o1 : ll) {
213 generateJson(ss, o1, indent + 1, true, escape);
217 ss.append(pad(indent)).append(']');
221 public static String removeLastCommaJson(String s) {
222 StringBuilder sb = new StringBuilder();
225 while (k < s.length()) {
226 int i11 = s.indexOf('}', k);
227 int i12 = s.indexOf(']', k);
234 i1 = i11 < i12 ? i11 : i12;
238 int i2 = s.lastIndexOf(',', i1);
244 String between = s.substring(i2 + 1, i1);
245 if (between.trim().length() > 0) {
250 sb.append(s.substring(start, i2));
255 sb.append(s.substring(start, s.length()));
257 return sb.toString();
260 public static String removeEmptyStructJson(String s) {
262 while (k < s.length()) {
263 boolean curly = true;
264 int i11 = s.indexOf('{', k);
265 int i12 = s.indexOf('[', k);
281 int i2 = curly ? s.indexOf('}', i1) : s.indexOf(']', i1);
283 String value = s.substring(i1 + 1, i2);
284 if (value.trim().length() == 0) {
285 int i4 = s.lastIndexOf('\n', i1);
288 int i5 = s.indexOf('\n', i2);
292 s = s.substring(0, i4) + s.substring(i5);
305 public static String removeEmptyStructXml(String s) {
307 while (k < s.length()) {
308 int i1 = s.indexOf('<', k);
309 if (i1 < 0 || i1 == s.length() - 1)
312 char c1 = s.charAt(i1 + 1);
313 if (c1 == '?' || c1 == '!') {
318 int i2 = s.indexOf('>', i1);
324 String closingTag = "</" + s.substring(i1 + 1, i2 + 1);
325 int i3 = s.indexOf(closingTag, i2 + 1);
331 String value = s.substring(i2 + 1, i3);
332 if (value.trim().length() > 0) {
337 int i4 = s.lastIndexOf('\n', i1);
340 int i5 = s.indexOf('\n', i3);
344 s = s.substring(0, i4) + s.substring(i5);
351 private static String escapeXml(String v) {
352 String s = v.replaceAll("&", "&");
353 s = s.replaceAll("<", "<");
354 s = s.replaceAll("'", "'");
355 s = s.replaceAll("\"", """);
356 s = s.replaceAll(">", ">");
360 private static String escapeJson(String v) {
361 String s = v.replaceAll("\\\\", "\\\\\\\\");
362 s = s.replaceAll("\"", "\\\\\"");
366 private static String pad(int n) {
368 for (int i = 0; i < n; i++)
369 s += Character.toString('\t');