From 3117acd2d7daeb7a252ff8b0a079d7f2cb129493 Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 4 Sep 2020 13:37:25 +1200 Subject: [PATCH] #2053 - Refactor tidy StringHelper.delimitedToMap --- src/main/java/io/ebean/util/StringHelper.java | 41 ++++++--------- src/test/java/io/ebean/StringHelperTest.java | 51 ++++++++++++++++++- 2 files changed, 65 insertions(+), 27 deletions(-) diff --git a/src/main/java/io/ebean/util/StringHelper.java b/src/main/java/io/ebean/util/StringHelper.java index a73e755fe..e90e75b1f 100644 --- a/src/main/java/io/ebean/util/StringHelper.java +++ b/src/main/java/io/ebean/util/StringHelper.java @@ -25,18 +25,18 @@ public class StringHelper { * always return a StringMap. If allNameValuePairs is null, or no name values * can be parsed out an empty StringMap is returned. * - * @param allNameValuePairs the entire string to be parsed. + * @param source the entire string to be parsed. * @param listDelimiter (typically ';') the delimited between the list * @param nameValueSeparator (typically '=') the separator between the name and value */ - public static Map delimitedToMap(String allNameValuePairs, String listDelimiter, String nameValueSeparator) { + public static Map delimitedToMap(String source, String listDelimiter, String nameValueSeparator) { Map params = new HashMap<>(); - if ((allNameValuePairs == null) || (allNameValuePairs.isEmpty())) { + if (source == null || source.isEmpty()) { return params; } // trim off any leading listDelimiter... - allNameValuePairs = trimFront(allNameValuePairs, listDelimiter); - return delimitedToMap(params, allNameValuePairs, listDelimiter, nameValueSeparator); + source = trimFront(source, listDelimiter); + return delimitedToMap(params, source, listDelimiter, nameValueSeparator); } /** @@ -47,9 +47,6 @@ public class StringHelper { */ private static String trimFront(String source, String trim) { while (true) { - if (source == null) { - return null; - } if (source.indexOf(trim) == 0) { source = source.substring(trim.length()); } else { @@ -61,18 +58,16 @@ public class StringHelper { /** * Recursively pulls out the key value pairs from a raw string. */ - private static Map delimitedToMap(Map map, String allNameValuePairs, String listDelimiter, String nameValueSeparator) { + private static Map delimitedToMap(Map map, String source, String listDelimiter, String nameValueSeparator) { int pos = 0; while (true) { - if (pos >= allNameValuePairs.length()) { + if (pos >= source.length()) { return map; } - - int equalsPos = allNameValuePairs.indexOf(nameValueSeparator, pos); - int delimPos = allNameValuePairs.indexOf(listDelimiter, pos); - + int equalsPos = source.indexOf(nameValueSeparator, pos); + int delimPos = source.indexOf(listDelimiter, pos); if (delimPos == -1) { - delimPos = allNameValuePairs.length(); + delimPos = source.length(); } if (equalsPos == -1) { return map; @@ -83,7 +78,7 @@ public class StringHelper { } if (equalsPos > delimPos) { // there is a key without a value? - String key = allNameValuePairs.substring(pos, delimPos); + String key = source.substring(pos, delimPos); key = key.trim(); if (!key.isEmpty()) { map.put(key, null); @@ -91,16 +86,10 @@ public class StringHelper { pos = delimPos + 1; continue; } - String key = allNameValuePairs.substring(pos, equalsPos); - if (delimPos <= -1) { - // we are done - return map; - - } else { - String value = allNameValuePairs.substring(equalsPos + 1, delimPos); - map.put(key.trim(), value); - pos = delimPos + 1; - } + String key = source.substring(pos, equalsPos); + String value = source.substring(equalsPos + 1, delimPos); + map.put(key.trim(), value); + pos = delimPos + 1; } } diff --git a/src/test/java/io/ebean/StringHelperTest.java b/src/test/java/io/ebean/StringHelperTest.java index 39d673967..bb044137c 100644 --- a/src/test/java/io/ebean/StringHelperTest.java +++ b/src/test/java/io/ebean/StringHelperTest.java @@ -24,7 +24,6 @@ public class StringHelperTest { @Test public void removeNewLines() { String content = "This is\na\rmultiline\r\ntext\n\r"; - String[] multi = {"\r\n", "\r", "\n"}; content = StringHelper.removeNewLines(content); assertThat(content).isEqualTo("This is a multiline text "); } @@ -39,4 +38,54 @@ public class StringHelperTest { .containsEntry("name3", "foo"); } + @Test + public void testDelimitedToMap_expect_trimLeading() { + String content = ";name1=foo;name2=bar;"; + Map map = StringHelper.delimitedToMap(content, ";", "="); + assertThat(map).hasSize(2) + .containsEntry("name1", "foo") + .containsEntry("name2", "bar"); + } + + @Test + public void testDelimitedToMap_when_emptyEntry() { + String content = ";name1=foo;=;name2=bar;"; + Map map = StringHelper.delimitedToMap(content, ";", "="); + assertThat(map).hasSize(2) + .containsEntry("name1", "foo") + .containsEntry("name2", "bar"); + } + + @Test + public void testDelimitedToMap_when_missingValue() { + String content = ";name1=foo;nameX;name2=bar;"; + Map map = StringHelper.delimitedToMap(content, ";", "="); + assertThat(map).hasSize(3) + .containsEntry("nameX", null) + .containsEntry("name1", "foo") + .containsEntry("name2", "bar"); + } + + @Test + public void testDelimitedToMap_when_missingValueAtEnd() { + String content = ";name1=foo;nameX;name2=bar;nameX2"; + Map map = StringHelper.delimitedToMap(content, ";", "="); + assertThat(map).hasSize(3) + .containsEntry("nameX", null) + .containsEntry("nameX2", null) + .containsEntry("name1", "foo") + .containsEntry("name2", "bar"); + } + + @Test + public void testDelimitedToMap_when_null() { + Map map = StringHelper.delimitedToMap(null, ";", "="); + assertThat(map).isEmpty(); + } + + @Test + public void testDelimitedToMap_when_empty() { + Map map = StringHelper.delimitedToMap("", ";", "="); + assertThat(map).isEmpty(); + } }