2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Copyright (C) 2018 Samsung Electronics. All rights
9 * ================================================================================
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21 * ============LICENSE_END=========================================================
24 package org.onap.ccsdk.sli.plugins.sshapicall.model;
26 import java.util.ArrayList;
27 import java.util.HashMap;
28 import java.util.List;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
34 public final class XmlJsonUtil {
36 private static final Logger log = LoggerFactory.getLogger(XmlJsonUtil.class);
38 private XmlJsonUtil() {
39 // Preventing instantiation of the same.
42 public static String getXml(Map<String, String> varmap, String var) {
43 boolean escape = true;
44 if (var.startsWith("'")) {
45 var = var.substring(1);
49 Object o = createStructure(varmap, var);
50 return generateXml(o, 0, escape);
53 public static String getJson(Map<String, String> varmap, String var) {
54 boolean escape = true;
55 if (var.startsWith("'")) {
56 var = var.substring(1);
60 boolean quotes = true;
61 if (var.startsWith("\"")) {
62 var = var.substring(1);
66 Object o = createStructure(varmap, var);
67 return generateJson(o, escape, quotes);
70 private static Object createStructure(Map<String, String> flatmap, String var) {
71 if (flatmap.containsKey(var)) {
72 if (var.endsWith("_length") || var.endsWith("].key"))
74 return flatmap.get(var);
77 Map<String, Object> mm = new HashMap<>();
78 for (String k : flatmap.keySet())
79 if (k.startsWith(var + ".")) {
80 int i1 = k.indexOf('.', var.length() + 1);
81 int i2 = k.indexOf('[', var.length() + 1);
83 if (i1 > 0 && i1 < i3)
85 if (i2 > 0 && i2 < i3)
87 String k1 = k.substring(var.length() + 1, i3);
88 String var1 = k.substring(0, i3);
89 if (!mm.containsKey(k1)) {
90 Object str = createStructure(flatmap, var1);
91 if (str != null && (!(str instanceof String) || ((String) str).trim().length() > 0))
98 boolean arrayFound = false;
99 for (String k : flatmap.keySet())
100 if (k.startsWith(var + "[")) {
106 List<Object> ll = new ArrayList<>();
108 int length = Integer.MAX_VALUE;
109 String lengthStr = flatmap.get(var + "_length");
110 if (lengthStr != null) {
112 length = Integer.parseInt(lengthStr);
113 } catch (Exception e) {
114 log.warn("Invalid number for {}_length:{}", var, lengthStr, e);
118 for (int i = 0; i < length; i++) {
119 Object v = createStructure(flatmap, var + '[' + i + ']');
132 @SuppressWarnings("unchecked")
133 private static String generateXml(Object o, int indent, boolean escape) {
137 if (o instanceof String)
138 return escape ? escapeXml((String) o) : (String) o;;
140 if (o instanceof Map) {
141 StringBuilder ss = new StringBuilder();
142 Map<String, Object> mm = (Map<String, Object>) o;
143 for (Map.Entry<String, Object> entry: mm.entrySet()) {
144 Object v = entry.getValue();
145 String key = entry.getKey();
146 if (v instanceof String) {
147 String s = escape ? escapeXml((String) v) : (String) v;
148 ss.append(pad(indent)).append('<').append(key).append('>');
150 ss.append("</").append(key).append('>').append('\n');
151 } else if (v instanceof Map) {
152 ss.append(pad(indent)).append('<').append(key).append('>').append('\n');
153 ss.append(generateXml(v, indent + 1, escape));
154 ss.append(pad(indent)).append("</").append(key).append('>').append('\n');
155 } else if (v instanceof List) {
156 List<Object> ll = (List<Object>) v;
157 for (Object o1 : ll) {
158 ss.append(pad(indent)).append('<').append(key).append('>').append('\n');
159 ss.append(generateXml(o1, indent + 1, escape));
160 ss.append(pad(indent)).append("</").append(key).append('>').append('\n');
164 return ss.toString();
170 private static String generateJson(Object o, boolean escape, boolean quotes) {
174 StringBuilder ss = new StringBuilder();
175 generateJson(ss, o, 0, false, escape, quotes);
176 return ss.toString();
179 @SuppressWarnings("unchecked")
180 private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape, boolean quotes) {
181 if (o instanceof String) {
182 String s = escape ? escapeJson((String) o) : (String) o;
184 ss.append(pad(indent));
186 ss.append('"').append(s).append('"');
193 if (o instanceof Map) {
194 Map<String, Object> mm = (Map<String, Object>) o;
197 ss.append(pad(indent));
200 boolean first = true;
201 for (Map.Entry<String, Object> entry : mm.entrySet()) {
205 Object v = entry.getValue();
206 String key = entry.getKey();
207 ss.append(pad(indent + 1)).append('"').append(key).append("\": ");
208 generateJson(ss, v, indent + 1, false, escape, true);
212 ss.append(pad(indent)).append('}');
217 if (o instanceof List) {
218 List<Object> ll = (List<Object>) o;
221 ss.append(pad(indent));
224 boolean first = true;
225 for (Object o1 : ll) {
230 generateJson(ss, o1, indent + 1, true, escape, quotes);
234 ss.append(pad(indent)).append(']');
238 public static String removeLastCommaJson(String s) {
239 StringBuilder sb = new StringBuilder();
242 while (k < s.length()) {
243 int i11 = s.indexOf('}', k);
244 int i12 = s.indexOf(']', k);
251 i1 = i11 < i12 ? i11 : i12;
255 int i2 = s.lastIndexOf(',', i1);
261 String between = s.substring(i2 + 1, i1);
262 if (between.trim().length() > 0) {
267 sb.append(s.substring(start, i2));
272 sb.append(s.substring(start, s.length()));
274 return sb.toString();
277 public static String removeEmptyStructJson(String s) {
279 while (k < s.length()) {
280 boolean curly = true;
281 int i11 = s.indexOf('{', k);
282 int i12 = s.indexOf('[', k);
298 int i2 = curly ? s.indexOf('}', i1) : s.indexOf(']', i1);
300 String value = s.substring(i1 + 1, i2);
301 if (value.trim().length() == 0) {
302 int i4 = s.lastIndexOf('\n', i1);
305 int i5 = s.indexOf('\n', i2);
309 s = s.substring(0, i4) + s.substring(i5);
322 public static String removeEmptyStructXml(String s) {
324 while (k < s.length()) {
325 int i1 = s.indexOf('<', k);
326 if (i1 < 0 || i1 == s.length() - 1)
329 char c1 = s.charAt(i1 + 1);
330 if (c1 == '?' || c1 == '!') {
335 int i2 = s.indexOf('>', i1);
341 String closingTag = "</" + s.substring(i1 + 1, i2 + 1);
342 int i3 = s.indexOf(closingTag, i2 + 1);
348 String value = s.substring(i2 + 1, i3);
349 if (value.trim().length() > 0) {
354 int i4 = s.lastIndexOf('\n', i1);
357 int i5 = s.indexOf('\n', i3);
361 s = s.substring(0, i4) + s.substring(i5);
368 private static String escapeXml(String v) {
369 String s = v.replaceAll("&", "&");
370 s = s.replaceAll("<", "<");
371 s = s.replaceAll("'", "'");
372 s = s.replaceAll("\"", """);
373 s = s.replaceAll(">", ">");
377 private static String escapeJson(String v) {
378 String s = v.replaceAll("\\\\", "\\\\\\\\");
379 s = s.replaceAll("\"", "\\\\\"");
383 private static String pad(int n) {
384 StringBuilder s = new StringBuilder();
385 for (int i = 0; i < n; i++)
386 s.append(Character.toString('\t'));