This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 863e1aea16cf CAMEL-22824: camel-core - Choice with bodyAs predicate 
may cause stream caching to be EOL (#20718)
863e1aea16cf is described below

commit 863e1aea16cf17c7f27de31a7a9478ab77d14c03
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Jan 8 11:21:47 2026 +0100

    CAMEL-22824: camel-core - Choice with bodyAs predicate may cause stream 
caching to be EOL (#20718)
---
 .../apache/camel/processor/ChoiceProcessor.java    |  3 ++
 .../camel/processor/StreamCachingChoiceTest.java   | 60 +++++++++++++---------
 ...t.java => StreamCachingFromFileChoiceTest.java} |  2 +-
 3 files changed, 41 insertions(+), 24 deletions(-)

diff --git 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/ChoiceProcessor.java
 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/ChoiceProcessor.java
index e5eb9d11e06c..cf5dafc6a5c1 100644
--- 
a/core/camel-core-processor/src/main/java/org/apache/camel/processor/ChoiceProcessor.java
+++ 
b/core/camel-core-processor/src/main/java/org/apache/camel/processor/ChoiceProcessor.java
@@ -29,6 +29,7 @@ import org.apache.camel.Traceable;
 import org.apache.camel.spi.IdAware;
 import org.apache.camel.spi.RouteIdAware;
 import org.apache.camel.support.AsyncProcessorConverterHelper;
+import org.apache.camel.support.MessageHelper;
 import org.apache.camel.support.service.ServiceHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -81,6 +82,8 @@ public class ChoiceProcessor extends BaseProcessorSupport 
implements Navigate<Pr
 
             // if we did not match then continue to next filter
             if (!matches) {
+                // prepare for re-read from next filter
+                MessageHelper.resetStreamCache(exchange.getIn());
                 continue;
             }
 
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingChoiceTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingChoiceTest.java
index a3ff48268dd6..9914ea74a08e 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingChoiceTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingChoiceTest.java
@@ -16,49 +16,63 @@
  */
 package org.apache.camel.processor;
 
-import java.io.File;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 
 import org.apache.camel.ContextTestSupport;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.converter.stream.FileInputStreamCache;
 import org.junit.jupiter.api.Test;
 
 public class StreamCachingChoiceTest extends ContextTestSupport {
 
-    private static final String TEST_FILE = 
"src/test/resources/org/apache/camel/converter/stream/test.xml";
-
     @Test
     public void testStreamCaching() throws Exception {
-        getMockEndpoint("mock:paris").expectedMessageCount(0);
-        getMockEndpoint("mock:madrid").expectedMessageCount(0);
-        getMockEndpoint("mock:london").expectedMessageCount(1);
-        getMockEndpoint("mock:other").expectedMessageCount(1);
+        getMockEndpoint("mock:1").expectedMessageCount(0);
+        getMockEndpoint("mock:2").expectedMessageCount(1);
+        getMockEndpoint("mock:other").expectedMessageCount(0);
+
+        MyInputStream bos = new MyInputStream("2".getBytes());
 
-        File file = new File(TEST_FILE);
-        FileInputStreamCache cache = new FileInputStreamCache(file);
-        template.sendBody("direct:start", cache);
+        template.sendBody("direct:start", bos);
 
         assertMockEndpointsSatisfied();
     }
 
+    private class MyInputStream extends InputStream {
+
+        private final ByteArrayInputStream bos;
+
+        public MyInputStream(byte[] buf) {
+            this.bos = new ByteArrayInputStream(buf);
+        }
+
+        @Override
+        public boolean markSupported() {
+            return false;
+        }
+
+        @Override
+        public int read() throws IOException {
+            return bos.read();
+        }
+
+        @Override
+        public synchronized void reset() {
+            bos.reset();
+        }
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
             public void configure() {
                 from("direct:start")
                         .choice()
-                            .when().simple("${body} contains 'Paris'")
-                                .to("mock:paris")
-                            .when().simple("${body} contains 'London'")
-                                .to("mock:london")
-                            .otherwise()
-                                .to("mock:other")
-                        .end()
-                        .choice()
-                            .when().simple("${body} contains 'Paris'")
-                                .to("mock:paris")
-                            .when().simple("${body} contains 'Madrid'")
-                                .to("mock:madrid")
+                            .when().simple("${bodyAs(String)} == '1'")
+                                .to("mock:1")
+                            .when().simple("${bodyAs(String)} == '2'")
+                                .to("mock:2")
                             .otherwise()
                                 .to("mock:other")
                         .end();
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingChoiceTest.java
 
b/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingFromFileChoiceTest.java
similarity index 97%
copy from 
core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingChoiceTest.java
copy to 
core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingFromFileChoiceTest.java
index a3ff48268dd6..fc4f13de81b6 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingChoiceTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/processor/StreamCachingFromFileChoiceTest.java
@@ -23,7 +23,7 @@ import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.converter.stream.FileInputStreamCache;
 import org.junit.jupiter.api.Test;
 
-public class StreamCachingChoiceTest extends ContextTestSupport {
+public class StreamCachingFromFileChoiceTest extends ContextTestSupport {
 
     private static final String TEST_FILE = 
"src/test/resources/org/apache/camel/converter/stream/test.xml";
 

Reply via email to