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 9a9f84e4 Fix #1465 9a9f84e4 is described below commit 9a9f84e4ea99e7f8ced25d6111d7283c1d8cca66 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Thu Dec 5 15:08:09 2024 -0500 Fix #1465 --- karavan-core/src/core/api/CamelDefinitionYaml.ts | 5 ++ .../src/core/api/CamelDefinitionYamlStep.ts | 5 +- karavan-core/src/core/model/CamelMetadata.ts | 2 +- karavan-core/test/yamDataFormat.camel.yaml | 14 +++++ karavan-core/test/yamDataFormat.spec.ts | 60 ++++++++++++++++++++++ karavan-core/test/yamDataFormat1.camel.yaml | 12 +++++ karavan-core/test/yamDataFormat2.camel.yaml | 13 +++++ .../CamelDefinitionYamlStepGenerator.java | 10 +++- .../karavan/generator/CamelMetadataGenerator.java | 3 +- 9 files changed, 119 insertions(+), 5 deletions(-) diff --git a/karavan-core/src/core/api/CamelDefinitionYaml.ts b/karavan-core/src/core/api/CamelDefinitionYaml.ts index 93ca86f3..1023edda 100644 --- a/karavan-core/src/core/api/CamelDefinitionYaml.ts +++ b/karavan-core/src/core/api/CamelDefinitionYaml.ts @@ -240,6 +240,11 @@ export class CamelDefinitionYaml { return xValue; } } else { + if (value.dslName === 'YAMLDataFormat') { // YAMLDataFormat constructor field + value.constructor = value._constructor; + delete value._constructor; + return value; + } delete value?.dslName; return value; } diff --git a/karavan-core/src/core/api/CamelDefinitionYamlStep.ts b/karavan-core/src/core/api/CamelDefinitionYamlStep.ts index b0351ddd..89a066d3 100644 --- a/karavan-core/src/core/api/CamelDefinitionYamlStep.ts +++ b/karavan-core/src/core/api/CamelDefinitionYamlStep.ts @@ -3519,7 +3519,10 @@ export class CamelDefinitionYamlStep { let def = element ? new YAMLDataFormat({...element}) : new YAMLDataFormat(); def.typeFilter = element && element?.typeFilter ? element?.typeFilter.map((x:any) => CamelDefinitionYamlStep.readYAMLTypeFilterDefinition(x)) :[]; - + if (element.constructor !== undefined) { + def._constructor = element.constructor; + delete (def as any).constructor; + } return def; } diff --git a/karavan-core/src/core/model/CamelMetadata.ts b/karavan-core/src/core/model/CamelMetadata.ts index 1f639628..e9b1b864 100644 --- a/karavan-core/src/core/model/CamelMetadata.ts +++ b/karavan-core/src/core/model/CamelMetadata.ts @@ -697,7 +697,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [ new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, '', ''), new PropertyMeta('library', 'Library', "Which yaml library to use. By default it is SnakeYAML", 'string', 'SnakeYAML', '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, 'advanced', ''), + 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', ''), diff --git a/karavan-core/test/yamDataFormat.camel.yaml b/karavan-core/test/yamDataFormat.camel.yaml new file mode 100644 index 00000000..641909ae --- /dev/null +++ b/karavan-core/test/yamDataFormat.camel.yaml @@ -0,0 +1,14 @@ +- route: + id: route-7447 + from: + id: from-875e + uri: direct1 + steps: + - marshal: + id: marshal-7abc + yaml: + dslName: YAMLDataFormat + id: yaml-b347 + library: hello + constructor: any-constructor + diff --git a/karavan-core/test/yamDataFormat.spec.ts b/karavan-core/test/yamDataFormat.spec.ts new file mode 100644 index 00000000..5a3bbb39 --- /dev/null +++ b/karavan-core/test/yamDataFormat.spec.ts @@ -0,0 +1,60 @@ +/* + * 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 'mocha'; +import { + FromDefinition, + LogDefinition, + WhenDefinition, + ChoiceDefinition, + MulticastDefinition, + ExpressionDefinition, + RouteDefinition, TryDefinition,CatchDefinition +} from "../src/core/model/CamelDefinition"; +import {CamelDefinitionApiExt} from "../src/core/api/CamelDefinitionApiExt"; +import {CamelDefinitionYaml} from "../src/core/api/CamelDefinitionYaml"; +import {SimpleExpression} from "../src/core/model/CamelDefinition"; +import {Integration} from "../src/core/model/IntegrationDefinition"; +import * as fs from 'fs'; +import { MarshalDefinition, YAMLDataFormat } from '../lib/model/CamelDefinition'; + +describe('YAML Data Format', () => { + + it('Write', () => { + const text1 = fs.readFileSync('test/yamDataFormat1.camel.yaml',{encoding:'utf8', flag:'r'}); + const text2 = fs.readFileSync('test/yamDataFormat2.camel.yaml',{encoding:'utf8', flag:'r'}); + const i = CamelDefinitionYaml.yamlToIntegration("yamDataFormat1.camel.yaml", text1); + + if (i.spec.flows?.[0].from?.steps?.[0].yaml) { + const yaml = i.spec.flows[0].from.steps[0].yaml; + if (typeof yaml === 'object' && yaml !== null) { + yaml._constructor = 'test'; + } + } + + const text3 = CamelDefinitionYaml.integrationToYaml(i); + expect(text3).to.equal(text2); + }); + + it('Read', () => { + const text = fs.readFileSync('test/yamDataFormat2.camel.yaml',{encoding:'utf8', flag:'r'}); + const i = CamelDefinitionYaml.yamlToIntegration("yamDataFormat2.camel.yaml", text); + + expect(i.spec.flows?.[0].from?.steps?.[0].yaml._constructor).to.equal('test'); + }); + +}); diff --git a/karavan-core/test/yamDataFormat1.camel.yaml b/karavan-core/test/yamDataFormat1.camel.yaml new file mode 100644 index 00000000..dfd3ca68 --- /dev/null +++ b/karavan-core/test/yamDataFormat1.camel.yaml @@ -0,0 +1,12 @@ +- route: + id: route-7447 + from: + id: from-875e + uri: direct1 + steps: + - marshal: + id: marshal-7abc + yaml: + dslName: YAMLDataFormat + id: yaml-b347 + library: hello diff --git a/karavan-core/test/yamDataFormat2.camel.yaml b/karavan-core/test/yamDataFormat2.camel.yaml new file mode 100644 index 00000000..4b8e8d09 --- /dev/null +++ b/karavan-core/test/yamDataFormat2.camel.yaml @@ -0,0 +1,13 @@ +- route: + id: route-7447 + from: + id: from-875e + uri: direct1 + steps: + - marshal: + id: marshal-7abc + yaml: + dslName: YAMLDataFormat + id: yaml-b347 + library: hello + constructor: test diff --git a/karavan-generator/src/main/java/org/apache/camel/karavan/generator/CamelDefinitionYamlStepGenerator.java b/karavan-generator/src/main/java/org/apache/camel/karavan/generator/CamelDefinitionYamlStepGenerator.java index d3334a6a..1c618c89 100644 --- a/karavan-generator/src/main/java/org/apache/camel/karavan/generator/CamelDefinitionYamlStepGenerator.java +++ b/karavan-generator/src/main/java/org/apache/camel/karavan/generator/CamelDefinitionYamlStepGenerator.java @@ -152,10 +152,16 @@ public final class CamelDefinitionYamlStepGenerator extends AbstractGenerator { , aName, getAttributeClass(aValue)); attrs.put(aName, code); } - } else { - + } else if ("YAMLDataFormat".equals(className) && "constructor".equals(aName)) { + String yamlConstructor = + " if (element.constructor !== undefined) {\n" + + " def._constructor = element.constructor;\n" + + " delete (def as any).constructor;\n" + + " }"; + attrs.put(aName, yamlConstructor); } }); + return String.format(readFileText(modelTemplate), className, s1, s3, attrs.values().stream().collect(Collectors.joining(""))); } diff --git a/karavan-generator/src/main/java/org/apache/camel/karavan/generator/CamelMetadataGenerator.java b/karavan-generator/src/main/java/org/apache/camel/karavan/generator/CamelMetadataGenerator.java index 018cf957..2a0c4beb 100644 --- a/karavan-generator/src/main/java/org/apache/camel/karavan/generator/CamelMetadataGenerator.java +++ b/karavan-generator/src/main/java/org/apache/camel/karavan/generator/CamelMetadataGenerator.java @@ -215,9 +215,10 @@ public final class CamelMetadataGenerator extends AbstractGenerator { pm.type = "string"; } if (!getDeprecatedClasses().contains(pm.type)) { + var propertyName = "constructor".equals(pname) ? "_constructor" : pname; code.append(String.format( " new PropertyMeta('%s', '%s', \"%s\", '%s', '%s', '%s', %b, %b, %b, %b, '%s', '%s'),\n", - pname, displayName, desc, pm.type, en, defaultValue, required, secret, pm.isArray, (pm.isArray ? pm.type : pm.isObject), labels, javaType)); + propertyName, displayName, desc, pm.type, en, defaultValue, required, secret, pm.isArray, (pm.isArray ? pm.type : pm.isObject), labels, javaType)); } } });