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 <marat.gubaidul...@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} />}