Claus Ibsen created CAMEL-24697:
-----------------------------------

             Summary: camel-yaml-dsl - JSON schema rejects EIP doc examples the 
runtime accepts: inheritErrorHandler, resequence expression oneOf, jaxb 
contextPath
                 Key: CAMEL-24697
                 URL: https://issues.apache.org/jira/browse/CAMEL-24697
             Project: Camel
          Issue Type: Bug
          Components: camel-yaml-dsl
            Reporter: Claus Ibsen


h3. Background

Found while working on CAMEL-24693 (validated per-EIP YAML sample set). After 
the doc-side fixes for the EIP examples that were written in the XML child 
shape, three groups of EIP documentation examples still fail {{camel validate 
yaml}} even though the runtime loads and starts them fine (checked with 
{{CamelYamlParser}} from camel-yaml-dsl-validator on 4.23.0-SNAPSHOT). All 
three are the generated YAML DSL JSON schema ({{camelYamlDsl.json}}) being 
stricter than the runtime.

h3. 1. {{inheritErrorHandler}} is missing on {{circuitBreaker}} and 
{{failoverLoadBalancer}}

{{GenerateYamlSchemaMojo}} skips {{inheritErrorHandler}} for every definition 
except the one whose {{@YamlType}} nodes contain {{loadBalance}} ("we want to 
skip inheritErrorHandler which is only applicable for the load-balancer"). But 
the generated {{ModelDeserializers}} accept the key on both 
{{CircuitBreakerDefinition}} and {{FailoverLoadBalancerDefinition}}, both model 
classes declare it with {{@Metadata}}, and the EIP docs use it:

{noformat}
fault-tolerance-3.camel.yaml:   /0/route/from/steps/1/circuitBreaker: property 
'inheritErrorHandler' is not defined in the schema and the schema does not 
allow additional properties
resilience4j-4.camel.yaml:      /0/route/from/steps/1/circuitBreaker: property 
'inheritErrorHandler' is not defined in the schema and the schema does not 
allow additional properties
failoverLoadBalancer-2.camel.yaml: 
/0/route/from/steps/0/loadBalance/failoverLoadBalancer: property 
'inheritErrorHandler' is not defined in the schema and the schema does not 
allow additional properties
failoverLoadBalancer-3.camel.yaml: 
/0/route/from/steps/0/loadBalance/failoverLoadBalancer: property 
'inheritErrorHandler' is not defined in the schema and the schema does not 
allow additional properties
{noformat}

Note the interaction with CAMEL-24696: both attributes are still converted 
eagerly with {{Boolean.valueOf}} while deserializing, so once they are exposed 
in the schema the placeholder leniency from CAMEL-24694 in 
{{YamlValidator.isRuntimeAcceptedScalar}} would accept {{inheritErrorHandler: 
"{{flag}}"}} while the runtime silently evaluates it to {{false}}. Either port 
the two fields first (CAMEL-24696) or exclude them in 
{{isRuntimeAcceptedScalar}} when adding them to the schema.

h3. 2. {{resequence}} with the {{expression:}} wrapper matches two oneOf 
branches

Every expression-carrying EIP gets a {{oneOf}} with three branches: the inline 
language form ({{simple: ...}}), a {{not}} branch that excludes all the 
language keys, and the {{expression:}} wrapper form. For {{SplitDefinition}}, 
{{FilterDefinition}} etc. the {{not}} branch also excludes {{expression}}, so 
the wrapper form matches exactly one branch. For {{ResequenceDefinition}} the 
{{not}} branch does not list {{expression}}, so the wrapper form matches both 
the {{not}} branch and the wrapper branch:

{noformat}
resequence-2.camel.yaml: /0/route/from/steps/0/resequence: must be valid to one 
and only one schema, but 2 are valid with indexes '1, 2'
{noformat}

8 of the 11 examples on the resequence page fail this way (resequence-2, -4, 
-5, -6, -7, -9, -10, -11). {{ResequenceDefinition}} is the only definition with 
two {{anyOf}} groups (expression, and batchConfig/streamConfig), which is 
probably why the generator drops {{expression}} from the exclusion list. Fix 
belongs in {{GenerateYamlSchemaMojo}}.

h3. 3. {{jaxb}} data format requires {{contextPath}} in the schema but not at 
runtime

{{JaxbDataFormat.contextPath}} in camel-core-model is {{@Metadata(required = 
true)}}, so the schema requires it and {{marshal: jaxb: {}}} / {{unmarshal: 
jaxb: {}}} on the marshal and unmarshal EIP pages fail:

{noformat}
marshal-1.camel.yaml:   /0/route/from/steps/0/unmarshal: must be valid to one 
and only one schema, but 0 are valid
                        /0/route/from/steps/0/unmarshal/jaxb: required property 
'contextPath' not found
{noformat}

The runtime does not require it: 
{{org.apache.camel.converter.jaxb.JaxbDataFormat#createContext}} falls back to 
{{JAXBContext.newInstance()}} when {{contextPath}} is null, and the Java DSL 
{{.jaxb()}} takes no arguments. Either drop {{required = true}} from the model 
metadata (which also fixes the catalog and Kaoto forms) or, if the PMC prefers 
the stricter contract, change the docs to show a context path.

h3. Done when

* {{inheritErrorHandler}} validates on {{circuitBreaker}} and 
{{failoverLoadBalancer}} without accepting a placeholder the runtime gets wrong;
* the resequence examples with the {{expression:}} wrapper validate against 
exactly one branch;
* {{jaxb: {}}} validates, or the docs are changed and the reason recorded here;
* {{camel validate yaml}} passes on the 14 affected EIP doc examples listed 
above (with CAMEL-24694 merged for the remaining scalar-type messages).

Related: CAMEL-24693 (sample set, and the doc-side fixes for the XML child 
shape), CAMEL-24694 (scalar leniency), CAMEL-24696 (eager Boolean conversion of 
inheritErrorHandler).

_Claude Code on behalf of davsclaus_



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

Reply via email to