diff --git a/packages/cors-proxy/package.json b/packages/cors-proxy/package.json index 2ac6327c043..dd2be835947 100644 --- a/packages/cors-proxy/package.json +++ b/packages/cors-proxy/package.json @@ -28,7 +28,7 @@ "dependencies": { "cors": "^2.8.5", "express": "^4.21.1", - "node-fetch": "^3.3.1" + "node-fetch": "^3.3.2" }, "devDependencies": { "@babel/core": "^7.16.0", diff --git a/packages/extended-services-vscode-extension/env/index.js b/packages/extended-services-vscode-extension/env/index.js index 61bc742bd66..bbd362e8067 100644 --- a/packages/extended-services-vscode-extension/env/index.js +++ b/packages/extended-services-vscode-extension/env/index.js @@ -17,9 +17,9 @@ * under the License. */ -const { varsWithName, composeEnv } = require("@kie-tools-scripts/build-env"); +const { composeEnv, varsWithName } = require("@kie-tools-scripts/build-env"); -module.exports = composeEnv([require("@kie-tools/root-env/env")], { +module.exports = composeEnv([require("@kie-tools/root-env/env"), require("@kie-tools/extended-services-java/env")], { vars: varsWithName({}), get env() { return {}; diff --git a/packages/extended-services-vscode-extension/package.json b/packages/extended-services-vscode-extension/package.json index 78bda18b814..1650e1d6ef5 100644 --- a/packages/extended-services-vscode-extension/package.json +++ b/packages/extended-services-vscode-extension/package.json @@ -43,7 +43,7 @@ "@vscode/test-web": "^0.0.30", "@vscode/vsce": "^2.22.0", "copy-webpack-plugin": "^11.0.0", - "node-fetch": "^3.3.1", + "node-fetch": "^3.3.2", "rimraf": "^3.0.2", "webpack": "^5.94.0", "webpack-cli": "^4.10.0", @@ -73,22 +73,23 @@ ], "configuration": { "properties": { - "extendedServices.connectionHeartbeatIntervalinSecs": { - "default": 1, + "extendedServices.connectionHeartbeatIntervalInSecs": { + "default": 10, "description": "Specifies the interval (in seconds) between each connection check.", "format": "time", + "minimum": 10, "order": 2, "type": "integer" }, "extendedServices.enableAutorun": { "default": true, - "description": "Automatically run a local instance of the service.", + "description": "Automatically runs a local instance of the Extended Service.", "order": 0, "type": "boolean" }, "extendedServices.extendedServicesURL": { "default": "http://localhost:21345", - "description": "Specifies the Exnteded Services URL.", + "description": "Specifies the Extended Services URL.", "format": "uri", "order": 1, "type": "string" diff --git a/packages/extended-services-vscode-extension/src/Connection.ts b/packages/extended-services-vscode-extension/src/Connection.ts index 0984a04f05c..185ffdfa696 100644 --- a/packages/extended-services-vscode-extension/src/Connection.ts +++ b/packages/extended-services-vscode-extension/src/Connection.ts @@ -28,13 +28,14 @@ export class Connection { private timeout: NodeJS.Timeout | null = null; private connected: boolean = false; - public async start(extendedServicesURL: URL, connectionHeartbeatIntervalinSecs: number): Promise { + public async start(extendedServicesURL: URL, connectionHeartbeatIntervalInSecs: number): Promise { this.timeout = setInterval(async () => { this.performHeartbeatCheck(extendedServicesURL); - }, connectionHeartbeatIntervalinSecs * 1000); + }, connectionHeartbeatIntervalInSecs * 1000); } public stop(): void { + console.debug("[Extended Services Extension] Disconnecting from Extended Service"); if (this.timeout) { this.fireDisconnectedEvent(); clearInterval(this.timeout); diff --git a/packages/extended-services-vscode-extension/src/LocalExtendedServices.ts b/packages/extended-services-vscode-extension/src/LocalExtendedServices.ts index 090e3404ef4..e804db505c2 100644 --- a/packages/extended-services-vscode-extension/src/LocalExtendedServices.ts +++ b/packages/extended-services-vscode-extension/src/LocalExtendedServices.ts @@ -80,6 +80,7 @@ export class LocalExtendedServices { } public stop(): void { + console.debug("[Extended Services Extension] Stopping local instance of Extended Service"); if (!this.serviceProcess) { return; } diff --git a/packages/extended-services-vscode-extension/src/Validator.ts b/packages/extended-services-vscode-extension/src/Validator.ts index 40f8cf1e055..c69c185e0e2 100644 --- a/packages/extended-services-vscode-extension/src/Validator.ts +++ b/packages/extended-services-vscode-extension/src/Validator.ts @@ -49,26 +49,28 @@ function createDMNDiagnostics(validationResponses: validationResponse.DMNValidat }); } -export async function validateBPMN(serviceURL: URL, kieFile: kieFile.KieFile): Promise { +export async function validateBPMN(serviceURL: URL, bpmnFile: kieFile.KieFile): Promise { try { const validationResponses: validationResponse.BPMNValidationResponse[] = await validationRequests.validateBPMN( serviceURL, - kieFile + bpmnFile ); return createBPMNDiagnostics(validationResponses); } catch (error) { - throw new Error("VALIDATE BPMN ERROR - " + error.message); + console.error(`An error occured while trying to validate BPMN file: ${bpmnFile} with error: ${error.message}`); + throw new Error(`An error occured while trying to validate BPMN file: ${bpmnFile} with error: ${error.message}`); } } -export async function validateDMN(serviceURL: URL, kieFile: kieFile.KieFile): Promise { +export async function validateDMN(serviceURL: URL, dmnFile: kieFile.KieFile): Promise { try { const validationResponses: validationResponse.DMNValidationResponse[] = await validationRequests.validateDMN( serviceURL, - kieFile + dmnFile ); return createDMNDiagnostics(validationResponses); } catch (error) { - throw new Error("VALIDATE DMN ERROR - " + error.message); + console.error(`An error occured while trying to validate DMN file: ${dmnFile} with error: ${error.message}`); + throw new Error(`An error occured while trying to validate DMN file: ${dmnFile} with error: ${error.message}`); } } diff --git a/packages/extended-services-vscode-extension/src/configurations/Configuration.ts b/packages/extended-services-vscode-extension/src/configurations/Configuration.ts index 2b322895afa..39a21ffa7c9 100644 --- a/packages/extended-services-vscode-extension/src/configurations/Configuration.ts +++ b/packages/extended-services-vscode-extension/src/configurations/Configuration.ts @@ -19,81 +19,53 @@ import * as vscode from "vscode"; -export const enableAutoRunID: string = "extendedServices.enableAutorun"; -export const connectionHeartbeatIntervalinSecsID: string = "extendedServices.connectionHeartbeatIntervalinSecs"; -export const extendedServicesURLID: string = "extendedServices.extendedServicesURL"; +export const enableAutoRunID = "extendedServices.enableAutorun"; +export const connectionHeartbeatIntervalInSecsID = "extendedServices.connectionHeartbeatIntervalInSecs"; +export const extendedServicesURLID = "extendedServices.extendedServicesURL"; + +type ConfigurationProperty = string | number | boolean; export class Configuration { readonly enableAutoRun: boolean; - readonly connectionHeartbeatIntervalinSecs: number; + readonly connectionHeartbeatIntervalInSecs: number; readonly extendedServicesURL: URL; - constructor(enableAutoRun: boolean, connectionHeartbeatIntervalinSecs: number, extendedServicesURL: URL) { + constructor(enableAutoRun: boolean, connectionHeartbeatIntervalInSecs: number, extendedServicesURL: URL) { this.enableAutoRun = enableAutoRun; - this.connectionHeartbeatIntervalinSecs = connectionHeartbeatIntervalinSecs; + this.connectionHeartbeatIntervalInSecs = connectionHeartbeatIntervalInSecs; this.extendedServicesURL = extendedServicesURL; } } -function fetchEnableAutoRun(): boolean { - const enableAutoRun = vscode.workspace.getConfiguration().get(enableAutoRunID); - if (!enableAutoRun) { - throw new Error("Enable Auto Run configuration not found"); - } - return enableAutoRun; -} - -function fetchConnectionHeartbeatIntervalinSecs(): number { - const connectionHeartbeatIntervalinSecs = vscode.workspace - .getConfiguration() - .get(connectionHeartbeatIntervalinSecsID); - if (!connectionHeartbeatIntervalinSecs) { - throw new Error("Connection Heartbeat Interval configuration not found"); - } - - return connectionHeartbeatIntervalinSecs; -} - function fetchExtendedServicesURL(): URL { - const extendedServicesURL = vscode.workspace.getConfiguration().get(extendedServicesURLID); - if (!extendedServicesURL) { - throw new Error("URL configuration not found"); - } - + const defaultExtendedServicesURL = `http://${process.env.WEBPACK_REPLACE__extendedServicesUrlHost}:${process.env.WEBPACK_REPLACE__extendedServicesUrlPort}`; + const extendedServicesURL = getConfigurationPropertyValue(extendedServicesURLID, defaultExtendedServicesURL); try { return new URL(extendedServicesURL); } catch (error) { - throw new Error("Invalid service URL:" + error.message); + throw new Error(`URL configuration ${extendedServicesURL} is invalid: ${error.message}`); } } -export function fetchConfiguration(): Configuration { - let errorMessages: string[] = []; - let enableAutoRun: any; - let connectionHeartbeatIntervalinSecs: any; - let extendedServicesURL: any; - - try { - enableAutoRun = fetchEnableAutoRun(); - } catch (error) { - errorMessages.push(error.message); - } - - try { - connectionHeartbeatIntervalinSecs = fetchConnectionHeartbeatIntervalinSecs(); - } catch (error) { - errorMessages.push(error.message); +const getConfigurationPropertyValue = ( + property: string, + defaultValue: T +): T => { + let value = vscode.workspace.getConfiguration().get(property) as T; + if (value === null) { + console.warn(`Property: ${property} is missing, using the default: ${defaultValue}`); + value = defaultValue; } + return value; +}; - try { - extendedServicesURL = fetchExtendedServicesURL(); - } catch (error) { - errorMessages.push(error.message); - } +export function fetchConfiguration(): Configuration { + const enableAutoRun = getConfigurationPropertyValue(enableAutoRunID, true); + const connectionHeartbeatIntervalInSecs = getConfigurationPropertyValue( + connectionHeartbeatIntervalInSecsID, + 10 + ); + const extendedServicesURL = fetchExtendedServicesURL(); - if (errorMessages.length < 0) { - throw new Error("CONFIGURATION ERROR - " + errorMessages.join(", ")); - } else { - return new Configuration(enableAutoRun, connectionHeartbeatIntervalinSecs, extendedServicesURL); - } + return new Configuration(enableAutoRun, connectionHeartbeatIntervalInSecs, extendedServicesURL); } diff --git a/packages/extended-services-vscode-extension/src/configurations/ConfigurationWatcher.ts b/packages/extended-services-vscode-extension/src/configurations/ConfigurationWatcher.ts index 62d6e7b4bfb..9e8a8f903bb 100644 --- a/packages/extended-services-vscode-extension/src/configurations/ConfigurationWatcher.ts +++ b/packages/extended-services-vscode-extension/src/configurations/ConfigurationWatcher.ts @@ -30,12 +30,12 @@ export class ConfigurationWatcher { private handleConfigurationChange(configurationChange: vscode.ConfigurationChangeEvent) { const enableAutoRunChanged = configurationChange.affectsConfiguration(configuration.enableAutoRunID); - const connectionHeartbeatIntervalinSecsChanged = configurationChange.affectsConfiguration( - configuration.connectionHeartbeatIntervalinSecsID + const connectionHeartbeatIntervalInSecsChanged = configurationChange.affectsConfiguration( + configuration.connectionHeartbeatIntervalInSecsID ); const extendedServicesURLChanged = configurationChange.affectsConfiguration(configuration.extendedServicesURLID); - if (enableAutoRunChanged || connectionHeartbeatIntervalinSecsChanged || extendedServicesURLChanged) { + if (enableAutoRunChanged || connectionHeartbeatIntervalInSecsChanged || extendedServicesURLChanged) { this.fireConfigurationChangedEvent(); } } diff --git a/packages/extended-services-vscode-extension/src/extension/extension-browser.ts b/packages/extended-services-vscode-extension/src/extension/extension-browser.ts index 955d7967426..b38202b6238 100644 --- a/packages/extended-services-vscode-extension/src/extension/extension-browser.ts +++ b/packages/extended-services-vscode-extension/src/extension/extension-browser.ts @@ -40,16 +40,19 @@ let kieFilesWatcher: KieFilesWatcher; let configurationWatcher: ConfigurationWatcher; let connection: Connection; -let userDisconnected: boolean = false; +/* Determines if the extension is connected with the Extended Services Backend */ +let isConnected = false; +/* Determines the user explicitely disconnected the Extension from the Extended Services Backend */ +let disconnectedByUser: boolean = false; let configuration: Configuration | null = null; function initializeCommands(context: vscode.ExtensionContext) { connectExtendedServicesCommand = vscode.commands.registerCommand(startExtendedServicesCommandUID, () => { - userDisconnected = false; + disconnectedByUser = false; startExtendedServices(); }); disconnectExtendedServicesCommand = vscode.commands.registerCommand(stopExtendedServicesCommandUID, () => { - userDisconnected = true; + disconnectedByUser = true; stopExtendedServices(); }); } @@ -67,29 +70,40 @@ function initializeVSCodeElements() { } function startExtendedServices(): void { + console.debug("[Extended Services Extension] Starting Extended Service"); try { - statusBarItem.show(); configuration = fetchConfiguration(); } catch (error) { - stopExtendedServices(); - vscode.window.showErrorMessage("An error happened while trying to start the Extended Services: " + error.message); + console.error(`[Extended Services Extension] Extension configuration is wrong: ${error.message}`); + vscode.window.showErrorMessage( + `Extension configuration is wrong: ${error.message}. Please fix your local extension's setting` + ); return; } try { - connection.start(configuration.extendedServicesURL, configuration.connectionHeartbeatIntervalinSecs); + console.debug( + `[Extended Services Extension] Connecting with the Extended Services located: ${configuration.extendedServicesURL}` + ); + connection.start(configuration.extendedServicesURL, configuration.connectionHeartbeatIntervalInSecs); } catch (error) { stopExtendedServices(); - vscode.window.showErrorMessage("An error happened while trying to connect to the service:" + error.message); + console.error( + `[Extended Services Extension] An error happened while trying to start the local service: ${error.message}` + ); + vscode.window.showErrorMessage(`An error happened while trying to start the local service: ${error.message}`); } } function stopExtendedServices() { + console.debug("[Extended Services Extension] Stopping Extended Service"); + /* Invalidating immediatly the current connection, so any request coming when shutting down is not served */ + isConnected = false; configuration = null; connection.stop(); } -async function validate(configuration: Configuration) { +async function validate(extendedServicesURL: URL) { diagnosticCollection.clear(); const bpmnFiles: KieFile[] = await kiefilesfetcher.findActiveKieFiles([kiefilesfetcher.bpmnDocumentFilter]); @@ -97,30 +111,30 @@ async function validate(configuration: Configuration) { for (const bpmnFile of bpmnFiles) { try { - const bpmnDiagnostics: vscode.Diagnostic[] = await validator.validateBPMN( - configuration.extendedServicesURL, - bpmnFile - ); + console.debug(`[Extended Services Extension] Validating BPMN file: ${bpmnFile.uri.path}`); + const bpmnDiagnostics: vscode.Diagnostic[] = await validator.validateBPMN(extendedServicesURL, bpmnFile); diagnosticCollection.set(bpmnFile.uri, bpmnDiagnostics); } catch (error) { - stopExtendedServices(); + console.error( + `[Extended Services Extension] An error happened while trying to validate ${bpmnFile.uri.path}: ${error.message}` + ); vscode.window.showErrorMessage( - "An error happened while trying to validate " + bpmnFile.uri.path + ": " + error.message + `An error happened while trying to validate ${bpmnFile.uri.path}: ${error.message}` ); } } for (const dmnFile of dmnFiles) { try { - const bpmnDiagnostics: vscode.Diagnostic[] = await validator.validateDMN( - configuration.extendedServicesURL, - dmnFile - ); - diagnosticCollection.set(dmnFile.uri, bpmnDiagnostics); + console.debug(`[Extended Services Extension] Validating DMN file: ${dmnFile.uri.path}`); + const dmnDiagnostics: vscode.Diagnostic[] = await validator.validateDMN(extendedServicesURL, dmnFile); + diagnosticCollection.set(dmnFile.uri, dmnDiagnostics); } catch (error) { - stopExtendedServices(); + console.error( + `[Extended Services Extension] An error happened while trying to validate ${dmnFile.uri.path}: ${error.message}` + ); vscode.window.showErrorMessage( - "An error happened while trying to validate " + dmnFile.uri.path + ": " + error.message + `An error happened while trying to validate ${dmnFile.uri.path}: ${error.message}` ); } } @@ -133,43 +147,48 @@ export function activate(context: vscode.ExtensionContext) { configurationWatcher.subscribeSettingsChanged(() => { stopExtendedServices(); - if (!userDisconnected && kieFilesWatcher.watchedKieFiles.length > 0) { + if (!disconnectedByUser && kieFilesWatcher.watchedKieFiles.length > 0) { startExtendedServices(); } }); kieFilesWatcher.subscribeKieFilesOpened(() => { - statusBarItem.show(); - if (userDisconnected) { - return; + console.debug( + `[Extended Services Extension] A KIE file has been opened. Current opened KIE files: ${ + kieFilesWatcher.watchedKieFiles.length + }` + ); + if (!disconnectedByUser && isConnected && configuration) { + validate(configuration.extendedServicesURL); } - - if (configuration) { - validate(configuration); - } else { + if (!disconnectedByUser && !isConnected) { startExtendedServices(); } }); kieFilesWatcher.subscribeKieFileChanged(() => { - if (configuration) { - validate(configuration); + console.debug("[Extended Services Extension] A KIE file has been changed"); + if (!disconnectedByUser && isConnected && configuration) { + validate(configuration.extendedServicesURL); } }); kieFilesWatcher.subscribeKieFilesClosed(() => { - if (kieFilesWatcher.watchedKieFiles.length === 0) { - stopExtendedServices(); - statusBarItem.hide(); - } else if (configuration) { - validate(configuration); + console.debug( + `[Extended Services Extension] A KIE file has been closed. Current opened KIE files: ${kieFilesWatcher.watchedKieFiles.length}` + ); + if (!disconnectedByUser && isConnected && configuration) { + validate(configuration.extendedServicesURL); } }); connection.subscribeConnected(() => { + console.debug("[Extended Services Extension] Connected with Extended Services"); + isConnected = true; vscode.commands.executeCommand("setContext", connectedEnablementUID, true); + statusBarItem.show(); if (configuration) { - validate(configuration); + validate(configuration.extendedServicesURL); statusBarItem.text = "$(extended-services-connected)"; statusBarItem.tooltip = "Apache KIE™ Extended Services is connected. Click to disconnect."; statusBarItem.command = stopExtendedServicesCommandUID; @@ -177,11 +196,16 @@ export function activate(context: vscode.ExtensionContext) { }); connection.subscribeConnectionLost((errorMessage: string) => { - vscode.window.showErrorMessage("Connection error: " + errorMessage); + statusBarItem.hide(); stopExtendedServices(); + isConnected = false; + console.error("[Extended Services Extension] Connection lost with Extended Services"); + vscode.window.showErrorMessage(`Connection error: ${errorMessage}`); }); connection.subscribeDisconnected(() => { + console.debug("[Extended Services Extension] Disconnected with Extended Services"); + isConnected = false; vscode.commands.executeCommand("setContext", connectedEnablementUID, false); statusBarItem.text = "$(extended-services-disconnected)"; statusBarItem.tooltip = "Apache KIE™ Extended Services is not connected. Click to connect."; diff --git a/packages/extended-services-vscode-extension/src/extension/extension-main.ts b/packages/extended-services-vscode-extension/src/extension/extension-main.ts index 560feb974e9..d48fe9a819c 100644 --- a/packages/extended-services-vscode-extension/src/extension/extension-main.ts +++ b/packages/extended-services-vscode-extension/src/extension/extension-main.ts @@ -43,16 +43,19 @@ let configurationWatcher: ConfigurationWatcher; let connection: Connection; let localService: LocalExtendedServices; -let userDisconnected: boolean = false; +/* Determines if the extension is connected with the Extended Services Backend */ +let isConnected: boolean = false; +/* Determines the user explicitely disconnected the Extension from the Extended Services Backend */ +let disconnectedByUser: boolean = false; let configuration: Configuration | null; function initializeCommands(context: vscode.ExtensionContext) { connectExtendedServicesCommand = vscode.commands.registerCommand(startExtendedServicesCommandUID, () => { - userDisconnected = false; + disconnectedByUser = false; startExtendedServices(context); }); disconnectExtendedServicesCommand = vscode.commands.registerCommand(stopExtendedServicesCommandUID, () => { - userDisconnected = true; + disconnectedByUser = true; if (configuration) { stopExtendedServices(configuration); } @@ -71,14 +74,16 @@ function initializeVSCodeElements() { } function startExtendedServices(context: vscode.ExtensionContext): void { - let config: Configuration; + console.debug("[Extended Services Extension] Starting Extended Service"); + statusBarItem.command = undefined; try { - statusBarItem.command = undefined; - statusBarItem.show(); configuration = fetchConfiguration(); } catch (error) { - stopExtendedServices(null); - vscode.window.showErrorMessage("An error happened while trying to start the Extended Services: " + error.message); + console.error(`[Extended Services Extension] Extension configuration is wrong: ${error.message}`); + vscode.window.showErrorMessage( + `Extension configuration is wrong: ${error.message}. Please fix your local extension's setting.` + ); + statusBarItem.hide(); return; } @@ -90,6 +95,9 @@ function startExtendedServices(context: vscode.ExtensionContext): void { } function stopExtendedServices(configuration: Configuration | null) { + console.debug("[Extended Services Extension] Stopping Extended Service"); + /* Invalidating immediatly the current connection, so any request coming when shutting down is not served */ + isConnected = false; statusBarItem.command = undefined; if (configuration?.enableAutoRun) { localService.stop(); @@ -99,24 +107,38 @@ function stopExtendedServices(configuration: Configuration | null) { } function startLocalExtendedServices(configuration: Configuration, context: vscode.ExtensionContext): void { + console.debug("[Extended Services Extension] Starting a Local Extended Services process"); try { localService.start(configuration.extendedServicesURL, context.extensionPath); } catch (error) { stopExtendedServices(configuration); - vscode.window.showErrorMessage("An error happened while trying to start the local service:" + error.message); + console.error( + `[Extended Services Extension] An error happened while trying to start the Local Extended Services process: ${error.message}` + ); + vscode.window.showErrorMessage( + `An error happened while trying to start the Local Extended Services process: ${error.message}` + ); } } function startConnection(configuration: Configuration) { + console.debug( + `[Extended Services Extension] Connecting with the Extended Services located: ${configuration.extendedServicesURL}` + ); try { - connection.start(configuration.extendedServicesURL, configuration.connectionHeartbeatIntervalinSecs); + connection.start(configuration.extendedServicesURL, configuration.connectionHeartbeatIntervalInSecs); } catch (error) { stopExtendedServices(configuration); - vscode.window.showErrorMessage("An error happened while trying to connect to the service:" + error.message); + console.error( + `[Extended Services Extension] An error happened while trying to connect to the service: ${error.message}` + ); + vscode.window.showErrorMessage(`An error happened while trying to connect to the service: ${error.message}`); } } -async function validate(configuration: Configuration) { +async function validate(extendedServicesURL: URL) { + console.debug("[Extended Services Extension] Validating the opened KIE files"); + diagnosticCollection.clear(); const bpmnFiles: KieFile[] = await kiefilesfetcher.findActiveKieFiles([kiefilesfetcher.bpmnDocumentFilter]); @@ -124,29 +146,30 @@ async function validate(configuration: Configuration) { for (const bpmnFile of bpmnFiles) { try { - const bpmnDiagnostics: vscode.Diagnostic[] = await validator.validateBPMN( - configuration.extendedServicesURL, - bpmnFile - ); + console.debug(`[Extended Services Extension] Validating BPMN file: ${bpmnFile.uri.path}`); + const bpmnDiagnostics: vscode.Diagnostic[] = await validator.validateBPMN(extendedServicesURL, bpmnFile); diagnosticCollection.set(bpmnFile.uri, bpmnDiagnostics); } catch (error) { + console.error( + `[Extended Services Extension] An error happened while trying to validate ${bpmnFile.uri.path}: ${error.message}` + ); vscode.window.showErrorMessage( - "An error happened while trying to validate " + bpmnFile.uri.path + ": " + error.message + `An error happened while trying to validate ${bpmnFile.uri.path}: ${error.message}` ); } } for (const dmnFile of dmnFiles) { try { - const bpmnDiagnostics: vscode.Diagnostic[] = await validator.validateDMN( - configuration.extendedServicesURL, - dmnFile - ); - diagnosticCollection.set(dmnFile.uri, bpmnDiagnostics); + console.debug(`[Extended Services Extension] Validating DMN file: ${dmnFile.uri.path}`); + const dmnDiagnostics: vscode.Diagnostic[] = await validator.validateDMN(extendedServicesURL, dmnFile); + diagnosticCollection.set(dmnFile.uri, dmnDiagnostics); } catch (error) { - stopExtendedServices(configuration); + console.error( + `[Extended Services Extension] An error happened while trying to validate ${dmnFile.uri.path}: ${error.message}` + ); vscode.window.showErrorMessage( - "An error happened while trying to validate " + dmnFile.uri.path + ": " + error.message + `An error happened while trying to validate ${dmnFile.uri.path}: ${error.message}` ); } } @@ -160,40 +183,43 @@ export function activate(context: vscode.ExtensionContext) { configurationWatcher.subscribeSettingsChanged(() => { stopExtendedServices(configuration); - if (!userDisconnected && kieFilesWatcher.watchedKieFiles.length > 0) { + if (!disconnectedByUser && kieFilesWatcher.watchedKieFiles.length > 0) { startExtendedServices(context); } }); kieFilesWatcher.subscribeKieFilesOpened(() => { - statusBarItem.show(); - if (userDisconnected) { - return; + console.debug( + `[Extended Services Extension] A KIE file has been opened. Current opened KIE files: ${ + kieFilesWatcher.watchedKieFiles.length + }` + ); + if (!disconnectedByUser && isConnected && configuration) { + validate(configuration.extendedServicesURL); } - - if (configuration) { - validate(configuration); - } else { + if (!disconnectedByUser && !isConnected) { startExtendedServices(context); } }); kieFilesWatcher.subscribeKieFileChanged(() => { - if (configuration) { - validate(configuration); + console.debug("[Extended Services Extension] A KIE file has been changed"); + if (!disconnectedByUser && isConnected && configuration) { + validate(configuration.extendedServicesURL); } }); kieFilesWatcher.subscribeKieFilesClosed(() => { - if (kieFilesWatcher.watchedKieFiles.length === 0) { - stopExtendedServices(configuration); - statusBarItem.hide(); - } else if (configuration) { - validate(configuration); + console.debug( + `[Extended Services Extension] A KIE file has been closed. Current opened KIE files: ${kieFilesWatcher.watchedKieFiles.length}` + ); + if (!disconnectedByUser && isConnected && configuration) { + validate(configuration.extendedServicesURL); } }); localService.subscribeLocalExtendedServicesStarted(() => { + console.debug("[Extended Services Extension] Local instance of Extended Services started"); if (configuration) { startConnection(configuration); } @@ -209,13 +235,17 @@ export function activate(context: vscode.ExtensionContext) { }); localService.subscribeLocalExtendedServicesStopped(() => { + console.debug("[Extended Services Extension] Local instance of Extended Services stopped"); connection.stop(); }); connection.subscribeConnected(() => { + console.debug("[Extended Services Extension] Connected with Extended Services"); + isConnected = true; vscode.commands.executeCommand("setContext", connectedEnablementUID, true); + statusBarItem.show(); if (configuration) { - validate(configuration); + validate(configuration.extendedServicesURL); statusBarItem.text = "$(extended-services-connected)"; statusBarItem.tooltip = "Apache KIE™ Extended Services are connected. Click to disconnect."; statusBarItem.command = stopExtendedServicesCommandUID; @@ -223,11 +253,17 @@ export function activate(context: vscode.ExtensionContext) { }); connection.subscribeConnectionLost((errorMessage: string) => { + statusBarItem.hide(); stopExtendedServices(configuration); - vscode.window.showErrorMessage("Connection error: " + errorMessage); + isConnected = false; + diagnosticCollection.clear(); + console.error("[Extended Services Extension] Connection lost with Extended Services"); + vscode.window.showErrorMessage(`Connection error: ${errorMessage}`); }); connection.subscribeDisconnected(() => { + console.debug("[Extended Services Extension] Disconnected with Extended Services"); + isConnected = false; vscode.commands.executeCommand("setContext", connectedEnablementUID, false); statusBarItem.text = "$(extended-services-disconnected)"; statusBarItem.tooltip = "Apache KIE™ Extended Services are not connected. Click to connect."; diff --git a/packages/extended-services-vscode-extension/src/requests/PingRequest.ts b/packages/extended-services-vscode-extension/src/requests/PingRequest.ts index 0e26fd641ca..b5ba0206531 100644 --- a/packages/extended-services-vscode-extension/src/requests/PingRequest.ts +++ b/packages/extended-services-vscode-extension/src/requests/PingRequest.ts @@ -20,10 +20,11 @@ import * as pingresponse from "./PingResponse"; export async function ping(extendedServicesURL: URL): Promise { - const url = new URL("/ping", extendedServicesURL); + const extendedServicesPingURL = new URL("/ping", extendedServicesURL); try { - const response = await fetch(url.toString()); + console.debug("[Extended Services Extension] Pinging: " + extendedServicesPingURL.toString()); + const response = await fetch(extendedServicesPingURL.toString()); if (response.ok) { const responseData = (await response.json()) as pingresponse.PingResponse; return responseData; diff --git a/packages/extended-services-vscode-extension/src/requests/ValidationRequests.ts b/packages/extended-services-vscode-extension/src/requests/ValidationRequests.ts index 53436866b3c..92bbb3cb76f 100644 --- a/packages/extended-services-vscode-extension/src/requests/ValidationRequests.ts +++ b/packages/extended-services-vscode-extension/src/requests/ValidationRequests.ts @@ -21,25 +21,23 @@ import * as vscode from "vscode"; import * as validationresponse from "./ValidationResponse"; import * as kiefile from "../kieFiles/KieFile"; -interface ValidationBody { +interface MultipleResourcesPayload { mainURI: string; - resources: ValidationResource[]; + resources: ResourceWithURI[]; } -interface ValidationResource { +interface ResourceWithURI { URI: string; content: string; } -function buildRequestBody(document: vscode.TextDocument): string { - const body: ValidationBody = { - mainURI: "VS Code KIE files", - resources: [ - { - URI: document.fileName, - content: document.getText(), - }, - ], +function buildMultipleResourcesPayload(mainURI: string, documents: vscode.TextDocument[]): string { + const body: MultipleResourcesPayload = { + mainURI: mainURI, + resources: documents.map((document) => ({ + URI: document.fileName, + content: document.getText(), + })), }; return JSON.stringify(body); @@ -56,12 +54,13 @@ async function validate( textDocument = await vscode.workspace.openTextDocument(kieFile.uri); } const url = new URL(endpoint, serviceURL); + console.debug(`[Extended Services Extension] Fetching ${url.toString()}`); const response = await fetch(url.toString(), { method: "POST", headers: { "Content-Type": "application/json", }, - body: buildRequestBody(textDocument), + body: buildMultipleResourcesPayload(textDocument.fileName, [textDocument]), }); const responseData: any = await response.json(); @@ -70,22 +69,28 @@ async function validate( export async function validateBPMN( serviceURL: URL, - kieFile: kiefile.KieFile + bpmnFile: kiefile.KieFile ): Promise { try { - return validate(serviceURL, kieFile, "/jitbpmn/validate", validationresponse.parseBPMNValidationResponse); + return validate(serviceURL, bpmnFile, "/jitbpmn/validate", validationresponse.parseBPMNValidationResponse); } catch (error) { + console.error( + `[Extended Services Extension] An error happened while trying to validate ${bpmnFile} from serviceUrl ${serviceURL}: ${error.message}` + ); throw new Error("VALIDATE BPMN REQUEST ERROR: \n", error.message); } } export async function validateDMN( serviceURL: URL, - kieFile: kiefile.KieFile + dmnFile: kiefile.KieFile ): Promise { try { - return validate(serviceURL, kieFile, "/jitdmn/validate", validationresponse.parseDMNValidationResponse); + return validate(serviceURL, dmnFile, "/jitdmn/validate", validationresponse.parseDMNValidationResponse); } catch (error) { + console.error( + `[Extended Services Extension] An error happened while trying to validate ${dmnFile} from serviceUrl ${serviceURL}: ${error.message}` + ); throw new Error("VALIDATE DMN REQUEST ERROR: \n", error.message); } } diff --git a/packages/extended-services-vscode-extension/webpack.config.js b/packages/extended-services-vscode-extension/webpack.config.js index d52f1fb6e7c..50be69a003d 100644 --- a/packages/extended-services-vscode-extension/webpack.config.js +++ b/packages/extended-services-vscode-extension/webpack.config.js @@ -18,6 +18,8 @@ */ const { merge } = require("webpack-merge"); +const { EnvironmentPlugin } = require("webpack"); +const { env } = require("./env"); const common = require("@kie-tools-core/webpack-base/webpack.common.config"); const commonConfig = (webpackEnv) => @@ -30,21 +32,51 @@ const commonConfig = (webpackEnv) => }, externals: { vscode: "commonjs vscode", + plugins: [], }, - plugins: [], }); -module.exports = async (webpackEnv) => [ - merge(commonConfig(webpackEnv), { - target: "node", - entry: { - "extension/extension-main": "./src/extension/extension-main.ts", - }, - }), - merge(commonConfig(webpackEnv), { - target: "web", - entry: { - "extension/extension-browser": "./src/extension/extension-browser.ts", - }, - }), -]; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +const buildEnv = env; // build-env is not typed + +module.exports = async (webpackEnv) => { + const [extendedServices_urlHost, extendedServices_urlPort] = getExtendedServicesArgs(); + + return [ + merge(commonConfig(webpackEnv), { + target: "node", + entry: { + "extension/extension-main": "./src/extension/extension-main.ts", + }, + plugins: [ + new EnvironmentPlugin({ + WEBPACK_REPLACE__extendedServicesUrlHost: extendedServices_urlHost, + WEBPACK_REPLACE__extendedServicesUrlPort: extendedServices_urlPort, + }), + ], + }), + merge(commonConfig(webpackEnv), { + target: "web", + entry: { + "extension/extension-browser": "./src/extension/extension-browser.ts", + }, + plugins: [ + new EnvironmentPlugin({ + WEBPACK_REPLACE__extendedServicesUrlHost: extendedServices_urlHost, + WEBPACK_REPLACE__extendedServicesUrlPort: extendedServices_urlPort, + }), + ], + }), + ]; +}; + +function getExtendedServicesArgs() { + const extendedServicesJavaHost = buildEnv.extendedServicesJava.host; + const extendedServicesJavaPort = buildEnv.extendedServicesJava.port; + + console.info("Extended Services :: URL HOST " + extendedServicesJavaHost); + console.info("Extended Services :: URL PORT: " + extendedServicesJavaPort); + + return [extendedServicesJavaHost, extendedServicesJavaPort]; +} diff --git a/packages/kie-sandbox-distribution/package.json b/packages/kie-sandbox-distribution/package.json index 7337835482a..f5fc7882bec 100644 --- a/packages/kie-sandbox-distribution/package.json +++ b/packages/kie-sandbox-distribution/package.json @@ -37,7 +37,7 @@ "@types/jest": "^29.5.12", "jest": "^29.7.0", "jest-junit": "^16.0.0", - "node-fetch": "^3.3.1", + "node-fetch": "^3.3.2", "rimraf": "^3.0.2", "run-script-os": "^1.1.6", "ts-jest": "^29.1.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4ad259e4e41..f3055828d85 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2454,8 +2454,8 @@ importers: specifier: ^4.21.1 version: 4.21.1 node-fetch: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.3.2 + version: 3.3.2 devDependencies: '@babel/core': specifier: ^7.16.0 @@ -5356,8 +5356,8 @@ importers: specifier: ^11.0.0 version: 11.0.0(webpack@5.94.0(webpack-cli@4.10.0)) node-fetch: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.3.2 + version: 3.3.2 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -7137,8 +7137,8 @@ importers: specifier: ^16.0.0 version: 16.0.0 node-fetch: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.3.2 + version: 3.3.2 rimraf: specifier: ^3.0.2 version: 3.0.2 @@ -26893,8 +26893,8 @@ packages: resolution: {integrity: sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==} engines: {node: ^10.17 || >=12.3} - node-fetch@3.3.1: - resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} node-forge@1.3.1: @@ -53276,7 +53276,7 @@ snapshots: transitivePeerDependencies: - domexception - node-fetch@3.3.1: + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0