X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=appc-config%2Fappc-config-generator%2Fprovider%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fsdnc%2Fconfig%2Fgenerator%2Ftool%2FJSONTool.java;h=f49facf936e3caf2d4eefccc6c4f1d27b03beb10;hb=d0dd24994a0c1aa0f6600adceeaf76c9bdd064b2;hp=faa9c6fb03c4eff88e85b1d595038fe52c7200b5;hpb=17116cc208810e274c30fc7cc985d55f36d21b23;p=appc.git diff --git a/appc-config/appc-config-generator/provider/src/main/java/org/onap/sdnc/config/generator/tool/JSONTool.java b/appc-config/appc-config-generator/provider/src/main/java/org/onap/sdnc/config/generator/tool/JSONTool.java index faa9c6fb0..f49facf93 100644 --- a/appc-config/appc-config-generator/provider/src/main/java/org/onap/sdnc/config/generator/tool/JSONTool.java +++ b/appc-config/appc-config-generator/provider/src/main/java/org/onap/sdnc/config/generator/tool/JSONTool.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Copyright (C) 2017 Amdocs * ============================================================================= @@ -18,7 +18,6 @@ * See the License for the specific language governing permissions and * limitations under the License. * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. * ============LICENSE_END========================================================= */ @@ -64,8 +63,17 @@ public class JSONTool { wm.remove(key); tryAddBlockKeys(blockKeys, mm, key, o); if (o instanceof Boolean || o instanceof Number || o instanceof String) { - mm.put(key, o.toString()); - log.info("Added property: " + key + ": " + o.toString()); + String oString = o.toString(); + //Add escape characters to the string in case it is a string representation + //of a json object. + oString = JSONObject.quote(oString, false); + //Remove the surrouding quotes added by the JSONObject.quote() method. + //JSONObject.quote() will always return, at minimum, a string with two quotes, + //even if a null string is passed to it. So this substring method does not + //need any checks. + oString = oString.substring(1, oString.length() - 1); + mm.put(key, oString); + log.info("Added property: " + key + ": " + oString); } else if (o instanceof JSONObject) { fill(wm, key, (JSONObject) o); } else if (o instanceof JSONArray) { @@ -76,6 +84,59 @@ public class JSONTool { return mm; } + //Finds json values which themselves contain String representations of json + //data and adds escape characters to the quotes. Example: + //Input: { "key1": "{"internalKey1": "internalValue1"}" } + //Output: { "key1": "{\"internalKey1\": \"internalValue1\"}" } + public static String escapeInternalJson(String jsonString) throws JSONException + { + StringBuilder sb = new StringBuilder(); + 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; + } + //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)) { + lastChar = c; + } + } + if(inJson == true) { + //We reached the end of the string, but the internal string containing + //the json data to escape never ended. + throw new JSONException("End of json data reached, but end of internal" + + "json string never reached."); + } + return sb.toString(); + } + private static void tryAddBlockKeys(List blockKeys, Map mm, String key, Object o) { if (blockKeys != null && blockKeys.contains(key) && o != null) { mm.put("block_" + key, o.toString());