Fix escapeInternalJson method 90/88190/5
authorPatrick Brady <patrick.brady@att.com>
Tue, 21 May 2019 17:29:49 +0000 (10:29 -0700)
committerTakamune Cho <takamune.cho@att.com>
Wed, 22 May 2019 13:06:34 +0000 (13:06 +0000)
The method incorrectly handled cases where the json string contained
json objects internally. These cases should be handled correctly now.

Change-Id: I43b40414526bcb6577242ab737097dfb9119e618
Signed-off-by: Patrick Brady <patrick.brady@att.com>
Issue-ID: APPC-1576

appc-config/appc-config-generator/provider/src/main/java/org/onap/sdnc/config/generator/tool/JSONTool.java

index 3c49ec6..e38f8b3 100644 (file)
@@ -94,19 +94,34 @@ public class JSONTool {
         char lastChar = 0;
         boolean inJson = false;
         for(char c : jsonString.toCharArray()) {
+            //If we see a { directly after a quote, it would mean that this string will contain json data
+            //as a string.
             if(c == '{' && lastChar == '"') {
                 inJson = true;
             }
-            if(inJson) {
-                if(c == '"' && lastChar != '\\') {
-                    sb.append("\\\"");
-                } else {
-                    sb.append(c);
-                }
-                if(c == '}' && lastChar == '"') {
+            //Checks if we are currently in a json block and if the character we are looking at is
+            //a quote. The quote is what needs to be escaped.
+            if(inJson && c == '"') {
+                //If a } precedes a quote, then this would signal the end of a string containing json
+                if(lastChar == '}') {
                     inJson = false;
+                    //since this quote we are looking at is outside the json string block, we should not escape it
+                    sb.append("\"");
+                } else {
+                    //Else block for the case where the quote was preceded by anything other than a }
+                    //We know we are still in the json string block
+                    //If the last character was not a backslash, we know that the quote we are looking at has
+                    //not been escaped.
+                    if(lastChar != '\\') {
+                        //un-escaped quote should be escaped
+                        sb.append("\\\"");
+                    } else {
+                        //quote is already escaped, we can add it as it is
+                        sb.append(c);
+                    }
                 }
             } else {
+                //If we are not in a json block, or if the character is not a quote, it can be added as is
                 sb.append(c);
             }
             if(!Character.isWhitespace(c)) {
@@ -119,7 +134,7 @@ public class JSONTool {
             throw new JSONException("End of json data reached, but end of internal"
                     + "json string never reached.");
         }
-            return sb.toString();
+        return sb.toString();
     }
 
     private static void tryAddBlockKeys(List<String> blockKeys, Map<String, String> mm, String key, Object o) {