in src/AWS.Deploy.Orchestration/OptionSettingHandler.cs [367:435]
public bool IsOptionSettingModified(Recommendation recommendation, OptionSettingItem optionSetting)
{
// If the option setting is not displayable, that means its dependencies are not satisfied and it does not play any role in the deployment.
// We do not need to evaluate whether it has been modified or not.
if (!IsOptionSettingDisplayable(recommendation, optionSetting))
{
return false;
}
if (optionSetting.Type.Equals(OptionSettingValueType.List))
{
var currentSet = GetOptionSettingValue<SortedSet<string>>(recommendation, optionSetting) ?? new SortedSet<string>();
var defaultSet = GetOptionSettingDefaultValue<SortedSet<string>>(recommendation, optionSetting) ?? new SortedSet<string>();
// return true if both have different lengths or all elements in currentSet are not present in defaultSet
return defaultSet.Count != currentSet.Count || !currentSet.All(x => defaultSet.Contains(x));
}
if (optionSetting.Type.Equals(OptionSettingValueType.KeyValue))
{
var currentDict = GetOptionSettingValue<Dictionary<string, string>>(recommendation, optionSetting) ?? new Dictionary<string, string>();
var defaultDict = GetOptionSettingDefaultValue<Dictionary<string, string>>(recommendation, optionSetting) ?? new Dictionary<string, string>();
// return true if both have different lengths or all keyValue pairs are not equal between currentDict and defaultDict
return defaultDict.Count != currentDict.Count ||
!currentDict.All(keyPair => defaultDict.ContainsKey(keyPair.Key) && string.Equals(defaultDict[keyPair.Key], currentDict[keyPair.Key]));
}
if (optionSetting.Type.Equals(OptionSettingValueType.Int))
{
var currentValue = GetOptionSettingValue<int>(recommendation, optionSetting);
var defaultValue = GetOptionSettingDefaultValue<int>(recommendation, optionSetting);
return defaultValue != currentValue;
}
if (optionSetting.Type.Equals(OptionSettingValueType.Double))
{
var currentValue = GetOptionSettingValue<double>(recommendation, optionSetting);
var defaultValue = GetOptionSettingDefaultValue<double>(recommendation, optionSetting);
return defaultValue != currentValue;
}
if (optionSetting.Type.Equals(OptionSettingValueType.Bool))
{
var currentValue = GetOptionSettingValue<bool>(recommendation, optionSetting);
var defaultValue = GetOptionSettingDefaultValue<bool>(recommendation, optionSetting);
return defaultValue != currentValue;
}
if (optionSetting.Type.Equals(OptionSettingValueType.String))
{
var currentValue = GetOptionSettingValue<string>(recommendation, optionSetting);
var defaultValue = GetOptionSettingDefaultValue<string>(recommendation, optionSetting);
if (string.IsNullOrEmpty(currentValue) && string.IsNullOrEmpty(defaultValue))
return false;
return !string.Equals(currentValue, defaultValue);
}
// The option setting is of type Object and it has nested child settings.
// return true is any of the child settings are modified.
foreach (var childSetting in optionSetting.ChildOptionSettings)
{
if (IsOptionSettingModified(recommendation, childSetting))
return true;
}
return false;
}