From 63b9b42dc882732421bc51dc16ec2a47bcaf7789 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Fri, 26 Nov 2021 16:34:15 +1300 Subject: [PATCH] #2433 - Postgres JSONB dirty checking - trim json --- .../ebeaninternal/server/type/JsonTrim.java | 9 +++- .../server/type/JsonTrimTest.java | 42 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java b/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java index 97592fb34..ec0808f14 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/type/JsonTrim.java @@ -19,8 +19,13 @@ final class JsonTrim { for (int i = 0; i < len; i++) { char c = json.charAt(i); if (c == '\"') { - if (!escaped) quoted = !quoted; - else escaped = false; + if (!escaped) { + quoted = !quoted; + } else { + escaped = false; + } + } else if (escaped) { + escaped = false; } else if (quoted && c == '\\') { escaped = true; } diff --git a/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java b/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java index c08ceeab7..a2b3c1cfe 100644 --- a/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java +++ b/ebean-test/src/test/java/io/ebeaninternal/server/type/JsonTrimTest.java @@ -5,17 +5,53 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class JsonTrimTest { +class JsonTrimTest { @Test - public void trim_array() { + void trim_array() { final String trimmed = JsonTrim.trim("[{\"name\": \"one\", \"along\": 1, \"timestamp\": 1629609021559}, {\"name\": \"two\", \"along\": 2, \"timestamp\": 1629609021559}]"); assertThat(trimmed).isEqualTo("[{\"name\":\"one\",\"along\":1,\"timestamp\":1629609021559},{\"name\":\"two\",\"along\":2,\"timestamp\":1629609021559}]"); } @Test - public void trim_object() { + void trim_object() { final String trimmed = JsonTrim.trim("{\"name\": \"one\",\t \t \"along\": 1, \"timestamp\": 1629609021559}"); assertThat(trimmed).isEqualTo("{\"name\":\"one\",\"along\":1,\"timestamp\":1629609021559}"); } + + @Test + void trim_object_embeddedEscapeSlash() { + final String trimmed = JsonTrim.trim("{\"a\": \"o\\nf\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"o\\nf\",\"b\":1}"); + } + + @Test + void trim_escapedTabNewLine() { + final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\",\"b\":1}"); + } + + @Test + void trim_leadingEscapedNewLine() { + final String trimmed = JsonTrim.trim("{\"a\": \"\\no\\t\\nf\\n\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"\\no\\t\\nf\\n\",\"b\":1}"); + } + + @Test + void trim_trailingEscapedNewLine() { + final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\\n\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\\n\",\"b\":1}"); + } + + @Test + void trim_trailingEscapedSlash() { + final String trimmed = JsonTrim.trim("{\"a\": \"o\\t\\nf\\\\\",\t \t \n \"b\": 1}"); + assertThat(trimmed).isEqualTo("{\"a\":\"o\\t\\nf\\\\\",\"b\":1}"); + } + + @Test + void trim_object_embeddedEscaped() { + final String trimmed = JsonTrim.trim("{\"name\": \"one\nfoo\nbar\\bazz\tboo\",\t \t \n \"along\": 1}"); + assertThat(trimmed).isEqualTo("{\"name\":\"one\nfoo\nbar\\bazz\tboo\",\"along\":1}"); + } }