From 006a9cbd4ebea2c631c5decfb44aede30d1d6ffa Mon Sep 17 00:00:00 2001 From: Robert Patrick Date: Tue, 8 Mar 2022 08:07:15 -0600 Subject: [PATCH 1/2] making sure that all windows get the backend port notifications --- electron/app/js/wktWindow.js | 5 +++ electron/app/js/wlRemoteConsoleUtils.js | 13 ++++++-- webui/src/js/viewModels/model-design-view.js | 32 +++++++++++++------- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/electron/app/js/wktWindow.js b/electron/app/js/wktWindow.js index 42a428304..3d28528f2 100644 --- a/electron/app/js/wktWindow.js +++ b/electron/app/js/wktWindow.js @@ -825,6 +825,11 @@ async function createWindow() { userSettings.setWindowSize(winSize); }); + newWindow.once('ready-to-show', () => { + const { getWebLogicRemoteConsoleBackendPort } = require('./wlRemoteConsoleUtils'); + sendToWindow('set-wrc-backend-port', getWebLogicRemoteConsoleBackendPort()); + }); + newWindow.on('close', (event) => { getLogger().debug('Received window close event on Window ID %s', newWindow.id); if (!newWindow.skipDirtyCheck) { diff --git a/electron/app/js/wlRemoteConsoleUtils.js b/electron/app/js/wlRemoteConsoleUtils.js index 9cbbd195f..49c93dd04 100644 --- a/electron/app/js/wlRemoteConsoleUtils.js +++ b/electron/app/js/wlRemoteConsoleUtils.js @@ -7,7 +7,7 @@ const path = require('path'); const readline = require('readline'); -const { app, dialog } = require('electron'); +const { app, BrowserWindow, dialog } = require('electron'); const fsPromises = require('fs/promises'); const userSettings = require('./userSettings'); @@ -21,8 +21,13 @@ const { spawnDaemonChildProcess } = require('./childProcessExecutor'); const { wlRemoteConsoleFrontendVersion } = require('../webui.json'); let _wlRemoteConsoleChildProcess; +let _wlRemoteConsolePort; /* global process */ +function getWebLogicRemoteConsoleBackendPort() { + return _wlRemoteConsolePort; +} + async function startWebLogicRemoteConsoleBackend(currentWindow, skipVersionCheck = false) { if (_wlRemoteConsoleChildProcess) { return Promise.resolve(); @@ -45,6 +50,8 @@ async function startWebLogicRemoteConsoleBackend(currentWindow, skipVersionCheck }); _wlRemoteConsoleChildProcess.on('exit', (code) => { getLogger().info('WebLogic Remote Console backend process exited with code %s', code); + _wlRemoteConsolePort = undefined; + BrowserWindow.getAllWindows().forEach(win => sendToWindow(win, 'set-wrc-backend-port', _wlRemoteConsolePort)); }); const stdoutLines = readline.createInterface({ input: _wlRemoteConsoleChildProcess.stdout }); @@ -58,7 +65,8 @@ async function startWebLogicRemoteConsoleBackend(currentWindow, skipVersionCheck const matcher = line.match(portRegex); if (matcher) { foundPort = true; - sendToWindow(currentWindow, 'set-wrc-backend-port', matcher[1]); + _wlRemoteConsolePort = matcher[1]; + BrowserWindow.getAllWindows().forEach(win => sendToWindow(win, 'set-wrc-backend-port', _wlRemoteConsolePort)); } } }); @@ -505,6 +513,7 @@ async function _getDefaultLocationForLinux() { module.exports = { getDefaultDirectoryForOpenDialog, getDefaultWebLogicRemoteConsoleHome, + getWebLogicRemoteConsoleBackendPort, setWebLogicRemoteConsoleHomeAndStart, startWebLogicRemoteConsoleBackend }; diff --git a/webui/src/js/viewModels/model-design-view.js b/webui/src/js/viewModels/model-design-view.js index d8dbe2c5e..882df5759 100644 --- a/webui/src/js/viewModels/model-design-view.js +++ b/webui/src/js/viewModels/model-design-view.js @@ -4,9 +4,9 @@ * Licensed under The Universal Permissive License (UPL), Version 1.0 as shown at https://oss.oracle.com/licenses/upl/ */ define(['accUtils', 'utils/i18n', 'knockout', 'models/wkt-project', 'utils/url-catalog', 'utils/view-helper', - 'utils/wkt-logger', 'wrc-frontend/core/parsers/yaml', 'wrc-frontend/integration/viewModels/utils', - 'wdt-model-designer/loader', 'ojs/ojinputtext', 'ojs/ojlabel', 'ojs/ojbutton', 'ojs/ojformlayout'], -function(accUtils, i18n, ko, project, urlCatalog, viewHelper, wktLogger, YamlParser, ViewModelUtils) { + 'utils/wkt-logger', 'js-yaml', 'wrc-frontend/integration/viewModels/utils', 'wdt-model-designer/loader', + 'ojs/ojinputtext', 'ojs/ojlabel', 'ojs/ojbutton', 'ojs/ojformlayout'], +function(accUtils, i18n, ko, project, urlCatalog, viewHelper, wktLogger, jsYaml, ViewModelUtils) { function ModelDesignViewModel() { let subscriptions = []; @@ -15,6 +15,7 @@ function(accUtils, i18n, ko, project, urlCatalog, viewHelper, wktLogger, YamlPar this.designer = undefined; this.dataProvider = {}; this.disableStartButton = ko.observable(false); + this.wrcBackendTriggerChange = false; this.connected = () => { accUtils.announce('Model design view loaded.', 'assertive'); @@ -29,7 +30,11 @@ function(accUtils, i18n, ko, project, urlCatalog, viewHelper, wktLogger, YamlPar wktLogger.debug('Model Design View got event for Model contents changed'); if (this.designer) { - this.createRemoteConsoleProvider(this.designer, true); + if (this.wrcBackendTriggerChange) { + this.wrcBackendTriggerChange = false; + } else { + this.createRemoteConsoleProvider(this.designer, true); + } } }, this)); @@ -134,26 +139,27 @@ function(accUtils, i18n, ko, project, urlCatalog, viewHelper, wktLogger, YamlPar } const providerOptions = this.getRemoteConsoleProviderOptions(); - // TODO - Do we need to use the Remote Console parser or can we just use js-yaml? - // - YamlParser.parse(providerOptions.fileContents).then(data => { + try { + const data = jsYaml.load(providerOptions.fileContents); wdtModelDesigner.createProvider(providerOptions.name, data); - }).catch(err => { + } catch (err) { ViewModelUtils.failureResponseDefaultHandling(err); - }); + } }; // Triggered when WDT Model File provider has been activated with the WRC backend. // this.providerActivated = (event) => { this.dataProvider = event.detail.value; + wktLogger.debug('Received providerActivated event with dataProvider = %s', JSON.stringify(this.dataProvider)); this.designer.selectLastVisitedSlice(); }; // Triggered when changes have been downloaded from the WRC backend, for the active WDT Model File provider. // this.changesAutoDownloaded = (event) => { - wktLogger.debug('changesAutoDownloaded event: %s', event.detail.value); + wktLogger.debug('Received changesAutoDownloaded event with modelContent = %s', event.detail.value); + this.wrcBackendTriggerChange = true; this.project.wdtModel.modelContent(event.detail.value); }; @@ -161,6 +167,7 @@ function(accUtils, i18n, ko, project, urlCatalog, viewHelper, wktLogger, YamlPar // this.providerDeactivated = (event) => { const result = event.detail.value; + wktLogger.debug('Received providerDeactivated event with dataProvider = %s', JSON.stringify(result)); delete result.data; this.dataProvider = {state: 'disconnected'}; }; @@ -168,10 +175,13 @@ function(accUtils, i18n, ko, project, urlCatalog, viewHelper, wktLogger, YamlPar // Triggered when WDT Model Designer has lost its connection to the WRC backend. // this.connectionLostRefused = (event) => { - wktLogger.debug('connectionLostRefused: backendUrl=%s', event.detail.value); + wktLogger.debug('Received connectionLostRefused event with backendUrl = %s', event.detail.value); if (this.designer) { this.designer.visible = false; } + // Technically, this should not be needed since the electron side should be pushing this port + // change to the window when the backend process exits, but it doesn't hurt anything. + // this.project.wdtModel.internal.wlRemoteConsolePort(undefined); }; From 4f5fa015603a7aaca7aa946071bdb9187bdb570b Mon Sep 17 00:00:00 2001 From: Robert Patrick Date: Tue, 8 Mar 2022 08:48:23 -0600 Subject: [PATCH 2/2] switching new window handling strategy --- electron/app/js/wktWindow.js | 5 ----- electron/app/js/wlRemoteConsoleUtils.js | 10 ++++++++-- electron/app/main.js | 10 +++++++++- webui/src/js/windowStateUtils.js | 1 + 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/electron/app/js/wktWindow.js b/electron/app/js/wktWindow.js index 3d28528f2..42a428304 100644 --- a/electron/app/js/wktWindow.js +++ b/electron/app/js/wktWindow.js @@ -825,11 +825,6 @@ async function createWindow() { userSettings.setWindowSize(winSize); }); - newWindow.once('ready-to-show', () => { - const { getWebLogicRemoteConsoleBackendPort } = require('./wlRemoteConsoleUtils'); - sendToWindow('set-wrc-backend-port', getWebLogicRemoteConsoleBackendPort()); - }); - newWindow.on('close', (event) => { getLogger().debug('Received window close event on Window ID %s', newWindow.id); if (!newWindow.skipDirtyCheck) { diff --git a/electron/app/js/wlRemoteConsoleUtils.js b/electron/app/js/wlRemoteConsoleUtils.js index 49c93dd04..82f69707e 100644 --- a/electron/app/js/wlRemoteConsoleUtils.js +++ b/electron/app/js/wlRemoteConsoleUtils.js @@ -51,7 +51,10 @@ async function startWebLogicRemoteConsoleBackend(currentWindow, skipVersionCheck _wlRemoteConsoleChildProcess.on('exit', (code) => { getLogger().info('WebLogic Remote Console backend process exited with code %s', code); _wlRemoteConsolePort = undefined; - BrowserWindow.getAllWindows().forEach(win => sendToWindow(win, 'set-wrc-backend-port', _wlRemoteConsolePort)); + BrowserWindow.getAllWindows().forEach(win => { + getLogger().debug('Sending new Remote Console backend port %s to Window ID %s', _wlRemoteConsolePort, win.id); + sendToWindow(win, 'set-wrc-backend-port', _wlRemoteConsolePort); + }); }); const stdoutLines = readline.createInterface({ input: _wlRemoteConsoleChildProcess.stdout }); @@ -66,7 +69,10 @@ async function startWebLogicRemoteConsoleBackend(currentWindow, skipVersionCheck if (matcher) { foundPort = true; _wlRemoteConsolePort = matcher[1]; - BrowserWindow.getAllWindows().forEach(win => sendToWindow(win, 'set-wrc-backend-port', _wlRemoteConsolePort)); + BrowserWindow.getAllWindows().forEach(win => { + getLogger().debug('Sending new Remote Console backend port %s to Window ID %s', _wlRemoteConsolePort, win.id); + sendToWindow(win, 'set-wrc-backend-port', _wlRemoteConsolePort); + }); } } }); diff --git a/electron/app/main.js b/electron/app/main.js index cdeab6917..284472d92 100644 --- a/electron/app/main.js +++ b/electron/app/main.js @@ -35,7 +35,8 @@ const openSSLUtils = require('./js/openSSLUtils'); const osUtils = require('./js/osUtils'); const { initializeAutoUpdater, registerAutoUpdateListeners, installUpdates, getUpdateInformation } = require('./js/appUpdater'); const { startWebLogicRemoteConsoleBackend, getDefaultDirectoryForOpenDialog, setWebLogicRemoteConsoleHomeAndStart, - getDefaultWebLogicRemoteConsoleHome } = require('./js/wlRemoteConsoleUtils'); + getDefaultWebLogicRemoteConsoleHome, getWebLogicRemoteConsoleBackendPort +} = require('./js/wlRemoteConsoleUtils'); const { getHttpsProxyUrl, getBypassProxyHosts } = require('./js/userSettings'); const { sendToWindow } = require('./js/windowUtils'); @@ -225,10 +226,17 @@ class Main { } sendToWindow(currentWindow, 'show-startup-dialogs', startupInformation); + const port = getWebLogicRemoteConsoleBackendPort(); + this._logger.debug('Sending Remote Console backend port %s to Window ID %s', port, currentWindow.id); + sendToWindow(currentWindow, 'set-wrc-backend-port', port); }); } this._startupDialogsShownAlready = true; + } else { + const port = getWebLogicRemoteConsoleBackendPort(); + this._logger.debug('Sending Remote Console backend port %s to Window ID %s', port, currentWindow.id); + sendToWindow(currentWindow, 'set-wrc-backend-port', port); } }); }); diff --git a/webui/src/js/windowStateUtils.js b/webui/src/js/windowStateUtils.js index 9cafe0300..ef5df053a 100644 --- a/webui/src/js/windowStateUtils.js +++ b/webui/src/js/windowStateUtils.js @@ -256,6 +256,7 @@ function(wktProject, wktConsole, wdtDiscoverer, dialogHelper, projectIO, }); window.api.ipc.receive('set-wrc-backend-port', (port) => { + wktLogger.debug('Received Remote Console backend port %s', port); wktProject.wdtModel.internal.wlRemoteConsolePort(port); });