2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * * Copyright (C) 2017 AT&T Intellectual Property.
 
   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'));