// ================================================================================= Overrides /// <inheritdoc /> /// <remarks>Looks for dynamic properties by the given name. If it was not found, continues the search /// in the appropriate setting files on the parent chain.</remarks> public override object GetProperty(string name) { if (this.HasProperty(name)) { return(base.GetProperty(name)); } else if (BinaryAsJObject != null) { bool found = false; object result = JsonDynamicFieldHelper.GetProperty(BinaryAsJObject, name, out found); // If not found, try the inherited settings file if (!found) { var inherited = this.FindClosestInheritedSettingsFile(); if (inherited != null) { return(inherited.GetProperty(name)); } } else { AddValueToCache(name, result); } return(result); } else { return(null); } }
void SetDynamicProperty(string name, object value) { if (_dynamicFieldMetadata == null) { BuildFieldMetadata(); } JsonDynamicFieldHelper.SetProperty(_jObject, name, value); _dynamicFieldsChanged = true; }
object GetDynamicProperty(string name) { if (_dynamicFieldMetadata == null) { BuildFieldMetadata(); } bool found; return(JsonDynamicFieldHelper.GetProperty(_jObject, name, out found)); }
/// <inheritdoc /> public override void Save(NodeSaveSettings settings) { AssertSettings(); if (_dynamicFieldsChanged && BinaryAsJObject != null) { // If this is a JSON settings file and the dynamic metadata changed, save the JSON binary according to the changes JsonDynamicFieldHelper.SaveToStream(BinaryAsJObject, stream => { this.Binary.SetStream(stream); base.Save(settings); _dynamicFieldsChanged = false; }); } else { base.Save(settings); } // Find all settings that inherit from this setting and remove their cached data if (RepositoryInstance.LuceneManagerIsRunning && !RepositoryEnvironment.WorkingMode.Importing) { string contextPath = null; if (this.ParentPath.StartsWith(SETTINGSCONTAINERPATH, true, System.Globalization.CultureInfo.InvariantCulture)) { contextPath = "/Root"; } else { contextPath = GetParentContextPath(this.Path); } if (contextPath == null) { using (new SystemAccount()) { var q = ContentQuery.Query(SafeQueries.InTreeAndTypeIsAndName, new QuerySettings { EnableAutofilters = FilterStatus.Disabled }, contextPath, typeof(Settings).Name, this.Name); foreach (var id in q.Identifiers) { NodeIdDependency.FireChanged(id); } } } } }
private void BuildDynamicFieldMetadata() { var cachedMetadata = this.GetCachedData(DYNAMICMETADATA_CACHEKEY) as IDictionary <string, FieldMetadata>; if (cachedMetadata != null) { _dynamicFieldMetadata = cachedMetadata; } else { if (BinaryAsJObject != null) { var meta = new Dictionary <string, FieldMetadata>(); if (!this.IsNew) { // Find inherited settings files var chain = Settings.GetAllSettingsByName <Settings>(this.GetSettingName(), this.Path).ToList(); // Workaround in case the current item was not yet loaded into the settings cache: the // first element in this chain should always be the current settings file. if (chain.Count == 0 || chain[0].Id != this.Id) { chain.Insert(0, this); } // Get metadata from inherited settings files var fieldDictionaries = chain.Select(x => JsonDynamicFieldHelper.BuildDynamicFieldMetadata(x.BinaryAsJObject)).ToList(); // The result should be composed in a way that the inheritor's metadata always overrides the original metadata fieldDictionaries.Reverse(); foreach (var dict in fieldDictionaries) { foreach (var k in dict.Keys) { meta[k] = dict[k]; } } } _dynamicFieldMetadata = meta; } else { _dynamicFieldMetadata = new Dictionary <string, FieldMetadata>(); } this.SetCachedData(DYNAMICMETADATA_CACHEKEY, _dynamicFieldMetadata); } }
public override void Save(NodeSaveSettings settings) { if (_dynamicFieldsChanged) { JsonDynamicFieldHelper.SaveToStream(_jObject, stream => { this.Binary.SetStream(stream); base.Save(settings); _dynamicFieldsChanged = false; }); } else { base.Save(settings); } }
void BuildDynamicFieldMetadata() { var cachedMetadata = this.GetCachedData(DYNAMICMETADATA_CACHEKEY) as IDictionary <string, FieldMetadata>; if (cachedMetadata != null) { _dynamicFieldMetadata = cachedMetadata; } else { if (BinaryAsJObject != null) { var meta = new Dictionary <string, FieldMetadata>(); if (!this.IsNew) { // Find inherited settings files var chain = Settings.GetAllSettingsByName <Settings>(this.GetSettingName(), this.Path); // Get metadata from inherited settings files var fieldDictionaries = chain.Select(x => JsonDynamicFieldHelper.BuildDynamicFieldMetadata(x.BinaryAsJObject)).ToList(); // The result should be composed in a way that the inheritor's metadata always overrides the original metadata fieldDictionaries.Reverse(); foreach (var dict in fieldDictionaries) { foreach (var k in dict.Keys) { meta[k] = dict[k]; } } } _dynamicFieldMetadata = meta; } else { _dynamicFieldMetadata = new Dictionary <string, FieldMetadata>(); } this.SetCachedData(DYNAMICMETADATA_CACHEKEY, _dynamicFieldMetadata); } }
/// <inheritdoc /> /// <remarks>Sets or overrides any dynamic or well-known property.</remarks> public override void SetProperty(string name, object value) { if (this.HasProperty(name)) { base.SetProperty(name, value); } else if (BinaryAsJObject != null) { // If the value is the same as what the inherited settings contains, set it to null, thus removing it from the JSON var inherited = this.FindClosestInheritedSettingsFile(); var inheritedValue = inherited?.GetProperty(name); if (inheritedValue != null && inheritedValue.Equals(value)) { value = null; } JsonDynamicFieldHelper.SetProperty(BinaryAsJObject, name, value); _dynamicFieldsChanged = true; } }
// ================================================================================= ISupportsAddingFieldsOnTheFly implementation bool ISupportsAddingFieldsOnTheFly.AddFields(IEnumerable <FieldMetadata> fields) { if (BinaryAsJObject == null) { return(false); } if (_dynamicFieldMetadata == null) { BuildDynamicFieldMetadata(); } foreach (var field in fields) { _dynamicFieldMetadata.Add(field.FieldName, field); if (field.FieldSetting != null) { JsonDynamicFieldHelper.SetProperty(BinaryAsJObject, field.FieldName, field.FieldSetting.DefaultValue); } } return(true); }
/*================================================================================= Custom methods */ protected void BuildFieldMetadata() { using (var stream = this.Binary.GetStream()) { _jObject = null; if (stream != null && stream.Length > 0) { try { using (var streamReader = new System.IO.StreamReader(stream)) using (var jsonReader = new JsonTextReader(streamReader)) { var token = JObject.ReadFrom(jsonReader); if (!(token is JObject)) { throw new Exception("Binary content of this settings file should be a JSON object."); } _jObject = (JObject)token; } } catch (Exception exc) { SenseNet.Diagnostics.Logger.WriteException(exc); } } if (_jObject == null) { _jObject = new JObject(); } } _dynamicFieldMetadata = JsonDynamicFieldHelper.BuildDynamicFieldMetadata(_jObject); }