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));
                         }
                     }
                 });

Reply via email to