/// <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; }