protected void changeCandidates_ExecuteStep(object data)
        {
            ChangeAssigneesParam cap = JSONSerializerExecute.Deserialize<ChangeAssigneesParam>(data);

            IWfProcess process = WfRuntime.GetProcessByProcessID(cap.ProcessID);

            CheckPermission(process);

            foreach (IWfActivity activity in process.Activities)
            {
                if (activity.Status != WfActivityStatus.Completed && activity.Status != WfActivityStatus.Aborted)
                {
                    if (activity.Candidates.Contains(cap.OriginalUser.ID))
                    {
                        WfReplaceAssigneesExecutor executor = new WfReplaceAssigneesExecutor(null, activity, cap.OriginalUser, cap.Users);

                        executor.ExecuteNotPersist();
                    }
                }
            }

            WfRuntime.PersistWorkflows();
        }
		public int DisplaceUserInProcess(string processID, string userID, string[] displacingUserIDArray)
		{
			IUser originalUser = OguMechanismFactory.GetMechanism().GetObjects<IUser>(SearchOUIDType.Guid, userID).FirstOrDefault();

			OguObjectCollection<IUser> displacingUsers = OguMechanismFactory.GetMechanism().GetObjects<IUser>(SearchOUIDType.Guid, displacingUserIDArray);

			List<IUser> distinctUsers = new List<IUser>();

			foreach (IUser user in displacingUsers)
			{
				if (distinctUsers.Exists(u => u.ID == user.ID) == false)
					distinctUsers.Add(user);
			}

			IWfProcess process = WfRuntime.GetProcessByProcessID(processID);

			int result = 0;

			foreach (IWfActivity activity in process.Activities)
			{
				bool needReplace = false;

				if (activity.Status != WfActivityStatus.Completed && activity.Status != WfActivityStatus.Aborted)
				{
					if (activity.Status == WfActivityStatus.Running || activity.Status == WfActivityStatus.Pending)
						needReplace = activity.Assignees.Contains(originalUser.ID);
					else
						needReplace = activity.Candidates.Contains(originalUser.ID);

					if (needReplace)
					{
						WfReplaceAssigneesExecutor executor = new WfReplaceAssigneesExecutor(null, activity, originalUser, distinctUsers);

						executor.ExecuteNotPersist();
						result++;
					}
				}
			}

			using (TransactionScope scope = TransactionScopeFactory.Create())
			{
				WfReplaceAssigneesExecutor.DoUserTaskOperations();
				WfRuntime.PersistWorkflows();

				scope.Complete();
			}

			return result;
		}