/// <summary>
		/// Removes a <paramref name="role"/> from this <see cref="RoleOwner"/>.
		/// </summary>
		/// <param name="role">The <see cref="Role"/>.</param>
		public void Remove(Role role)
		{
			// validate arguments
			if (role == null)
				throw new ArgumentNullException("role");
			roles.Remove(role.Id);
		}
		/// <summary>
		/// Adds a <paramref name="role"/> to this <see cref="RoleOwner"/>.
		/// </summary>
		/// <param name="role">The <see cref="Role"/>.</param>
		public void Add(Role role)
		{
			// validate arguments
			if (role == null)
				throw new ArgumentNullException("role");
			roles.Add(role.Id, role);
		}
        /// <summary>
        /// Adds a <paramref name="role"/> to the <paramref name="owner"/>.
        /// </summary>
        /// <param name="context">The <see cref="IMansionContext"/>.</param>
        /// <param name="owner">The <see cref="RoleOwner"/>.</param>
        /// <param name="role">The <see cref="Role"/>.</param>
        public void AssignRole(IMansionContext context, RoleOwner owner, Role role)
        {
            // validate arguments
            if (context == null)
                throw new ArgumentNullException("context");
            if (owner == null)
                throw new ArgumentNullException("owner");
            if (role == null)
                throw new ArgumentNullException("role");

            // get the repository
            var repository = context.Repository;

            // retrieve the required nodes
            var ownerNode = RetrieveRoleOwnerNode(context, owner, repository);
            var roleNode = RetrieveRoleNode(context, role, repository);

            // update the role owner
            repository.UpdateNode(context, ownerNode, new PropertyBag
                                                      {
                                                      	{"assignedRoleGuids", string.Join(",", new[] {ownerNode.Get(context, "assignedRoleGuids", string.Empty), roleNode.Get<string>(context, "guid")})}
                                                      });
        }
        /// <summary>
        /// Creates the new <paramref name="permission"/> on the <paramref name="role"/>.
        /// </summary>
        /// <param name="context">The <see cref="IMansionContext"/>.</param>
        /// <param name="role">The <see cref="Role"/>.</param>
        /// <param name="permission">The <see cref="Permission"/>.</param>
        public void CreatePermission(IMansionContext context, Role role, Permission permission)
        {
            // validate arguments
            if (context == null)
                throw new ArgumentNullException("context");
            if (role == null)
                throw new ArgumentNullException("role");
            if (permission == null)
                throw new ArgumentNullException("permission");

            // get the repository
            var repository = context.Repository;

            // retrieve the role
            var roleNode = RetrieveRoleNode(context, role, repository);

            // store the permission
            var permissionPrefix = permission.Operation.Resource.Id + "_" + permission.Operation.Id + "_";
            repository.UpdateNode(context, roleNode, new PropertyBag
                                                     {
                                                     	{permissionPrefix + "granted", permission.Granted},
                                                     	{permissionPrefix + "priority", permission.Priority},
                                                     });
        }
        /// <summary>
        /// Maps a <paramref name="roleNode"/> to <see cref="Role"/>.
        /// </summary>
        /// <param name="context"></param>
        /// <param name="roleNode"></param>
        /// <returns></returns>
        private Role MapRole(IMansionContext context, Node roleNode)
        {
            // create the role
            var role = new Role(roleNode.PermanentId);

            // find all the properties ending with _granted
            foreach (var property in roleNode.Where(x => x.Key.EndsWith(GrantedPostfix, StringComparison.OrdinalIgnoreCase)))
            {
                // get the resourceId and operationId
                var permissionParts = property.Key.Substring(0, property.Key.Length - GrantedPostfix.Length).Split(new[] {'_'}, StringSplitOptions.RemoveEmptyEntries);
                if (permissionParts.Length != 2)
                    throw new InvalidOperationException(string.Format("Invalid permission '{0}' found in role '{1}'", property.Key, roleNode.Pointer.PathString));
                var resourceId = permissionParts[0];
                var operationId = permissionParts[1];
                var permissionPrefix = resourceId + "_" + operationId + "_";

                // create the operation
                var operation = ProtectedOperation.Create(context, resourceId, operationId);

                // create the permission
                var permission = new Permission
                                 {
                                 	Granted = roleNode.Get(context, permissionPrefix + "granted", false),
                                 	Operation = operation,
                                 	Priority = roleNode.Get(context, permissionPrefix + "priority", 5)
                                 };

                // add the permission to the role
                role.Add(permission);
            }

            // return the role
            return role;
        }
 /// <summary>
 /// Retrieves the role node.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="role"></param>
 /// <param name="repository"></param>
 /// <returns></returns>
 private static Node RetrieveRoleNode(IMansionContext context, Role role, IRepository repository)
 {
     var node = repository.RetrieveSingleNode(context, new PropertyBag
                                                       {
                                                       	{"baseType", "Role"},
                                                       	{"guid", role.Id},
                                                       	{"bypassAuthorization", true},
                                                       	{StorageOnlyQueryComponent.PropertyKey, true}
                                                       });
     if (node == null)
         throw new InvalidOperationException(string.Format("Could not find role with ID {0} in repository, please sync tables", role.Id));
     return node;
 }
        /// <summary>
        /// Removes a <paramref name="role"/> from the <paramref name="owner"/>.
        /// </summary>
        /// <param name="context">The <see cref="IMansionContext"/>.</param>
        /// <param name="owner">The <see cref="RoleOwner"/>.</param>
        /// <param name="role">The <see cref="Role"/>.</param>
        public void RemoveRole(IMansionContext context, RoleOwner owner, Role role)
        {
            // validate arguments
            if (context == null)
                throw new ArgumentNullException("context");
            if (owner == null)
                throw new ArgumentNullException("owner");
            if (role == null)
                throw new ArgumentNullException("role");

            // get the repository
            var repository = context.Repository;

            // retrieve the required nodes
            var ownerNode = RetrieveRoleOwnerNode(context, owner, repository);
            var roleNode = RetrieveRoleNode(context, role, repository);

            // build the userGuids array
            var assignedRoleList = (ownerNode.Get(context, "assignedRoleGuids", string.Empty).Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries)).ToList();
            assignedRoleList.Remove(roleNode.Get<string>(context, "guid"));

            // update the user group
            repository.UpdateNode(context, ownerNode, new PropertyBag
                                                      {
                                                      	{"assignedRoleGuids", string.Join(",", assignedRoleList)}
                                                      });
        }
        /// <summary>
        /// Deletes the <paramref name="permission"/> from the <paramref name="role"/>.
        /// </summary>
        /// <param name="context">The <see cref="IMansionContext"/>.</param>
        /// <param name="role">The <see cref="Role"/>.</param>
        /// <param name="permission">The <see cref="Permission"/>.</param>
        public void DeletePermission(IMansionContext context, Role role, Permission permission)
        {
            // validate arguments
            if (context == null)
                throw new ArgumentNullException("context");
            if (role == null)
                throw new ArgumentNullException("role");

            throw new System.NotImplementedException();
        }