gpii-universal
Version:
Cross platform, core components of the GPII personalization infrastructure.
147 lines (138 loc) • 5.88 kB
JavaScript
/*!
* 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
*/
;
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;
};