IN THIS ARTICLE
Settings Registry Chaining
The Settings Registry supports the ability to merge additional Settings Registry files *.setreg(patch) via the
JSON Importer Framework .
Any field named $import within a Settings Registry file can be used to specify additional *.setreg, *.setregpatch, or any other JSON format files to merge to the Settings Registry.
When a Settings Registry file is merged using the
Merge API, it triggers the logic to look for $import directives within the settings file to merge additional JSON files.
The order in which the additional files are merged is determined by the location of the $import directive.
- Any setting that appears before the
$importdirective can be overridden by the JSON contents of the imported file. - Any setting that appears after the
$importdirective can override the JSON contents of the imported file.
Chain import setreg file using a $import directive string
The following example shows how to use the $import directive to merge another Settings Registry file using a string value.
test.apple.setreg
{
"pre_field": { "first": 1, "second": 2 },
"$import": "test.ios.setreg",
"post_field": { "1": 11, "2": 12 }
}
test.ios.setreg
{
"pre_field": { "second": 202 },
"post_field": { "2": 120 }
}
After test.ios.setreg is merged, the test.apple.setreg file results in the following final JSON output:
Import Result
{
"pre_field": { "first": 1, "second": 202 },
"post_field": { "1": 11, "2": 12 }
}
Notice that the "pre_field" that appear before the $import directive has its "second" field value (202) overridden by the imported test.ios.setreg file.
Contrast the difference with the "post_field" that appears after the $import directive. The "2" field value (12) is from the original test.apple.setreg file.
Chain import setreg file using a $import directive object
The following shows how to use the $import directive to merge another Settings Registry file using a JSON object with a filename key.
The reason to use the $import directive object over the $import directive string, is that the object syntax supports an additional "patch" field.
The "patch" field is a JSON object, whose content will be merged directly over the imported content data before being merged over the initial Settings Registry file data.
test.mobile.setreg
{
"device_abis": [
"arm64-v8a"
]
}
The test.android.setreg patches the "device_abis" array of the test.mobile.setreg after reading the imported contents into memory, but before applying the contents to the rest of the test.android.setreg data.
test.android.setreg
{
"$import": {
"filename": "test.mobile.setreg",
"patch": {
"device_abis": [
"arm64-v8a",
"x86_64"
]
}
}
}
Importing multiple setreg files using a $import directive
The following shows how multiple uses of the same $import key can be used to merge multiple Settings Registry files.
Given the two Settings Registry files that follow, number.setreg and string.setreg, the result of the merge depends on the order in which the files appear in the import file.
Example Data
number.setreg
{
"1": 7,
"2": 14
}
string.setreg
{
"1": "Hello",
"3": "World"
}
Example 1
Merging the aggregate setreg file with the following contents will merge string.setreg over number.setreg.
aggregate.setreg
{
"$import": "number.setreg",
"$import": "string.setreg"
}
The value of key "1" is from the string.setreg file.
aggregate.setreg (Post Import)
{
"1": "Hello",
"2": 14,
"3": "World"
}
Example 2
Swapping the order of the $import directives changes the result of the values within the Settings Registry.
aggregate2.setreg
{
"$import": "string.setreg",
"$import": "number.setreg"
}
The value of key "1" is from the number.setreg file.
aggregate2.setreg (Post Import)
{
"1": 7,
"2": 14,
"3": "World"
}
Using the approach shown in the preceding examples, you can merge a chain of files into the Settings Registry with the MergeSettingsFolder or MergeSettingsFile
Merge APIs.