blob: 8f84c72120b7931c5b78f967fdf8bd4badc88085 [file] [log] [blame]
/*
* 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 * as path from "path";
import { workspace, Uri, window, ExtensionContext, FileType } from "vscode";
import { CamelDefinitionYaml } from "core/api/CamelDefinitionYaml";
import { Integration } from "core/model/IntegrationDefinition";
export function getRoot(): string | undefined {
return (workspace.workspaceFolders && (workspace.workspaceFolders.length > 0))
? workspace.workspaceFolders[0].uri.fsPath : undefined;
}
export function save(relativePath: string, text: string) {
if (workspace.workspaceFolders) {
const uriFolder: Uri = workspace.workspaceFolders[0].uri;
write(path.join(uriFolder.path, relativePath), text);
}
}
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));
workspace.fs.delete(uriFile);
}
}
export function getRalativePath(fullPath: string): string {
const root = workspace.workspaceFolders ? workspace.workspaceFolders[0].uri.path : "";
const normalizedRoot = Uri.file(root).fsPath;
const relativePath = path.resolve(fullPath).replace(normalizedRoot + path.sep, '');
return relativePath;
}
export async function readKamelets(context: ExtensionContext) {
const yamls: string[] = await readBuildInKamelets(context);
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 files = await readFilesInDirByExtension(kameletsDir, "yaml");
const customKamelets: string[] = Array.from(files.values());
if (customKamelets && customKamelets.length > 0) yamls.push(...customKamelets);
}
return yamls;
}
async function readBuildInKamelets(context: ExtensionContext) {
const kameletsPath = path.join(context.extensionPath, 'kamelets', "kamelets.yaml");
const result: string[] = [];
const file = await readFile(kameletsPath);
const code = Buffer.from(file).toString('utf8');
code.split("\n---\n").map(c => c.trim()).forEach(z => result.push(z));
return result;
}
export async function readSupportedComponents() {
const supportedComponentsPath: string | undefined = workspace.getConfiguration().get("Karavan.supportedComponents");
if (supportedComponentsPath && supportedComponentsPath.trim().length > 0) {
const filename = path.isAbsolute(supportedComponentsPath) ? supportedComponentsPath : path.resolve(supportedComponentsPath);
const file = await readFile(filename);
return Buffer.from(file).toString('utf8');
}
return undefined;
}
export async function readSupportedOnlySettings(): Promise<boolean> {
return workspace.getConfiguration().get("Karavan.supportedOnly") || false;
}
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.set(filename, code);
}
}
return result;
}
export async function readComponents(context: ExtensionContext) {
const componentsPath = path.join(context.extensionPath, 'components', 'components.json');
const file = await readFile(componentsPath);
const code = Buffer.from(file).toString('utf8');
const components: [] = JSON.parse(code);
const jsons: string[] = [];
components.forEach(c => jsons.push(JSON.stringify(c)));
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 async function readJavaCode(fullPath: string) {
const result = new Map<string, string>();
const codePath = path.dirname(fullPath);
const javaFiles = await getJavaFiles(codePath);
for (let x in javaFiles) {
const fname = javaFiles[x];
const readData = await readFile(fname);
const code = Buffer.from(readData).toString('utf8');
result.set(path.basename(fname, ".java"), code);
}
return result;
}
export function parceYaml(filename: string, yaml: string): [boolean, string?] {
const i = CamelDefinitionYaml.yamlToIntegration(filename, yaml);
if (i.kind === 'Integration' && i.metadata.name) {
return [true, yaml];
} else {
return [false, undefined];
}
}
export function toCliFilename(filename: string): string {
return (/\s/).test(filename)
? '"' + filename + '"'
: filename.replace(/\s/g, "\\ ");
}
export function nameFromTitle(title: string): string {
return title.replace(/[^a-z0-9+]+/gi, "-").toLowerCase();
}
export async function getAllFiles(dirPath, arrayOfFiles: string[]) {
const files = await readDirectory(dirPath)
arrayOfFiles = arrayOfFiles || [];
for (let x in files) {
const filename = files[x][0];
const type = files[x][1];
if (type === FileType.Directory) {
arrayOfFiles = await getAllFiles(dirPath + "/" + filename, arrayOfFiles)
} else {
arrayOfFiles.push(path.join(dirPath, "/", filename))
}
}
return arrayOfFiles
}
export async function getYamlFiles(baseDir: string) {
const result: string[] = [];
(await getAllFiles(baseDir, [])).filter(f => f.endsWith(".yaml")).forEach(f => {
result.push(f);
})
return result;
}
export async function getCamelYamlFiles(baseDir: string) {
const result: string[] = [];
(await getAllFiles(baseDir, [])).filter(f => f.endsWith(".camel.yaml")).forEach(f => {
result.push(f);
})
return result;
}
export async function hasApplicationProperties(baseDir: string) {
return (await getPropertyFiles(baseDir)).includes(baseDir + path.sep + 'application.properties');
}
export async function getPropertyFiles(baseDir: string) {
const result: string[] = [];
(await getAllFiles(baseDir, [])).filter(f => f.endsWith(".properties")).forEach(f => {
result.push(f);
})
return result;
}
export async function getJavaFiles(baseDir: string) {
const result: string[] = [];
(await getAllFiles(baseDir, [])).filter(f => f.endsWith(".java")).forEach(f => {
result.push(f);
})
return result;
}
export async function getJsonFiles(baseDir: string) {
const result: string[] = [];
(await getAllFiles(baseDir, [])).filter(f => f.endsWith(".json")).forEach(f => {
result.push(f);
})
return result;
}
export async function getProperties(rootPath?: string) {
try {
if (rootPath === undefined)
rootPath = (workspace.workspaceFolders && (workspace.workspaceFolders.length > 0)) ? workspace.workspaceFolders[0].uri.fsPath : undefined;
if (rootPath) {
const readData = await readFile(path.resolve(rootPath, "application.properties"));
return Buffer.from(readData).toString('utf8');
} else {
const readData = await readFile(path.resolve("application.properties"));
return Buffer.from(readData).toString('utf8');
}
} catch (err) {
return '';
}
}
export async function getProperty(name: string) {
const properties = await getProperties();
const props = properties.split("\n");
for (var p of props) {
const pair = p.split("=");
if (pair[0] === name) {
return pair[1];
}
}
}
export async function getRuntime() {
const defaultRuntime: string = workspace.getConfiguration().get("camel.runtimes") || "";
const runtime = await getProperty("camel.jbang.runtime");
const result:string = runtime !== undefined ? runtime : defaultRuntime;
return result;
}
export async function getTarget() {
return getProperty('camel.karavan.target');
}
export async function getExportFolder() {
return getProperty('camel.jbang.exportDir');
}
export async function stat(fullPath: string) {
const uriFile: Uri = Uri.file(fullPath);
return workspace.fs.stat(uriFile);
}
export async function readDirectory(fullPath: string) {
const uriFile: Uri = Uri.file(fullPath);
return workspace.fs.readDirectory(uriFile);
}
export async function readFile(fullPath: string) {
const uriFile: Uri = Uri.file(fullPath);
return workspace.fs.readFile(uriFile);
}
export async function write(fullPath: string, code: string) {
const uriFile: Uri = Uri.file(fullPath);
workspace.fs.writeFile(uriFile, Buffer.from(code, 'utf8'))
.then(
value => { },
reason => window.showErrorMessage("Error: " + reason)
);
}
export function capitalize(text) {
return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
}
export function defaultGAV(): string | undefined {
const groupId = workspace.getConfiguration().get("Karavan.defaultGroupId");
const artifact = currentFolderName();
return groupId + ":" + artifact + ":1";
}
export function currentFolderName(): string | undefined {
if (workspace.workspaceFolders) {
const uriFolder: Uri = workspace.workspaceFolders[0].uri;
const parts = uriFolder.fsPath.split(path.sep);
const name = parts.at(parts.length - 1) || '';
return name;
}
}
export async function createApplication(runtime: string, target: string) {
window.showInputBox({
title: "Export project with " + runtime,
ignoreFocusOut: true,
prompt: "groupId:artifactId:version",
value: defaultGAV(),
validateInput: (text: string): string | undefined => {
if (!text || text.length === 0) {
return 'Name should not be empty. Format groupId:artifactId:version';
} else {
return undefined;
}
}
}).then(gav => {
if (gav) {
createApplicationProperties(runtime, gav, target);
createApplicationGitignore();
}
});
}
export async function createApplicationProperties(runtime: string, gav: string, target: string) {
if (workspace.workspaceFolders) {
const uriFolder: Uri = workspace.workspaceFolders[0].uri;
const name = currentFolderName() || "";
const runtimePrefix = runtime.replaceAll("-", "");
const appPropertyName = "Karavan.".concat(runtimePrefix).concat("ApplicationProperties");
const targetPropertyName = "Karavan.".concat(runtimePrefix).concat(capitalize(target)).concat("Properties");
const props: string[] = workspace.getConfiguration().get(appPropertyName) || [];
const runtimeProps: string[] = workspace.getConfiguration().get(targetPropertyName) || [];
const text = props.concat(runtimeProps).map(v => {
if (v.includes('$NAME')) return v.replace('$NAME', name)
else if (v.includes('$GAV')) return v.replace('$GAV', gav)
else if (v.includes('$RUNTIME')) return v.replace('$RUNTIME', runtime)
else if (v.includes('$TARGET')) return v.replace('$TARGET', target)
else return v;
}).join('\n');
write(path.join(uriFolder.path, "application.properties"), text);
}
}
export async function createApplicationGitignore() {
if (workspace.workspaceFolders) {
const uriFolder: Uri = workspace.workspaceFolders[0].uri;
const gitignore: string[] = workspace.getConfiguration().get("Karavan.applicationGitignore") || [];
const text = gitignore.join('\n');
write(path.join(uriFolder.path, ".gitignore"), text);
}
}
function setMinikubeEnvVariables(env: string): Map<string, string> {
const map = new Map<string, string>();
const linesAll = env.split(/\r?\n/);
const vars = linesAll.filter(l => l !== undefined && l.startsWith("export")).map(line => line.replace("export", ""));
vars.forEach(line => {
const parts = line.split("=");
const key = parts[0].trim();
const value = parts[1].replaceAll('"', '').trim();
map.set(key, value);
})
return map;
}