/// <summary> /// Gets all broken rules for an object graph. /// </summary> /// <param name="root">The root.</param> /// <returns>BrukenRulesTree list</returns> public static BrokenRulesTree GetAllBrokenRules(object root) { var list = new BrokenRulesTree(); long counter = 1; AddNodeToBrukenRules(ref list, ref counter, null, root); return(list); }
/// <summary> /// Gets all nodes in tree that have broken rules. /// </summary> /// <param name="root">The root.</param> /// <param name="errorsOnly">if set to <c>true</c> will only return objects that gave IsValid = false.</param> /// <returns></returns> public static BrokenRulesTree GetAllBrokenRules(object root, bool errorsOnly) { var list = new BrokenRulesTree(); long counter = 1; long childBrokenRuleCount = 0; AddNodeToBrukenRules(ref list, ref counter, null, root, errorsOnly, ref childBrokenRuleCount); return(list); }
private static void AddNodeToBrukenRules(ref BrokenRulesTree list, ref long counter, object parentKey, object obj) { // is this a single editable object if (obj is Csla.Core.BusinessBase) { var nodeKey = counter++; var bo = (Csla.Core.BusinessBase)obj; if (!bo.IsValid) { list.Add(new BrokenRulesNode() { Parent = parentKey, Node = nodeKey, BrokenRules = bo.BrokenRulesCollection, Object = obj }); } // get managed child properties foreach (var child in ((IManageProperties)bo).GetChildren()) { AddNodeToBrukenRules(ref list, ref counter, nodeKey, child); } //// is there registered private properties of RelationShipType child? //var props = fdm.GetRegisteredProperties(); //foreach (var propertyInfo in props) //{ // if (((propertyInfo.RelationshipType & RelationshipTypes.Child) > 0) && // ((propertyInfo.RelationshipType & RelationshipTypes.PrivateField) > 0)) // { // AddNodeToBrukenRules(ref list, obj, ((IManageProperties) obj).ReadProperty(propertyInfo)); // } //} } // or a list og EditableObject (both BindingList and ObservableCollection) else if (obj is IEditableCollection) { var nodeKey = counter++; var isValid = ((ITrackStatus)obj).IsValid; if (isValid) { return; // exit if object is valid } list.Add(new BrokenRulesNode() { Parent = parentKey, Node = nodeKey, Object = obj }); foreach (object child in (IEnumerable)obj) { AddNodeToBrukenRules(ref list, ref counter, nodeKey, child); } } return; }
public void Collect() { _brokenRules.ClearBrokenRules(); BrokenRulesTree brokenRulesTree = _rootObject.GetAllBrokenRules(); if (brokenRulesTree != null) { foreach (BrokenRulesNode node in brokenRulesTree) { CollectBrokenRules(node); } } }
private static void AddNodeToBrukenRules(ref BrokenRulesTree list, ref long counter, object parentKey, object obj, bool errorsOnly, ref long childBrokenRuleCount) { // is this a single editable object if (obj is Csla.Core.BusinessBase) { var nodeKey = counter++; var bo = (Csla.Core.BusinessBase)obj; long myChildBrokenRuleCount = bo.BrokenRulesCollection.Count; var node = new BrokenRulesNode() { Parent = parentKey, Node = nodeKey, BrokenRules = bo.BrokenRulesCollection, Object = obj }; list.Add(node); // get managed child properties foreach (var child in ((IManageProperties)bo).GetChildren()) { AddNodeToBrukenRules(ref list, ref counter, nodeKey, child, errorsOnly, ref myChildBrokenRuleCount); } // remove node if it has no child with broken rules. if (!errorsOnly && myChildBrokenRuleCount == 0) { list.Remove(node); } if (errorsOnly && bo.IsValid) { list.Remove(node); } childBrokenRuleCount += myChildBrokenRuleCount; } // or a list of EditableObject (both BindingList and ObservableCollection) else if (obj is IEditableCollection) { var nodeKey = counter++; var isValid = ((ITrackStatus)obj).IsValid; var node = new BrokenRulesNode() { Parent = parentKey, Node = nodeKey, Object = obj, BrokenRules = new BrokenRulesCollection(true) }; long myChildBrokenRuleCount = 0; list.Add(node); foreach (var child in (IEnumerable)obj) { AddNodeToBrukenRules(ref list, ref counter, nodeKey, child, errorsOnly, ref myChildBrokenRuleCount); } // remove node if it has no child with broken rules. if (!errorsOnly && myChildBrokenRuleCount == 0) { list.Remove(node); } if (errorsOnly && isValid) { list.Remove(node); } childBrokenRuleCount += myChildBrokenRuleCount; } return; }
private static void AddNodeToBrukenRules(ref BrokenRulesTree list, ref long counter, object parentKey, object obj, bool errorsOnly, ref long childBrokenRuleCount) { // is this a single editable object if (obj is Csla.Core.BusinessBase) { var nodeKey = counter++; var bo = (Csla.Core.BusinessBase)obj; long myChildBrokenRuleCount = bo.BrokenRulesCollection.Count; var node = new BrokenRulesNode() { Parent = parentKey, Node = nodeKey, BrokenRules = bo.BrokenRulesCollection, Object = obj }; list.Add(node); // get managed child properties foreach (var child in ((IManageProperties)bo).GetChildren()) { AddNodeToBrukenRules(ref list, ref counter, nodeKey, child, errorsOnly, ref myChildBrokenRuleCount); } // remove node if it has no child with broken rules. if (!errorsOnly && myChildBrokenRuleCount == 0) { list.Remove(node); } if (errorsOnly && bo.IsValid) { list.Remove(node); } childBrokenRuleCount += myChildBrokenRuleCount; } // or a list of EditableObject (both BindingList and ObservableCollection) else if (obj is IEditableCollection) { var nodeKey = counter++; var isValid = ((ITrackStatus)obj).IsValid; var node = new BrokenRulesNode() { Parent = parentKey, Node = nodeKey, Object = obj }; long myChildBrokenRuleCount = 0; list.Add(node); foreach (var child in (IEnumerable)obj) { AddNodeToBrukenRules(ref list, ref counter, nodeKey, child, errorsOnly, ref myChildBrokenRuleCount); } // remove node if it has no child with broken rules. if (!errorsOnly && myChildBrokenRuleCount == 0) { list.Remove(node); } if (errorsOnly && isValid) { list.Remove(node); } childBrokenRuleCount += myChildBrokenRuleCount; } return; }
/// <summary> /// Gets all nodes in tree that have broken rules. /// </summary> /// <param name="root">The root.</param> /// <param name="errorsOnly">if set to <c>true</c> will only return objects that gave IsValid = false.</param> /// <returns></returns> public static BrokenRulesTree GetAllBrokenRules(object root, bool errorsOnly) { var list = new BrokenRulesTree(); long counter = 1; long childBrokenRuleCount = 0; AddNodeToBrukenRules(ref list, ref counter, null, root, errorsOnly, ref childBrokenRuleCount); return list; }