Add mandatory empty construct to json template
[ccsdk/sli/plugins.git] / restapi-call-node / provider / src / main / java / org / onap / ccsdk / sli / plugins / restapicall / XmlJsonUtil.java
index 16b9f51..4712b42 100644 (file)
@@ -29,10 +29,14 @@ import java.util.Map;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class XmlJsonUtil {
+public final class XmlJsonUtil {
 
     private static final Logger log = LoggerFactory.getLogger(XmlJsonUtil.class);
 
+    private XmlJsonUtil() {
+        // Preventing instantiation of the same.
+    }
+
     public static String getXml(Map<String, String> varmap, String var) {
         boolean escape = true;
         if (var.startsWith("'")) {
@@ -51,8 +55,14 @@ public class XmlJsonUtil {
             escape = false;
         }
 
+        boolean quotes = true;
+        if (var.startsWith("\"")) {
+            var = var.substring(1);
+            quotes = false;
+        }
+
         Object o = createStructure(varmap, var);
-        return generateJson(o, escape);
+        return generateJson(o, escape, quotes);
     }
 
     private static Object createStructure(Map<String, String> flatmap, String var) {
@@ -99,7 +109,7 @@ public class XmlJsonUtil {
                 try {
                     length = Integer.parseInt(lengthStr);
                 } catch (Exception e) {
-                    log.warn("Invalid number for " + var + "_length:" + lengthStr);
+                    log.warn("Invalid number for {}_length:{}", var, lengthStr, e);
                 }
             }
 
@@ -128,23 +138,24 @@ public class XmlJsonUtil {
         if (o instanceof Map) {
             StringBuilder ss = new StringBuilder();
             Map<String, Object> mm = (Map<String, Object>) o;
-            for (String k : mm.keySet()) {
-                Object v = mm.get(k);
+            for (Map.Entry<String, Object> entry: mm.entrySet()) {
+                Object v = entry.getValue();
+                String key = entry.getKey();
                 if (v instanceof String) {
                     String s = escape ? escapeXml((String) v) : (String) v;
-                    ss.append(pad(indent)).append('<').append(k).append('>');
+                    ss.append(pad(indent)).append('<').append(key).append('>');
                     ss.append(s);
-                    ss.append("</").append(k).append('>').append('\n');
+                    ss.append("</").append(key).append('>').append('\n');
                 } else if (v instanceof Map) {
-                    ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
+                    ss.append(pad(indent)).append('<').append(key).append('>').append('\n');
                     ss.append(generateXml(v, indent + 1, escape));
-                    ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
+                    ss.append(pad(indent)).append("</").append(key).append('>').append('\n');
                 } else if (v instanceof List) {
                     List<Object> ll = (List<Object>) v;
                     for (Object o1 : ll) {
-                        ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
+                        ss.append(pad(indent)).append('<').append(key).append('>').append('\n');
                         ss.append(generateXml(o1, indent + 1, escape));
-                        ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
+                        ss.append(pad(indent)).append("</").append(key).append('>').append('\n');
                     }
                 }
             }
@@ -154,22 +165,26 @@ public class XmlJsonUtil {
         return null;
     }
 
-    private static String generateJson(Object o, boolean escape) {
+    private static String generateJson(Object o, boolean escape, boolean quotes) {
         if (o == null)
             return null;
 
         StringBuilder ss = new StringBuilder();
-        generateJson(ss, o, 0, false, escape);
+        generateJson(ss, o, 0, false, escape, quotes);
         return ss.toString();
     }
 
     @SuppressWarnings("unchecked")
-    private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape) {
+    private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape, boolean quotes) {
         if (o instanceof String) {
             String s = escape ? escapeJson((String) o) : (String) o;
             if (padFirst)
                 ss.append(pad(indent));
-            ss.append('"').append(s).append('"');
+            if (quotes) {
+                ss.append('"').append(s).append('"');
+            } else {
+                ss.append(s);
+            }
             return;
         }
 
@@ -181,14 +196,14 @@ public class XmlJsonUtil {
             ss.append("{\n");
 
             boolean first = true;
-            for (String k : mm.keySet()) {
+            for (Map.Entry<String, Object> entry : mm.entrySet()) {
                 if (!first)
                     ss.append(",\n");
                 first = false;
-
-                Object v = mm.get(k);
-                ss.append(pad(indent + 1)).append('"').append(k).append("\": ");
-                generateJson(ss, v, indent + 1, false, escape);
+                Object v = entry.getValue();
+                String key = entry.getKey();
+                ss.append(pad(indent + 1)).append('"').append(key).append("\": ");
+                generateJson(ss, v, indent + 1, false, escape, true);
             }
 
             ss.append("\n");
@@ -210,7 +225,7 @@ public class XmlJsonUtil {
                     ss.append(",\n");
                 first = false;
 
-                generateJson(ss, o1, indent + 1, true, escape);
+                generateJson(ss, o1, indent + 1, true, escape, quotes);
             }
 
             ss.append("\n");
@@ -257,7 +272,7 @@ public class XmlJsonUtil {
         return sb.toString();
     }
 
-    public static String removeEmptyStructJson(String s) {
+    public static String removeEmptyStructJson(String template, String s) {
         int k = 0;
         while (k < s.length()) {
             boolean curly = true;
@@ -289,8 +304,13 @@ public class XmlJsonUtil {
                         if (i5 < 0)
                             i5 = s.length();
 
-                        s = s.substring(0, i4) + s.substring(i5);
-                        k = 0;
+                        /*If template mandates empty construct to be present, those should not be removed.*/
+                        if ((template != null) && template.contains(s.substring(i4))) {
+                            k = i1 + 1;
+                        } else {
+                            s = s.substring(0, i4) + s.substring(i5);
+                            k = 0;
+                        }
                     } else
                         k = i1 + 1;
                 } else
@@ -364,9 +384,9 @@ public class XmlJsonUtil {
     }
 
     private static String pad(int n) {
-        String s = "";
+        StringBuilder s = new StringBuilder();
         for (int i = 0; i < n; i++)
-            s += '\t';
-        return s;
+            s.append(Character.toString('\t'));
+        return s.toString();
     }
 }