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/12/01 21:22:56 UTC

[camel-karavan] branch main updated: Snippet support

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 83921d9  Snippet support
83921d9 is described below

commit 83921d9dac3abc7e515ce6ab3d989b75c3a13f24
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Thu Dec 1 16:22:45 2022 -0500

    Snippet support
---
 .../src/main/webui/src/projects/ProjectPage.tsx    |  1 -
 ...arkus-org.apache.camel.AggregationStrategy.java | 23 +++++++++
 .../quarkus-org.apache.camel.Processor.java        | 14 ++++++
 ...-boot-org.apache.camel.AggregationStrategy.java | 20 ++++++++
 .../spring-boot-org.apache.camel.Processor.java    | 12 +++++
 karavan-vscode/src/extension.ts                    | 55 +++++-----------------
 karavan-vscode/src/utils.ts                        | 29 ++++++++++--
 karavan-vscode/webview/App.tsx                     | 24 +++++++++-
 8 files changed, 127 insertions(+), 51 deletions(-)

diff --git a/karavan-app/src/main/webui/src/projects/ProjectPage.tsx b/karavan-app/src/main/webui/src/projects/ProjectPage.tsx
index 3713c35..b592e7b 100644
--- a/karavan-app/src/main/webui/src/projects/ProjectPage.tsx
+++ b/karavan-app/src/main/webui/src/projects/ProjectPage.tsx
@@ -264,7 +264,6 @@ export class ProjectPage extends React.Component<Props, State> {
                 onSave={(name, yaml) => this.save(name, yaml)}
                 onSaveCustomCode={(name, code) => this.post(new ProjectFile(name+".java", project.projectId, code, Date.now()))}
                 onGetCustomCode={(name, javaType) => {
-                    console.log(name);
                     return new Promise<string | undefined>(resolve => resolve(files.filter(f => f.name === name + ".java")?.at(0)?.code))
                 }}
             />
diff --git a/karavan-vscode/snippets/quarkus-org.apache.camel.AggregationStrategy.java b/karavan-vscode/snippets/quarkus-org.apache.camel.AggregationStrategy.java
new file mode 100644
index 0000000..4e45fcd
--- /dev/null
+++ b/karavan-vscode/snippets/quarkus-org.apache.camel.AggregationStrategy.java
@@ -0,0 +1,23 @@
+import org.apache.camel.AggregationStrategy
+;
+import org.apache.camel.Exchange;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@Singleton
+@Named("NAME")
+public class NAME implements AggregationStrategy {
+    @Override
+    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
+
+        if (oldExchange == null) {
+            return newExchange;
+        }
+
+        String oldBody = oldExchange.getIn().getBody(String.class);
+        String newBody = newExchange.getIn().getBody(String.class);
+        oldExchange.getIn().setBody(oldBody + "+" + newBody);
+        return oldExchange;
+    }
+}
\ No newline at end of file
diff --git a/karavan-vscode/snippets/quarkus-org.apache.camel.Processor.java b/karavan-vscode/snippets/quarkus-org.apache.camel.Processor.java
new file mode 100644
index 0000000..6b81323
--- /dev/null
+++ b/karavan-vscode/snippets/quarkus-org.apache.camel.Processor.java
@@ -0,0 +1,14 @@
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+@Singleton
+@Named("NAME")
+public class NAME implements Processor {
+
+  public void process(Exchange exchange) throws Exception {
+      exchange.getIn().setBody("Hello World");
+  }
+}
\ No newline at end of file
diff --git a/karavan-vscode/snippets/spring-boot-org.apache.camel.AggregationStrategy.java b/karavan-vscode/snippets/spring-boot-org.apache.camel.AggregationStrategy.java
new file mode 100644
index 0000000..1b04d76
--- /dev/null
+++ b/karavan-vscode/snippets/spring-boot-org.apache.camel.AggregationStrategy.java
@@ -0,0 +1,20 @@
+import org.apache.camel.AggregationStrategy;
+import org.apache.camel.Exchange;
+
+import org.springframework.stereotype.Component;
+
+@Component("NAME")
+public class NAME implements AggregationStrategy {
+    @Override
+    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
+
+        if (oldExchange == null) {
+            return newExchange;
+        }
+
+        String oldBody = oldExchange.getIn().getBody(String.class);
+        String newBody = newExchange.getIn().getBody(String.class);
+        oldExchange.getIn().setBody(oldBody + "+" + newBody);
+        return oldExchange;
+    }
+}
\ No newline at end of file
diff --git a/karavan-vscode/snippets/spring-boot-org.apache.camel.Processor.java b/karavan-vscode/snippets/spring-boot-org.apache.camel.Processor.java
new file mode 100644
index 0000000..4593b74
--- /dev/null
+++ b/karavan-vscode/snippets/spring-boot-org.apache.camel.Processor.java
@@ -0,0 +1,12 @@
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+
+import org.springframework.stereotype.Component;
+
+@Component("NAME")
+public class NAME implements Processor {
+
+  public void process(Exchange exchange) throws Exception {
+      exchange.getIn().setBody("Hello World");
+  }
+}
\ No newline at end of file
diff --git a/karavan-vscode/src/extension.ts b/karavan-vscode/src/extension.ts
index b816b0b..99087b9 100644
--- a/karavan-vscode/src/extension.ts
+++ b/karavan-vscode/src/extension.ts
@@ -26,51 +26,12 @@ import * as utils from "./utils";
 const KARAVAN_LOADED = "karavan:loaded";
 
 export function activate(context: ExtensionContext) {
-    const webviewContent = `<!DOCTYPE html>
-    <html lang="en">
-    
-    <head>
-      <meta charset="utf-8" />
-      <meta name="viewport" content="width=device-width, initial-scale=1" />
-      <link href="styleUri" rel="stylesheet" type="text/css" />
-    </head>
-    
-    <body>
-      <noscript>You need to enable JavaScript to run this app.</noscript>
-      <div id="root">
-        <div class="pf-c-page karavan">
-          <main class="pf-c-page__main" tabindex="-1">
-            <section class="pf-c-page__main-section pf-m-dark-200 loading-page"><svg
-                class="pf-c-spinner pf-m-xl progress-stepper" role="progressbar" aria-valuetext="Loading..."
-                viewBox="0 0 100 100" style="--pf-c-spinner--diameter:80px" aria-label="Loading...">
-                <circle class="pf-c-spinner__path" cx="50" cy="50" r="45" fill="none"></circle>
-              </svg></section>
-          </main>
-        </div>
-      </div>
-      <script>
-      </script>
-      <script src="scriptUri"></script>
-    </body>
-    
-    </html>`
-        .replace(
-            "styleUri",
-            Uri.joinPath(context.extensionUri, "/dist/main.css")
-                .with({ scheme: "vscode-resource" })
-                .toString()
-        )
-        .replace(
-            "scriptUri",
-            Uri.joinPath(context.extensionUri, "/dist/webview.js")
-                .with({ scheme: "vscode-resource" })
-                .toString()
-        );
+
     const rootPath = (workspace.workspaceFolders && (workspace.workspaceFolders.length > 0))
         ? workspace.workspaceFolders[0].uri.fsPath : undefined;
 
     // Register views    
-    const designer = new DesignerView(context, webviewContent, rootPath);
+    const designer = new DesignerView(context, rootPath);
 
     const integrationView = new IntegrationView(designer, rootPath);
     window.registerTreeDataProvider('integrations', integrationView);
@@ -80,18 +41,24 @@ export function activate(context: ExtensionContext) {
     window.registerTreeDataProvider('openapi', openapiView);
     commands.registerCommand('openapi.refresh', () => openapiView.refresh());
 
-    const helpView = new HelpView(context, webviewContent);
+    const helpView = new HelpView(context);
     window.registerTreeDataProvider('help', helpView);
     commands.registerCommand('karavan.openKamelets', () => helpView.openKaravanWebView("kamelets"));
     commands.registerCommand('karavan.openComponents', () => helpView.openKaravanWebView("components"));
     commands.registerCommand('karavan.openEip', () => helpView.openKaravanWebView("eip"));
 
     // Create new Integration YAML command
-    const createYaml = commands.registerCommand("karavan.create-yaml", (...args: any[]) => designer.createIntegration("plain", args[0]?.fsPath));
+    const createYaml = commands.registerCommand("karavan.create-yaml", (...args: any[]) => {
+        console.log("args", args)
+        designer.createIntegration("plain", args[0]?.fsPath)
+    });
     context.subscriptions.push(createYaml);
 
     // Open integration in designer command
-    const open = commands.registerCommand("karavan.open", (...args: any[]) => designer.karavanOpen(args[0].fsPath, args[0].tab));
+    const open = commands.registerCommand("karavan.open", (...args: any[]) => {
+        console.log("args", args)
+        designer.karavanOpen(args[0].fsPath, args[0].tab);
+    });
     context.subscriptions.push(open);
 
     // Open integration in editor command
diff --git a/karavan-vscode/src/utils.ts b/karavan-vscode/src/utils.ts
index 9cfad7c..c226a36 100644
--- a/karavan-vscode/src/utils.ts
+++ b/karavan-vscode/src/utils.ts
@@ -30,6 +30,13 @@ export function save(relativePath: string, text: string) {
     }
 }
 
+export function saveCode(name: string, yamlFullPath: string, yamFileName: string,  code: string) {
+    if (workspace.workspaceFolders) {
+        const folder = yamlFullPath.replace(yamFileName, '');
+        write(path.join(folder, name + ".java"), code);
+    }
+}
+
 export function deleteFile(fullPath: string) {
     if (workspace.workspaceFolders) {
         const uriFile: Uri = Uri.file(path.resolve(fullPath));
@@ -49,7 +56,8 @@ export async function readKamelets(context: ExtensionContext) {
     const kameletsPath: string | undefined = workspace.getConfiguration().get("Karavan.kameletsPath");
     if (kameletsPath && kameletsPath.trim().length > 0) {
         const kameletsDir = path.isAbsolute(kameletsPath) ? kameletsPath : path.resolve(kameletsPath);
-        const customKamelets: string[] = await readFilesInDirByExtension(kameletsDir, "yaml");
+        const files = await readFilesInDirByExtension(kameletsDir, "yaml");
+        const customKamelets: string[] = Array.from(files.values());
         if (customKamelets && customKamelets.length > 0) yamls.push(...customKamelets);
     }
     return yamls;
@@ -64,15 +72,15 @@ async function readBuildInKamelets(context: ExtensionContext) {
     return result;
 }
 
-async function readFilesInDirByExtension(dir: string, extension: string) {
-    const result: string[] = [];
+async function readFilesInDirByExtension(dir: string, extension: string): Promise<Map<string, string>> {
+    const result = new Map<string, string>();
     const dirs: [string, FileType][] = await readDirectory(dir);
     for (let d in dirs) {
         const filename = dirs[d][0];
         if (filename !== undefined && filename.endsWith(extension)){
             const file = await readFile(dir + "/" + filename);
             const code = Buffer.from(file).toString('utf8');
-            result.push(code);
+            result.set(filename, code);
         }
     }
     return result;
@@ -88,6 +96,19 @@ export async function readComponents(context: ExtensionContext) {
     return jsons;
 }
 
+export async function readTemplates(context: ExtensionContext) {
+    const result = new Map<string, string>();
+    const runtime = await getRuntime();
+    const files = await readFilesInDirByExtension(path.join(context.extensionPath, 'snippets'), "java");
+    files.forEach((v, k)=>{
+        if (runtime && k.startsWith(runtime)){
+            const name = k.replace(runtime+"-", "").replace(".java", "");
+            result.set(name, v);
+        }
+    })
+    return result;
+}
+
 export function parceYaml(filename: string, yaml: string): [boolean, string?] {
     const i = CamelDefinitionYaml.yamlToIntegration(filename, yaml);
     if (i.kind === 'Integration' && i.metadata.name) {
diff --git a/karavan-vscode/webview/App.tsx b/karavan-vscode/webview/App.tsx
index 8a78b4a..818878b 100644
--- a/karavan-vscode/webview/App.tsx
+++ b/karavan-vscode/webview/App.tsx
@@ -25,6 +25,7 @@ import { ComponentApi } from "core/api/ComponentApi";
 import { KameletsPage } from "./kamelets/KameletsPage";
 import { ComponentsPage } from "./components/ComponentsPage";
 import { EipPage } from "./eip/EipPage";
+import { TemplateApi } from "./core/api/TemplateApi";
 
 interface Props {
   dark: boolean
@@ -34,6 +35,7 @@ interface State {
   karavanDesignerRef: any
   filename: string
   relativePath: string
+  fullPath: string
   yaml: string
   key: string
   loaded: boolean
@@ -52,6 +54,7 @@ class App extends React.Component<Props, State> {
     karavanDesignerRef: React.createRef(),
     filename: '',
     relativePath: '',
+    fullPath: '',
     yaml: '',
     key: '',
     loaded: false,
@@ -90,6 +93,11 @@ class App extends React.Component<Props, State> {
       case 'components':
         ComponentApi.saveComponents(message.components, true);
         break;
+      case 'templates':
+        const templates = message.templates;
+        const map = new Map( Object.keys(templates).map(key => [key, templates[key]]));
+        TemplateApi.saveTemplates(map, true);
+        break;  
       case 'open':
         if (this.state.filename === '' && this.state.key === '') {
           if (message.page !== "designer" && this.state.interval) clearInterval(this.state.interval);
@@ -99,6 +107,7 @@ class App extends React.Component<Props, State> {
             yaml: message.yaml,
             scheduledYaml: message.yaml,
             relativePath: message.relativePath,
+            fullPath: message.fullPath,
             key: Math.random().toString(),
             loaded: true,
             active: true,
@@ -124,7 +133,7 @@ class App extends React.Component<Props, State> {
   save(filename: string, yaml: string, propertyOnly: boolean) {
     if (this.state.active) {
       if (!propertyOnly) {
-        vscode.postMessage({ command: 'save', filename: filename, relativePath: this.state.relativePath, yaml: yaml });
+        vscode.postMessage({ command: 'save', filename: filename, relativePath: this.state.relativePath, fullPath: this.state.fullPath, code: yaml });
         this.setState({ scheduledYaml: yaml, hasChanges: false });
       } else {
         this.setState({ scheduledYaml: yaml, hasChanges: true });
@@ -132,6 +141,11 @@ class App extends React.Component<Props, State> {
     }
   }
 
+  saveJavCode(name: string, code: string) {
+    vscode.postMessage({ command: 'saveCode', name: name, yamlFullPath: this.state.fullPath, yamFileName: this.state.filename, code: code });
+  }
+
+
   public render() {
     return (
       <Page className="karavan">
@@ -147,7 +161,13 @@ class App extends React.Component<Props, State> {
             yaml={this.state.yaml}
             onSave={(filename, yaml, propertyOnly) => this.save(filename, yaml, propertyOnly)}
             tab={this.state.tab}
-            dark={this.props.dark} />
+            dark={this.props.dark} 
+            onSaveCustomCode={(name, code) => this.saveJavCode(name, code)}
+            onGetCustomCode={(name, javaType) => {
+                // return new Promise<string | undefined>(resolve => resolve(files.filter(f => f.name === name + ".java")?.at(0)?.code))
+                return new Promise<string | undefined>(resolve => resolve(undefined))
+            }}
+            />
         }
         {this.state.loaded && this.state.page === "kamelets" && <KameletsPage dark={this.props.dark} />}
         {this.state.loaded && this.state.page === "components" && <ComponentsPage dark={this.props.dark} />}