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.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 public final class XmlJsonUtil {
33 private static final Logger log = LoggerFactory.getLogger(XmlJsonUtil.class);
35 private XmlJsonUtil() {
36 // Preventing instantiation of the same.
39 public static String getXml(Map<String, String> varmap, String var) {
40 boolean escape = true;
41 if (var.startsWith("'")) {
42 var = var.substring(1);
46 Object o = createStructure(varmap, var);
47 return generateXml(o, 0, escape);
50 public static String getJson(Map<String, String> varmap, String var) {
51 boolean escape = true;
52 if (var.startsWith("'")) {
53 var = var.substring(1);
57 boolean quotes = true;
58 if (var.startsWith("\"")) {
59 var = var.substring(1);
63 Object o = createStructure(varmap, var);
64 return generateJson(o, escape, quotes);
67 private static Object createStructure(Map<String, String> flatmap, String var) {
68 if (flatmap.containsKey(var)) {
69 if (var.endsWith("_length") || var.endsWith("].key")) {
72 return flatmap.get(var);
75 Map<String, Object> mm = new HashMap<>();
76 for (String k : flatmap.keySet()) {
77 if (k.startsWith(var + ".")) {
78 int i1 = k.indexOf('.', var.length() + 1);
79 int i2 = k.indexOf('[', var.length() + 1);
81 if (i1 > 0 && i1 < i3) {
84 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)) {
101 boolean arrayFound = false;
102 for (String k : flatmap.keySet()) {
103 if (k.startsWith(var + "[")) {
110 List<Object> ll = new ArrayList<>();
112 int length = Integer.MAX_VALUE;
113 String lengthStr = flatmap.get(var + "_length");
114 if (lengthStr != null) {
116 length = Integer.parseInt(lengthStr);
117 } catch (Exception e) {
118 log.warn("Invalid number for {}_length:{}", var, lengthStr, e);
122 for (int i = 0; i < length; i++) {
123 Object v = createStructure(flatmap, var + '[' + i + ']');
138 @SuppressWarnings("unchecked")
139 private static String generateXml(Object o, int indent, boolean escape) {
144 if (o instanceof String) {
145 return escape ? escapeXml((String) o) : (String) o;
148 if (o instanceof Map) {
149 StringBuilder ss = new StringBuilder();
150 Map<String, Object> mm = (Map<String, Object>) o;
151 for (Map.Entry<String, Object> entry : mm.entrySet()) {
152 Object v = entry.getValue();
153 String key = entry.getKey();
154 if (v instanceof String) {
155 String s = escape ? escapeXml((String) v) : (String) v;
156 ss.append(pad(indent)).append('<').append(key).append('>');
158 ss.append("</").append(key).append('>').append('\n');
159 } else if (v instanceof Map) {
160 ss.append(pad(indent)).append('<').append(key).append('>').append('\n');
161 ss.append(generateXml(v, indent + 1, escape));
162 ss.append(pad(indent)).append("</").append(key).append('>').append('\n');
163 } else if (v instanceof List) {
164 List<Object> ll = (List<Object>) v;
165 for (Object o1 : ll) {
166 ss.append(pad(indent)).append('<').append(key).append('>').append('\n');
167 ss.append(generateXml(o1, indent + 1, escape));
168 ss.append(pad(indent)).append("</").append(key).append('>').append('\n');
172 return ss.toString();
177 private static String generateJson(Object o, boolean escape, boolean quotes) {
181 if (o instanceof String && ((String) o).length() == 0) {
185 StringBuilder ss = new StringBuilder();
186 generateJson(ss, o, 0, false, escape, quotes);
187 return ss.toString();
190 @SuppressWarnings("unchecked")
191 private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape, boolean quotes) {
192 if (o instanceof String) {
193 String s = escape ? escapeJson((String) o) : (String) o;
195 ss.append(pad(indent));
198 ss.append('"').append(s).append('"');
205 if (o instanceof Map) {
206 Map<String, Object> mm = (Map<String, Object>) o;
209 ss.append(pad(indent));
213 boolean first = true;
214 for (Map.Entry<String, Object> entry : mm.entrySet()) {
219 Object v = entry.getValue();
220 String key = entry.getKey();
221 ss.append(pad(indent + 1)).append('"').append(key).append("\": ");
222 generateJson(ss, v, indent + 1, false, escape, true);
226 ss.append(pad(indent)).append('}');
231 if (o instanceof List) {
232 List<Object> ll = (List<Object>) o;
235 ss.append(pad(indent));
239 boolean first = true;
240 for (Object o1 : ll) {
246 generateJson(ss, o1, indent + 1, true, escape, quotes);
250 ss.append(pad(indent)).append(']');
254 public static String removeLastCommaJson(String s) {
255 StringBuilder sb = new StringBuilder();
258 while (k < s.length()) {
259 int i11 = s.indexOf('}', k);
260 int i12 = s.indexOf(']', k);
264 } else if (i12 < 0) {
267 i1 = i11 < i12 ? i11 : i12;
273 int i2 = s.lastIndexOf(',', i1);
279 String between = s.substring(i2 + 1, i1);
280 if (between.trim().length() > 0) {
285 sb.append(s.substring(start, i2));
290 sb.append(s.substring(start, s.length()));
292 return sb.toString();
295 public static String removeEmptyStructJson(String template, String s) {
297 while (k < s.length()) {
298 boolean curly = true;
299 int i11 = s.indexOf('{', k);
300 int i12 = s.indexOf('[', k);
305 } else if (i12 < 0) {
307 } else if (i11 < i12) {
315 int i2 = curly ? s.indexOf('}', i1) : s.indexOf(']', i1);
317 String value = s.substring(i1 + 1, i2);
318 if (value.trim().length() == 0) {
319 int i4 = s.lastIndexOf('\n', i1);
323 int i5 = s.indexOf('\n', i2);
329 /*If template mandates empty construct to be present, those should not be removed.*/
330 if (template != null && template.contains(s.substring(i4))) {
333 s = s.substring(0, i4) + s.substring(i5);
350 public static String removeEmptyStructXml(String s) {
352 while (k < s.length()) {
353 int i1 = s.indexOf('<', k);
354 if (i1 < 0 || i1 == s.length() - 1) {
358 char c1 = s.charAt(i1 + 1);
359 if (c1 == '?' || c1 == '!') {
364 int i2 = s.indexOf('>', i1);
370 String closingTag = "</" + s.substring(i1 + 1, i2 + 1);
371 int i3 = s.indexOf(closingTag, i2 + 1);
377 String value = s.substring(i2 + 1, i3);
378 if (value.trim().length() > 0) {
383 int i4 = s.lastIndexOf('\n', i1);
387 int i5 = s.indexOf('\n', i3);
392 s = s.substring(0, i4) + s.substring(i5);
399 private static String escapeXml(String v) {
400 String s = v.replaceAll("&", "&");
401 s = s.replaceAll("<", "<");
402 s = s.replaceAll("'", "'");
403 s = s.replaceAll("\"", """);
404 s = s.replaceAll(">", ">");
408 private static String escapeJson(String v) {
409 String s = v.replaceAll("\\\\", "\\\\\\\\");
410 s = s.replaceAll("\"", "\\\\\"");
414 private static String pad(int n) {
415 StringBuilder s = new StringBuilder();
416 for (int i = 0; i < n; i++) {
417 s.append(Character.toString('\t'));