You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2017/09/05 15:34:22 UTC
cxf git commit: [CXF-7496] Avoiding indexOf searches
Repository: cxf
Updated Branches:
refs/heads/3.1.x-fixes f5770688c -> 3c37b64cb
[CXF-7496] Avoiding indexOf searches
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/3c37b64c
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/3c37b64c
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/3c37b64c
Branch: refs/heads/3.1.x-fixes
Commit: 3c37b64cb7b33acbb8c8f8e557b24f313914bed6
Parents: f577068
Author: Sergey Beryozkin <sb...@gmail.com>
Authored: Tue Sep 5 16:31:54 2017 +0100
Committer: Sergey Beryozkin <sb...@gmail.com>
Committed: Tue Sep 5 16:34:02 2017 +0100
----------------------------------------------------------------------
.../json/basic/JsonMapObjectReaderWriter.java | 47 +++++++++-------
.../basic/JsonMapObjectReaderWriterTest.java | 56 ++++++++++++++++++++
2 files changed, 84 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/3c37b64c/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriter.java
----------------------------------------------------------------------
diff --git a/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriter.java b/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriter.java
index df4070e..39fe7dd 100644
--- a/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriter.java
+++ b/rt/rs/extensions/json-basic/src/main/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriter.java
@@ -42,6 +42,7 @@ public class JsonMapObjectReaderWriter {
private static final char OBJECT_END = '}';
private static final char ARRAY_START = '[';
private static final char ARRAY_END = ']';
+ private static final char ESCAPE = '\\';
private static final String NULL_VALUE = "null";
private boolean format;
@@ -197,7 +198,7 @@ public class JsonMapObjectReaderWriter {
values.put(name, internalFromJsonAsList(name, newJson));
i = closingIndex + 1;
} else {
- int commaIndex = getCommaIndex(json, sepIndex + j, sepIndex + j);
+ int commaIndex = getCommaIndex(json, sepIndex + j);
Object value = readPrimitiveValue(name, json, sepIndex + j, commaIndex);
values.put(name, value);
i = commaIndex + 1;
@@ -218,7 +219,7 @@ public class JsonMapObjectReaderWriter {
values.add(nextMap.map);
i = closingIndex + 1;
} else {
- int commaIndex = getCommaIndex(json, i, i);
+ int commaIndex = getCommaIndex(json, i);
Object value = readPrimitiveValue(name, json, i, commaIndex);
values.add(value);
i = commaIndex;
@@ -247,33 +248,41 @@ public class JsonMapObjectReaderWriter {
return value;
}
- protected static int getCommaIndex(String json, int start, int from) {
- int commaIndex = json.indexOf(COMMA, from);
+ protected static int getCommaIndex(String json, int from) {
+ int commaIndex = getNextSepCharIndex(json, COMMA, from);
if (commaIndex == -1) {
commaIndex = json.length();
- } else if (json.charAt(commaIndex - 1) != DQUOTE && json.charAt(start) == DQUOTE) {
- int lastNonWhiteCharIndex = commaIndex - 1;
- for (; lastNonWhiteCharIndex > from; lastNonWhiteCharIndex--) {
- if (!Character.isWhitespace(json.charAt(lastNonWhiteCharIndex))) {
- break;
- }
- }
- if (json.charAt(lastNonWhiteCharIndex) != DQUOTE) {
- commaIndex = getCommaIndex(json, start, commaIndex + 1);
- }
}
return commaIndex;
}
- protected int getClosingIndex(String json, char openChar, char closeChar, int from) {
- int nextOpenIndex = json.indexOf(openChar, from + 1);
- int closingIndex = json.indexOf(closeChar, from + 1);
+ protected static int getClosingIndex(String json, char openChar, char closeChar, int from) {
+ int nextOpenIndex = getNextSepCharIndex(json, openChar, from + 1);
+ int closingIndex = getNextSepCharIndex(json, closeChar, from + 1);
while (nextOpenIndex != -1 && nextOpenIndex < closingIndex) {
- nextOpenIndex = json.indexOf(openChar, nextOpenIndex + 1);
- closingIndex = json.indexOf(closeChar, closingIndex + 1);
+ nextOpenIndex = getNextSepCharIndex(json, openChar, nextOpenIndex + 1);
+ closingIndex = getNextSepCharIndex(json, closeChar, closingIndex + 1);
}
return closingIndex;
}
+ protected static int getNextSepCharIndex(String json, char curlyBracketChar, int from) {
+ int nextCurlyBracketIndex = -1;
+ boolean inString = false;
+ for (int i = from; i < json.length(); i++) {
+ char currentChar = json.charAt(i);
+ if (currentChar == curlyBracketChar && !inString) {
+ nextCurlyBracketIndex = i;
+ break;
+ } else if (currentChar == DQUOTE) {
+ if (i > from && json.charAt(i - 1) == ESCAPE) {
+ continue;
+ }
+ inString = !inString;
+ }
+ }
+ return nextCurlyBracketIndex;
+ }
+
public void setFormat(boolean format) {
this.format = format;
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/3c37b64c/rt/rs/extensions/json-basic/src/test/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriterTest.java
----------------------------------------------------------------------
diff --git a/rt/rs/extensions/json-basic/src/test/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriterTest.java b/rt/rs/extensions/json-basic/src/test/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriterTest.java
index aecad16..0dce1ef 100644
--- a/rt/rs/extensions/json-basic/src/test/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriterTest.java
+++ b/rt/rs/extensions/json-basic/src/test/java/org/apache/cxf/jaxrs/json/basic/JsonMapObjectReaderWriterTest.java
@@ -24,6 +24,8 @@ import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
+import org.apache.cxf.helpers.CastUtils;
+
import org.junit.Assert;
import org.junit.Test;
@@ -68,4 +70,58 @@ public class JsonMapObjectReaderWriterTest extends Assert {
assertEquals(Collections.singletonList("cValue1, cValue2"), map.get("c"));
assertEquals("dValue1,dValue2,dValue3,dValue4", map.get("d"));
}
+ @Test
+ public void testReadStringWithLeftCurlyBracketInString() throws Exception {
+ JsonMapObjectReaderWriter jsonMapObjectReaderWriter = new JsonMapObjectReaderWriter();
+ String s = "{\"x\":{\"y\":\"{\"}}";
+ Map<String, Object> map = jsonMapObjectReaderWriter.fromJson(s);
+ assertEquals(1, map.size());
+ Map<String, Object> xMap = CastUtils.cast((Map<?, ?>)map.get("x"));
+ assertEquals(1, xMap.size());
+ assertEquals("{", xMap.get("y"));
+ }
+ @Test
+ public void testReadStringWithLeftCurlyBracketInString2() throws Exception {
+ JsonMapObjectReaderWriter jsonMapObjectReaderWriter = new JsonMapObjectReaderWriter();
+ String s = "{\"x\":{\"y\":\"{\", \"z\":\"{\"}, \"a\":\"b\"}";
+ Map<String, Object> map = jsonMapObjectReaderWriter.fromJson(s);
+ assertEquals(2, map.size());
+ assertEquals("b", map.get("a"));
+ Map<String, Object> xMap = CastUtils.cast((Map<?, ?>)map.get("x"));
+ assertEquals(2, xMap.size());
+ assertEquals("{", xMap.get("y"));
+ assertEquals("{", xMap.get("z"));
+ }
+ @Test
+ public void testReadStringWithRightCurlyBracketInString() throws Exception {
+ JsonMapObjectReaderWriter jsonMapObjectReaderWriter = new JsonMapObjectReaderWriter();
+ String s = "{\"x\":{\"y\":\"}\"}}";
+ Map<String, Object> map = jsonMapObjectReaderWriter.fromJson(s);
+ assertEquals(1, map.size());
+ Map<String, Object> xMap = CastUtils.cast((Map<?, ?>)map.get("x"));
+ assertEquals(1, xMap.size());
+ assertEquals("}", xMap.get("y"));
+ }
+ @Test
+ public void testReadStringWithRightCurlyBracketInString2() throws Exception {
+ JsonMapObjectReaderWriter jsonMapObjectReaderWriter = new JsonMapObjectReaderWriter();
+ String s = "{\"x\":{\"y\":\"}\", \"z\":\"}\"}, \"a\":\"b\"}";
+ Map<String, Object> map = jsonMapObjectReaderWriter.fromJson(s);
+ assertEquals(2, map.size());
+ assertEquals("b", map.get("a"));
+ Map<String, Object> xMap = CastUtils.cast((Map<?, ?>)map.get("x"));
+ assertEquals(2, xMap.size());
+ assertEquals("}", xMap.get("y"));
+ assertEquals("}", xMap.get("z"));
+ }
+ @Test
+ public void testReadStringWithCurlyBracketsInString() throws Exception {
+ JsonMapObjectReaderWriter jsonMapObjectReaderWriter = new JsonMapObjectReaderWriter();
+ String s = "{\"x\":{\"y\":\"{\\\"}\"}}";
+ Map<String, Object> map = jsonMapObjectReaderWriter.fromJson(s);
+ assertEquals(1, map.size());
+ Map<String, Object> xMap = CastUtils.cast((Map<?, ?>)map.get("x"));
+ assertEquals(1, xMap.size());
+ assertEquals("{\\\"}", xMap.get("y"));
+ }
}