UNPKG

gpii-universal

Version:

Cross platform, core components of the GPII personalization infrastructure.

147 lines (138 loc) 5.88 kB
/*! * Lifecycle Manager Utilities * * Copyright 2019 OCAD University * * Licensed under the New BSD license. You may not use this file except in * compliance with this License. * * The research leading to these results has received funding from the European Union's * Seventh Framework Programme (FP7/2007-2013) * under grant agreement no. 289016. * * You may obtain a copy of the License at * https://github.com/GPII/universal/blob/master/LICENSE.txt */ "use strict"; var fluid = fluid || require("infusion"); var gpii = fluid.registerNamespace("gpii"); fluid.registerNamespace("gpii.lifecycleManager"); /** * Remove settings that are not in the matchMaker settings results. This is used by * lifecycleManager.readPreferences() to filter out applcation setting values that are * relevant to request preferences. * @param {Array} settingValues - An array of objects with each object keyed by a solution id with its value being * an object of setting values that this solution supports. * An example of an input for "settingValues": * [{ * "org.gnome.desktop.a11y.magnifier": [ * { * "settings": { * "mag-factor": 2, * "show-cross-hairs": false, * "focus-tracking": false, * "caret-tracking": false, * "mouse-tracking": false, * "screen-position": "full-screen" * } * } * ] * }] * @param {Object} matchMakerSolutionRegistryEntries - The solution registry entries in the calculated lifecyle * instructions. Each solution registry entry contains a list of settings generated by a matchmaking process. * @return {Object} An object with each element keyed by a solution id with its value only having settings * generated by a matchmaking process. * An example of the output: * [{ * "org.gnome.desktop.a11y.magnifier": [ * { * "settings": { * "mag-factor": 2, * "screen-position": "full-screen" * } * } * ] * }] */ gpii.lifecycleManager.getMatchMakerSettings = function (settingValues, matchMakerSolutionRegistryEntries) { var settingsTogo = {}; // 1. collect all settings generated from the a matchmaking process var matchedSettingsForSolutions = {}; fluid.each(matchMakerSolutionRegistryEntries, function (solutionSpec, solutionId) { var matchedSettings = []; fluid.each(solutionSpec.settingsHandlers, function (settingsHandlerSpec) { matchedSettings = matchedSettings.concat(fluid.keys(settingsHandlerSpec.settings)); }); fluid.set(matchedSettingsForSolutions, [solutionId], matchedSettings); }); // 2. remove setting values that are not in matchedSettings fluid.each(settingValues, function (oneSolutionBlock) { fluid.each(oneSolutionBlock, function (settingBlocks, solutionId) { fluid.each(settingBlocks, function (oneSettingBlock) { fluid.each(oneSettingBlock.settings, function (value, key) { if (matchedSettingsForSolutions[solutionId].includes(key)) { fluid.set(settingsTogo, [solutionId, key], value); }; }); }); }); }); return settingsTogo; }; /** * Invert application settings to common or application terms. This is currently used by * lifecycleManager.readPreferences() to transform application settings to request preferences. * @param {Object} settings - Settings keyed by solution ids with values being objects containing setting values. * An example of an input for "settings": * { * "org.gnome.desktop.a11y.magnifier": { * "mag-factor": 2, * "screen-position": "full-screen" * } * } * @param {Object} solutionRegistryEntries - The solution registry entries. * the "settingValues". * @return {Object} An transformed object keyed by preference URLs. * An example of the output: * { * "http://registry.gpii.net/common/magnification": 2 * } */ gpii.lifecycleManager.transformSettingsToPrefs = function (settings, solutionRegistryEntries) { var transformed = {}; fluid.each(settings, function (settingsForOneSolution, solutionId) { var settingsHandlers = fluid.get(solutionRegistryEntries, [solutionId, "settingsHandlers"]); fluid.each(settingsHandlers, function (handler) { transformed = fluid.extend(true, transformed, fluid.model.transformWithRules(settingsForOneSolution, gpii.getInverseRules(handler))); }); }); return transformed; }; /** * Filter out preferences by matching preference paths. * @param {Object} preferences - The preferences object to filter from. * @param {Object} prefsSearchFor - Contain preference paths to match. * @return {Object} A subset of "preferences" containing preference paths matching paths from "prefsSearchFor". */ gpii.lifecycleManager.filterMatchedPrefs = function (preferences, prefsSearchFor) { var matchedPrefs = {}; var prefApplicationPrefix = "http://registry.gpii.net/applications/"; fluid.each(prefsSearchFor, function (prefsVal, prefsKey) { if (prefsKey.startsWith(prefApplicationPrefix)) { // application terms fluid.each(prefsVal, function (innerPrefsVal, innerPrefsKey) { var exists = fluid.get(preferences, [prefsKey, innerPrefsKey]); if (exists !== undefined) { fluid.set(matchedPrefs, [prefsKey, innerPrefsKey], exists); } }); } else { // common terms var exists = fluid.get(preferences, [prefsKey]); if (exists !== undefined) { fluid.set(matchedPrefs, [prefsKey], exists); } } }); return matchedPrefs; };