Claus Ibsen created CAMEL-25383:
-----------------------------------

             Summary: camel-support - EndpointUriFactorySupport removes an 
unset optional path option by name from inside the value of an earlier path 
option
                 Key: CAMEL-25383
                 URL: https://issues.apache.org/jira/browse/CAMEL-25383
             Project: Camel
          Issue Type: Bug
          Components: camel-core
            Reporter: Claus Ibsen


{{EndpointUriFactorySupport.buildPathParameter}} fills the path options one at 
a time, in the order of the syntax. For an optional path option without a 
value, it removes the option's name from the uri, found with 
{{indexOfPathParameter}}. That search starts after the scheme, so it can find 
the name inside the value of a path option already substituted, cut it out, and 
remove one separator character before it.

Example: the azure-files syntax is 
{{azure-files://account/share:port/directoryName}}, with {{port}} and 
{{directoryName}} optional. In YAML DSL:

{noformat}
uri: azure-files
parameters:
  account: "{{accountName}}"
  share: "{{shareName}}/{{directoryName}}"
{noformat}

The YAML DSL builds the uri with the component's EndpointUriFactory and gets:

{noformat}
azure-files:{{accountName}}/{{shareName}}/{}}
{noformat}

After {{share}} is substituted, the unset {{directoryName}} is removed by name. 
{{indexOfPathParameter}} finds the word inside the substituted value 
{{{{directoryName}}}} ({{{}} counts as a word boundary), removes it and the 
{{{}} before it, and leaves {{{}}}}. Any value that contains the name of a 
later, unset optional path option as a word is changed the same way, with or 
without placeholders.

Found while normalizing the camel-kamelets catalog to canonical YAML DSL 
(CAMEL-25381): {{azure-storage-files-source}} was written with {{share: 
"{{shareName}}/{{directoryName}}"}}. CAMEL-25381 now keeps such a uri as 
written, but the factory itself is still affected.

Proposal: search for the name only in the part of the uri that is still syntax. 
Path options are filled in syntax order, so it is enough to start after the end 
of the last value substituted, or to build the path from the syntax in one pass 
instead of replacing names in a string that already holds values. A test in 
camel-support can use a small factory with a syntax such as {{foo:a/b:c/d}} 
where {{c}} and {{d}} are optional, and the value of {{b}} contains {{d}}.



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

Reply via email to