Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "bugfix",
"category": "Amazon DynamoDB Enhanced Client",
"contributor": "",
"description": "Optimizations for DDB EnhancedDocument.toJson()"
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,44 +46,72 @@ public static String stringValue(JsonNode jsonNode) {
}

/**
* Escapes characters for a give given string
* Escapes characters for a given string
*
* @param input Input string
* @return String with escaped characters.
*/
public static String addEscapeCharacters(String input) {
StringBuilder output = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
StringBuilder output = null;
int len = input.length();

for (int i = 0; i < len; i++) {
char ch = input.charAt(i);
switch (ch) {
case '\\':
output.append("\\\\"); // escape backslash with a backslash
break;
case '\n':
output.append("\\n"); // newline character
break;
case '\r':
output.append("\\r"); // carriage return character
break;
case '\t':
output.append("\\t"); // tab character
break;
case '\f':
output.append("\\f"); // form feed
break;
case '\"':
output.append("\\\""); // double-quote character
break;
default:
if (Character.isISOControl(ch)) {
output.append(String.format("\\u%04X", (int) ch));
} else {
output.append(ch);
}
break;
if (needsEscaping(ch)) {
if (output == null) {
output = initializeStringBuilder(input, i);
}
appendEscapeChar(output, ch);
} else if (output != null) {
output.append(ch);
}
}
return output.toString();

return output == null ? input : output.toString();
}

private static boolean needsEscaping(char ch) {
return Character.isISOControl(ch) || ch == '"' || ch == '\\';
}

/**
* Initialize StringBuilder with the unescaped portion of the input.
*/
private static StringBuilder initializeStringBuilder(String input, int position) {
// Arbitrary buffer of 16
StringBuilder builder = new StringBuilder(input.length() + 16);
builder.append(input, 0, position);
return builder;
}

private static void appendEscapeChar(StringBuilder output, char ch) {
switch (ch) {
case '\\':
output.append("\\\\"); // escape backslash with a backslash
break;
case '\n':
output.append("\\n"); // newline character
break;
case '\r':
output.append("\\r"); // carriage return character
break;
case '\t':
output.append("\\t"); // tab character
break;
case '\f':
output.append("\\f"); // form feed
break;
case '\"':
output.append("\\\""); // double-quote character
break;
default:
if (Character.isISOControl(ch)) {
output.append(String.format("\\u%04X", (int) ch));
} else {
output.append(ch);
}
break;
}
}

private static String mapToString(JsonNode jsonNode) {
Expand Down
Loading