* ============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
* =============================================================================
* 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=========================================================
*/
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) {
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<String> blockKeys, Map<String, String> mm, String key, Object o) {
if (blockKeys != null && blockKeys.contains(key) && o != null) {
mm.put("block_" + key, o.toString());