Example #1
0
        // ================================================================================= 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);
            }
        }
Example #2
0
        void SetDynamicProperty(string name, object value)
        {
            if (_dynamicFieldMetadata == null)
            {
                BuildFieldMetadata();
            }

            JsonDynamicFieldHelper.SetProperty(_jObject, name, value);
            _dynamicFieldsChanged = true;
        }
Example #3
0
        object GetDynamicProperty(string name)
        {
            if (_dynamicFieldMetadata == null)
            {
                BuildFieldMetadata();
            }

            bool found;

            return(JsonDynamicFieldHelper.GetProperty(_jObject, name, out found));
        }
Example #4
0
        /// <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);
                        }
                    }
                }
            }
        }
Example #5
0
        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);
            }
        }
Example #6
0
 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);
     }
 }
Example #7
0
        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);
            }
        }
Example #8
0
        /// <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;
            }
        }
Example #9
0
        // ================================================================================= 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);
        }
Example #10
0
        /*================================================================================= 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);
        }