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());
+    }
 }

Reply via email to