Andrea Cosentino created CAMEL-24422:
----------------------------------------

             Summary: camel-docling: make message body input-source 
interpretation explicit and configurable
                 Key: CAMEL-24422
                 URL: https://issues.apache.org/jira/browse/CAMEL-24422
             Project: Camel
          Issue Type: Improvement
          Components: camel-docling
    Affects Versions: 4.22.0
            Reporter: Andrea Cosentino


{{DoclingProducer.getInputPath()}} decides what a {{String}} message body 
_means_ by
inspecting its prefix:

* starts with {{http://}} or {{https://}} -> treated as a remote URL and handed 
to the
  docling CLI or to {{HttpSource}}
* starts with {{/}}, or contains {{\}} -> treated as a local filesystem path 
and read
* otherwise -> treated as document content and written to a temp file

The mode is chosen implicitly and the route author cannot influence it. A route 
that means
"convert whatever text arrives in the body" silently switches to reading a file 
when that
text happens to begin with {{/}}, and to fetching a remote resource when it 
happens to
begin with {{http://}}. No endpoint option pins the component to a single 
interpretation.

There are three things to address here.

h2. 1. No way to express intent

Add endpoint options so a route can state what the body is, instead of relying 
on prefix
sniffing. Suggested shape: {{allowUrlSource}} and {{allowFilePathSource}}, or a 
single
{{inputSourceMode}} enum ({{AUTO}} / {{CONTENT}} / {{PATH}}), plus an optional
base-directory option that bounds the file-path mode to a configured root.

h2. 2. Duplicated prefix logic

The same {{startsWith("http://";) || startsWith("https://";)}} branch is 
implemented
independently in four places:

|| Method || Declared at || Prefix check ||
| {{DoclingProducer#getInputPath}} | 1711 | 1726 |
| {{DoclingProducer#addSourceToRequest}} | 1523 | 1525 |
| {{DoclingProducer#addSourceToChunkRequest}} | 625 | 628 |
| {{DoclingProducer#extractMetadataUsingApi}} | 650 | 670 |

Any new handling has to be added to every one of them, which is how they drift 
apart.
The classification belongs in one place -- {{getInputPath()}} -- so that the 
downstream
helpers receive an already-classified source rather than re-deriving it. Note 
that
{{extractMetadataUsingApi}} spells the condition negatively, which makes the 
set harder
to keep aligned by inspection.

h2. 3. validateFileSize() does nothing for a path that does not exist

{{validateFileSize()}} (line 1816) is wrapped in {{if (Files.exists(path))}}, 
so a path
that resolves to nothing, or to a pseudo-file that reports size 0, passes 
without a check
while the call site reads as though one happened. Either make the outcome 
explicit (fail
when a path cannot be sized) or rename the method so its partial nature is 
visible where
it is called.

h2. Batch operations have the same shape

{{extractDocumentList()}} (line 1049) applies the same implicit rule for the 
batch
operations: a {{String}} body is used either as a directory to scan via
{{new File(path).listFiles()}} or as a single file path, again with no way for 
the route
to say which was intended. Whatever mechanism is added should cover this path 
too.

h2. Documentation and upgrade guide

The component documentation currently describes the accepted body types as
"{{String}} - File path or document content" and does not mention the URL mode 
at all, so
{{docling-component.adoc}} needs to be updated to describe the resulting 
contract.

If the defaults change as part of this, the change needs an entry in
{{docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc}}.

h2. Blast radius

Tightening the {{String}} branch does not affect the documented
{{from("file:...").to("docling:...")}} flow: camel-file delivers a
{{GenericFile}}/{{WrappedFile}} body, which {{getInputPath()}} unwraps into the 
{{File}}
branch rather than the {{String}} branch.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to