From 13ad73aeceba5cab145a03fbdadcc442d3396966 Mon Sep 17 00:00:00 2001 From: Andrea Cosentino Date: Wed, 29 Jul 2026 09:24:46 +0200 Subject: [PATCH] CAMEL-24289: camel-aws2-textract - throw when pojoRequest=true and the body is the wrong type Child of CAMEL-24261. Textract2Producer's nine operations (detectDocumentText, analyzeDocument, analyzeExpense, startDocumentTextDetection, startDocumentAnalysis, startExpenseAnalysis, getDocumentTextDetection, getDocumentAnalysis, getExpenseAnalysis) only acted when the body was the matching request type under pojoRequest=true; any other body silently fell through with no AWS call and no error. Add the missing else that throws IllegalArgumentException naming the required type, consistent with CAMEL-23462. A parameterized test covers all nine operations; verified to fail (silent no-op) before the fix. The shared 4.22 upgrade-guide entry was added with CAMEL-24263. Co-authored-by: Claude Opus 4.8 Signed-off-by: Andrea Cosentino --- .../camel-aws/camel-aws2-textract/pom.xml | 5 +++ .../aws2/textract/Textract2Producer.java | 27 ++++++++++++++ .../aws2/textract/Textract2ProducerTest.java | 37 +++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/components/camel-aws/camel-aws2-textract/pom.xml b/components/camel-aws/camel-aws2-textract/pom.xml index e2a2ba80efcdc..452d5b6ebe355 100644 --- a/components/camel-aws/camel-aws2-textract/pom.xml +++ b/components/camel-aws/camel-aws2-textract/pom.xml @@ -78,5 +78,10 @@ ${project.version} test + + org.assertj + assertj-core + test + \ No newline at end of file diff --git a/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2Producer.java b/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2Producer.java index e00d9de3a567c..aca4d9a02dd72 100644 --- a/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2Producer.java +++ b/components/camel-aws/camel-aws2-textract/src/main/java/org/apache/camel/component/aws2/textract/Textract2Producer.java @@ -123,6 +123,9 @@ private void detectDocumentText(TextractClient textractClient, Exchange exchange } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "detectDocumentText operation requires DetectDocumentTextRequest in POJO mode"); } } else { DetectDocumentTextRequest.Builder request = DetectDocumentTextRequest.builder(); @@ -154,6 +157,9 @@ private void analyzeDocument(TextractClient textractClient, Exchange exchange) t } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "analyzeDocument operation requires AnalyzeDocumentRequest in POJO mode"); } } else { AnalyzeDocumentRequest.Builder request = AnalyzeDocumentRequest.builder(); @@ -194,6 +200,9 @@ private void analyzeExpense(TextractClient textractClient, Exchange exchange) th } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "analyzeExpense operation requires AnalyzeExpenseRequest in POJO mode"); } } else { AnalyzeExpenseRequest.Builder request = AnalyzeExpenseRequest.builder(); @@ -226,6 +235,9 @@ private void startDocumentTextDetection(TextractClient textractClient, Exchange } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "startDocumentTextDetection operation requires StartDocumentTextDetectionRequest in POJO mode"); } } else { StartDocumentTextDetectionRequest.Builder request = StartDocumentTextDetectionRequest.builder(); @@ -258,6 +270,9 @@ private void startDocumentAnalysis(TextractClient textractClient, Exchange excha } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "startDocumentAnalysis operation requires StartDocumentAnalysisRequest in POJO mode"); } } else { StartDocumentAnalysisRequest.Builder request = StartDocumentAnalysisRequest.builder(); @@ -297,6 +312,9 @@ private void startExpenseAnalysis(TextractClient textractClient, Exchange exchan } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "startExpenseAnalysis operation requires StartExpenseAnalysisRequest in POJO mode"); } } else { StartExpenseAnalysisRequest.Builder request = StartExpenseAnalysisRequest.builder(); @@ -329,6 +347,9 @@ private void getDocumentTextDetection(TextractClient textractClient, Exchange ex } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "getDocumentTextDetection operation requires GetDocumentTextDetectionRequest in POJO mode"); } } else { GetDocumentTextDetectionRequest.Builder request = GetDocumentTextDetectionRequest.builder(); @@ -377,6 +398,9 @@ private void getDocumentAnalysis(TextractClient textractClient, Exchange exchang } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "getDocumentAnalysis operation requires GetDocumentAnalysisRequest in POJO mode"); } } else { GetDocumentAnalysisRequest.Builder request = GetDocumentAnalysisRequest.builder(); @@ -425,6 +449,9 @@ private void getExpenseAnalysis(TextractClient textractClient, Exchange exchange } Message message = getMessageForResponse(exchange); message.setBody(result); + } else { + throw new IllegalArgumentException( + "getExpenseAnalysis operation requires GetExpenseAnalysisRequest in POJO mode"); } } else { GetExpenseAnalysisRequest.Builder request = GetExpenseAnalysisRequest.builder(); diff --git a/components/camel-aws/camel-aws2-textract/src/test/java/org/apache/camel/component/aws2/textract/Textract2ProducerTest.java b/components/camel-aws/camel-aws2-textract/src/test/java/org/apache/camel/component/aws2/textract/Textract2ProducerTest.java index 445e41bc8c249..dba02346a12f8 100644 --- a/components/camel-aws/camel-aws2-textract/src/test/java/org/apache/camel/component/aws2/textract/Textract2ProducerTest.java +++ b/components/camel-aws/camel-aws2-textract/src/test/java/org/apache/camel/component/aws2/textract/Textract2ProducerTest.java @@ -24,11 +24,14 @@ import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.test.junit6.CamelTestSupport; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.services.textract.model.DetectDocumentTextRequest; import software.amazon.awssdk.services.textract.model.DetectDocumentTextResponse; import software.amazon.awssdk.services.textract.model.Document; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -112,6 +115,24 @@ public void process(Exchange exchange) { } + @ParameterizedTest + @CsvSource({ + "direct:detectDocumentTextPojo,detectDocumentText operation requires DetectDocumentTextRequest in POJO mode", + "direct:analyzeDocumentPojo,analyzeDocument operation requires AnalyzeDocumentRequest in POJO mode", + "direct:analyzeExpensePojo,analyzeExpense operation requires AnalyzeExpenseRequest in POJO mode", + "direct:startDocumentTextDetectionPojo,startDocumentTextDetection operation requires StartDocumentTextDetectionRequest in POJO mode", + "direct:startDocumentAnalysisPojo,startDocumentAnalysis operation requires StartDocumentAnalysisRequest in POJO mode", + "direct:startExpenseAnalysisPojo,startExpenseAnalysis operation requires StartExpenseAnalysisRequest in POJO mode", + "direct:getDocumentTextDetectionPojo,getDocumentTextDetection operation requires GetDocumentTextDetectionRequest in POJO mode", + "direct:getDocumentAnalysisPojo,getDocumentAnalysis operation requires GetDocumentAnalysisRequest in POJO mode", + "direct:getExpenseAnalysisPojo,getExpenseAnalysis operation requires GetExpenseAnalysisRequest in POJO mode", + }) + void pojoRequestWithWrongBodyTypeThrows(String route, String expectedMessage) { + assertThatThrownBy(() -> template.requestBody(route, "not the expected request type")) + .hasRootCauseInstanceOf(IllegalArgumentException.class) + .hasRootCauseMessage(expectedMessage); + } + @Override protected RouteBuilder createRouteBuilder() { return new RouteBuilder() { @@ -126,6 +147,22 @@ public void configure() { from("direct:detectDocumentTextOptions").to( "aws2-textract://test?textractClient=#amazonTextractClient&operation=detectDocumentText&s3Bucket=testbucket&s3Object=testobject.pdf") .to("mock:result"); + from("direct:analyzeDocumentPojo") + .to("aws2-textract://test?textractClient=#amazonTextractClient&operation=analyzeDocument&pojoRequest=true"); + from("direct:analyzeExpensePojo") + .to("aws2-textract://test?textractClient=#amazonTextractClient&operation=analyzeExpense&pojoRequest=true"); + from("direct:startDocumentTextDetectionPojo") + .to("aws2-textract://test?textractClient=#amazonTextractClient&operation=startDocumentTextDetection&pojoRequest=true"); + from("direct:startDocumentAnalysisPojo") + .to("aws2-textract://test?textractClient=#amazonTextractClient&operation=startDocumentAnalysis&pojoRequest=true"); + from("direct:startExpenseAnalysisPojo") + .to("aws2-textract://test?textractClient=#amazonTextractClient&operation=startExpenseAnalysis&pojoRequest=true"); + from("direct:getDocumentTextDetectionPojo") + .to("aws2-textract://test?textractClient=#amazonTextractClient&operation=getDocumentTextDetection&pojoRequest=true"); + from("direct:getDocumentAnalysisPojo") + .to("aws2-textract://test?textractClient=#amazonTextractClient&operation=getDocumentAnalysis&pojoRequest=true"); + from("direct:getExpenseAnalysisPojo") + .to("aws2-textract://test?textractClient=#amazonTextractClient&operation=getExpenseAnalysis&pojoRequest=true"); } }; }