This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-25689 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 8520c620719b2270f633a3c5012173eb27aaec85 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Oct 15 17:30:16 2026 +0200 CAMEL-25689: camel-toon - Upgrade JToon to 2.0.7 JToon 2.0.6 removes the lengthMarker component of EncodeOptions, as the TOON specification no longer has the [#N] array length marker. The lengthMarker option of the toon data format is therefore removed. With strict=false, JToon 2.0.6 applies only the non-strict recoveries of the TOON specification and fails on other malformed TOON, instead of returning null or a partial result. The description of the strict option now says so. Supersedes #27890. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../org/apache/camel/catalog/dataformats/toon.json | 5 ++- .../org/apache/camel/catalog/models/toon.json | 5 ++- .../apache/camel/catalog/schemas/camel-spring.xsd | 15 ++------- .../apache/camel/catalog/schemas/camel-xml-io.xsd | 15 ++------- .../camel/catalog/schemas/camelYamlDsl-model.json | 16 ++------- .../dataformat/toon/ToonDataFormatConfigurer.java | 7 ---- .../org/apache/camel/dataformat/toon/toon.json | 5 ++- .../camel/dataformat/toon/ToonDataFormat.java | 17 +++------- .../camel/dataformat/toon/ToonDataFormatTest.java | 18 +++++----- .../org/apache/camel/model/dataformat/toon.json | 5 ++- .../camel/model/dataformat/ToonDataFormat.java | 38 ++-------------------- .../reifier/dataformat/ToonDataFormatReifier.java | 1 - .../apache/camel/java/out/JavaDslModelWriter.java | 1 - .../java/org/apache/camel/xml/in/ModelParser.java | 1 - .../java/org/apache/camel/xml/out/ModelWriter.java | 1 - .../org/apache/camel/yaml/out/YamlModelWriter.java | 1 - .../ROOT/pages/camel-4x-upgrade-guide-4_24.adoc | 14 ++++++++ .../dsl/yaml/deserializers/ModelDeserializers.java | 8 +---- .../resources/schema/camelYamlDsl-canonical.json | 8 +---- .../resources/schema/camelYamlDsl-model.json | 16 ++------- .../generated/resources/schema/camelYamlDsl.json | 8 +---- parent/pom.xml | 2 +- 22 files changed, 55 insertions(+), 152 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/toon.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/toon.json index a45eeb267e26..5d2b6d93b885 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/toon.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/dataformats/toon.json @@ -19,8 +19,7 @@ "id": { "index": 0, "kind": "attribute", "displayName": "Id", "group": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }, "indent": { "index": 1, "kind": "attribute", "displayName": "Indent", "group": "common", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Number of spaces per indentation level." }, "delimiter": { "index": 2, "kind": "attribute", "displayName": "Delimiter", "group": "common", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "COMMA", "TAB", "PIPE" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "COMMA", "description": "Delimiter used for tabular array rows and inline primitive arrays." }, - "lengthMarker": { "index": 3, "kind": "attribute", "displayName": "Length Marker", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths." }, - "strict": { "index": 4, "kind": "attribute", "displayName": "Strict", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing." }, - "contentTypeHeader": { "index": 5, "kind": "attribute", "displayName": "Content Type Header", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the data format should set the Content-Type header to text\/toon when marshalling." } + "strict": { "index": 3, "kind": "attribute", "displayName": "Strict", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malfor [...] + "contentTypeHeader": { "index": 4, "kind": "attribute", "displayName": "Content Type Header", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the data format should set the Content-Type header to text\/toon when marshalling." } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/toon.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/toon.json index 7bb7784a39ae..f82156daa665 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/toon.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/models/toon.json @@ -16,8 +16,7 @@ "id": { "index": 0, "kind": "attribute", "displayName": "Id", "group": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }, "indent": { "index": 1, "kind": "attribute", "displayName": "Indent", "group": "common", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Number of spaces per indentation level." }, "delimiter": { "index": 2, "kind": "attribute", "displayName": "Delimiter", "group": "common", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "COMMA", "TAB", "PIPE" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "COMMA", "description": "Delimiter used for tabular array rows and inline primitive arrays." }, - "lengthMarker": { "index": 3, "kind": "attribute", "displayName": "Length Marker", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths." }, - "strict": { "index": 4, "kind": "attribute", "displayName": "Strict", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing." }, - "contentTypeHeader": { "index": 5, "kind": "attribute", "displayName": "Content Type Header", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the data format should set the Content-Type header to text\/toon when marshalling." } + "strict": { "index": 3, "kind": "attribute", "displayName": "Strict", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malfor [...] + "contentTypeHeader": { "index": 4, "kind": "attribute", "displayName": "Content Type Header", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the data format should set the Content-Type header to text\/toon when marshalling." } } } diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd index e438e41c1419..8d07290062b9 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-spring.xsd @@ -10303,16 +10303,6 @@ Number of spaces per indentation level. Default value: 2 <xs:documentation xml:lang="en"> <![CDATA[ Delimiter used for tabular array rows and inline primitive arrays. Default value: COMMA -]]> - </xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="lengthMarker" type="xs:string"> - <xs:annotation> - <xs:documentation xml:lang="en"> -<![CDATA[ -Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths. -Default value: false ]]> </xs:documentation> </xs:annotation> @@ -10321,8 +10311,9 @@ Default value: false <xs:annotation> <xs:documentation xml:lang="en"> <![CDATA[ -Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing. Default value: -true +Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries +of the TOON specification, such as accepting an array whose length differs from the declared length; other malformed +TOON still fails. Default value: true ]]> </xs:documentation> </xs:annotation> diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd index 81f71962e73e..7eae091914f4 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camel-xml-io.xsd @@ -9425,16 +9425,6 @@ Number of spaces per indentation level. Default value: 2 <xs:documentation xml:lang="en"> <![CDATA[ Delimiter used for tabular array rows and inline primitive arrays. Default value: COMMA -]]> - </xs:documentation> - </xs:annotation> - </xs:attribute> - <xs:attribute name="lengthMarker" type="xs:string"> - <xs:annotation> - <xs:documentation xml:lang="en"> -<![CDATA[ -Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths. -Default value: false ]]> </xs:documentation> </xs:annotation> @@ -9443,8 +9433,9 @@ Default value: false <xs:annotation> <xs:documentation xml:lang="en"> <![CDATA[ -Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing. Default value: -true +Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries +of the TOON specification, such as accepting an array whose length differs from the declared length; other malformed +TOON still fails. Default value: true ]]> </xs:documentation> </xs:annotation> diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json index 60af524015b7..4aa55e017a97 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/schemas/camelYamlDsl-model.json @@ -13723,25 +13723,15 @@ "kind" : "attribute", "index" : 2, "group" : "common" - }, { - "name" : "lengthMarker", - "type" : "boolean", - "description" : "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths.", - "title" : "Length Marker", - "default" : "false", - "displayName" : "Length Marker", - "kind" : "attribute", - "index" : 3, - "group" : "common" }, { "name" : "strict", "type" : "boolean", - "description" : "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing.", + "description" : "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malformed TOON still fails.", "title" : "Strict", "default" : "true", "displayName" : "Strict", "kind" : "attribute", - "index" : 4, + "index" : 3, "group" : "common" }, { "name" : "contentTypeHeader", @@ -13751,7 +13741,7 @@ "default" : "true", "displayName" : "Content Type Header", "kind" : "attribute", - "index" : 5, + "index" : 4, "group" : "common" } ] }, diff --git a/components/camel-toon/src/generated/java/org/apache/camel/dataformat/toon/ToonDataFormatConfigurer.java b/components/camel-toon/src/generated/java/org/apache/camel/dataformat/toon/ToonDataFormatConfigurer.java index 6497c75109e4..ca2b872f8c12 100644 --- a/components/camel-toon/src/generated/java/org/apache/camel/dataformat/toon/ToonDataFormatConfigurer.java +++ b/components/camel-toon/src/generated/java/org/apache/camel/dataformat/toon/ToonDataFormatConfigurer.java @@ -25,7 +25,6 @@ public class ToonDataFormatConfigurer extends org.apache.camel.support.component map.put("ContentTypeHeader", boolean.class); map.put("Delimiter", java.lang.String.class); map.put("Indent", int.class); - map.put("LengthMarker", boolean.class); map.put("Strict", boolean.class); ALL_OPTIONS = map; } @@ -38,8 +37,6 @@ public class ToonDataFormatConfigurer extends org.apache.camel.support.component case "contentTypeHeader": target.setContentTypeHeader(property(camelContext, boolean.class, value)); return true; case "delimiter": target.setDelimiter(property(camelContext, java.lang.String.class, value)); return true; case "indent": target.setIndent(property(camelContext, int.class, value)); return true; - case "lengthmarker": - case "lengthMarker": target.setLengthMarker(property(camelContext, boolean.class, value)); return true; case "strict": target.setStrict(property(camelContext, boolean.class, value)); return true; default: return false; } @@ -57,8 +54,6 @@ public class ToonDataFormatConfigurer extends org.apache.camel.support.component case "contentTypeHeader": return boolean.class; case "delimiter": return java.lang.String.class; case "indent": return int.class; - case "lengthmarker": - case "lengthMarker": return boolean.class; case "strict": return boolean.class; default: return null; } @@ -72,8 +67,6 @@ public class ToonDataFormatConfigurer extends org.apache.camel.support.component case "contentTypeHeader": return target.isContentTypeHeader(); case "delimiter": return target.getDelimiter(); case "indent": return target.getIndent(); - case "lengthmarker": - case "lengthMarker": return target.isLengthMarker(); case "strict": return target.isStrict(); default: return null; } diff --git a/components/camel-toon/src/generated/resources/META-INF/org/apache/camel/dataformat/toon/toon.json b/components/camel-toon/src/generated/resources/META-INF/org/apache/camel/dataformat/toon/toon.json index a45eeb267e26..5d2b6d93b885 100644 --- a/components/camel-toon/src/generated/resources/META-INF/org/apache/camel/dataformat/toon/toon.json +++ b/components/camel-toon/src/generated/resources/META-INF/org/apache/camel/dataformat/toon/toon.json @@ -19,8 +19,7 @@ "id": { "index": 0, "kind": "attribute", "displayName": "Id", "group": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }, "indent": { "index": 1, "kind": "attribute", "displayName": "Indent", "group": "common", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Number of spaces per indentation level." }, "delimiter": { "index": 2, "kind": "attribute", "displayName": "Delimiter", "group": "common", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "COMMA", "TAB", "PIPE" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "COMMA", "description": "Delimiter used for tabular array rows and inline primitive arrays." }, - "lengthMarker": { "index": 3, "kind": "attribute", "displayName": "Length Marker", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths." }, - "strict": { "index": 4, "kind": "attribute", "displayName": "Strict", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing." }, - "contentTypeHeader": { "index": 5, "kind": "attribute", "displayName": "Content Type Header", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the data format should set the Content-Type header to text\/toon when marshalling." } + "strict": { "index": 3, "kind": "attribute", "displayName": "Strict", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malfor [...] + "contentTypeHeader": { "index": 4, "kind": "attribute", "displayName": "Content Type Header", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the data format should set the Content-Type header to text\/toon when marshalling." } } } diff --git a/components/camel-toon/src/main/java/org/apache/camel/dataformat/toon/ToonDataFormat.java b/components/camel-toon/src/main/java/org/apache/camel/dataformat/toon/ToonDataFormat.java index caea472a4de1..33e603cf7e39 100644 --- a/components/camel-toon/src/main/java/org/apache/camel/dataformat/toon/ToonDataFormat.java +++ b/components/camel-toon/src/main/java/org/apache/camel/dataformat/toon/ToonDataFormat.java @@ -59,10 +59,9 @@ public class ToonDataFormat extends ServiceSupport @Metadata(description = "Delimiter used for tabular array rows and inline primitive arrays.", defaultValue = "COMMA", enums = "COMMA,TAB,PIPE") private String delimiter = Delimiter.COMMA.name(); - @Metadata(description = "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths.", - defaultValue = "false", javaType = "java.lang.Boolean") - private boolean lengthMarker = EncodeOptions.DEFAULT.lengthMarker(); - @Metadata(description = "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing.", + @Metadata(description = "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict" + + " recoveries of the TOON specification, such as accepting an array whose length differs from the" + + " declared length; other malformed TOON still fails.", defaultValue = "true", javaType = "java.lang.Boolean") private boolean strict = DecodeOptions.DEFAULT.strict(); @Metadata(description = "Whether the data format should set the Content-Type header to text/toon when marshalling.", @@ -129,7 +128,7 @@ public class ToonDataFormat extends ServiceSupport } private EncodeOptions encodeOptions() { - return new EncodeOptions(indent, resolveDelimiter(), lengthMarker, KeyFolding.OFF, Integer.MAX_VALUE); + return new EncodeOptions(indent, resolveDelimiter(), KeyFolding.OFF, Integer.MAX_VALUE); } private DecodeOptions decodeOptions() { @@ -161,14 +160,6 @@ public class ToonDataFormat extends ServiceSupport this.delimiter = delimiter; } - public boolean isLengthMarker() { - return lengthMarker; - } - - public void setLengthMarker(boolean lengthMarker) { - this.lengthMarker = lengthMarker; - } - public boolean isStrict() { return strict; } diff --git a/components/camel-toon/src/test/java/org/apache/camel/dataformat/toon/ToonDataFormatTest.java b/components/camel-toon/src/test/java/org/apache/camel/dataformat/toon/ToonDataFormatTest.java index 89b3bac6860a..97ea67f564cc 100644 --- a/components/camel-toon/src/test/java/org/apache/camel/dataformat/toon/ToonDataFormatTest.java +++ b/components/camel-toon/src/test/java/org/apache/camel/dataformat/toon/ToonDataFormatTest.java @@ -215,12 +215,6 @@ class ToonDataFormatTest extends CamelTestSupport { assertThat(toon).contains(" inner"); } - @Test - void lengthMarkerOptionPrefixesArrayLength() { - String toon = template.requestBody("direct:lengthMarker", List.of("a", "b"), String.class); - assertThat(toon).contains("[#"); - } - @Test void contentTypeHeaderIsSetByDefault() { Exchange exchange = template.request("direct:marshal", e -> e.getIn().setBody(Map.of("ok", true))); @@ -251,7 +245,7 @@ class ToonDataFormatTest extends CamelTestSupport { } @Test - void strictFalseUsesBestEffortParsing() { + void strictFalseAcceptsArrayLengthMismatch() { Object result = template.requestBody("direct:strictFalse", "tags[2]: a,b,c"); assertThat(result).isInstanceOf(Map.class); @SuppressWarnings("unchecked") @@ -262,6 +256,15 @@ class ToonDataFormatTest extends CamelTestSupport { assertThat(tags).containsExactly("a", "b", "c"); } + @Test + void malformedToonFailsWhenNotStrict() { + // the [#N] length marker is no longer part of the TOON specification + assertThatThrownBy(() -> template.requestBody("direct:strictFalse", "tags[#2]: a,b", Object.class)) + .isInstanceOf(CamelExecutionException.class) + .cause() + .isInstanceOf(IllegalArgumentException.class); + } + @Test void emptyJsonStringMarshalFails() { assertThatThrownBy(() -> template.requestBody("direct:marshal", "", String.class)) @@ -304,7 +307,6 @@ class ToonDataFormatTest extends CamelTestSupport { from("direct:pipe").marshal(dataFormat().toon().delimiter("PIPE").end()); from("direct:unmarshalPipe").unmarshal(dataFormat().toon().delimiter("PIPE").end()); from("direct:indent").marshal(dataFormat().toon().indent(4).end()); - from("direct:lengthMarker").marshal(dataFormat().toon().lengthMarker(true).end()); from("direct:noContentType").marshal(dataFormat().toon().contentTypeHeader(false).end()); from("direct:strictFalse").unmarshal(dataFormat().toon().strict(false).end()); } diff --git a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/dataformat/toon.json b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/dataformat/toon.json index 7bb7784a39ae..f82156daa665 100644 --- a/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/dataformat/toon.json +++ b/core/camel-core-model/src/generated/resources/META-INF/org/apache/camel/model/dataformat/toon.json @@ -16,8 +16,7 @@ "id": { "index": 0, "kind": "attribute", "displayName": "Id", "group": "common", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The id of this node" }, "indent": { "index": 1, "kind": "attribute", "displayName": "Indent", "group": "common", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "autowired": false, "secret": false, "defaultValue": 2, "description": "Number of spaces per indentation level." }, "delimiter": { "index": 2, "kind": "attribute", "displayName": "Delimiter", "group": "common", "required": false, "type": "enum", "javaType": "java.lang.String", "enum": [ "COMMA", "TAB", "PIPE" ], "deprecated": false, "autowired": false, "secret": false, "defaultValue": "COMMA", "description": "Delimiter used for tabular array rows and inline primitive arrays." }, - "lengthMarker": { "index": 3, "kind": "attribute", "displayName": "Length Marker", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths." }, - "strict": { "index": 4, "kind": "attribute", "displayName": "Strict", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing." }, - "contentTypeHeader": { "index": 5, "kind": "attribute", "displayName": "Content Type Header", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the data format should set the Content-Type header to text\/toon when marshalling." } + "strict": { "index": 3, "kind": "attribute", "displayName": "Strict", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malfor [...] + "contentTypeHeader": { "index": 4, "kind": "attribute", "displayName": "Content Type Header", "group": "common", "required": false, "type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": true, "description": "Whether the data format should set the Content-Type header to text\/toon when marshalling." } } } diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ToonDataFormat.java b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ToonDataFormat.java index 31ebb077732a..f6419c82e8b9 100644 --- a/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ToonDataFormat.java +++ b/core/camel-core-model/src/main/java/org/apache/camel/model/dataformat/ToonDataFormat.java @@ -43,12 +43,9 @@ public class ToonDataFormat extends DataFormatDefinition implements ContentTypeH enums = "COMMA,TAB,PIPE") private String delimiter; @XmlAttribute - @Metadata(description = "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths.", - defaultValue = "false", - javaType = "java.lang.Boolean") - private String lengthMarker; - @XmlAttribute - @Metadata(description = "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing.", + @Metadata(description = "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict" + + " recoveries of the TOON specification, such as accepting an array whose length differs from the" + + " declared length; other malformed TOON still fails.", defaultValue = "true", javaType = "java.lang.Boolean") private String strict; @XmlAttribute @@ -64,7 +61,6 @@ public class ToonDataFormat extends DataFormatDefinition implements ContentTypeH super(source); this.indent = source.indent; this.delimiter = source.delimiter; - this.lengthMarker = source.lengthMarker; this.strict = source.strict; this.contentTypeHeader = source.contentTypeHeader; } @@ -73,7 +69,6 @@ public class ToonDataFormat extends DataFormatDefinition implements ContentTypeH this(); this.indent = builder.indent; this.delimiter = builder.delimiter; - this.lengthMarker = builder.lengthMarker; this.strict = builder.strict; this.contentTypeHeader = builder.contentTypeHeader; } @@ -99,14 +94,6 @@ public class ToonDataFormat extends DataFormatDefinition implements ContentTypeH this.delimiter = delimiter; } - public String getLengthMarker() { - return lengthMarker; - } - - public void setLengthMarker(String lengthMarker) { - this.lengthMarker = lengthMarker; - } - public String getStrict() { return strict; } @@ -133,7 +120,6 @@ public class ToonDataFormat extends DataFormatDefinition implements ContentTypeH private String indent; private String delimiter; - private String lengthMarker; private String strict; private String contentTypeHeader; @@ -161,24 +147,6 @@ public class ToonDataFormat extends DataFormatDefinition implements ContentTypeH return this; } - /** - * Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain - * lengths. - */ - public Builder lengthMarker(String lengthMarker) { - this.lengthMarker = lengthMarker; - return this; - } - - /** - * Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain - * lengths. - */ - public Builder lengthMarker(boolean lengthMarker) { - this.lengthMarker = Boolean.toString(lengthMarker); - return this; - } - /** * Whether to enable strict validation when unmarshalling TOON. */ diff --git a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/ToonDataFormatReifier.java b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/ToonDataFormatReifier.java index 9e99ef930761..fe243807d5d5 100644 --- a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/ToonDataFormatReifier.java +++ b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/dataformat/ToonDataFormatReifier.java @@ -32,7 +32,6 @@ public class ToonDataFormatReifier extends DataFormatReifier<ToonDataFormat> { protected void prepareDataFormatConfig(Map<String, Object> properties) { properties.put("indent", definition.getIndent()); properties.put("delimiter", definition.getDelimiter()); - properties.put("lengthMarker", definition.getLengthMarker()); properties.put("strict", definition.getStrict()); } } diff --git a/core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java b/core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java index 08726f2dd734..4dfdcb1d70cf 100644 --- a/core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java +++ b/core/camel-java-io/src/generated/java/org/apache/camel/java/out/JavaDslModelWriter.java @@ -3372,7 +3372,6 @@ public class JavaDslModelWriter extends JavaDslModelWriterSupport { doWriteIdentifiedTypeAttributes(sb, def); doWriteAttribute(sb, "indent", def.getIndent(), "2"); doWriteAttribute(sb, "delimiter", def.getDelimiter(), "COMMA"); - doWriteAttribute(sb, "lengthMarker", def.getLengthMarker(), "false"); doWriteAttribute(sb, "strict", def.getStrict(), "true"); doWriteAttribute(sb, "contentTypeHeader", def.getContentTypeHeader(), "true"); } diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java index 8beb70e5816d..125ddb30f0c4 100644 --- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java +++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/in/ModelParser.java @@ -2104,7 +2104,6 @@ public class ModelParser extends BaseParser { case "contentTypeHeader": def.setContentTypeHeader(val); yield true; case "delimiter": def.setDelimiter(val); yield true; case "indent": def.setIndent(val); yield true; - case "lengthMarker": def.setLengthMarker(val); yield true; case "strict": def.setStrict(val); yield true; default: yield identifiedTypeAttributeHandler().accept(def, key, val); }, noElementHandler(), noValueHandler()); diff --git a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java index 554ece49b258..6b50a43de7b4 100644 --- a/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java +++ b/core/camel-xml-io/src/generated/java/org/apache/camel/xml/out/ModelWriter.java @@ -2758,7 +2758,6 @@ public class ModelWriter extends BaseWriter { doWriteIdentifiedTypeAttributes(def); doWriteAttribute("indent", def.getIndent(), "2"); doWriteAttribute("delimiter", def.getDelimiter(), "COMMA"); - doWriteAttribute("lengthMarker", def.getLengthMarker(), "false"); doWriteAttribute("strict", def.getStrict(), "true"); doWriteAttribute("contentTypeHeader", def.getContentTypeHeader(), "true"); endElement(name); diff --git a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java index 85612baebdc6..656b8958b7f6 100644 --- a/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java +++ b/core/camel-yaml-io/src/generated/java/org/apache/camel/yaml/out/YamlModelWriter.java @@ -2759,7 +2759,6 @@ public class YamlModelWriter extends YamlModelWriterSupport { doWriteIdentifiedTypeAttributes(jo, def); doWriteAttribute(jo, "indent", def.getIndent(), "2"); doWriteAttribute(jo, "delimiter", def.getDelimiter(), "COMMA"); - doWriteAttribute(jo, "lengthMarker", def.getLengthMarker(), "false"); doWriteAttribute(jo, "strict", def.getStrict(), "true"); doWriteAttribute(jo, "contentTypeHeader", def.getContentTypeHeader(), "true"); return jo; diff --git a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc index ebcf624762ff..44f117657ad1 100644 --- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc +++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_24.adoc @@ -875,3 +875,17 @@ The consumer now sets the `CamelMiloNodeId` header on every exchange, including Stopping a consumer now deletes its monitored items. Previously they stayed on the server while another endpoint kept the shared connection open, so a restarted consumer received each value twice. While the server is unreachable, the stop waits until the client's next attempt to reconnect has failed. + +=== camel-toon - the lengthMarker option is removed + +`camel-toon` now uses JToon 2.0.7, which follows a newer version of the TOON specification. + +The `lengthMarker` option of the TOON data format is removed, because the TOON specification no longer has the `[#N]` +array length marker. Remove the option from the data format in Java, XML and YAML routes. TOON text with a `[#N]` array +header, such as the output of a data format with `lengthMarker=true`, now fails to unmarshal in both strict and +non-strict mode; in Camel 4.23 it already failed in strict mode (the default). To read such data, remove the `#` from +its array headers (`tags[#2]:` becomes `tags[2]:`). + +With `strict=false`, unmarshalling no longer returns `null` or a partial result for malformed TOON. Only the non-strict +recoveries of the TOON specification apply, such as accepting an array whose length differs from the declared length; +other malformed TOON fails with `IllegalArgumentException`, as in strict mode. diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java index cc102eea2e2e..d49c52f650d6 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/generated/java/org/apache/camel/dsl/yaml/deserializers/ModelDeserializers.java @@ -19343,8 +19343,7 @@ public final class ModelDeserializers extends YamlDeserializerSupport { @YamlProperty(name = "delimiter", type = "enum:COMMA,TAB,PIPE", defaultValue = "COMMA", description = "Delimiter used for tabular array rows and inline primitive arrays.", displayName = "Delimiter"), @YamlProperty(name = "id", type = "string", description = "The id of this node", displayName = "Id"), @YamlProperty(name = "indent", type = "number", defaultValue = "2", description = "Number of spaces per indentation level.", displayName = "Indent"), - @YamlProperty(name = "lengthMarker", type = "boolean", defaultValue = "false", description = "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths.", displayName = "Length Marker"), - @YamlProperty(name = "strict", type = "boolean", defaultValue = "true", description = "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing.", displayName = "Strict") + @YamlProperty(name = "strict", type = "boolean", defaultValue = "true", description = "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malformed TOON still fails.", displayName = "Strict") } ) public static class ToonDataFormatDeserializer extends YamlDeserializerBase<ToonDataFormat> { @@ -19382,11 +19381,6 @@ public final class ModelDeserializers extends YamlDeserializerSupport { target.setIndent(val); break; } - case "lengthMarker": { - String val = asText(node); - target.setLengthMarker(val); - break; - } case "strict": { String val = asText(node); target.setStrict(val); diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json index ae62903636aa..4df0bad7f730 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-canonical.json @@ -8719,16 +8719,10 @@ "description" : "Number of spaces per indentation level.", "default" : 2 }, - "lengthMarker" : { - "type" : "boolean", - "title" : "Length Marker", - "description" : "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths.", - "default" : false - }, "strict" : { "type" : "boolean", "title" : "Strict", - "description" : "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing.", + "description" : "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malformed TOON still fails.", "default" : true } } diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json index 60af524015b7..4aa55e017a97 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl-model.json @@ -13723,25 +13723,15 @@ "kind" : "attribute", "index" : 2, "group" : "common" - }, { - "name" : "lengthMarker", - "type" : "boolean", - "description" : "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths.", - "title" : "Length Marker", - "default" : "false", - "displayName" : "Length Marker", - "kind" : "attribute", - "index" : 3, - "group" : "common" }, { "name" : "strict", "type" : "boolean", - "description" : "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing.", + "description" : "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malformed TOON still fails.", "title" : "Strict", "default" : "true", "displayName" : "Strict", "kind" : "attribute", - "index" : 4, + "index" : 3, "group" : "common" }, { "name" : "contentTypeHeader", @@ -13751,7 +13741,7 @@ "default" : "true", "displayName" : "Content Type Header", "kind" : "attribute", - "index" : 5, + "index" : 4, "group" : "common" } ] }, diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json index fb5f7c8b3b38..ff5a9269f053 100644 --- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json +++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/generated/resources/schema/camelYamlDsl.json @@ -10926,16 +10926,10 @@ "description" : "Number of spaces per indentation level.", "default" : 2 }, - "lengthMarker" : { - "type" : "boolean", - "title" : "Length Marker", - "description" : "Whether to prefix array lengths with a hash marker so arrays render as hash-prefixed lengths instead of plain lengths.", - "default" : false - }, "strict" : { "type" : "boolean", "title" : "Strict", - "description" : "Whether to enable strict validation when unmarshalling TOON. When false, JToon uses best-effort parsing.", + "description" : "Whether to enable strict validation when unmarshalling TOON. When false, the decoder applies the non-strict recoveries of the TOON specification, such as accepting an array whose length differs from the declared length; other malformed TOON still fails.", "default" : true } } diff --git a/parent/pom.xml b/parent/pom.xml index 1f072fa7b645..7e3e99e2b800 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -182,7 +182,7 @@ <fory-version>1.7.7</fory-version> <ph-ubl-version>10.2.0</ph-ubl-version> <j8583-version>3.0.1</j8583-version> - <jtoon-version>2.0.5</jtoon-version> + <jtoon-version>2.0.7</jtoon-version> <jakarta-jms-api-version>3.1.0</jakarta-jms-api-version> <jakarta-persistence-api-version>3.2.0</jakarta-persistence-api-version> <jakarta-json-api-version>2.1.3</jakarta-json-api-version>
