This is an automated email from the ASF dual-hosted git repository.

yamer pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-tools.git


The following commit(s) were added to refs/heads/main by this push:
     new 52040d70254 kie-issues#1694: Apache KIE Extended Services extension 
issues (#2802)
52040d70254 is described below

commit 52040d702548670c18c72db89a02057da7aa5622
Author: Yeser Amer <[email protected]>
AuthorDate: Thu Jan 16 11:25:10 2025 +0100

    kie-issues#1694: Apache KIE Extended Services extension issues (#2802)
    
    Co-authored-by: Luiz João Motta <[email protected]>
    Co-authored-by: Jozef Marko <[email protected]>
---
 packages/cors-proxy/package.json                   |   2 +-
 .../env/index.js                                   |   4 +-
 .../package.json                                   |  11 +-
 .../src/Connection.ts                              |   5 +-
 .../src/LocalExtendedServices.ts                   |   1 +
 .../src/Validator.ts                               |  14 +--
 .../src/configurations/Configuration.ts            |  86 +++++----------
 .../src/configurations/ConfigurationWatcher.ts     |   6 +-
 .../src/extension/extension-browser.ts             | 102 +++++++++++-------
 .../src/extension/extension-main.ts                | 118 ++++++++++++++-------
 .../src/requests/PingRequest.ts                    |   5 +-
 .../src/requests/ValidationRequests.ts             |  39 ++++---
 .../webpack.config.js                              |  62 ++++++++---
 packages/kie-sandbox-distribution/package.json     |   2 +-
 pnpm-lock.yaml                                     |  18 ++--
 15 files changed, 275 insertions(+), 200 deletions(-)

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 aa30fd2348b..12844201161 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": "^3.2.1",
     "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<void> {
+  public async start(extendedServicesURL: URL, 
connectionHeartbeatIntervalInSecs: number): Promise<void> {
     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<vscode.Diagnostic[]> {
+export async function validateBPMN(serviceURL: URL, bpmnFile: 
kieFile.KieFile): Promise<vscode.Diagnostic[]> {
   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<vscode.Diagnostic[]> {
+export async function validateDMN(serviceURL: URL, dmnFile: kieFile.KieFile): 
Promise<vscode.Diagnostic[]> {
   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<boolean>(enableAutoRunID);
-  if (!enableAutoRun) {
-    throw new Error("Enable Auto Run configuration not found");
-  }
-  return enableAutoRun;
-}
-
-function fetchConnectionHeartbeatIntervalinSecs(): number {
-  const connectionHeartbeatIntervalinSecs = vscode.workspace
-    .getConfiguration()
-    .get<number>(connectionHeartbeatIntervalinSecsID);
-  if (!connectionHeartbeatIntervalinSecs) {
-    throw new Error("Connection Heartbeat Interval configuration not found");
-  }
-
-  return connectionHeartbeatIntervalinSecs;
-}
-
 function fetchExtendedServicesURL(): URL {
-  const extendedServicesURL = 
vscode.workspace.getConfiguration().get<string>(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<string>(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 = <T extends ConfigurationProperty | null>(
+  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<boolean>(enableAutoRunID, true);
+  const connectionHeartbeatIntervalInSecs = 
getConfigurationPropertyValue<number>(
+    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<pingresponse.PingResponse> {
-  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<validationresponse.BPMNValidationResponse[]> {
   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<validationresponse.DMNValidationResponse[]> {
   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 254651552de..e7567068343 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -2353,8 +2353,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
@@ -5255,8 +5255,8 @@ importers:
         specifier: ^11.0.0
         version: 11.0.0([email protected]([email protected]))
       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
@@ -7036,8 +7036,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
@@ -26792,8 +26792,8 @@ packages:
     resolution: {integrity: 
sha512-RdbZCEynH2tH46+tj0ua9caUHVWrd/RHnRfvly2EVdqGmI3ndS1Vn/xjm5KuGejDt2RNDQsVRLPNd2QPwcewVg==}
     engines: {node: ^10.17 || >=12.3}
 
-  [email protected]:
-    resolution: {integrity: 
sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==}
+  [email protected]:
+    resolution: {integrity: 
sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
     engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
 
   [email protected]:
@@ -53150,7 +53150,7 @@ snapshots:
     transitivePeerDependencies:
       - domexception
 
-  [email protected]:
+  [email protected]:
     dependencies:
       data-uri-to-buffer: 4.0.1
       fetch-blob: 3.2.0


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to