Here is the function to populate assignments if there are new:
private void ApplyRoleAssigments(SPListItem item)
{
var newAssignments = new List<SPRoleAssignment>();
var current = from rol in item.RoleAssignments.Cast<SPRoleAssignment>()
select rol;
List<SPRoleAssignment> currentAssigments = current.ToList();
IEnumerable<SPRoleAssignment> differenceNewAssigments = newAssignments.Except(currentAssigments,
new SpRoleAssigementComparer());
IEnumerable<SPRoleAssignment> differenceCurrentAssigments = currentAssigments.Except(newAssignments,
new SpRoleAssigementComparer());
if (differenceNewAssigments.Count() > 0 || differenceCurrentAssigments.Count() > 0)
{
SPSecurity.RunWithElevatedPrivileges(() =>
SharePointHelper.InvokeInSPListItemContext(operationContext, item.ParentList.RootFolder.ToString(), item.ID, (site, web, list, item_) =>
{
SharePointHelper.DisableEventFiring();
SPGroupHelper.ResetRoleAssignments(item_);
item_.RoleAssignments.Add(newAssignments);
item_.SystemUpdate();
SharePointHelper.EnableEventFiring();
}));
}
}
{
var newAssignments = new List<SPRoleAssignment>();
var current = from rol in item.RoleAssignments.Cast<SPRoleAssignment>()
select rol;
List<SPRoleAssignment> currentAssigments = current.ToList();
IEnumerable<SPRoleAssignment> differenceNewAssigments = newAssignments.Except(currentAssigments,
new SpRoleAssigementComparer());
IEnumerable<SPRoleAssignment> differenceCurrentAssigments = currentAssigments.Except(newAssignments,
new SpRoleAssigementComparer());
if (differenceNewAssigments.Count() > 0 || differenceCurrentAssigments.Count() > 0)
{
SPSecurity.RunWithElevatedPrivileges(() =>
SharePointHelper.InvokeInSPListItemContext(operationContext, item.ParentList.RootFolder.ToString(), item.ID, (site, web, list, item_) =>
{
SharePointHelper.DisableEventFiring();
SPGroupHelper.ResetRoleAssignments(item_);
item_.RoleAssignments.Add(newAssignments);
item_.SystemUpdate();
SharePointHelper.EnableEventFiring();
}));
}
}
Here is a custom IEqualityComparer<SPRoleAssignment>
public class SpRoleAssigementComparer : IEqualityComparer<SPRoleAssignment>
{
public bool Equals(SPRoleAssignment x, SPRoleAssignment y)
{
//Check whether the compared objects reference the same data.
if (ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (ReferenceEquals(x, null) || ReferenceEquals(y, null))
return false;
if (x.Member == null || y.Member == null)
{
return false;
}
if (x.Member.Name == y.Member.Name && x.RoleDefinitionBindings.Xml == y.RoleDefinitionBindings.Xml)
return true;
return false;
}
public int GetHashCode(SPRoleAssignment obj)
{
return obj.ToString().ToLower().GetHashCode();
}
}
No comments:
Post a Comment