This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new 2e02eaa camel-core - Small optimization for split iterator 2e02eaa is described below commit 2e02eaa73234a7cda52d11a19a3de575c979586f Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Fri Apr 9 10:07:22 2021 +0200 camel-core - Small optimization for split iterator --- .../org/apache/camel/support/ObjectHelper.java | 5 +- .../java/org/apache/camel/util/StringHelper.java | 50 +++++++++++++++++++ .../org/apache/camel/util/StringHelperTest.java | 58 +++++++++++++++++++--- 3 files changed, 103 insertions(+), 10 deletions(-) diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ObjectHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ObjectHelper.java index c1b9767..273d079 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/ObjectHelper.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/ObjectHelper.java @@ -541,7 +541,7 @@ public final class ObjectHelper { } else { // optimized split string on default delimiter int count = StringHelper.countChar(value, DEFAULT_DELIMITER_CHAR) + 1; - return StringHelper.splitOnCharacterAsList(value, DEFAULT_DELIMITER_CHAR, count); + return () -> StringHelper.splitOnCharacterAsIterator(value, DEFAULT_DELIMITER_CHAR, count); } } return () -> new Scanner(value, delimiter); @@ -761,7 +761,8 @@ public final class ObjectHelper { } else { // optimized split string on default delimiter int count = StringHelper.countChar(s, DEFAULT_DELIMITER_CHAR) + 1; - return StringHelper.splitOnCharacterAsList(s, DEFAULT_DELIMITER_CHAR, count); + return (Iterable<String>) () -> StringHelper.splitOnCharacterAsIterator(s, DEFAULT_DELIMITER_CHAR, + count); } } else { return (Iterable<String>) () -> new Scanner(s, delimiter); diff --git a/core/camel-util/src/main/java/org/apache/camel/util/StringHelper.java b/core/camel-util/src/main/java/org/apache/camel/util/StringHelper.java index dfd4d40..e55fb8b 100644 --- a/core/camel-util/src/main/java/org/apache/camel/util/StringHelper.java +++ b/core/camel-util/src/main/java/org/apache/camel/util/StringHelper.java @@ -18,8 +18,10 @@ package org.apache.camel.util; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Locale; +import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; import java.util.function.Function; @@ -396,6 +398,54 @@ public final class StringHelper { return rc; } + public static Iterator<String> splitOnCharacterAsIterator(String value, char needle, int count) { + // skip leading and trailing needles + int end = value.length() - 1; + boolean skipStart = value.charAt(0) == needle; + boolean skipEnd = value.charAt(end) == needle; + if (skipStart && skipEnd) { + value = value.substring(1, end); + count = count - 2; + } else if (skipStart) { + value = value.substring(1); + count = count - 1; + } else if (skipEnd) { + value = value.substring(0, end); + count = count - 1; + } + + final int size = count; + final String text = value; + + return new Iterator<String>() { + int i = 0; + int pos = 0; + + @Override + public boolean hasNext() { + return i < size; + } + + @Override + public String next() { + if (i == size) { + throw new NoSuchElementException(); + } + String answer; + int end = text.indexOf(needle, pos); + if (end != -1) { + answer = text.substring(pos, end); + pos = end + 1; + } else { + answer = text.substring(pos); + // no more data + i = size; + } + return answer; + } + }; + } + public static List<String> splitOnCharacterAsList(String value, char needle, int count) { // skip leading and trailing needles int end = value.length() - 1; diff --git a/core/camel-util/src/test/java/org/apache/camel/util/StringHelperTest.java b/core/camel-util/src/test/java/org/apache/camel/util/StringHelperTest.java index f2b57ab..e95c18b 100644 --- a/core/camel-util/src/test/java/org/apache/camel/util/StringHelperTest.java +++ b/core/camel-util/src/test/java/org/apache/camel/util/StringHelperTest.java @@ -16,6 +16,7 @@ */ package org.apache.camel.util; +import java.util.Iterator; import java.util.List; import org.junit.jupiter.api.Nested; @@ -125,16 +126,16 @@ public class StringHelperTest { @Test public void testSplitOnCharacterAsList() throws Exception { - // List<String> list = splitOnCharacterAsList("foo", ',', 1); - // assertEquals(1, list.size()); - // assertEquals("foo", list.get(0)); + List<String> list = splitOnCharacterAsList("foo", ',', 1); + assertEquals(1, list.size()); + assertEquals("foo", list.get(0)); - // list = splitOnCharacterAsList("foo,bar", ',', 2); - // assertEquals(2, list.size()); - // assertEquals("foo", list.get(0)); - // assertEquals("bar", list.get(1)); + list = splitOnCharacterAsList("foo,bar", ',', 2); + assertEquals(2, list.size()); + assertEquals("foo", list.get(0)); + assertEquals("bar", list.get(1)); - List<String> list = splitOnCharacterAsList("foo,bar,", ',', 3); + list = splitOnCharacterAsList("foo,bar,", ',', 3); assertEquals(2, list.size()); assertEquals("foo", list.get(0)); assertEquals("bar", list.get(1)); @@ -163,4 +164,45 @@ public class StringHelperTest { assertEquals("50", list.get(50)); assertEquals("99", list.get(99)); } + + @Test + public void testSplitOnCharacterAsIterator() throws Exception { + Iterator<String> it = splitOnCharacterAsIterator("foo", ',', 1); + assertEquals("foo", it.next()); + assertFalse(it.hasNext()); + + it = splitOnCharacterAsIterator("foo,bar", ',', 2); + assertEquals("foo", it.next()); + assertEquals("bar", it.next()); + assertFalse(it.hasNext()); + + it = splitOnCharacterAsIterator("foo,bar,", ',', 3); + assertEquals("foo", it.next()); + assertEquals("bar", it.next()); + assertFalse(it.hasNext()); + + it = splitOnCharacterAsIterator(",foo,bar", ',', 3); + assertEquals("foo", it.next()); + assertEquals("bar", it.next()); + assertFalse(it.hasNext()); + + it = splitOnCharacterAsIterator(",foo,bar,", ',', 4); + assertEquals("foo", it.next()); + assertEquals("bar", it.next()); + assertFalse(it.hasNext()); + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 100; i++) { + sb.append(i); + sb.append(","); + } + String value = sb.toString(); + + int count = StringHelper.countChar(value, ',') + 1; + it = splitOnCharacterAsIterator(value, ',', count); + for (int i = 0; i < 100; i++) { + assertEquals("" + i, it.next()); + } + assertFalse(it.hasNext()); + } }