Exemple #1
0
        /// <summary>
        /// Recursively searches the given field and all its fields for
        /// <see cref="T:s3pi.Interfaces.IResource"/> instances,
        /// and compiles them into a dictionary with the content field path
        /// to access them from the given root field.
        /// </summary>
        public static List <IResourceConnection> SlurpRKsFromField(string absolutePath,
                                                                   AApiVersionedFields rootField, List <RKContainer> containers,
                                                                   Predicate <IResourceKey> validate = null)
        {
            List <IResourceConnection> subKeys, keys = new List <IResourceConnection>();

            if (rootField is IResourceKey && (validate == null || validate(rootField as IResourceKey)))
            {
                keys.Add(new DefaultConnection(rootField as IResourceKey, rootField,
                                               ResourceDataActions.FindWrite, absolutePath));
            }

            List <string> contentFields = rootField.ContentFields;
            TypedValue    tv;
            string        contentField, name, absoluteName;

            for (int i = 0; i < contentFields.Count; i++)
            {
                contentField = contentFields[i];
                if (IsExcludedContentField(contentField))
                {
                    continue;
                }
                tv           = rootField[contentField];
                name         = "root." + contentField;
                absoluteName = absolutePath + "." + contentField;

                // string is enumerable but we want to treat it as a single value
                if (typeof(string).IsAssignableFrom(tv.Type))
                {
                    continue;
                }

                else if (typeof(IEnumerable).IsAssignableFrom(tv.Type))
                {
                    subKeys = SlurpRKsFromIEnumerable(absoluteName, name, rootField,
                                                      tv.Value as IEnumerable, containers, validate);
                    keys.AddRange(subKeys);
                }
                else if (typeof(AApiVersionedFields).IsAssignableFrom(tv.Type))
                {
                    subKeys = SlurpRKsFromField(absoluteName,
                                                tv.Value as AApiVersionedFields, containers, validate);
                    keys.AddRange(subKeys);
                }
                else if (typeof(TextReader).IsAssignableFrom(tv.Type))
                {
                    TextRKContainer textHelper = new TextRKContainer(name, rootField,
                                                                     tv.Value as TextReader, absoluteName, validate);
                    keys.AddRange(textHelper.Owners);
                }
                else if (tv.Value is IResourceKey && (validate == null || validate(tv.Value as IResourceKey)))
                {
                    keys.Add(new DefaultConnection(tv.Value as IResourceKey, rootField,
                                                   ResourceDataActions.FindWrite, name));
                }
            }

            return(keys);
        }
        /// <summary>
        /// Recursively searches the given field and all its fields for 
        /// <see cref="T:s3pi.Interfaces.IResource"/> instances,
        /// and compiles them into a dictionary with the content field path
        /// to access them from the given root field.
        /// </summary>
        public static List<IResourceConnection> SlurpRKsFromField(string absolutePath,
            AApiVersionedFields rootField, List<RKContainer> containers,
            Predicate<IResourceKey> validate = null)
        {
            List<IResourceConnection> subKeys, keys = new List<IResourceConnection>();

            if (rootField is IResourceKey && (validate == null || validate(rootField as IResourceKey)))
                keys.Add(new DefaultConnection(rootField as IResourceKey, rootField,
                    ResourceDataActions.FindWrite, absolutePath));

            List<string> contentFields = rootField.ContentFields;
            TypedValue tv;
            string contentField, name, absoluteName;
            for (int i = 0; i < contentFields.Count; i++)
            {
                contentField = contentFields[i];
                if (IsExcludedContentField(contentField))
                    continue;
                tv = rootField[contentField];
                name = "root." + contentField;
                absoluteName = absolutePath + "." + contentField;

                // string is enumerable but we want to treat it as a single value
                if (typeof(string).IsAssignableFrom(tv.Type))
                    continue;

                else if (typeof(IEnumerable).IsAssignableFrom(tv.Type))
                {
                    subKeys = SlurpRKsFromIEnumerable(absoluteName, name, rootField,
                        tv.Value as IEnumerable, containers, validate);
                    keys.AddRange(subKeys);
                }
                else if (typeof(AApiVersionedFields).IsAssignableFrom(tv.Type))
                {
                    subKeys = SlurpRKsFromField(absoluteName,
                        tv.Value as AApiVersionedFields, containers, validate);
                    keys.AddRange(subKeys);
                }
                else if (typeof(TextReader).IsAssignableFrom(tv.Type))
                {
                    TextRKContainer textHelper = new TextRKContainer(name, rootField,
                        tv.Value as TextReader, absoluteName, validate);
                    keys.AddRange(textHelper.Owners);
                }
                else if (tv.Value is IResourceKey && (validate == null || validate(tv.Value as IResourceKey)))
                {
                    keys.Add(new DefaultConnection(tv.Value as IResourceKey, rootField,
                        ResourceDataActions.FindWrite, name));
                }
            }

            return keys;
        }