This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git


The following commit(s) were added to refs/heads/main by this push:
     new 9d1f63b  Backward (#205)
9d1f63b is described below

commit 9d1f63bbb63fcb68dc91aab69b81dfc3205a7ff0
Author: Marat Gubaidullin <[email protected]>
AuthorDate: Tue Mar 1 19:28:22 2022 -0500

    Backward (#205)
    
    * Latest Models and API
    
    * First try
---
 karavan-core/src/core/api/CamelDefinitionYaml.ts  |  41 +++--
 karavan-core/src/core/model/CamelDefinition.ts    |   9 +-
 karavan-core/src/core/model/CamelMetadata.ts      | 194 +++++++++++-----------
 karavan-core/test/backward.spec.ts                |  74 +++++++++
 karavan-core/test/backward.yaml                   |  47 ++++++
 karavan-core/test/backward2.yaml                  |  32 ++++
 karavan-core/test/cloneDefinition.spec.ts         |   9 +-
 karavan-core/test/dependencies.spec.ts            |   2 +-
 karavan-core/test/expression.spec.ts              |  53 ++++++
 karavan-demo/xxx-yaml.yaml                        |  26 +++
 karavan-designer/src/App.tsx                      |   1 +
 karavan-designer/src/designer/KaravanDesigner.tsx |   9 +-
 karavan-designer/src/designer/karavan.css         |   7 +
 karavan-vscode/package.json                       |   5 +
 karavan-vscode/src/extension.ts                   |   4 +
 karavan-vscode/webview/App.tsx                    |   8 +-
 16 files changed, 398 insertions(+), 123 deletions(-)

diff --git a/karavan-core/src/core/api/CamelDefinitionYaml.ts 
b/karavan-core/src/core/api/CamelDefinitionYaml.ts
index 3ed294f..3d1bc18 100644
--- a/karavan-core/src/core/api/CamelDefinitionYaml.ts
+++ b/karavan-core/src/core/api/CamelDefinitionYaml.ts
@@ -22,7 +22,7 @@ import {CamelDefinitionYamlStep} from 
"./CamelDefinitionYamlStep";
 
 export class CamelDefinitionYaml {
 
-    static integrationToYaml = (integration: Integration): string => {
+    static integrationToYaml = (integration: Integration, backward: boolean = 
false): string => {
         const clone: any = CamelUtil.cloneIntegration(integration);
         const flows = integration.spec.flows
         clone.spec.flows = flows?.map((f: any) => 
CamelDefinitionYaml.cleanupElement(f)).filter(x => Object.keys(x).length !== 0);
@@ -34,11 +34,11 @@ export class CamelDefinitionYaml {
         if (integration.crd) {
             delete clone.crd
             const i = JSON.parse(JSON.stringify(clone, null, 3)); // fix 
undefined in string attributes
-            const text = CamelDefinitionYaml.yamlDump(i);
+            const text = CamelDefinitionYaml.yamlDump(i, backward);
             return text;
         } else {
             const f = JSON.parse(JSON.stringify(clone.spec.flows, null, 3));
-            const text = CamelDefinitionYaml.yamlDump(f);
+            const text = CamelDefinitionYaml.yamlDump(f, backward);
             if (clone.spec.dependencies && clone.spec.dependencies.length > 0) 
{
                 const modeline = 
this.generateModeline(clone.spec.dependencies);
                 return modeline.concat('\n', text);
@@ -117,7 +117,7 @@ export class CamelDefinitionYaml {
         return result
     }
 
-    static yamlDump = (integration: Integration): string => {
+    static yamlDump = (integration: Integration, backward: boolean = false): 
string => {
         return yaml.dump(integration,
             {
                 noRefs: false,
@@ -132,18 +132,22 @@ export class CamelDefinitionYaml {
                     else if (a > b) return 1
                     else return 0;
                 },
-                replacer: this.replacer
+                replacer: (key, value) => this.replacer(key, value, backward)
             });
     }
 
-    static replacer = (key: string, value: any): any => {
+    static replacer = (key: string, value: any, backward: boolean = false): 
any => {
         if (typeof value === 'object' && (value.hasOwnProperty('stepName') || 
value.hasOwnProperty('inArray')  || value.hasOwnProperty('inSteps'))) {
             const stepNameField = value.hasOwnProperty('stepName') ? 
'stepName' : 'step-name';
             const stepName = value[stepNameField];
             let newValue: any = JSON.parse(JSON.stringify(value));
+            if (backward && stepName === 'route'){
+                newValue.steps = newValue.from.steps;
+                delete newValue.from.steps;
+            }
             delete newValue[stepNameField];
             if ((value.inArray && !value.inSteps)
-                || key === 'expression'
+                || stepName === 'expression'
                 || key === 'from') {
                 delete newValue.inArray;
                 delete newValue.inSteps;
@@ -160,19 +164,19 @@ export class CamelDefinitionYaml {
         }
     }
 
-    static yamlToIntegration = (filename: string, text: string): Integration 
=> {
+    static yamlToIntegration = (filename: string, text: string, backward: 
boolean = false): Integration => {
         const integration: Integration = Integration.createNew(filename);
         const fromYaml: any = yaml.load(text);
         const camelized: any = CamelUtil.camelizeObject(fromYaml);
         if (Array.isArray(camelized)) {
             integration.crd = false;
             const flows: any[] = camelized;
-            
integration.spec.flows?.push(...CamelDefinitionYaml.flowsToCamelElements(flows));
+            
integration.spec.flows?.push(...CamelDefinitionYaml.flowsToCamelElements(flows, 
backward));
             integration.spec.dependencies = this.modelineToDependency(text);
         } else {
             integration.crd = true;
             const int: Integration = new Integration({...camelized});
-            
integration.spec.flows?.push(...CamelDefinitionYaml.flowsToCamelElements(int.spec.flows
 || []));
+            
integration.spec.flows?.push(...CamelDefinitionYaml.flowsToCamelElements(int.spec.flows
 || [], backward));
             integration.spec.dependencies = 
this.dependenciesToDependency(int.spec.dependencies);
         }
         return integration;
@@ -200,14 +204,27 @@ export class CamelDefinitionYaml {
         return result;
     }
 
-    static flowsToCamelElements = (flows: any[]): any[] => {
+    static flowsToCamelElements = (flows: any[], backward: boolean = false): 
any[] => {
         const result: any[] = [];
         flows.filter((e: any) => e.hasOwnProperty('restConfiguration'))
             .forEach((f: any) => 
result.push(CamelDefinitionYamlStep.readRestConfigurationDefinition(f.restConfiguration)));
         flows.filter((e: any) => e.hasOwnProperty('rest'))
             .forEach((f: any) => 
result.push(CamelDefinitionYamlStep.readRestDefinition(f.rest)));
         flows.filter((e: any) => e.hasOwnProperty('route'))
-            .forEach((f: any) => 
result.push(CamelDefinitionYamlStep.readRouteDefinition(f.route)));
+            .forEach((f: any) => {
+                if (backward){
+                    const route = f.route;
+                    if (route.from.steps && Array.isArray(route.from.steps)){
+                        route.from.steps.push(...route.steps);
+                    } else {
+                        route.from.steps = [...route.steps];
+                    }
+                    delete route.steps;
+                    
result.push(CamelDefinitionYamlStep.readRouteDefinition(route));
+                } else {
+                    
result.push(CamelDefinitionYamlStep.readRouteDefinition(f.route));
+                }
+            });
         flows.filter((e: any) => e.hasOwnProperty('from'))
             .forEach((f: any) =>  
result.push(CamelDefinitionYamlStep.readRouteDefinition(new 
RouteDefinition({from: f.from}))));
         flows.filter((e: any) => e.hasOwnProperty('beans'))
diff --git a/karavan-core/src/core/model/CamelDefinition.ts 
b/karavan-core/src/core/model/CamelDefinition.ts
index 3cfd6e8..6c54ad7 100644
--- a/karavan-core/src/core/model/CamelDefinition.ts
+++ b/karavan-core/src/core/model/CamelDefinition.ts
@@ -2162,8 +2162,8 @@ export class CryptoDataFormat extends CamelElement {
     initVectorRef?: string;
     keyRef?: string;
     id?: string;
-    buffersize?: number;
-    algorithm?: string
+    algorithm?: string;
+    bufferSize?: number
     public constructor(init?: Partial<CryptoDataFormat>) {
         super('CryptoDataFormat')
         Object.assign(this, init)
@@ -2376,6 +2376,7 @@ export class JacksonXMLDataFormat extends CamelElement {
     prettyPrint?: boolean;
     jsonView?: string;
     dataFormatName?: string = 'jacksonXml';
+    timezone?: string;
     moduleClassNames?: string;
     allowJmsType?: boolean;
     enableFeatures?: string;
@@ -3148,7 +3149,7 @@ export class WeightedLoadBalancerDefinition extends 
CamelElement {
     stepName?: string = 'weightedLoadBalancer';
     id?: string;
     distributionRatio: string = '';
-    roundRobin?: string
+    roundRobin?: boolean
     public constructor(init?: Partial<WeightedLoadBalancerDefinition>) {
         super('WeightedLoadBalancerDefinition')
         Object.assign(this, init)
@@ -3462,7 +3463,6 @@ export class RestConfigurationDefinition extends 
CamelElement {
     useXForwardHeaders?: boolean;
     apiHost?: string;
     contextPath?: string;
-    apiContextRouteId?: string;
     component?: string;
     dataFormatProperty?: RestPropertyDefinition[] = [];
     bindingMode?: string;
@@ -3584,7 +3584,6 @@ export class DataFormatTransformerDefinition extends 
CamelElement {
     syslog?: SyslogDataFormat;
     zipFile?: ZipFileDataFormat;
     jaxb?: JaxbDataFormat;
-    ref?: string;
     rss?: RssDataFormat;
     fromType?: string;
     stepName?: string = 'dataFormatTransformer';
diff --git a/karavan-core/src/core/model/CamelMetadata.ts 
b/karavan-core/src/core/model/CamelMetadata.ts
index 4060fd4..62bb02e 100644
--- a/karavan-core/src/core/model/CamelMetadata.ts
+++ b/karavan-core/src/core/model/CamelMetadata.ts
@@ -102,8 +102,8 @@ export const DataFormats: [string, string, string][] = [
     ['grok','Grok',"Unmarshal unstructured data to objects using Logstash 
based Grok patterns."],
     ['gzipDeflater','GZip Deflater',"Compress and decompress messages using 
java.util.zip.GZIPStream."],
     ['hl7','HL7',"Marshal and unmarshal HL7 (Health Care) model objects using 
the HL7 MLLP codec."],
-    ['ical','iCal',"Marshal and unmarshal iCal (.ics) documents to/from model 
objects provided by the iCal4j library."],
-    ['jacksonXml','Jackson XML',"Unmarshal a XML payloads to POJOs and back 
using XMLMapper extension of Jackson."],
+    ['ical','iCal',"Marshal and unmarshal iCal (.ics) documents to/from model 
objects."],
+    ['jacksonXml','Jackson XML',"Unmarshal an XML payloads to POJOs and back 
using XMLMapper extension of Jackson."],
     ['jaxb','JAXB',"Unmarshal XML payloads to POJOs and back using JAXB2 XML 
marshalling standard."],
     ['json','JSon',"Marshal POJOs to JSON and back."],
     ['jsonApi','JSonApi',"Marshal and unmarshal JSON:API resources using 
JSONAPI-Converter library."],
@@ -136,10 +136,10 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('tarFile', 'TarFileDataFormat', 'Tar File', "Archive files 
into tarballs or extract files from tarballs.", 
'dataformat,transformation,file', [
-        new PropertyMeta('usingIterator', 'Using Iterator', "If the tar file 
has more then one entry, the setting this option to true, allows to work with 
the splitter EIP, to split the data using an iterator in a streaming mode.", 
'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('allowEmptyDirectory', 'Allow Empty Directory', "If 
the tar file has more then one entry, setting this option to true, allows to 
get the iterator even if the directory is empty", 'boolean', '', 'false', 
false, false, false, false, ''),
+        new PropertyMeta('usingIterator', 'Using Iterator', "If the tar file 
has more than one entry, the setting this option to true, allows working with 
the splitter EIP, to split the data using an iterator in a streaming mode.", 
'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('allowEmptyDirectory', 'Allow Empty Directory', "If 
the tar file has more than one entry, setting this option to true, allows to 
get the iterator even if the directory is empty", 'boolean', '', 'false', 
false, false, false, false, ''),
         new PropertyMeta('preservePathElements', 'Preserve Path Elements', "If 
the file name contains path elements, setting this option to true, allows the 
path to be maintained in the tar file.", 'boolean', '', 'false', false, false, 
false, false, ''),
-        new PropertyMeta('maxDecompressedSize', 'Max Decompressed Size', "Set 
the maximum decompressed size of a tar file (in bytes). The default value if 
not specified corresponds to 1 gigabyte. An IOException will be thrown if the 
decompressed size exceeds this amount. Set to -1 to disable setting a maximum 
decompressed size.", 'number', '', '1073741824', false, false, false, false, 
''),
+        new PropertyMeta('maxDecompressedSize', 'Max Decompressed Size', "Set 
the maximum decompressed size of a tar file (in bytes). The default value if 
not specified corresponds to 1 gigabyte. An IOException will be thrown if the 
decompressed size exceeds this amount. Set to -1 to disable setting a maximum 
decompressed size.", 'number', '', '1073741824', false, false, false, false, 
'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('cbor', 'CBORDataFormat', 'CBOR', "Unmarshal a CBOR 
payload to POJO and back.", 'dataformat,transformation,json', [
@@ -158,10 +158,10 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('soap', 'SoapDataFormat', 'SOAP', "Marshal Java objects to 
SOAP messages and back.", 'dataformat,transformation,xml', [
         new PropertyMeta('contextPath', 'Context Path', "Package name where 
your JAXB classes are located.", 'string', '', '', true, false, false, false, 
''),
         new PropertyMeta('encoding', 'Encoding', "To overrule and use a 
specific encoding", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('elementNameStrategyRef', 'Element Name Strategy 
Ref', "Refers to an element strategy to lookup from the registry. An element 
name strategy is used for two purposes. The first is to find a xml element name 
for a given object and soap action when marshaling the object into a SOAP 
message. The second is to find an Exception class for a given soap fault name. 
The following three element strategy class name is provided out of the box. 
QNameStrategy - Uses a fixed qNa [...]
+        new PropertyMeta('elementNameStrategyRef', 'Element Name Strategy 
Ref', "Refers to an element strategy to lookup from the registry. An element 
name strategy is used for two purposes. The first is to find a xml element name 
for a given object and soap action when marshaling the object into a SOAP 
message. The second is to find an Exception class for a given soap fault name. 
The following three element strategy class name is provided out of the box. 
QNameStrategy - Uses a fixed qNa [...]
         new PropertyMeta('version', 'Version', "SOAP version should either be 
1.1 or 1.2. Is by default 1.1", 'string', '1.1, 1.2', '1.1', false, false, 
false, false, ''),
-        new PropertyMeta('namespacePrefixRef', 'Namespace Prefix Ref', "When 
marshalling using JAXB or SOAP then the JAXB implementation will automatic 
assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, 
Camel allows you to refer to a map which contains the desired mapping.", 
'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('schema', 'Schema', "To validate against an existing 
schema. Your can use the prefix classpath:, file: or http: to specify how the 
resource should by resolved. You can separate multiple schema files by using 
the ',' character.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('namespacePrefixRef', 'Namespace Prefix Ref', "When 
marshalling using JAXB or SOAP then the JAXB implementation will automatic 
assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, 
Camel allows you to refer to a map which contains the desired mapping.", 
'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('schema', 'Schema', "To validate against an existing 
schema. Your can use the prefix classpath:, file: or http: to specify how the 
resource should be resolved. You can separate multiple schema files by using 
the ',' character.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('lzf', 'LZFDataFormat', 'LZF Deflate Compression', 
"Compress and decompress streams using LZF deflate algorithm.", 
'dataformat,transformation', [
@@ -169,20 +169,20 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('univocityFixed', 'UniVocityFixedDataFormat', 'uniVocity 
Fixed Length', "Marshal and unmarshal Java objects from and to fixed length 
records using UniVocity Parsers.", 'dataformat,transformation,csv', [
+        new PropertyMeta('padding', 'Padding', "The padding character. The 
default value is a space", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('skipTrailingCharsUntilNewline', 'Skip Trailing Chars 
Until Newline', "Whether or not the trailing characters until new line must be 
ignored. The default value is false", 'boolean', '', 'false', false, false, 
false, false, ''),
         new PropertyMeta('recordEndsOnNewline', 'Record Ends On Newline', 
"Whether or not the record ends on new line. The default value is false", 
'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('padding', 'Padding', "The padding character. The 
default value is a space", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('nullValue', 'Null Value', "The string representation 
of a null value. The default value is null", 'string', '', '', false, false, 
false, false, ''),
+        new PropertyMeta('nullValue', 'Null Value', "The string representation 
of a null value. The default value is null", 'string', '', '', false, false, 
false, false, 'advanced'),
         new PropertyMeta('skipEmptyLines', 'Skip Empty Lines', "Whether or not 
the empty lines must be ignored. The default value is true", 'boolean', '', 
'true', false, false, false, false, ''),
         new PropertyMeta('ignoreTrailingWhitespaces', 'Ignore Trailing 
Whitespaces', "Whether or not the trailing white spaces must ignored. The 
default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreLeadingWhitespaces', 'Ignore Leading 
Whitespaces', "Whether or not the leading white spaces must be ignored. The 
default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('headersDisabled', 'Headers Disabled', "Whether or 
not the headers are disabled. When defined, this option explicitly sets the 
headers as null which indicates that there is no header. The default value is 
false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('headerExtractionEnabled', 'Header Extraction 
Enabled', "Whether or not the header must be read in the first line of the test 
document The default value is false", 'boolean', '', 'false', false, false, 
false, false, ''),
-        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', 
"The maximum number of record to read.", 'number', '', '', false, false, false, 
false, ''),
-        new PropertyMeta('emptyValue', 'Empty Value', "The String 
representation of an empty value", 'string', '', '', false, false, false, 
false, ''),
-        new PropertyMeta('lineSeparator', 'Line Separator', "The line 
separator of the files The default value is to use the JVM platform line 
separator", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('normalizedLineSeparator', 'Normalized Line 
Separator', "The normalized line separator of the files The default value is a 
new line character.", 'string', '', '\n', false, false, false, false, ''),
-        new PropertyMeta('comment', 'Comment', "The comment symbol. The 
default value is #", 'string', '', '#', false, false, false, false, ''),
+        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', 
"The maximum number of record to read.", 'number', '', '', false, false, false, 
false, 'advanced'),
+        new PropertyMeta('emptyValue', 'Empty Value', "The String 
representation of an empty value", 'string', '', '', false, false, false, 
false, 'advanced'),
+        new PropertyMeta('lineSeparator', 'Line Separator', "The line 
separator of the files The default value is to use the JVM platform line 
separator", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('normalizedLineSeparator', 'Normalized Line 
Separator', "The normalized line separator of the files The default value is a 
new line character.", 'string', '', '\n', false, false, false, false, 
'advanced'),
+        new PropertyMeta('comment', 'Comment', "The comment symbol. The 
default value is #", 'string', '', '#', false, false, false, false, 'advanced'),
         new PropertyMeta('lazyLoad', 'Lazy Load', "Whether the unmarshalling 
should produce an iterator that reads the lines on the fly or if all the lines 
must be read at one. The default value is false", 'boolean', '', 'false', 
false, false, false, false, ''),
         new PropertyMeta('asMap', 'As Map', "Whether the unmarshalling should 
produce maps for the lines values instead of lists. It requires to have header 
(either defined or collected). The default value is false", 'boolean', '', 
'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
@@ -205,7 +205,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('disableFeatures', 'Disable Features', "Set of 
features to disable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. 
The features should be a name that matches a enum from 
com.fasterxml.jackson.databind.SerializationFeature, 
com.fasterxml.jackson.databind.DeserializationFeature, or 
com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated 
by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If 
enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType 
header during the unmarshalling. This should only be enabled when desired to be 
used.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use 
the Timezone when marshalling/unmarshalling.", 'string', '', '', false, false, 
false, false, 'advanced'),
-        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object 
Mapper', "If set to true then Jackson will lookup for an objectMapper into the 
registry", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object 
Mapper', "If set to true then Jackson will lookup for an objectMapper into the 
registry", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether 
the data format should set the Content-Type header with the type from the data 
format. For example application/xml for data formats marshalling to XML, or 
application/json for data formats marshalling to JSON", 'boolean', '', 'true', 
false, false, false, false, ''),
         new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema 
resolver used to lookup schemas for the data in transit.", 'string', '', '', 
false, false, false, false, 'advanced'),
         new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema 
Resolver', "When not disabled, the SchemaResolver will be looked up into the 
registry", 'boolean', '', 'true', false, false, false, false, 'advanced'),
@@ -218,46 +218,47 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('gzipDeflater', 'GzipDeflaterDataFormat', 'GZip Deflater', 
"Compress and decompress messages using java.util.zip.GZIPStream.", 
'dataformat,transformation', [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
-    new ElementMeta('jacksonXml', 'JacksonXMLDataFormat', 'Jackson XML', 
"Unmarshal a XML payloads to POJOs and back using XMLMapper extension of 
Jackson.", 'dataformat,transformation,xml', [
-        new PropertyMeta('xmlMapper', 'Xml Mapper', "Lookup and use the 
existing XmlMapper with the given id.", 'string', '', '', false, false, false, 
false, ''),
+    new ElementMeta('jacksonXml', 'JacksonXMLDataFormat', 'Jackson XML', 
"Unmarshal an XML payloads to POJOs and back using XMLMapper extension of 
Jackson.", 'dataformat,transformation,xml', [
+        new PropertyMeta('xmlMapper', 'Xml Mapper', "Lookup and use the 
existing XmlMapper with the given id.", 'string', '', '', false, false, false, 
false, 'advanced'),
         new PropertyMeta('prettyPrint', 'Pretty Print', "To enable pretty 
printing output nicely formatted. Is by default false.", 'boolean', '', 
'false', false, false, false, false, ''),
         new PropertyMeta('unmarshalType', 'Unmarshal Type', "Class name of the 
java type to use when unmarshalling", 'string', '', '', false, false, false, 
false, ''),
+        new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If 
enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType 
header during the unmarshalling. This should only be enabled when desired to be 
used.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('jsonView', 'Json View', "When marshalling a POJO to 
JSON you might want to exclude certain fields from the JSON output. With 
Jackson you can use JSON views to accomplish this. This option is to refer to 
the class which has JsonView annotations", 'string', '', '', false, false, 
false, false, ''),
         new PropertyMeta('include', 'Include', "If you want to marshal a pojo 
to JSON, and the pojo has some fields with null values. And you want to skip 
these null values, you can set this option to NON_NULL", 'string', '', '', 
false, false, false, false, ''),
-        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users 
to allow the JMSType header from the JMS spec to specify a FQN classname to use 
to unmarshal to.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('collectionType', 'Collection Type', "Refers to a 
custom collection type to lookup in the registry to use. This option should 
rarely be used, but allows to use different collection types than 
java.util.Collection based as default.", 'string', '', '', false, false, false, 
false, ''),
+        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users 
to allow the JMSType header from the JMS spec to specify a FQN classname to use 
to unmarshal to.", 'boolean', '', 'false', false, false, false, false, 
'advanced'),
+        new PropertyMeta('collectionType', 'Collection Type', "Refers to a 
custom collection type to lookup in the registry to use. This option should 
rarely be used, but allows to use different collection types than 
java.util.Collection based as default.", 'string', '', '', false, false, false, 
false, 'advanced'),
         new PropertyMeta('useList', 'Use List', "To unmarshal to a List of Map 
or a List of Pojo.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('enableJaxbAnnotationModule', 'Enable Jaxb Annotation 
Module', "Whether to enable the JAXB annotations module when using jackson. 
When enabled then JAXB annotations can be used by Jackson.", 'boolean', '', 
'false', false, false, false, false, ''),
-        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use 
custom Jackson modules com.fasterxml.jackson.databind.Module specified as a 
String with FQN class names. Multiple classes can be separated by comma.", 
'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson 
modules referred from the Camel registry. Multiple modules can be separated by 
comma.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use 
the Timezone when marshalling/unmarshalling.", 'string', '', '', false, false, 
false, false, 'advanced'),
+        new PropertyMeta('enableJaxbAnnotationModule', 'Enable Jaxb Annotation 
Module', "Whether to enable the JAXB annotations module when using jackson. 
When enabled then JAXB annotations can be used by Jackson.", 'boolean', '', 
'false', false, false, false, false, 'advanced'),
+        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use 
custom Jackson modules com.fasterxml.jackson.databind.Module specified as a 
String with FQN class names. Multiple classes can be separated by comma.", 
'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson 
modules referred from the Camel registry. Multiple modules can be separated by 
comma.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('enableFeatures', 'Enable Features', "Set of features 
to enable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The 
features should be a name that matches a enum from 
com.fasterxml.jackson.databind.SerializationFeature, 
com.fasterxml.jackson.databind.DeserializationFeature, or 
com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated 
by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('disableFeatures', 'Disable Features', "Set of 
features to disable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. 
The features should be a name that matches a enum from 
com.fasterxml.jackson.databind.SerializationFeature, 
com.fasterxml.jackson.databind.DeserializationFeature, or 
com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated 
by comma", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If 
enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType 
header during the unmarshalling. This should only be enabled when desired to be 
used.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether 
the data format should set the Content-Type header with the type from the data 
format. For example application/xml for data formats marshalling to XML, or 
application/json for data formats marshalling to JSON", 'boolean', '', 'true', 
false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('protobuf', 'ProtobufDataFormat', 'Protobuf', "Serialize 
and deserialize Java objects using Google's Protocol buffers.", 
'dataformat,transformation', [
         new PropertyMeta('instanceClass', 'Instance Class', "Name of class to 
use when unmarshalling", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('contentTypeFormat', 'Content Type Format', "Defines 
a content type format in which protobuf message will be serialized/deserialized 
from(to) the Java been. The format can either be native or json for either 
native protobuf or json fields representation. The default value is native.", 
'string', 'native, json', 'native', false, false, false, false, ''),
-        new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether 
the data format should set the Content-Type header with the type from the data 
format. For example application/xml for data formats marshalling to XML, or 
application/json for data formats marshalling to JSON", 'boolean', '', 'true', 
false, false, false, false, ''),
-        new PropertyMeta('library', 'Library', "Which Protobuf library to 
use.", 'string', 'google-protobuf, jackson', 'GoogleProtobuf', false, false, 
false, false, ''),
-        new PropertyMeta('objectMapper', 'Object Mapper', "Lookup and use the 
existing ObjectMapper with the given id when using Jackson.", 'string', '', '', 
false, false, false, false, ''),
+        new PropertyMeta('objectMapper', 'Object Mapper', "Lookup and use the 
existing ObjectMapper with the given id when using Jackson.", 'string', '', '', 
false, false, false, false, 'advanced'),
         new PropertyMeta('useDefaultObjectMapper', 'Use Default Object 
Mapper', "Whether to lookup and use default Jackson ObjectMapper from the 
registry.", 'boolean', '', 'true', false, false, false, false, ''),
+        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object 
Mapper', "If set to true then Jackson will lookup for an objectMapper into the 
registry", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('library', 'Library', "Which Protobuf library to 
use.", 'string', 'google-protobuf, jackson', 'GoogleProtobuf', false, false, 
false, false, ''),
         new PropertyMeta('unmarshalType', 'Unmarshal Type', "Class name of the 
java type to use when unmarshalling", 'string', '', '', false, false, false, 
false, ''),
         new PropertyMeta('jsonView', 'Json View', "When marshalling a POJO to 
JSON you might want to exclude certain fields from the JSON output. With 
Jackson you can use JSON views to accomplish this. This option is to refer to 
the class which has JsonView annotations", 'string', '', '', false, false, 
false, false, ''),
         new PropertyMeta('include', 'Include', "If you want to marshal a pojo 
to JSON, and the pojo has some fields with null values. And you want to skip 
these null values, you can set this option to NON_NULL", 'string', '', '', 
false, false, false, false, ''),
-        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users 
to allow the JMSType header from the JMS spec to specify a FQN classname to use 
to unmarshal to.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users 
to allow the JMSType header from the JMS spec to specify a FQN classname to use 
to unmarshal to.", 'boolean', '', 'false', false, false, false, false, 
'advanced'),
         new PropertyMeta('collectionType', 'Collection Type', "Refers to a 
custom collection type to lookup in the registry to use. This option should 
rarely be used, but allows to use different collection types than 
java.util.Collection based as default.", 'string', '', '', false, false, false, 
false, ''),
         new PropertyMeta('useList', 'Use List', "To unmarshal to a List of Map 
or a List of Pojo.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use 
custom Jackson modules com.fasterxml.jackson.databind.Module specified as a 
String with FQN class names. Multiple classes can be separated by comma.", 
'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson 
modules referred from the Camel registry. Multiple modules can be separated by 
comma.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use 
custom Jackson modules com.fasterxml.jackson.databind.Module specified as a 
String with FQN class names. Multiple classes can be separated by comma.", 
'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson 
modules referred from the Camel registry. Multiple modules can be separated by 
comma.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('enableFeatures', 'Enable Features', "Set of features 
to enable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The 
features should be a name that matches a enum from 
com.fasterxml.jackson.databind.SerializationFeature, 
com.fasterxml.jackson.databind.DeserializationFeature, or 
com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated 
by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('disableFeatures', 'Disable Features', "Set of 
features to disable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. 
The features should be a name that matches a enum from 
com.fasterxml.jackson.databind.SerializationFeature, 
com.fasterxml.jackson.databind.DeserializationFeature, or 
com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated 
by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If 
enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType 
header during the unmarshalling. This should only be enabled when desired to be 
used.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use 
the Timezone when marshalling/unmarshalling.", 'string', '', '', false, false, 
false, false, ''),
-        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object 
Mapper', "If set to true then Jackson will lookup for an objectMapper into the 
registry", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema 
resolver used to lookup schemas for the data in transit.", 'string', '', '', 
false, false, false, false, ''),
-        new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema 
Resolver', "When not disabled, the SchemaResolver will be looked up into the 
registry", 'boolean', '', 'true', false, false, false, false, ''),
+        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use 
the Timezone when marshalling/unmarshalling.", 'string', '', '', false, false, 
false, false, 'advanced'),
+        new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema 
resolver used to lookup schemas for the data in transit.", 'string', '', '', 
false, false, false, false, 'advanced'),
+        new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema 
Resolver', "When not disabled, the SchemaResolver will be looked up into the 
registry", 'boolean', '', 'true', false, false, false, false, 'advanced'),
+        new PropertyMeta('contentTypeFormat', 'Content Type Format', "Defines 
a content type format in which protobuf message will be serialized/deserialized 
from(to) the Java been. The format can either be native or json for either 
native protobuf or json fields representation. The default value is native.", 
'string', 'native, json', 'native', false, false, false, false, ''),
+        new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether 
the data format should set the Content-Type header with the type from the data 
format. For example application/xml for data formats marshalling to XML, or 
application/json for data formats marshalling to JSON", 'boolean', '', 'true', 
false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('bindy', 'BindyDataFormat', 'Bindy', "Marshal and 
unmarshal Java beans from and to flat payloads (such as CSV, delimited, fixed 
length formats, or FIX messages).", 'dataformat,transformation,csv', [
@@ -269,44 +270,44 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('xmlSecurity', 'XMLSecurityDataFormat', 'XML Security', 
"Encrypt and decrypt XML payloads using Apache Santuario.", 
'dataformat,transformation,xml', [
-        new PropertyMeta('xmlCipherAlgorithm', 'Xml Cipher Algorithm', "The 
cipher algorithm to be used for encryption/decryption of the XML message 
content. The available choices are: XMLCipher.TRIPLEDES XMLCipher.AES_128 
XMLCipher.AES_128_GCM XMLCipher.AES_192 XMLCipher.AES_192_GCM XMLCipher.AES_256 
XMLCipher.AES_256_GCM XMLCipher.SEED_128 XMLCipher.CAMELLIA_128 
XMLCipher.CAMELLIA_192 XMLCipher.CAMELLIA_256 The default value is 
XMLCipher.AES_256_GCM", 'string', '', 'AES-256-GCM', false [...]
+        new PropertyMeta('xmlCipherAlgorithm', 'Xml Cipher Algorithm', "The 
cipher algorithm to be used for encryption/decryption of the XML message 
content. The available choices are: XMLCipher.TRIPLEDES XMLCipher.AES_128 
XMLCipher.AES_128_GCM XMLCipher.AES_192 XMLCipher.AES_192_GCM XMLCipher.AES_256 
XMLCipher.AES_256_GCM XMLCipher.SEED_128 XMLCipher.CAMELLIA_128 
XMLCipher.CAMELLIA_192 XMLCipher.CAMELLIA_256 The default value is 
XMLCipher.AES_256_GCM", 'string', 'TRIPLEDES, AES_128, AES [...]
         new PropertyMeta('passPhrase', 'Pass Phrase', "A String used as 
passPhrase to encrypt/decrypt content. The passPhrase has to be provided. The 
passPhrase needs to be put together in conjunction with the appropriate 
encryption algorithm. For example using TRIPLEDES the passPhase can be a Only 
another 24 Byte key", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('passPhraseByte', 'Pass Phrase Byte', "A byte used as 
passPhrase to encrypt/decrypt content. The passPhrase has to be provided. The 
passPhrase needs to be put together in conjunction with the appropriate 
encryption algorithm. For example using TRIPLEDES the passPhase can be a Only 
another 24 Byte key", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('passPhraseByte', 'Pass Phrase Byte', "A byte used as 
passPhrase to encrypt/decrypt content. The passPhrase has to be provided. The 
passPhrase needs to be put together in conjunction with the appropriate 
encryption algorithm. For example using TRIPLEDES the passPhase can be a Only 
another 24 Byte key", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('secureTag', 'Secure Tag', "The XPath reference to 
the XML Element selected for encryption/decryption. If no tag is specified, the 
entire payload is encrypted/decrypted.", 'string', '', '', false, false, false, 
false, ''),
-        new PropertyMeta('secureTagContents', 'Secure Tag Contents', "A 
boolean value to specify whether the XML Element is to be encrypted or the 
contents of the XML Element false = Element Level true = Element Content 
Level", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('keyCipherAlgorithm', 'Key Cipher Algorithm', "The 
cipher algorithm to be used for encryption/decryption of the asymmetric key. 
The available choices are: XMLCipher.RSA_v1dot5 XMLCipher.RSA_OAEP 
XMLCipher.RSA_OAEP_11 The default value is XMLCipher.RSA_OAEP", 'string', '', 
'RSA_OAEP', false, false, false, false, ''),
+        new PropertyMeta('secureTagContents', 'Secure Tag Contents', "A 
boolean value to specify whether the XML Element is to be encrypted or the 
contents of the XML Element. false = Element Level. true = Element Content 
Level.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('keyCipherAlgorithm', 'Key Cipher Algorithm', "The 
cipher algorithm to be used for encryption/decryption of the asymmetric key. 
The available choices are: XMLCipher.RSA_v1dot5 XMLCipher.RSA_OAEP 
XMLCipher.RSA_OAEP_11 The default value is XMLCipher.RSA_OAEP", 'string', 
'RSA_v1dot5, RSA_OAEP, RSA_OAEP_11', 'RSA_OAEP', false, false, false, false, 
''),
         new PropertyMeta('recipientKeyAlias', 'Recipient Key Alias', "The key 
alias to be used when retrieving the recipient's public or private key from a 
KeyStore when performing asymmetric key encryption or decryption.", 'string', 
'', '', false, false, false, false, ''),
         new PropertyMeta('keyOrTrustStoreParametersRef', 'Key Or Trust Store 
Parameters Ref', "Refers to a KeyStore instance to lookup in the registry, 
which is used for configuration options for creating and loading a KeyStore 
instance that represents the sender's trustStore or recipient's keyStore.", 
'string', '', '', false, false, false, false, ''),
         new PropertyMeta('keyPassword', 'Key Password', "The password to be 
used for retrieving the private key from the KeyStore. This key is used for 
asymmetric decryption.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('digestAlgorithm', 'Digest Algorithm', "The digest 
algorithm to use with the RSA OAEP algorithm. The available choices are: 
XMLCipher.SHA1 XMLCipher.SHA256 XMLCipher.SHA512 The default value is 
XMLCipher.SHA1", 'string', '', 'SHA1', false, false, false, false, ''),
-        new PropertyMeta('mgfAlgorithm', 'Mgf Algorithm', "The MGF Algorithm 
to use with the RSA OAEP algorithm. The available choices are: 
EncryptionConstants.MGF1_SHA1 EncryptionConstants.MGF1_SHA256 
EncryptionConstants.MGF1_SHA512 The default value is 
EncryptionConstants.MGF1_SHA1", 'string', '', 'MGF1_SHA1', false, false, false, 
false, ''),
+        new PropertyMeta('digestAlgorithm', 'Digest Algorithm', "The digest 
algorithm to use with the RSA OAEP algorithm. The available choices are: 
XMLCipher.SHA1 XMLCipher.SHA256 XMLCipher.SHA512 The default value is 
XMLCipher.SHA1", 'string', 'SHA1, SHA256, SHA512', 'SHA1', false, false, false, 
false, ''),
+        new PropertyMeta('mgfAlgorithm', 'Mgf Algorithm', "The MGF Algorithm 
to use with the RSA OAEP algorithm. The available choices are: 
EncryptionConstants.MGF1_SHA1 EncryptionConstants.MGF1_SHA256 
EncryptionConstants.MGF1_SHA512 The default value is 
EncryptionConstants.MGF1_SHA1", 'string', 'MGF1_SHA1, MGF1_SHA256, 
MGF1_SHA512', 'MGF1_SHA1', false, false, false, false, ''),
         new PropertyMeta('addKeyValueForEncryptedKey', 'Add Key Value For 
Encrypted Key', "Whether to add the public key used to encrypt the session key 
as a KeyValue in the EncryptedKey structure or not.", 'boolean', '', 'true', 
false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('json', 'JsonDataFormat', 'JSon', "Marshal POJOs to JSON 
and back.", 'dataformat,transformation,json', [
         new PropertyMeta('objectMapper', 'Object Mapper', "Lookup and use the 
existing ObjectMapper with the given id when using Jackson.", 'string', '', '', 
false, false, false, false, ''),
         new PropertyMeta('useDefaultObjectMapper', 'Use Default Object 
Mapper', "Whether to lookup and use default Jackson ObjectMapper from the 
registry.", 'boolean', '', 'true', false, false, false, false, ''),
+        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object 
Mapper', "If set to true then Jackson will lookup for an objectMapper into the 
registry", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('prettyPrint', 'Pretty Print', "To enable pretty 
printing output nicely formatted. Is by default false.", 'boolean', '', 
'false', false, false, false, false, ''),
         new PropertyMeta('library', 'Library', "Which json library to use.", 
'string', 'fastjson, gson, jackson, johnzon, jsonb, x-stream', 'Jackson', 
false, false, false, false, ''),
         new PropertyMeta('unmarshalType', 'Unmarshal Type', "Class name of the 
java type to use when unmarshalling", 'string', '', '', false, false, false, 
false, ''),
         new PropertyMeta('jsonView', 'Json View', "When marshalling a POJO to 
JSON you might want to exclude certain fields from the JSON output. With 
Jackson you can use JSON views to accomplish this. This option is to refer to 
the class which has JsonView annotations", 'string', '', '', false, false, 
false, false, ''),
         new PropertyMeta('include', 'Include', "If you want to marshal a pojo 
to JSON, and the pojo has some fields with null values. And you want to skip 
these null values, you can set this option to NON_NULL", 'string', '', '', 
false, false, false, false, ''),
-        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users 
to allow the JMSType header from the JMS spec to specify a FQN classname to use 
to unmarshal to.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users 
to allow the JMSType header from the JMS spec to specify a FQN classname to use 
to unmarshal to.", 'boolean', '', 'false', false, false, false, false, 
'advanced'),
         new PropertyMeta('collectionType', 'Collection Type', "Refers to a 
custom collection type to lookup in the registry to use. This option should 
rarely be used, but allows to use different collection types than 
java.util.Collection based as default.", 'string', '', '', false, false, false, 
false, ''),
         new PropertyMeta('useList', 'Use List', "To unmarshal to a List of Map 
or a List of Pojo.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use 
custom Jackson modules com.fasterxml.jackson.databind.Module specified as a 
String with FQN class names. Multiple classes can be separated by comma.", 
'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson 
modules referred from the Camel registry. Multiple modules can be separated by 
comma.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use 
custom Jackson modules com.fasterxml.jackson.databind.Module specified as a 
String with FQN class names. Multiple classes can be separated by comma.", 
'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson 
modules referred from the Camel registry. Multiple modules can be separated by 
comma.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('enableFeatures', 'Enable Features', "Set of features 
to enable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The 
features should be a name that matches a enum from 
com.fasterxml.jackson.databind.SerializationFeature, 
com.fasterxml.jackson.databind.DeserializationFeature, or 
com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated 
by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('disableFeatures', 'Disable Features', "Set of 
features to disable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. 
The features should be a name that matches a enum from 
com.fasterxml.jackson.databind.SerializationFeature, 
com.fasterxml.jackson.databind.DeserializationFeature, or 
com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated 
by comma", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('permissions', 'Permissions', "Adds permissions that 
controls which Java packages and classes XStream is allowed to use during 
unmarshal from xml/json to Java beans. A permission must be configured either 
here or globally using a JVM system property. The permission can be specified 
in a syntax where a plus sign is allow, and minus sign is deny. Wildcards is 
supported by using . as prefix. For example to allow com.foo and all 
subpackages then specfy com.foo.. Mult [...]
+        new PropertyMeta('permissions', 'Permissions', "Adds permissions that 
controls which Java packages and classes XStream is allowed to use during 
unmarshal from xml/json to Java beans. A permission must be configured either 
here or globally using a JVM system property. The permission can be specified 
in a syntax where a plus sign is allow, and minus sign is deny. Wildcards is 
supported by using . as prefix. For example to allow com.foo and all 
subpackages then specfy com.foo.. Mult [...]
         new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If 
enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType 
header during the unmarshalling. This should only be enabled when desired to be 
used.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use 
the Timezone when marshalling/unmarshalling. This option will have no effect on 
the others Json DataFormat, like gson, fastjson and xstream.", 'string', '', 
'', false, false, false, false, ''),
-        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object 
Mapper', "If set to true then Jackson will lookup for an objectMapper into the 
registry", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use 
the Timezone when marshalling/unmarshalling. This option will have no effect on 
the others Json DataFormat, like gson, fastjson and xstream.", 'string', '', 
'', false, false, false, false, 'advanced'),
         new PropertyMeta('dropRootNode', 'Drop Root Node', "Whether XStream 
will drop the root node in the generated JSon. You may want to enable this when 
using POJOs; as then the written object will include the class name as root 
node, which is often not intended to be written in the JSON output.", 
'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether 
the data format should set the Content-Type header with the type from the data 
format. For example application/xml for data formats marshalling to XML, or 
application/json for data formats marshalling to JSON", 'boolean', '', 'true', 
false, false, false, false, ''),
-        new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema 
resolver used to lookup schemas for the data in transit.", 'string', '', '', 
false, false, false, false, ''),
-        new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema 
Resolver', "When not disabled, the SchemaResolver will be looked up into the 
registry", 'boolean', '', 'true', false, false, false, false, ''),
+        new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema 
resolver used to lookup schemas for the data in transit.", 'string', '', '', 
false, false, false, false, 'advanced'),
+        new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema 
Resolver', "When not disabled, the SchemaResolver will be looked up into the 
registry", 'boolean', '', 'true', false, false, false, false, 'advanced'),
         new PropertyMeta('namingStrategy', 'Naming Strategy', "If set then 
Jackson will use the the defined Property Naming Strategy.Possible values are: 
LOWER_CAMEL_CASE, LOWER_DOT_CASE, LOWER_CASE, KEBAB_CASE, SNAKE_CASE and 
UPPER_CAMEL_CASE", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether 
the data format should set the Content-Type header with the type from the data 
format. For example application/xml for data formats marshalling to XML, or 
application/json for data formats marshalling to JSON", 'boolean', '', 'true', 
false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('beanio', 'BeanioDataFormat', 'BeanIO', "Marshal and 
unmarshal Java beans to and from flat files (such as CSV, delimited, or fixed 
length formats).", 'dataformat,transformation,csv', [
@@ -329,7 +330,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('tidyMarkup', 'TidyMarkupDataFormat', 'TidyMarkup', "Parse 
(potentially invalid) HTML into valid HTML or DOM.", 
'dataformat,transformation', [
-        new PropertyMeta('dataObjectType', 'Data Object Type', "What data type 
to unmarshal as, can either be org.w3c.dom.Node or java.lang.String. Is by 
default org.w3c.dom.Node", 'string', '', 'org.w3c.dom.Node', false, false, 
false, false, ''),
+        new PropertyMeta('dataObjectType', 'Data Object Type', "What data type 
to unmarshal as, can either be org.w3c.dom.Node or java.lang.String. Is by 
default org.w3c.dom.Node", 'string', 'org.w3c.dom.Node, java.lang.String', 
'org.w3c.dom.Node', false, false, false, false, ''),
         new PropertyMeta('omitXmlDeclaration', 'Omit Xml Declaration', "When 
returning a String, do we omit the XML declaration in the top.", 'boolean', '', 
'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
@@ -350,7 +351,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('zipDeflater', 'ZipDeflaterDataFormat', 'Zip Deflater', 
"Compress and decompress streams using java.util.zip.Deflater and 
java.util.zip.Inflater.", 'dataformat,transformation', [
-        new PropertyMeta('compressionLevel', 'Compression Level', "To specify 
a specific compression between 0-9. -1 is default compression, 0 is no 
compression, and 9 is the best compression.", 'number', '', '-1', false, false, 
false, false, ''),
+        new PropertyMeta('compressionLevel', 'Compression Level', "To specify 
a specific compression between 0-9. -1 is default compression, 0 is no 
compression, and 9 is the best compression.", 'number', '-1, 0, 1, 2, 3, 4, 5, 
6, 7, 8, 9', '-1', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('asn1', 'ASN1DataFormat', 'ASN.1 File', "Encode and decode 
data structures using Abstract Syntax Notation One (ASN.1).", 
'dataformat,transformation,file', [
@@ -367,9 +368,9 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('xstream', 'XStreamDataFormat', 'XStream', "Marshal and 
unmarshal POJOs to/from XML using XStream library.", 
'dataformat,transformation,xml,json', [
         new PropertyMeta('permissions', 'Permissions', "Adds permissions that 
controls which Java packages and classes XStream is allowed to use during 
unmarshal from xml/json to Java beans. A permission must be configured either 
here or globally using a JVM system property. The permission can be specified 
in a syntax where a plus sign is allow, and minus sign is deny. Wildcards is 
supported by using . as prefix. For example to allow com.foo and all 
subpackages then specify com.foo.. Mul [...]
         new PropertyMeta('encoding', 'Encoding', "Sets the encoding to use", 
'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('driver', 'Driver', "To use a custom XStream driver. 
The instance must be of type 
com.thoughtworks.xstream.io.HierarchicalStreamDriver", 'string', '', '', false, 
false, false, false, ''),
-        new PropertyMeta('driverRef', 'Driver Ref', "To refer to a custom 
XStream driver to lookup in the registry. The instance must be of type 
com.thoughtworks.xstream.io.HierarchicalStreamDriver", 'string', '', '', false, 
false, false, false, ''),
-        new PropertyMeta('mode', 'Mode', "Mode for dealing with duplicate 
references The possible values are: NO_REFERENCES ID_REFERENCES 
XPATH_RELATIVE_REFERENCES XPATH_ABSOLUTE_REFERENCES 
SINGLE_NODE_XPATH_RELATIVE_REFERENCES SINGLE_NODE_XPATH_ABSOLUTE_REFERENCES", 
'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('driver', 'Driver', "To use a custom XStream driver. 
The instance must be of type 
com.thoughtworks.xstream.io.HierarchicalStreamDriver", 'string', '', '', false, 
false, false, false, 'advanced'),
+        new PropertyMeta('driverRef', 'Driver Ref', "To refer to a custom 
XStream driver to lookup in the registry. The instance must be of type 
com.thoughtworks.xstream.io.HierarchicalStreamDriver", 'string', '', '', false, 
false, false, false, 'advanced'),
+        new PropertyMeta('mode', 'Mode', "Mode for dealing with duplicate 
references The possible values are: NO_REFERENCES ID_REFERENCES 
XPATH_RELATIVE_REFERENCES XPATH_ABSOLUTE_REFERENCES 
SINGLE_NODE_XPATH_RELATIVE_REFERENCES SINGLE_NODE_XPATH_ABSOLUTE_REFERENCES", 
'string', 'NO_REFERENCES, ID_REFERENCES, XPATH_RELATIVE_REFERENCES, 
XPATH_ABSOLUTE_REFERENCES, SINGLE_NODE_XPATH_RELATIVE_REFERENCES, 
SINGLE_NODE_XPATH_ABSOLUTE_REFERENCES', '', false, false, false, false, 
'advanced'),
         new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether 
the data format should set the Content-Type header with the type from the data 
format. For example application/xml for data formats marshalling to XML, or 
application/json for data formats marshalling to JSON", 'boolean', '', 'true', 
false, false, false, false, ''),
         new PropertyMeta('converters', 'Converters', "List of class names for 
using custom XStream converters. The classes must be of type 
com.thoughtworks.xstream.converters.Converter", 'PropertyDefinition', '', '', 
false, false, true, true, ''),
         new PropertyMeta('aliases', 'Aliases', "Alias a Class to a shorter 
name to be used in XML elements.", 'PropertyDefinition', '', '', false, false, 
true, true, ''),
@@ -380,16 +381,16 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('yaml', 'YAMLDataFormat', 'YAML', "Marshal and unmarshal 
Java objects to and from YAML.", 'dataformat,transformation,yaml', [
         new PropertyMeta('library', 'Library', "Which yaml library to use. By 
default it is SnakeYAML", 'string', 'snake-yaml', 'SnakeYAML', false, false, 
false, false, ''),
         new PropertyMeta('unmarshalType', 'Unmarshal Type', "Class name of the 
java type to use when unmarshalling", 'string', '', '', false, false, false, 
false, ''),
-        new PropertyMeta('constructor', 'Constructor', "BaseConstructor to 
construct incoming documents.", 'string', '', '', false, false, false, false, 
''),
-        new PropertyMeta('representer', 'Representer', "Representer to emit 
outgoing objects.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('dumperOptions', 'Dumper Options', "DumperOptions to 
configure outgoing objects.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('resolver', 'Resolver', "Resolver to detect implicit 
type", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('constructor', 'Constructor', "BaseConstructor to 
construct incoming documents.", 'string', '', '', false, false, false, false, 
'advanced'),
+        new PropertyMeta('representer', 'Representer', "Representer to emit 
outgoing objects.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('dumperOptions', 'Dumper Options', "DumperOptions to 
configure outgoing objects.", 'string', '', '', false, false, false, false, 
'advanced'),
+        new PropertyMeta('resolver', 'Resolver', "Resolver to detect implicit 
type", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('useApplicationContextClassLoader', 'Use Application 
Context Class Loader', "Use ApplicationContextClassLoader as custom 
ClassLoader", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('prettyFlow', 'Pretty Flow', "Force the emitter to 
produce a pretty YAML document when using the flow style.", 'boolean', '', 
'false', false, false, false, false, ''),
         new PropertyMeta('allowAnyType', 'Allow Any Type', "Allow any class to 
be un-marshaled", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('typeFilter', 'Type Filter', "Set the types SnakeYAML 
is allowed to un-marshall", 'YAMLTypeFilterDefinition', '', '', false, false, 
true, true, ''),
-        new PropertyMeta('maxAliasesForCollections', 'Max Aliases For 
Collections', "Set the maximum amount of aliases allowed for collections.", 
'number', '', '50', false, false, false, false, ''),
-        new PropertyMeta('allowRecursiveKeys', 'Allow Recursive Keys', "Set 
whether recursive keys are allowed.", 'boolean', '', 'false', false, false, 
false, false, ''),
+        new PropertyMeta('maxAliasesForCollections', 'Max Aliases For 
Collections', "Set the maximum amount of aliases allowed for collections.", 
'number', '', '50', false, false, false, false, 'advanced'),
+        new PropertyMeta('allowRecursiveKeys', 'Allow Recursive Keys', "Set 
whether recursive keys are allowed.", 'boolean', '', 'false', false, false, 
false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('custom', 'CustomDataFormat', 'Custom', "Delegate to a 
custom org.apache.camel.spi.DataFormat implementation via Camel registry.", 
'dataformat,transformation', [
@@ -406,7 +407,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('urlSafe', 'Url Safe', "Instead of emitting '' and 
'/' we emit '-' and '_' respectively. urlSafe is only applied to encode 
operations. Decoding seamlessly handles both modes. Is by default false.", 
'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
-    new ElementMeta('ical', 'IcalDataFormat', 'iCal', "Marshal and unmarshal 
iCal (.ics) documents to/from model objects provided by the iCal4j library.", 
'dataformat,transformation', [
+    new ElementMeta('ical', 'IcalDataFormat', 'iCal', "Marshal and unmarshal 
iCal (.ics) documents to/from model objects.", 'dataformat,transformation', [
         new PropertyMeta('validating', 'Validating', "Whether to validate.", 
'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
@@ -419,54 +420,54 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('cryptoProvider', 'Crypto Provider', "The name of the 
JCE Security Provider that should be used.", 'string', '', '', false, false, 
false, false, 'advanced'),
         new PropertyMeta('initVectorRef', 'Init Vector Ref', "Refers to a byte 
array containing the Initialization Vector that will be used to initialize the 
Cipher.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('algorithmParameterRef', 'Algorithm Parameter Ref', 
"A JCE AlgorithmParameterSpec used to initialize the Cipher. Will lookup the 
type using the given name as a java.security.spec.AlgorithmParameterSpec 
type.", 'string', '', '', false, false, false, false, 'advanced'),
-        new PropertyMeta('buffersize', 'buffersize', "buffersize", 'number', 
'', '', false, false, false, false, ''),
+        new PropertyMeta('bufferSize', 'Buffer Size', "The size of the buffer 
used in the signature process.", 'number', '', '4096', false, false, false, 
false, ''),
         new PropertyMeta('macAlgorithm', 'Mac Algorithm', "The JCE algorithm 
name indicating the Message Authentication algorithm.", 'string', '', 
'HmacSHA1', false, false, false, false, ''),
         new PropertyMeta('shouldAppendHmac', 'shouldAppendHmac', 
"shouldAppendHmac", 'boolean', '', '', false, false, false, false, ''),
         new PropertyMeta('inline', 'Inline', "Flag indicating that the 
configured IV should be inlined into the encrypted data stream. Is by default 
false.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('zipFile', 'ZipFileDataFormat', 'Zip File', "Compression 
and decompress streams using java.util.zip.ZipStream.", 
'dataformat,transformation,file', [
-        new PropertyMeta('usingIterator', 'Using Iterator', "If the zip file 
has more then one entry, the setting this option to true, allows to work with 
the splitter EIP, to split the data using an iterator in a streaming mode.", 
'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('allowEmptyDirectory', 'Allow Empty Directory', "If 
the zip file has more then one entry, setting this option to true, allows to 
get the iterator even if the directory is empty", 'boolean', '', 'false', 
false, false, false, false, ''),
+        new PropertyMeta('usingIterator', 'Using Iterator', "If the zip file 
has more than one entry, the setting this option to true, allows working with 
the splitter EIP, to split the data using an iterator in a streaming mode.", 
'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('allowEmptyDirectory', 'Allow Empty Directory', "If 
the zip file has more than one entry, setting this option to true, allows to 
get the iterator even if the directory is empty", 'boolean', '', 'false', 
false, false, false, false, ''),
         new PropertyMeta('preservePathElements', 'Preserve Path Elements', "If 
the file name contains path elements, setting this option to true, allows the 
path to be maintained in the zip file.", 'boolean', '', 'false', false, false, 
false, false, ''),
-        new PropertyMeta('maxDecompressedSize', 'Max Decompressed Size', "Set 
the maximum decompressed size of a zip file (in bytes). The default value if 
not specified corresponds to 1 gigabyte. An IOException will be thrown if the 
decompressed size exceeds this amount. Set to -1 to disable setting a maximum 
decompressed size.", 'number', '', '1073741824', false, false, false, false, 
''),
+        new PropertyMeta('maxDecompressedSize', 'Max Decompressed Size', "Set 
the maximum decompressed size of a zip file (in bytes). The default value if 
not specified corresponds to 1 gigabyte. An IOException will be thrown if the 
decompressed size exceeds this amount. Set to -1 to disable setting a maximum 
decompressed size.", 'number', '', '1073741824', false, false, false, false, 
'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('jaxb', 'JaxbDataFormat', 'JAXB', "Unmarshal XML payloads 
to POJOs and back using JAXB2 XML marshalling standard.", 
'dataformat,transformation,xml', [
         new PropertyMeta('contextPath', 'Context Path', "Package name where 
your JAXB classes are located.", 'string', '', '', true, false, false, false, 
''),
         new PropertyMeta('contextPathIsClassName', 'Context Path Is Class 
Name', "This can be set to true to mark that the contextPath is referring to a 
classname and not a package name.", 'boolean', '', 'false', false, false, 
false, false, ''),
-        new PropertyMeta('schema', 'Schema', "To validate against an existing 
schema. Your can use the prefix classpath:, file: or http: to specify how the 
resource should by resolved. You can separate multiple schema files by using 
the ',' character.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('schema', 'Schema', "To validate against an existing 
schema. Your can use the prefix classpath:, file: or http: to specify how the 
resource should be resolved. You can separate multiple schema files by using 
the ',' character.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('schemaSeverityLevel', 'Schema Severity Level', "Sets 
the schema severity level to use when validating against a schema. This level 
determines the minimum severity error that triggers JAXB to stop continue 
parsing. The default value of 0 (warning) means that any error (warning, error 
or fatal error) will trigger JAXB to stop. There are the following three 
levels: 0=warning, 1=error, 2=fatal error.", 'number', '0, 1, 2', '0', false, 
false, false, false, ''),
         new PropertyMeta('prettyPrint', 'Pretty Print', "To enable pretty 
printing output nicely formatted. Is by default false.", 'boolean', '', 
'false', false, false, false, false, ''),
-        new PropertyMeta('objectFactory', 'Object Factory', "Whether to allow 
using ObjectFactory classes to create the POJO classes during marshalling. This 
only applies to POJO classes that has not been annotated with JAXB and 
providing jaxb.index descriptor files.", 'boolean', '', 'false', false, false, 
false, false, ''),
+        new PropertyMeta('objectFactory', 'Object Factory', "Whether to allow 
using ObjectFactory classes to create the POJO classes during marshalling. This 
only applies to POJO classes that has not been annotated with JAXB and 
providing jaxb.index descriptor files.", 'boolean', '', 'false', false, false, 
false, false, 'advanced'),
         new PropertyMeta('ignoreJaxbElement', 'ignoreJaxbElement', 
"ignoreJaxbElement", 'boolean', '', '', false, false, false, false, ''),
         new PropertyMeta('mustBeJaxbElement', 'mustBeJaxbElement', 
"mustBeJaxbElement", 'boolean', '', '', false, false, false, false, ''),
-        new PropertyMeta('filterNonXmlChars', 'Filter Non Xml Chars', "To 
ignore non xml characheters and replace them with an empty space.", 'boolean', 
'', 'false', false, false, false, false, ''),
+        new PropertyMeta('filterNonXmlChars', 'Filter Non Xml Chars', "To 
ignore non xml characheters and replace them with an empty space.", 'boolean', 
'', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('encoding', 'Encoding', "To overrule and use a 
specific encoding", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('fragment', 'Fragment', "To turn on marshalling XML 
fragment trees. By default JAXB looks for XmlRootElement annotation on given 
class to operate on whole XML tree. This is useful but not always - sometimes 
generated code does not have XmlRootElement annotation, sometimes you need 
unmarshall only part of tree. In that case you can use partial unmarshalling. 
To enable this behaviours you need set property partClass. Camel will pass this 
class to JAXB's unmarshaler [...]
-        new PropertyMeta('partClass', 'Part Class', "Name of class used for 
fragment parsing. See more details at the fragment option.", 'string', '', '', 
false, false, false, false, ''),
-        new PropertyMeta('partNamespace', 'Part Namespace', "XML namespace to 
use for fragment parsing. See more details at the fragment option.", 'string', 
'', '', false, false, false, false, ''),
-        new PropertyMeta('namespacePrefixRef', 'Namespace Prefix Ref', "When 
marshalling using JAXB or SOAP then the JAXB implementation will automatic 
assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, 
Camel allows you to refer to a map which contains the desired mapping.", 
'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('fragment', 'Fragment', "To turn on marshalling XML 
fragment trees. By default JAXB looks for XmlRootElement annotation on given 
class to operate on whole XML tree. This is useful but not always - sometimes 
generated code does not have XmlRootElement annotation, sometimes you need 
unmarshall only part of tree. In that case you can use partial unmarshalling. 
To enable this behaviours you need set property partClass. Camel will pass this 
class to JAXB's unmarshaler [...]
+        new PropertyMeta('partClass', 'Part Class', "Name of class used for 
fragment parsing. See more details at the fragment option.", 'string', '', '', 
false, false, false, false, 'advanced'),
+        new PropertyMeta('partNamespace', 'Part Namespace', "XML namespace to 
use for fragment parsing. See more details at the fragment option.", 'string', 
'', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('namespacePrefixRef', 'Namespace Prefix Ref', "When 
marshalling using JAXB or SOAP then the JAXB implementation will automatic 
assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, 
Camel allows you to refer to a map which contains the desired mapping.", 
'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('xmlStreamWriterWrapper', 'Xml Stream Writer 
Wrapper', "To use a custom xml stream writer.", 'string', '', '', false, false, 
false, false, 'advanced'),
         new PropertyMeta('schemaLocation', 'Schema Location', "To define the 
location of the schema", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('noNamespaceSchemaLocation', 'No Namespace Schema 
Location', "To define the location of the namespaceless schema", 'string', '', 
'', false, false, false, false, ''),
+        new PropertyMeta('noNamespaceSchemaLocation', 'No Namespace Schema 
Location', "To define the location of the namespaceless schema", 'string', '', 
'', false, false, false, false, 'advanced'),
         new PropertyMeta('jaxbProviderProperties', 'Jaxb Provider Properties', 
"Refers to a custom java.util.Map to lookup in the registry containing custom 
JAXB provider properties to be used with the JAXB marshaller.", 'string', '', 
'', false, false, false, false, 'advanced'),
         new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether 
the data format should set the Content-Type header with the type from the data 
format. For example application/xml for data formats marshalling to XML, or 
application/json for data formats marshalling to JSON", 'boolean', '', 'true', 
false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('univocityTsv', 'UniVocityTsvDataFormat', 'uniVocity TSV', 
"Marshal and unmarshal Java objects from and to TSV (Tab-Separated Values) 
records using UniVocity Parsers.", 'dataformat,transformation,csv', [
-        new PropertyMeta('escapeChar', 'Escape Char', "The escape character.", 
'string', '', '\\', false, false, false, false, ''),
-        new PropertyMeta('nullValue', 'Null Value', "The string representation 
of a null value. The default value is null", 'string', '', '', false, false, 
false, false, ''),
+        new PropertyMeta('escapeChar', 'Escape Char', "The escape character.", 
'string', '', '\\', false, false, false, false, 'advanced'),
+        new PropertyMeta('nullValue', 'Null Value', "The string representation 
of a null value. The default value is null", 'string', '', '', false, false, 
false, false, 'advanced'),
         new PropertyMeta('skipEmptyLines', 'Skip Empty Lines', "Whether or not 
the empty lines must be ignored. The default value is true", 'boolean', '', 
'true', false, false, false, false, ''),
         new PropertyMeta('ignoreTrailingWhitespaces', 'Ignore Trailing 
Whitespaces', "Whether or not the trailing white spaces must ignored. The 
default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreLeadingWhitespaces', 'Ignore Leading 
Whitespaces', "Whether or not the leading white spaces must be ignored. The 
default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('headersDisabled', 'Headers Disabled', "Whether or 
not the headers are disabled. When defined, this option explicitly sets the 
headers as null which indicates that there is no header. The default value is 
false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('headerExtractionEnabled', 'Header Extraction 
Enabled', "Whether or not the header must be read in the first line of the test 
document The default value is false", 'boolean', '', 'false', false, false, 
false, false, ''),
-        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', 
"The maximum number of record to read.", 'number', '', '', false, false, false, 
false, ''),
-        new PropertyMeta('emptyValue', 'Empty Value', "The String 
representation of an empty value", 'string', '', '', false, false, false, 
false, ''),
-        new PropertyMeta('lineSeparator', 'Line Separator', "The line 
separator of the files The default value is to use the JVM platform line 
separator", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('normalizedLineSeparator', 'Normalized Line 
Separator', "The normalized line separator of the files The default value is a 
new line character.", 'string', '', '\n', false, false, false, false, ''),
-        new PropertyMeta('comment', 'Comment', "The comment symbol. The 
default value is #", 'string', '', '#', false, false, false, false, ''),
+        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', 
"The maximum number of record to read.", 'number', '', '', false, false, false, 
false, 'advanced'),
+        new PropertyMeta('emptyValue', 'Empty Value', "The String 
representation of an empty value", 'string', '', '', false, false, false, 
false, 'advanced'),
+        new PropertyMeta('lineSeparator', 'Line Separator', "The line 
separator of the files The default value is to use the JVM platform line 
separator", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('normalizedLineSeparator', 'Normalized Line 
Separator', "The normalized line separator of the files The default value is a 
new line character.", 'string', '', '\n', false, false, false, false, 
'advanced'),
+        new PropertyMeta('comment', 'Comment', "The comment symbol. The 
default value is #", 'string', '', '#', false, false, false, false, 'advanced'),
         new PropertyMeta('lazyLoad', 'Lazy Load', "Whether the unmarshalling 
should produce an iterator that reads the lines on the fly or if all the lines 
must be read at one. The default value is false", 'boolean', '', 'false', 
false, false, false, false, ''),
         new PropertyMeta('asMap', 'As Map', "Whether the unmarshalling should 
produce maps for the lines values instead of lists. It requires to have header 
(either defined or collected). The default value is false", 'boolean', '', 
'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
@@ -497,21 +498,21 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
     new ElementMeta('univocityCsv', 'UniVocityCsvDataFormat', 'uniVocity CSV', 
"Marshal and unmarshal Java objects from and to CSV (Comma Separated Values) 
using UniVocity Parsers.", 'dataformat,transformation,csv', [
-        new PropertyMeta('quoteAllFields', 'Quote All Fields', "Whether or not 
all values must be quoted when writing them.", 'boolean', '', 'false', false, 
false, false, false, ''),
-        new PropertyMeta('quote', 'Quote', "The quote symbol.", 'string', '', 
'"', false, false, false, false, ''),
-        new PropertyMeta('quoteEscape', 'Quote Escape', "The quote escape 
symbol", 'string', '', '"', false, false, false, false, ''),
         new PropertyMeta('delimiter', 'Delimiter', "The delimiter of values", 
'string', '', ',', false, false, false, false, ''),
-        new PropertyMeta('nullValue', 'Null Value', "The string representation 
of a null value. The default value is null", 'string', '', '', false, false, 
false, false, ''),
+        new PropertyMeta('quoteAllFields', 'Quote All Fields', "Whether or not 
all values must be quoted when writing them.", 'boolean', '', 'false', false, 
false, false, false, ''),
+        new PropertyMeta('quote', 'Quote', "The quote symbol.", 'string', '', 
'"', false, false, false, false, 'advanced'),
+        new PropertyMeta('quoteEscape', 'Quote Escape', "The quote escape 
symbol", 'string', '', '"', false, false, false, false, 'advanced'),
+        new PropertyMeta('nullValue', 'Null Value', "The string representation 
of a null value. The default value is null", 'string', '', '', false, false, 
false, false, 'advanced'),
         new PropertyMeta('skipEmptyLines', 'Skip Empty Lines', "Whether or not 
the empty lines must be ignored. The default value is true", 'boolean', '', 
'true', false, false, false, false, ''),
         new PropertyMeta('ignoreTrailingWhitespaces', 'Ignore Trailing 
Whitespaces', "Whether or not the trailing white spaces must ignored. The 
default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreLeadingWhitespaces', 'Ignore Leading 
Whitespaces', "Whether or not the leading white spaces must be ignored. The 
default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('headersDisabled', 'Headers Disabled', "Whether or 
not the headers are disabled. When defined, this option explicitly sets the 
headers as null which indicates that there is no header. The default value is 
false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('headerExtractionEnabled', 'Header Extraction 
Enabled', "Whether or not the header must be read in the first line of the test 
document The default value is false", 'boolean', '', 'false', false, false, 
false, false, ''),
-        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', 
"The maximum number of record to read.", 'number', '', '', false, false, false, 
false, ''),
-        new PropertyMeta('emptyValue', 'Empty Value', "The String 
representation of an empty value", 'string', '', '', false, false, false, 
false, ''),
-        new PropertyMeta('lineSeparator', 'Line Separator', "The line 
separator of the files The default value is to use the JVM platform line 
separator", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('normalizedLineSeparator', 'Normalized Line 
Separator', "The normalized line separator of the files The default value is a 
new line character.", 'string', '', '\n', false, false, false, false, ''),
-        new PropertyMeta('comment', 'Comment', "The comment symbol. The 
default value is #", 'string', '', '#', false, false, false, false, ''),
+        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', 
"The maximum number of record to read.", 'number', '', '', false, false, false, 
false, 'advanced'),
+        new PropertyMeta('emptyValue', 'Empty Value', "The String 
representation of an empty value", 'string', '', '', false, false, false, 
false, 'advanced'),
+        new PropertyMeta('lineSeparator', 'Line Separator', "The line 
separator of the files The default value is to use the JVM platform line 
separator", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('normalizedLineSeparator', 'Normalized Line 
Separator', "The normalized line separator of the files The default value is a 
new line character.", 'string', '', '\n', false, false, false, false, 
'advanced'),
+        new PropertyMeta('comment', 'Comment', "The comment symbol. The 
default value is #", 'string', '', '#', false, false, false, false, 'advanced'),
         new PropertyMeta('lazyLoad', 'Lazy Load', "Whether the unmarshalling 
should produce an iterator that reads the lines on the fly or if all the lines 
must be read at one. The default value is false", 'boolean', '', 'false', 
false, false, false, false, ''),
         new PropertyMeta('asMap', 'As Map', "Whether the unmarshalling should 
produce maps for the lines values instead of lists. It requires to have header 
(either defined or collected). The default value is false", 'boolean', '', 
'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
@@ -578,11 +579,11 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('flatpack', 'FlatpackDataFormat', 'Flatpack', "Marshal and 
unmarshal Java lists and maps to/from flat files (such as CSV, delimited, or 
fixed length formats) using Flatpack library.", 
'dataformat,transformation,csv', [
         new PropertyMeta('definition', 'Definition', "The flatpack pzmap 
configuration file. Can be omitted in simpler situations, but its preferred to 
use the pzmap.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('fixed', 'Fixed', "Delimited or fixed. Is by default 
false = delimited", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('ignoreFirstRecord', 'Ignore First Record', "Whether 
the first line is ignored for delimited files (for the column headers). Is by 
default true.", 'boolean', '', 'true', false, false, false, false, ''),
-        new PropertyMeta('textQualifier', 'Text Qualifier', "If the text is 
qualified with a character. Uses quote character by default.", 'string', '', 
'', false, false, false, false, ''),
         new PropertyMeta('delimiter', 'Delimiter', "The delimiter char (could 
be ; , or similar)", 'string', '', ',', false, false, false, false, ''),
+        new PropertyMeta('ignoreFirstRecord', 'Ignore First Record', "Whether 
the first line is ignored for delimited files (for the column headers). Is by 
default true.", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('allowShortLines', 'Allow Short Lines', "Allows for 
lines to be shorter than expected and ignores the extra characters", 'boolean', 
'', 'false', false, false, false, false, ''),
         new PropertyMeta('ignoreExtraColumns', 'Ignore Extra Columns', "Allows 
for lines to be longer than expected and ignores the extra characters.", 
'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('textQualifier', 'Text Qualifier', "If the text is 
qualified with a character. Uses quote character by default.", 'string', '', 
'', false, false, false, false, 'advanced'),
         new PropertyMeta('parserFactoryRef', 'Parser Factory Ref', "References 
to a custom parser factory to lookup in the registry", 'string', '', '', false, 
false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', 
false, false, false, false, ''),
     ]),
@@ -833,18 +834,17 @@ export const CamelModelMetadata: ElementMeta[] = [
         new PropertyMeta('ref', 'Ref', "Reference to the rest-dsl", 'string', 
'', '', true, false, false, false, ''),
     ]),
     new ElementMeta('restConfiguration', 'RestConfigurationDefinition', 'Rest 
Configuration', "To configure rest", 'rest', [
-        new PropertyMeta('component', 'Component', "The Camel Rest component 
to use for the REST transport (consumer), such as netty-http, jetty, servlet, 
undertow. If no component has been explicit configured, then Camel will lookup 
if there is a Camel component that integrates with the Rest DSL, or if a 
org.apache.camel.spi.RestConsumerFactory is registered in the registry. If 
either one is found, then that is being used.", 'string', '', '', false, false, 
false, false, ''),
-        new PropertyMeta('apiComponent', 'Api Component', "The name of the 
Camel component to use as the REST API. If no API Component has been explicit 
configured, then Camel will lookup if there is a Camel component responsible 
for servicing and generating the REST API documentation, or if a 
org.apache.camel.spi.RestApiProcessorFactory is registered in the registry. If 
either one is found, then that is being used.", 'string', '', '', false, false, 
false, false, 'consumer,advanced'),
-        new PropertyMeta('producerComponent', 'Producer Component', "Sets the 
name of the Camel component to use as the REST producer", 'string', '', '', 
false, false, false, false, 'producer,advanced'),
+        new PropertyMeta('component', 'Component', "The Camel Rest component 
to use for the REST transport (consumer), such as netty-http, jetty, servlet, 
undertow. If no component has been explicit configured, then Camel will lookup 
if there is a Camel component that integrates with the Rest DSL, or if a 
org.apache.camel.spi.RestConsumerFactory is registered in the registry. If 
either one is found, then that is being used.", 'string', 'platform-http, 
servlet, jetty, undertow, netty-http [...]
+        new PropertyMeta('apiComponent', 'Api Component', "The name of the 
Camel component to use as the REST API. If no API Component has been explicit 
configured, then Camel will lookup if there is a Camel component responsible 
for servicing and generating the REST API documentation, or if a 
org.apache.camel.spi.RestApiProcessorFactory is registered in the registry. If 
either one is found, then that is being used.", 'string', 'openapi, swagger', 
'', false, false, false, false, 'consume [...]
+        new PropertyMeta('producerComponent', 'Producer Component', "Sets the 
name of the Camel component to use as the REST producer", 'string', 
'vertx-http, http, undertow, netty-http', '', false, false, false, false, 
'producer,advanced'),
         new PropertyMeta('scheme', 'Scheme', "The scheme to use for exposing 
the REST service. Usually http or https is supported. The default value is 
http", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('host', 'Host', "The hostname to use for exposing the 
REST service.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('port', 'Port', "The port number to use for exposing 
the REST service. Notice if you use servlet component then the port number 
configured here does not apply, as the port number in use is the actual port 
number the servlet component is using. eg if using Apache Tomcat its the tomcat 
http port, if using Apache Karaf its the HTTP service in Karaf that uses port 
8181 by default etc. Though in those situations setting the port number here, 
allows tooling and JMX to  [...]
-        new PropertyMeta('apiHost', 'Api Host', "To use a specific hostname 
for the API documentation (such as swagger or openapi) This can be used to 
override the generated host with this configured hostname", 'string', '', '', 
false, false, false, false, ''),
+        new PropertyMeta('apiHost', 'Api Host', "To use a specific hostname 
for the API documentation (such as swagger or openapi) This can be used to 
override the generated host with this configured hostname", 'string', '', '', 
false, false, false, false, 'consumer,advanced'),
         new PropertyMeta('useXForwardHeaders', 'Use XForward Headers', 
"Whether to use X-Forward headers for Host and related setting. The default 
value is true.", 'boolean', '', 'true', false, false, false, false, 
'consumer,advanced'),
         new PropertyMeta('producerApiDoc', 'Producer Api Doc', "Sets the 
location of the api document the REST producer will use to validate the REST 
uri and query parameters are valid accordingly to the api document. The 
location of the api document is loaded from classpath by default, but you can 
use file: or http: to refer to resources to load from file or http url.", 
'string', '', '', false, false, false, false, 'producer,advanced'),
         new PropertyMeta('contextPath', 'Context Path', "Sets a leading 
context-path the REST services will be using. This can be used when using 
components such as camel-servlet where the deployed web application is deployed 
using a context-path. Or for components such as camel-jetty or camel-netty-http 
that includes a HTTP server.", 'string', '', '', false, false, false, false, 
'consumer'),
         new PropertyMeta('apiContextPath', 'Api Context Path', "Sets a leading 
API context-path the REST API services will be using. This can be used when 
using components such as camel-servlet where the deployed web application is 
deployed using a context-path.", 'string', '', '', false, false, false, false, 
'consumer'),
-        new PropertyMeta('apiContextRouteId', 'Api Context Route Id', "Sets 
the route id to use for the route that services the REST API. The route will by 
default use an auto assigned route id.", 'string', '', '', false, false, false, 
false, 'consumer'),
         new PropertyMeta('apiVendorExtension', 'Api Vendor Extension', 
"Whether vendor extension is enabled in the Rest APIs. If enabled then Camel 
will include additional information as vendor extension (eg keys starting with 
x-) such as route ids, class names etc. Not all 3rd party API gateways and 
tools supports vendor-extensions when importing your API docs.", 'boolean', '', 
'false', false, false, false, false, 'consumer,advanced'),
         new PropertyMeta('hostNameResolver', 'Host Name Resolver', "If no 
hostname has been explicit configured, then this resolver is used to compute 
the hostname the REST service will be using.", 'string', 'all-local-ip, 
local-host-name, local-ip', 'allLocalIp', false, false, false, false, 
'consumer,advanced'),
         new PropertyMeta('bindingMode', 'Binding Mode', "Sets the binding mode 
to use. The default value is off", 'string', 'off, auto, json, xml, json_xml', 
'off', false, false, false, false, ''),
diff --git a/karavan-core/test/backward.spec.ts 
b/karavan-core/test/backward.spec.ts
new file mode 100644
index 0000000..bc79998
--- /dev/null
+++ b/karavan-core/test/backward.spec.ts
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {expect} from 'chai';
+import * as fs from 'fs';
+import 'mocha';
+import {CamelDefinitionYaml} from "../src/core/api/CamelDefinitionYaml";
+import {
+    ChoiceDefinition,
+    ExpressionDefinition,
+    FromDefinition,
+    LogDefinition,
+    OtherwiseDefinition,
+    SimpleExpression,
+    ToDefinition,
+    WhenDefinition
+} from "../src/core/model/CamelDefinition";
+import { RouteDefinition} from "../src/core/model/CamelDefinition";
+import {Integration} from "../src/core/model/IntegrationDefinition";
+
+describe('Backward for Camel version < 3.16.x', () => {
+
+    it('Object -> YAML', () => {
+        const i1 = Integration.createNew("test")
+
+        const when1 = new WhenDefinition({
+            expression: new ExpressionDefinition({simple: new 
SimpleExpression({expression:'${body} != null'})}),
+            steps: [new LogDefinition({logName: 'log11', message: "hello11"})]
+        })
+        const when2 = new WhenDefinition({
+            expression: new ExpressionDefinition({simple: '${body} == null'}),
+            steps: [new LogDefinition({logName: 'log22', message: "hello22"})]
+        })
+        const otherwise = new OtherwiseDefinition({steps: [new 
LogDefinition({logName: 'logX', message: "helloX"})]})
+        const choice = new ChoiceDefinition({when: [when1, when2], otherwise: 
otherwise})
+
+        const flow1 = new FromDefinition({uri: "direct1"});
+        flow1.steps?.push(choice);
+        flow1.steps?.push(new ToDefinition({uri: 'kamelet:kamelet2'}));
+        flow1.steps?.push(new ToDefinition({uri: 'kamelet:kamelet2'}));
+        flow1.parameters = {httpMethodRestrict: 'POST'}
+        i1.spec.flows?.push(new RouteDefinition({from: flow1}));
+
+        const flow2 = new FromDefinition({uri: "direct2"});
+        flow2.steps?.push(new LogDefinition({logName: 'log1', message: 
"hello1"}));
+        flow2.steps?.push(new LogDefinition({logName: 'log2', message: 
"hello2"}));
+
+        i1.spec.flows?.push(new RouteDefinition({from: flow2}));
+        const yaml1 = CamelDefinitionYaml.integrationToYaml(i1, true);
+        const yaml2 = fs.readFileSync('test/backward.yaml',{encoding:'utf8', 
flag:'r'});
+        expect(yaml1).to.equal(yaml2);
+    });
+
+    it('YAML -> Object', () => {
+        const yaml2 = fs.readFileSync('test/backward2.yaml',{encoding:'utf8', 
flag:'r'});
+        const i = 
CamelDefinitionYaml.yamlToIntegration("kafka2trinobatch.yaml", yaml2, true);
+        expect(i.spec.flows?.[0].from.steps.length).to.equal(2);
+    });
+
+
+});
\ No newline at end of file
diff --git a/karavan-core/test/backward.yaml b/karavan-core/test/backward.yaml
new file mode 100644
index 0000000..ac24364
--- /dev/null
+++ b/karavan-core/test/backward.yaml
@@ -0,0 +1,47 @@
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: test
+spec:
+  flows:
+    - route:
+        steps:
+          - choice:
+              when:
+                - expression:
+                    simple:
+                      expression: ${body} != null
+                  steps:
+                    - log:
+                        message: hello11
+                        logName: log11
+                - expression:
+                    simple: ${body} == null
+                  steps:
+                    - log:
+                        message: hello22
+                        logName: log22
+              otherwise:
+                otherwise:
+                  steps:
+                    - log:
+                        message: helloX
+                        logName: logX
+          - to:
+              uri: kamelet:kamelet2
+          - to:
+              uri: kamelet:kamelet2
+        from:
+          uri: direct1
+          parameters:
+            httpMethodRestrict: POST
+    - route:
+        steps:
+          - log:
+              message: hello1
+              logName: log1
+          - log:
+              message: hello2
+              logName: log2
+        from:
+          uri: direct2
diff --git a/karavan-core/test/backward2.yaml b/karavan-core/test/backward2.yaml
new file mode 100644
index 0000000..3da42fe
--- /dev/null
+++ b/karavan-core/test/backward2.yaml
@@ -0,0 +1,32 @@
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: kafka2trinobatch.yaml
+spec:
+  flows:
+    - route:
+        from:
+          uri: kafka:dynamic-pnc-logs
+        steps:
+          - log:
+              message: '"Processing ${body}'
+              loggingLevel: INFO
+          - aggregate:
+              steps:
+                - to:
+                    uri: >-
+                      sql:insert into iceberg.kafka.pnc_logs (message,
+                      timestamp) values (:#${body}, current_timestamp)
+                    parameters:
+                      batch: true
+                      useMessageBodyForSql: false
+              correlationExpression: {}
+              strategyRef: >-
+                
#class:org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy
+              expression:
+                constant: {}
+              completionSize: 20
+              completionTimeout: '10000'
+  dependencies:
+    - mvn:io.trino:trino-jdbc:368
+    - mvn:org.apache.commons:commons-dbcp2:2.9.0
diff --git a/karavan-core/test/cloneDefinition.spec.ts 
b/karavan-core/test/cloneDefinition.spec.ts
index 707f28f..16ccc7e 100644
--- a/karavan-core/test/cloneDefinition.spec.ts
+++ b/karavan-core/test/cloneDefinition.spec.ts
@@ -24,6 +24,7 @@ import { FilterDefinition, LogDefinition, ChoiceDefinition,
 import {CamelDefinitionApi} from "../src/core/api/CamelDefinitionApi";
 import {ExpressionDefinition} from "../src/core/model/CamelDefinition";
 import {Integration, CamelElement} from 
"../src/core/model/IntegrationDefinition";
+import {RouteDefinition} from "../lib/model/CamelDefinition";
 
 describe('Clone', () => {
 
@@ -46,20 +47,20 @@ describe('Clone', () => {
         flow1.steps?.push(new ToDefinition({uri: 'kamelet:kamelet2'}));
         flow1.steps?.push(new ToDefinition({uri: 'kamelet:kamelet2'}));
         flow1.parameters = {httpMethodRestrict: 'POST'}
-        i1.spec.flows?.push(flow1);
+        i1.spec.flows?.push(new RouteDefinition({from: flow1}));
 
         const flow2 = new FromDefinition({uri: "direct2"});
         flow2.steps?.push(new LogDefinition({logName: 'log1', message: 
"hello1"}));
         flow2.steps?.push(new LogDefinition({logName: 'log2', message: 
"hello2"}));
 
-        i1.spec.flows?.push(flow2);
+        i1.spec.flows?.push(new RouteDefinition({from: flow2}));
         const i2 = cloneIntegration(i1);
 
         expect(i1.metadata.name).to.equal(i2.metadata.name);
         expect(i1.spec.flows?.length).to.equal(i2.spec.flows?.length);
         if (i1.spec.flows && i2.spec.flows){
-            const f1:FromDefinition = i1.spec.flows[0];
-            const f2:FromDefinition = i2.spec.flows[0];
+            const f1:FromDefinition = i1.spec.flows[0].from;
+            const f2:FromDefinition = i2.spec.flows[0].from;
             
expect(f1.parameters?.httpMethodRestrict).to.equal(f2.parameters?.httpMethodRestrict);
             expect(f1.steps.length).to.equal(f2.steps.length);
 
diff --git a/karavan-core/test/dependencies.spec.ts 
b/karavan-core/test/dependencies.spec.ts
index 5cc8a86..d511b6e 100644
--- a/karavan-core/test/dependencies.spec.ts
+++ b/karavan-core/test/dependencies.spec.ts
@@ -81,7 +81,7 @@ describe('Read/write dependencies', () => {
             expect(i.spec.dependencies[0].version).to.equal("2.9.0");
         }
         i.crd = false
-        console.log(CamelDefinitionYaml.integrationToYaml(i))
+        // console.log(CamelDefinitionYaml.integrationToYaml(i))
     });
 
 });
\ No newline at end of file
diff --git a/karavan-core/test/expression.spec.ts 
b/karavan-core/test/expression.spec.ts
new file mode 100644
index 0000000..9d80b62
--- /dev/null
+++ b/karavan-core/test/expression.spec.ts
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {expect} from 'chai';
+import * as fs from 'fs';
+import 'mocha';
+import {CamelDefinitionYaml} from "../src/core/api/CamelDefinitionYaml";
+import {
+    ChoiceDefinition,
+    ExpressionDefinition,
+    FromDefinition,
+    LogDefinition,
+    OtherwiseDefinition,
+    SimpleExpression,
+    ToDefinition,
+    WhenDefinition
+} from "../src/core/model/CamelDefinition";
+import { RouteDefinition} from "../src/core/model/CamelDefinition";
+import {Integration} from "../src/core/model/IntegrationDefinition";
+import {AggregateDefinition} from "../lib/model/CamelDefinition";
+
+describe('Expression to yaml', () => {
+
+    it('Aggregate Expression', () => {
+        const i1 = Integration.createNew("test")
+
+        const agg = new AggregateDefinition({
+            correlationExpression: new ExpressionDefinition({simple: new 
SimpleExpression({expression:'${body} != null'})}),
+            steps: [new LogDefinition({logName: 'log11', message: "hello11"})]
+        })
+
+        const flow1 = new FromDefinition({uri: "direct1"});
+        flow1.steps?.push(agg);
+        i1.spec.flows?.push(new RouteDefinition({from: flow1}));
+
+        const yaml1 = CamelDefinitionYaml.integrationToYaml(i1, false);
+        console.log(yaml1)
+    });
+
+});
\ No newline at end of file
diff --git a/karavan-demo/xxx-yaml.yaml b/karavan-demo/xxx-yaml.yaml
new file mode 100644
index 0000000..06fd7bb
--- /dev/null
+++ b/karavan-demo/xxx-yaml.yaml
@@ -0,0 +1,26 @@
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: xxx-yaml.yaml
+spec:
+  flows:
+    - route:
+        steps:
+          - log:
+              message: ${body}
+          - aggregate:
+              steps:
+                - log:
+                    message: Aggregated ${body}
+              aggregationStrategy: >-
+                
#class:org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy
+              completionSize: 2
+              correlationExpression:
+                simple:
+                  expressionSubElement:
+                    expression: ${body}
+        from:
+          uri: kamelet:timer-source
+          parameters:
+            message: hello
+            period: 2000
diff --git a/karavan-designer/src/App.tsx b/karavan-designer/src/App.tsx
index e03b2c6..ca15b49 100644
--- a/karavan-designer/src/App.tsx
+++ b/karavan-designer/src/App.tsx
@@ -247,6 +247,7 @@ class App extends React.Component<Props, State> {
                                  onSave={(filename, yaml) => 
this.save(filename, yaml)}
                                  borderColor="#fb8824"
                                  borderColorSelected="#303284"
+                                 backward={true}
                                  
dark={document.body.className.includes('vscode-dark')}
                 />
             </Page>
diff --git a/karavan-designer/src/designer/KaravanDesigner.tsx 
b/karavan-designer/src/designer/KaravanDesigner.tsx
index ad24ea3..d9fdb71 100644
--- a/karavan-designer/src/designer/KaravanDesigner.tsx
+++ b/karavan-designer/src/designer/KaravanDesigner.tsx
@@ -16,7 +16,7 @@
  */
 import React from 'react';
 import {
-    Badge,
+    Badge, Label,
     PageSection, Tab, Tabs, TabTitleIcon, TabTitleText, Tooltip,
 } from '@patternfly/react-core';
 import './karavan.css';
@@ -31,6 +31,7 @@ import {ErrorDesigner} from "./error/ErrorDesigner";
 import {TemplatesDesigner} from "./templates/TemplatesDesigner";
 import {ExceptionDesigner} from "./exception/ExceptionDesigner";
 import {DependenciesDesigner} from "./dependencies/DependenciesDesigner";
+import InfoCircleIcon from 
'@patternfly/react-icons/dist/esm/icons/info-circle-icon';
 
 interface Props {
     onSave?: (filename: string, yaml: string) => void
@@ -39,6 +40,7 @@ interface Props {
     borderColor: string
     borderColorSelected: string
     dark: boolean
+    backward?: boolean
 }
 
 interface State {
@@ -52,7 +54,7 @@ export class KaravanDesigner extends React.Component<Props, 
State> {
     public state: State = {
         tab: 'routes',
         integration: this.props.yaml
-            ? CamelDefinitionYaml.yamlToIntegration(this.props.filename, 
this.props.yaml)
+            ? CamelDefinitionYaml.yamlToIntegration(this.props.filename, 
this.props.yaml, this.props.backward)
             : Integration.createNew(this.props.filename),
         key: "",
     };
@@ -69,7 +71,7 @@ export class KaravanDesigner extends React.Component<Props, 
State> {
 
     getCode = (integration: Integration): string => {
         const clone = CamelUtil.cloneIntegration(integration);
-        return CamelDefinitionYaml.integrationToYaml(clone);
+        return CamelDefinitionYaml.integrationToYaml(clone, 
this.props.backward);
     }
 
     getTab(title: string, tooltip: string, icon: string) {
@@ -180,6 +182,7 @@ export class KaravanDesigner extends React.Component<Props, 
State> {
         const tab = this.state.tab;
         return (
             <PageSection className="page" isFilled padding={{default: 
'noPadding'}}>
+                {this.props.backward && <Label className="backward" 
variant="outline" color="orange" isCompact={true} icon={<InfoCircleIcon 
/>}>Backward</Label>}
                 <Tabs className="main-tabs" activeKey={tab} onSelect={(event, 
tabIndex) => this.setState({tab: tabIndex.toString()})} style={{width: "100%"}}>
                     <Tab eventKey='routes' title={this.getTab("Routes", 
"Integration flows", "routes")}></Tab>
                     <Tab eventKey='rest' title={this.getTab("REST", "REST 
services", "rest")}></Tab>
diff --git a/karavan-designer/src/designer/karavan.css 
b/karavan-designer/src/designer/karavan.css
index ee976b5..0396062 100644
--- a/karavan-designer/src/designer/karavan.css
+++ b/karavan-designer/src/designer/karavan.css
@@ -22,6 +22,13 @@
     height: 36px;
 }
 
+.karavan .backward {
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    z-index: 100;
+}
+
 .karavan .header-button {
     margin-left: var(--pf-c-page__header-tools--MarginRight);
 }
diff --git a/karavan-vscode/package.json b/karavan-vscode/package.json
index 35d58c7..f2afd58 100644
--- a/karavan-vscode/package.json
+++ b/karavan-vscode/package.json
@@ -78,6 +78,11 @@
           "default": "true",
           "description": "Reload routes on change"
         },
+        "camel.backward": {
+          "type": "boolean",
+          "default": false,
+          "description": "Compatibility with Camel version < 3.16"
+        },
         "Karavan.kameletsPath": {
           "type": "string",
           "default": "",
diff --git a/karavan-vscode/src/extension.ts b/karavan-vscode/src/extension.ts
index cfc757e..14bf78a 100644
--- a/karavan-vscode/src/extension.ts
+++ b/karavan-vscode/src/extension.ts
@@ -119,6 +119,10 @@ function openKaravanWebView(context: 
vscode.ExtensionContext, webviewContent: st
         "icons/icon.svg"
     );
 
+    // Send backward compatibility
+    const backward = vscode.workspace.getConfiguration().get("camel.backward");
+    if (backward) panel.webview.postMessage({ command: 'backward'});
+
     // Read and send Kamelets
     panel.webview.postMessage({ command: 'kamelets', kamelets: 
readKamelets(context) });
 
diff --git a/karavan-vscode/webview/App.tsx b/karavan-vscode/webview/App.tsx
index 1c23036..bb3681a 100644
--- a/karavan-vscode/webview/App.tsx
+++ b/karavan-vscode/webview/App.tsx
@@ -32,6 +32,7 @@ interface State {
   relativePath: string
   yaml: string
   key: string
+  backward: boolean
 }
 
 class App extends React.Component<Props, State> {
@@ -40,7 +41,8 @@ class App extends React.Component<Props, State> {
     filename: '',
     relativePath: '',
     yaml: '',
-    key: ''
+    key: '',
+    backward: false
   };
 
 
@@ -48,6 +50,9 @@ class App extends React.Component<Props, State> {
     window.addEventListener('message', event => {
       const message = event.data; // The JSON data our extension sent
       switch (message.command) {
+        case 'backward':
+          this.setState({backward: true});
+          break;
         case 'kamelets':
           KameletApi.saveKamelets(message.kamelets);
           break;
@@ -78,6 +83,7 @@ class App extends React.Component<Props, State> {
       <Page className="karavan">
          <KaravanDesigner 
           key={this.state.key} 
+          backward={this.state.backward}
           filename={this.state.filename} 
           yaml={this.state.yaml} 
           onSave={(filename, yaml) => this.save(filename, yaml)}

Reply via email to