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} />}