From fbf736aaf708058e83a9251ba569f7a69fa7060e Mon Sep 17 00:00:00 2001 From: Pete Richards Date: Tue, 16 May 2017 13:07:17 -0700 Subject: [PATCH] [Conductor] improve validation, properly set defaults Update conductor validation logic to trigger easier-to-understand error messages for bad configurations. Update default-setting-behavior to properly set clock and offsets when the default option is clock-based menu option. Only set defaults when timeSystem has not already been configured. fixes https://github.com/nasa/openmct/issues/1580 --- src/plugins/timeConductor/plugin.js | 120 ++++++++++++++++++---------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/src/plugins/timeConductor/plugin.js b/src/plugins/timeConductor/plugin.js index 3485ae4004..ad8a716781 100644 --- a/src/plugins/timeConductor/plugin.js +++ b/src/plugins/timeConductor/plugin.js @@ -22,28 +22,75 @@ define([], function () { + function validateMenuOption(menuOption, index) { + if (menuOption.clock && !menuOption.clockOffsets) { + return "clock-based menuOption at index " + index + " is " + + "missing required property 'clockOffsets'."; + } + if (!menuOption.timeSystem) { + return "menuOption at index " + index + " is missing " + + "required property 'timeSystem'."; + } + if (!menuOption.bounds && !menuOption.clock) { + return "fixed-bounds menuOption at index " + index + " is " + + "missing required property 'bounds'"; + } + } + + function validateConfiguration(config) { + if (config === undefined || + config.menuOptions === undefined || + config.menuOptions.length === 0) { + return "You must specify one or more 'menuOptions'."; + } + if (config.menuOptions.some(validateMenuOption)) { + return config.menuOptions.map(validateMenuOption) + .filter(function (err) { return !!err; }) + .join('\n'); + } + return undefined; + } + + function validateRuntimeConfiguration(config, openmct) { + var systems = openmct.time.getAllTimeSystems() + .reduce(function (m, ts) { + m[ts.key] = ts; + return m; + }, {}); + var clocks = openmct.time.getAllClocks() + .reduce(function (m, c) { + m[c.key] = c; + return m; + }, {}); + + return config.menuOptions.map(function (menuOption, index) { + if (menuOption.timeSystem && !systems[menuOption.timeSystem]) { + return "menuOption at index " + index + " specifies a " + + "timeSystem that does not exist: " + menuOption.timeSystem; + } + if (menuOption.clock && !clocks[menuOption.clock]) { + return "menuOption at index " + index + " specifies a " + + "clock that does not exist: " + menuOption.clock; + } + }) + .filter(function (err) { return !!err; }) + .join('\n'); + } + + function throwConfigErrorIfExists(error) { + if (error) { + throw new Error("Invalid Time Conductor Configuration: \n" + + error + '\n' + + "https://github.com/nasa/openmct/blob/master/API.md#the-time-conductor"); + } + } + return function (config) { - function validateConfiguration() { - if (config === undefined || config.menuOptions === undefined || config.menuOptions.length === 0) { - return "Please provide some configuration for the time conductor. https://github.com/nasa/openmct/blob/master/API.md#the-time-conductor"; - } - return undefined; - } + throwConfigErrorIfExists(validateConfiguration(config)); return function (openmct) { - function getTimeSystem(key) { - return openmct.time.getAllTimeSystems().filter(function (timeSystem) { - return timeSystem.key === key; - })[0]; - } - - var validationError = validateConfiguration(); - if (validationError) { - throw validationError; - } - openmct.legacyExtension('constants', { key: 'CONDUCTOR_CONFIG', value: config, @@ -54,39 +101,24 @@ define([], function () { openmct.legacyRegistry.enable('platform/features/conductor/compatibility'); openmct.on('start', function () { + + throwConfigErrorIfExists(validateRuntimeConfiguration(config, openmct)); + /* - On app startup, default the conductor + On app startup, default the conductor if not already set. */ - var timeSystem = openmct.time.timeSystem(); - var clock = openmct.time.clock(); - - if (timeSystem === undefined) { - timeSystem = getTimeSystem(config.menuOptions[0].timeSystem); - if (timeSystem === undefined) { - throw 'Please install and configure at least one time system'; - } + if (openmct.time.timeSystem() !== undefined) { + return; } - var configForTimeSystem = config.menuOptions.filter(function (menuOption) { - return menuOption.timeSystem === timeSystem.key && menuOption.clock === (clock && clock.key); - })[0]; - - if (configForTimeSystem !== undefined) { - var bounds; - if (clock === undefined) { - bounds = configForTimeSystem.bounds; - } else { - var clockOffsets = configForTimeSystem.clockOffsets; - - bounds = { - start: clock.currentValue() + clockOffsets.start, - end: clock.currentValue() + clockOffsets.end - }; - } - openmct.time.timeSystem(timeSystem, bounds); + var defaults = config.menuOptions[0]; + if (defaults.clock) { + openmct.time.clock(defaults.clock, defaults.clockOffsets); + openmct.time.timeSystem(defaults.timeSystem, openmct.time.bounds()); } else { - throw 'Invalid time conductor configuration. Please define defaults for time system "' + timeSystem.key + '"'; + openmct.time.timeSystem(defaults.timeSystem, defaults.bounds); } + }); }; };