From f462af9a95eafc527978b146b80f5969f6982586 Mon Sep 17 00:00:00 2001 From: croway Date: Thu, 3 Sep 2026 19:24:36 +0200 Subject: [PATCH] camel-docling: honor the operationId URI path segment to select the operation DoclingEndpoint stores the docling: URI path segment (e.g. docling:EXTRACT_STRUCTURED_DATA) but DoclingComponent never applied it to DoclingConfiguration.operation, and DoclingProducer.getOperation() only consults the CamelDoclingOperation header or the configured/default operation (CONVERT_TO_MARKDOWN). As a result, an endpoint like docling:EXTRACT_STRUCTURED_DATA?useDoclingServe=true&outputFormat=json silently performed CONVERT_TO_MARKDOWN instead, since the operation was never set anywhere else - the path segment was purely cosmetic despite the component's own syntax being documented as "docling:operationId". DoclingComponent.createEndpoint() now parses the operationId into a DoclingOperations value and applies it to the endpoint's configuration before setProperties() runs, so an explicit ?operation=... query parameter (as already used in this component's own tests and docs) still takes precedence, and an operationId that isn't a recognized operation name is silently ignored rather than failing endpoint creation. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01Hs6c6LpuL8ZZ3gaSXwt7CS --- .../component/docling/DoclingComponent.java | 10 +++++++++ .../docling/DoclingComponentTest.java | 21 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingComponent.java b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingComponent.java index 767d4354646ff..7d4defa95587c 100644 --- a/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingComponent.java +++ b/components/camel-ai/camel-docling/src/main/java/org/apache/camel/component/docling/DoclingComponent.java @@ -29,6 +29,7 @@ import org.apache.camel.spi.Metadata; import org.apache.camel.spi.annotations.Component; import org.apache.camel.support.DefaultComponent; +import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -83,6 +84,15 @@ protected void doStart() throws Exception { @Override protected Endpoint createEndpoint(String uri, String remaining, Map parameters) throws Exception { DoclingConfiguration config = this.configuration.copy(); + // operationId (e.g. docling:CONVERT_TO_MARKDOWN) selects the operation; applied before + // setProperties() below so an explicit ?operation=... parameter still takes precedence. + if (ObjectHelper.isNotEmpty(remaining)) { + try { + config.setOperation(DoclingOperations.valueOf(remaining)); + } catch (IllegalArgumentException e) { + // not a recognized operation name - leave the configured/default operation as-is + } + } DoclingEndpoint endpoint = new DoclingEndpoint(uri, this, remaining, config); setProperties(endpoint, parameters); return endpoint; diff --git a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingComponentTest.java b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingComponentTest.java index cf56c9d7160de..4c6c8ec219d04 100644 --- a/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingComponentTest.java +++ b/components/camel-ai/camel-docling/src/test/java/org/apache/camel/component/docling/DoclingComponentTest.java @@ -49,6 +49,27 @@ public void testCreateEndpointWithParameters() throws Exception { assertEquals("es", doclingEndpoint.getConfiguration().getOcrLanguage()); } + @Test + public void testOperationIdSelectsOperation() throws Exception { + Endpoint endpoint = context.getEndpoint("docling:EXTRACT_STRUCTURED_DATA"); + assertNotNull(endpoint); + assertTrue(endpoint instanceof DoclingEndpoint); + + DoclingEndpoint doclingEndpoint = (DoclingEndpoint) endpoint; + assertEquals("EXTRACT_STRUCTURED_DATA", doclingEndpoint.getOperationId()); + assertEquals(DoclingOperations.EXTRACT_STRUCTURED_DATA, doclingEndpoint.getConfiguration().getOperation()); + } + + @Test + public void testExplicitOperationParameterOverridesOperationId() throws Exception { + // a recognized operationId must still be overridable via an explicit "operation" parameter + Endpoint endpoint = context.getEndpoint("docling:CONVERT_TO_MARKDOWN?operation=EXTRACT_TEXT"); + assertNotNull(endpoint); + + DoclingEndpoint doclingEndpoint = (DoclingEndpoint) endpoint; + assertEquals(DoclingOperations.EXTRACT_TEXT, doclingEndpoint.getConfiguration().getOperation()); + } + @Test public void testProducerCreation() throws Exception { DoclingEndpoint endpoint = (DoclingEndpoint) context.getEndpoint("docling:convert");