You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2022/05/24 20:37:01 UTC

[camel-karavan] branch main updated: List of placeholders (#354)

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 cea8342  List of placeholders (#354)
cea8342 is described below

commit cea83427bb370a12551d8f297f4e8b4433cc7847
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Tue May 24 16:36:56 2022 -0400

    List of placeholders (#354)
---
 karavan-core/src/core/api/CamelUtil.ts |  49 +++++++++++-
 karavan-core/test/placeholder.spec.ts  |  32 ++++++++
 karavan-core/test/placeholder.yaml     | 133 +++++++++++++++++++++++++++++++++
 3 files changed, 213 insertions(+), 1 deletion(-)

diff --git a/karavan-core/src/core/api/CamelUtil.ts b/karavan-core/src/core/api/CamelUtil.ts
index bf948c1..84ffdcd 100644
--- a/karavan-core/src/core/api/CamelUtil.ts
+++ b/karavan-core/src/core/api/CamelUtil.ts
@@ -16,7 +16,7 @@
  */
 import {
     Integration,
-    CamelElement, Beans, Dependency,
+    CamelElement, Beans, Dependency, CamelElementMeta,
 } from "../model/IntegrationDefinition";
 import {CamelDefinitionApi} from "./CamelDefinitionApi";
 import {KameletDefinition, NamedBeanDefinition, ToDefinition} from "../model/CamelDefinition";
@@ -213,4 +213,51 @@ export class CamelUtil {
         }
         return result;
     }
+
+    static findPlaceholdersInObject = (item: any, result: Set<string> = new Set<string>()): Set<string> => {
+        if (typeof item === 'object'){
+            Object.keys(item).forEach(key => {
+                const value = (item as any)[key];
+                if (Array.isArray(value)){
+                    this.findPlaceholdersInArray(value, result);
+                } else if (typeof value === 'object'){
+                    this.findPlaceholdersInObject(value, result);
+                } else {
+                    const r = this.findPlaceholder(value.toString());
+                    if (r[0] && r[1]) result.add(r[1]);
+                }
+            })
+        } else {
+            const r = this.findPlaceholder(item.toString());
+            if (r[0] && r[1]) result.add(r[1]);
+        }
+        return result;
+    }
+
+    static findPlaceholdersInArray = (items: any[] | undefined, result: Set<string> = new Set<string>()): Set<string> => {
+        if (items !== undefined) {
+            items.forEach(item => {
+                if (typeof item === 'object'){
+                    this.findPlaceholdersInObject(item, result);
+                } else {
+                    const r = this.findPlaceholder(item.toString());
+                    if (r[0] && r[1]) result.add(r[1]);
+                }
+            })
+        }
+        return result;
+    }
+
+    static findPlaceholder = (value: string): [boolean, string?] => {
+        let result = false;
+        let placeholder = undefined;
+        if (value !== undefined) {
+            const val = value.trim();
+            result = val.includes("{{") && val.includes("}}");
+            const start = val.search("{{") + 2;
+            const end = val.search("}}");
+            placeholder = val.substring(start, end).trim();
+        }
+        return [result, placeholder];
+    }
 }
diff --git a/karavan-core/test/placeholder.spec.ts b/karavan-core/test/placeholder.spec.ts
new file mode 100644
index 0000000..1232fb7
--- /dev/null
+++ b/karavan-core/test/placeholder.spec.ts
@@ -0,0 +1,32 @@
+/*
+ * 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 {CamelUtil} from "../src/core/api/CamelUtil";
+
+describe('Get Placeholders', () => {
+
+    it('Get Placeholders', () => {
+        const yaml = fs.readFileSync('test/placeholder.yaml',{encoding:'utf8', flag:'r'});
+        const i = CamelDefinitionYaml.yamlToIntegration("test1.yaml", yaml);
+        const placeholders = CamelUtil.findPlaceholdersInObject(i);
+        expect(placeholders.size).to.equal(4);
+    });
+
+});
diff --git a/karavan-core/test/placeholder.yaml b/karavan-core/test/placeholder.yaml
new file mode 100644
index 0000000..acbe3ad
--- /dev/null
+++ b/karavan-core/test/placeholder.yaml
@@ -0,0 +1,133 @@
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: Postman Demo
+spec:
+  flows:
+    - rest:
+        post:
+          - to: direct:post
+        path: /parcels
+        consumes: application/json
+        produces: application/json
+    - route:
+        from:
+          uri: direct:post
+          steps:
+            - log:
+                message: 'Received: ${body}'
+            - multicast:
+                steps:
+                  - to:
+                      uri: kamelet:kafka-not-secured-sink
+                      parameters:
+                        topic: parcels
+                        bootstrapServers: '{{kafka-brokers}}'
+                  - to:
+                      uri: kamelet:postgresql-sink
+                      parameters:
+                        serverName: '{{postgres-server}}'
+                        serverPort: '5432'
+                        username: postgres
+                        password: postgres
+                        databaseName: demo
+                        query: >-
+                          INSERT INTO parcels (id,address) VALUES
+                          (:#id,:#address) ON CONFLICT (id)  DO NOTHING
+                aggregationStrategy: >-
+                  #class:org.apache.camel.processor.aggregate.UseOriginalAggregationStrategy
+                parallelProcessing: true
+                streaming: true
+        id: post
+    - route:
+        from:
+          uri: kamelet:jms-apache-artemis-source
+          steps:
+            - to:
+                uri: xj:identity
+                parameters:
+                  transformDirection: XML2JSON
+            - to:
+                uri: kamelet:kafka-not-secured-sink
+                parameters:
+                  topic: payments
+                  bootstrapServers: '{{kafka-brokers}}'
+          parameters:
+            destinationType: queue
+            destinationName: payments
+            brokerURL: '{{jms-broker}}'
+        id: payment
+    - route:
+        from:
+          uri: kamelet:kafka-not-secured-source
+          steps:
+            - log:
+                message: 'Aggegating: ${body}'
+            - unmarshal:
+                json:
+                  library: jackson
+            - aggregate:
+                steps:
+                  - choice:
+                      when:
+                        - expression:
+                            groovy:
+                              expression: >-
+                                body.find { it.containsKey('status') }.status ==
+                                'confirmed'
+                          steps:
+                            - marshal:
+                                json:
+                                  library: jackson
+                            - log:
+                                message: 'Send to MQTT : ${body}'
+                            - to:
+                                uri: kamelet:mqtt-sink
+                                parameters:
+                                  topic: deliveries
+                                  brokerUrl: '{{mqtt-broker}}'
+                      otherwise:
+                        steps:
+                          - setBody:
+                              expression:
+                                groovy:
+                                  expression: 'body.find { it.containsKey(''status'') } '
+                          - marshal:
+                              json:
+                                library: jackson
+                          - log:
+                              message: 'Send to database: ${body}'
+                          - to:
+                              uri: kamelet:postgresql-sink
+                              parameters:
+                                serverName: '{{postgres-server}}'
+                                serverPort: '5432'
+                                username: postgres
+                                password: postgres
+                                databaseName: demo
+                                query: >-
+                                  UPDATE parcels set status = 'CANCELED' WHERE
+                                  id = :#id
+                aggregationStrategy: aggregator
+                completionSize: 2
+                correlationExpression:
+                  groovy:
+                    expression: body.get('id')
+          parameters:
+            topic: parcels,payments
+            bootstrapServers: '{{kafka-brokers}}'
+            autoCommitEnable: true
+            consumerGroup: postman
+        id: aggregator
+    - route:
+        from:
+          uri: kamelet:mqtt-source
+          steps:
+            - log:
+                message: 'Delivery: ${body}'
+          parameters:
+            topic: deliveries
+            brokerUrl: '{{mqtt-broker}}'
+    - beans:
+        - name: aggregator
+          type: org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy