/// <inheritdoc />
        protected override bool InternalExecute(ProcessExecutingContext context)
        {
            bool isRedo = (Status == ProcessStatus.Error && CurrentActivityId == Guid.Empty &&
                           !ProcessUserTaskUtilities.GetIsActivityCreated(UserConnection, UId));
            bool isRunning = !CurrentActivityId.Equals(Guid.Empty) && !IsActivityCompleted;

            if (!isRunning || isRedo)
            {
                var            editMode = (RecordEditMode)Enum.ToObject(typeof(RecordEditMode), EditMode);
                bool           isActivityEntitySchema = GetIsActivityEntitySchema();
                Entity         activity      = null;
                IProcessEngine processEngine = UserConnection.ProcessEngine;
                if (isActivityEntitySchema)
                {
                    if (editMode == RecordEditMode.New)
                    {
                        activity = CreateActivity();
                        RecordId = CurrentActivityId;
                    }
                    else
                    {
                        CurrentActivityId = RecordId;
                    }
                }
                else
                {
                    Entity           accompaningActivity  = CreateAccompaningActivity();
                    CoreEntitySchema activityEntitySchema = GetActivityEntitySchema();
                    Guid             resultColumnUId      = activityEntitySchema.Columns.GetByName("Status").UId;
                    processEngine.AddProcessListener(accompaningActivity, UId,
                                                     GetConditionData(resultColumnUId, accompaningActivity));
                    if (editMode == RecordEditMode.New)
                    {
                        RecordId = Guid.NewGuid();
                    }
                }
                string serializedFilters = IsMatchConditions && DataSourceFilters.IsNotNullOrEmpty()
                                        ? ConvertToProcessDataSourceFilters(ObjectSchemaId, DataSourceFilters)
                                        : null;
                if (activity == null)
                {
                    if (editMode != RecordEditMode.New)
                    {
                        processEngine.AddProcessListener(RecordId, ObjectSchemaId, UId, serializedFilters);
                    }
                    else
                    {
                        processEngine.AddProcessListener(RecordId, ObjectSchemaId, UId, null, null,
                                                         EntityChangeType.Inserted);
                    }
                }
                else
                {
                    processEngine.AddProcessListener(activity, UId, serializedFilters);
                }
            }
            InteractWithUser(context, isRunning, ShowExecutionPage);
            return(false);
        }
        /// <inheritdoc />
        public override bool CompleteExecuting(params object[] parameters)
        {
            bool isActivityEntitySchema = GetIsActivityEntitySchema();
            Guid activityStatusId       = isActivityEntitySchema
                                ? Guid.Empty
                                : ProcessUserTaskUtilities.GetActivityStatus(UserConnection, CurrentActivityId);
            IProcessEngine processEngine = UserConnection.ProcessEngine;

            if (GetIsMatchedConditions())
            {
                if (!isActivityEntitySchema && activityStatusId != ActivityConsts.CanceledStatusUId)
                {
                    activityStatusId = ActivityConsts.CompletedStatusUId;
                }
                processEngine.RemoveActivityProcessListener(CurrentActivityId, UId, activityStatusId);
                if (!GetIsActivityEntitySchema())
                {
                    var editMode = (RecordEditMode)Enum.ToObject(typeof(RecordEditMode), EditMode);
                    EntityChangeType entityChangeType = editMode == RecordEditMode.New
                                                ? EntityChangeType.Inserted
                                                : EntityChangeType.Updated;
                    processEngine.RemoveProcessListener(RecordId, ObjectSchemaId, UId, entityChangeType);
                }
                if (GenerateDecisionsFromColumn)
                {
                    ResultParameter = GetResultParameter();
                }
                return(base.CompleteExecuting(parameters));
            }
            if ((RecordEditMode)Enum.ToObject(typeof(RecordEditMode), EditMode) == RecordEditMode.New)
            {
                string serializedFilters = IsMatchConditions && DataSourceFilters.IsNotNullOrEmpty()
                                        ? ConvertToProcessDataSourceFilters(ObjectSchemaId, DataSourceFilters)
                                        : null;
                processEngine.AddProcessListener(RecordId, ObjectSchemaId, UId, serializedFilters);
                EditMode = (int)RecordEditMode.Existing;
            }
            if (activityStatusId == ActivityConsts.NewStatusUId)
            {
                ProcessUserTaskUtilities.SetActivityStatus(UserConnection, CurrentActivityId,
                                                           ActivityConsts.InProgressUId);
            }
            return(false);
        }