This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch camel-4.14.x
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.14.x by this push:
new 5b5d941bbade CAMEL-22824: camel-core - Choice with bodyAs predicate
may cause stream caching to be EOL (#20718)
5b5d941bbade is described below
commit 5b5d941bbadee13388781ee4ab5605dae1b804ea
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";