public virtual IPermission Union <TActualResultType>(IPermission target) where TActualResultType : ObjectAccessPermission { try { if (!(target is ObjectAccessPermission)) { throw new ArgumentException("Can't unite anything other than an ObjectAccessPermission or one of its descendants!"); } if (!typeof(ObjectAccessPermission).IsAssignableFrom(typeof(TActualResultType))) { throw new ArgumentException("Resultant object Type must be an ObjectAccessPermission or one of its descendants!"); } List <ParticularAccessItem> resultItems = new List <ParticularAccessItem>(); IEnumerable <ParticularAccessItem> allItems = AccessItemList.Union(((ObjectAccessPermission)target).AccessItemList); if (target is ConditionalObjectAccessPermission) { resultItems.AddRange(allItems.Distinct()); } else { foreach (ParticularAccessItem item in allItems) { // only process items not already stored in the result set if (!resultItems.Exists(i => i.ObjectType == item.ObjectType && i.Access == item.Access)) { // a conditional item (with an actual condition) has precedence over unconditional items... // NOTE: multiple non mutually-exclusive conditional items will be ignored! ConditionalParticularAccessItem conditionalItem = item as ConditionalParticularAccessItem; if (conditionalItem == null || conditionalItem != null && string.IsNullOrEmpty(conditionalItem.Condition)) { var duplicateItems = allItems.Where(i => i.ObjectType == item.ObjectType && i.Access == item.Access && !object.ReferenceEquals(i, item)); conditionalItem = (ConditionalParticularAccessItem)duplicateItems.FirstOrDefault(i => i is ConditionalParticularAccessItem && !string.IsNullOrEmpty(((ConditionalParticularAccessItem)i).Condition)); } if (conditionalItem != null) { resultItems.Add(new ConditionalParticularAccessItem(conditionalItem.ObjectType, conditionalItem.Access, conditionalItem.Modifier, conditionalItem.Condition)); } else { resultItems.Add(new ParticularAccessItem(item.ObjectType, item.Access, item.Modifier)); } } } } ObjectAccessPermission result = (ObjectAccessPermission)Activator.CreateInstance(typeof(TActualResultType)); resultItems.ForEach(item => result.AccessItemList.Add(item)); return(result); } catch (Exception ex) { throw new Exception(ex.ToString()); } }
public override void FromXml(SecurityElement element) { base.FromXml(element); condition = null; if (element != null) { foreach (SecurityElement particularAccessItemElement in element.Children) { string tempCondition = particularAccessItemElement.Attribute(conditionAttr); if (condition != null && condition != tempCondition) { throw new ArgumentException("Stored particular access item conditions do not match!"); } condition = tempCondition ?? condition; } } var newAccessList = AccessItemList.Select(item => new ConditionalParticularAccessItem(item.ObjectType, item.Access, item.Modifier, condition)).ToList(); AccessItemList.Clear(); foreach (ParticularAccessItem item in newAccessList) { AccessItemList.Add(item); } }