public virtual void Validate(MigratingActivityInstance migratingInstance,
                                     MigratingProcessInstance migratingProcessInstance,
                                     MigratingActivityInstanceValidationReportImpl instanceReport)
        {
            var sourceScope = migratingInstance.SourceScope;
            var targetScope = migratingInstance.TargetScope;

            if (migratingInstance.Migrates())
            {
                var becomesNonScope = sourceScope.IsScope && !targetScope.IsScope;
                if (becomesNonScope)
                {
                    var dependentVariablesByName = GetMigratingVariableInstancesByName(migratingInstance);
                    foreach (var variableName in dependentVariablesByName.Keys)
                    {
                        if (dependentVariablesByName[variableName].Count > 1)
                        {
                            instanceReport.AddFailure("The variable '" + variableName +
                                                      "' exists in both, this scope and " +
                                                      "concurrent local in the parent scope. " +
                                                      "Migrating to a non-scope activity would overwrite one of them.");
                        }
                    }
                }
            }
        }
예제 #2
0
        public virtual void handle(MigratingInstanceParseContext parseContext, TransitionInstance transitionInstance)
        {
            if (!isAsyncTransitionInstance(transitionInstance))
            {
                return;
            }

            MigrationInstruction applyingInstruction = parseContext.getInstructionFor(transitionInstance.ActivityId);

            ScopeImpl sourceScope = parseContext.SourceProcessDefinition.findActivity(transitionInstance.ActivityId);
            ScopeImpl targetScope = null;

            if (applyingInstruction != null)
            {
                string activityId = applyingInstruction.TargetActivityId;
                targetScope = parseContext.TargetProcessDefinition.findActivity(activityId);
            }

            ExecutionEntity asyncExecution = Context.CommandContext.ExecutionManager.findExecutionById(transitionInstance.ExecutionId);

            MigratingTransitionInstance migratingTransitionInstance = parseContext.MigratingProcessInstance.addTransitionInstance(applyingInstruction, transitionInstance, sourceScope, targetScope, asyncExecution);

            MigratingActivityInstance parentInstance = parseContext.getMigratingActivityInstanceById(transitionInstance.ParentActivityInstanceId);

            migratingTransitionInstance.setParent(parentInstance);

            IList <JobEntity> jobs = asyncExecution.Jobs;

            parseContext.handleDependentTransitionInstanceJobs(migratingTransitionInstance, jobs);

            parseContext.handleDependentVariables(migratingTransitionInstance, collectTransitionInstanceVariables(migratingTransitionInstance));
        }
예제 #3
0
 public virtual void ParseTransitionInstances(MigratingInstanceParseContext parseContext,
                                              MigratingActivityInstance migratingInstance)
 {
     foreach (var transitionInstance in migratingInstance.ActivityInstance.ChildTransitionInstances)
     {
         parseContext.HandleTransitionInstance(transitionInstance);
     }
 }
예제 #4
0
 protected internal virtual void AddEmergingTimerJobs(MigratingActivityInstance owningInstance,
                                                      ICollection <TimerDeclarationImpl> emergingDeclarations)
 {
     foreach (var timerDeclaration in emergingDeclarations)
     {
         owningInstance.AddEmergingDependentInstance(new EmergingJobInstance(timerDeclaration));
     }
 }
예제 #5
0
 public virtual ProcessEngineException CannotDestroySubordinateInNonScope(
     MigratingActivityInstance activityInstance)
 {
     return
         (new ProcessEngineException(ExceptionMessage("006", "{}",
                                                      "Cannot destroy a subordinate of activity instance '{}'. Activity '{}' is not a scope",
                                                      activityInstance.ActivityInstance.Id, activityInstance.ActivityInstance.ActivityId)));
 }
예제 #6
0
 public virtual ProcessEngineException CannotBecomeSubordinateInNonScope(
     MigratingActivityInstance activityInstance)
 {
     return
         (new ProcessEngineException(ExceptionMessage("005", "{}",
                                                      "Cannot attach a subordinate to activity instance '{}'. Activity '{}' is not a scope",
                                                      activityInstance.ActivityInstance.Id, activityInstance.ActivityInstance.ActivityId)));
 }
 public virtual void Validate(MigratingActivityInstance migratingInstance,
                              MigratingProcessInstance migratingProcessInstance,
                              MigratingActivityInstanceValidationReportImpl instanceReport)
 {
     if (IsInvalid(migratingInstance))
     {
         instanceReport.AddFailure("There is no migration instruction for this instance's activity");
     }
 }
예제 #8
0
 public virtual void ParseDependentInstances(MigratingInstanceParseContext parseContext,
                                             MigratingActivityInstance migratingInstance)
 {
     parseContext.HandleDependentVariables(migratingInstance, CollectActivityInstanceVariables(migratingInstance));
     parseContext.HandleDependentActivityInstanceJobs(migratingInstance,
                                                      CollectActivityInstanceJobs(migratingInstance));
     parseContext.HandleDependentEventSubscriptions(migratingInstance,
                                                    CollectActivityInstanceEventSubscriptions(migratingInstance));
 }
예제 #9
0
 protected internal virtual void AddEmergingEventSubscriptions(MigratingActivityInstance owningInstance,
                                                               ICollection <EventSubscriptionDeclaration> emergingDeclarations)
 {
     foreach (var eventSubscriptionDeclaration in emergingDeclarations)
     {
         owningInstance.AddEmergingDependentInstance(
             new MigratingEventSubscriptionInstance(eventSubscriptionDeclaration));
     }
 }
예제 #10
0
 protected internal virtual IList <JobEntity> CollectActivityInstanceJobs(
     MigratingActivityInstance migratingInstance)
 {
     if (migratingInstance.SourceScope.IsScope)
     {
         //return migratingInstance.resolveRepresentativeExecution().Jobs;
     }
     return(null);
 }
        public virtual HistoryEvent CreateActivityInstanceMigrateEvt(MigratingActivityInstance actInstance)
        {
            // create event instance
            HistoricActivityInstanceEventEntity evt = LoadActivityInstanceEventEntity(actInstance.ResolveRepresentativeExecution());

            // initialize event
            InitActivityInstanceEvent(evt, actInstance, HistoryEventTypes.ActivityInstanceMigrate);

            return(evt);
        }
예제 #12
0
 protected internal virtual IList <JobEntity> collectActivityInstanceJobs(MigratingActivityInstance migratingInstance)
 {
     if (migratingInstance.SourceScope.Scope)
     {
         return(migratingInstance.resolveRepresentativeExecution().Jobs);
     }
     else
     {
         return(Collections.emptyList());
     }
 }
예제 #13
0
        protected internal virtual void handleIncident(MigratingInstanceParseContext parseContext, IncidentEntity incident)
        {
            MigratingActivityInstance owningInstance = parseContext.getMigratingActivityInstanceById(incident.Execution.ActivityInstanceId);

            if (owningInstance != null)
            {
                parseContext.consume(incident);
                MigratingIncident migratingIncident = new MigratingIncident(incident, owningInstance.TargetScope);
                owningInstance.addMigratingDependentInstance(migratingIncident);
            }
        }
예제 #14
0
        /// <summary>
        /// Migrate activity instances to their new activities and process definition. Creates new
        /// scope instances as necessary.
        /// </summary>
        protected internal virtual void migrateProcessInstance(MigratingProcessInstance migratingProcessInstance)
        {
            MigratingActivityInstance rootActivityInstance = migratingProcessInstance.RootInstance;

            MigratingProcessElementInstanceTopDownWalker walker = new MigratingProcessElementInstanceTopDownWalker(rootActivityInstance);

            walker.addPreVisitor(new MigratingActivityInstanceVisitor(executionBuilder.SkipCustomListeners, executionBuilder.SkipIoMappings));
            walker.addPreVisitor(new MigrationCompensationInstanceVisitor());

            walker.walkUntil();
        }
예제 #15
0
 protected internal virtual void addEmergingEventSubscriptions(MigratingActivityInstance owningInstance, IDictionary <string, EventSubscriptionDeclaration> targetDeclarations)
 {
     foreach (string key in targetDeclarations.Keys)
     {
         // the event subscription will be created
         EventSubscriptionDeclaration declaration = targetDeclarations[key];
         if (!declaration.StartEvent)
         {
             owningInstance.addEmergingDependentInstance(new MigratingEventSubscriptionInstance(declaration));
         }
     }
 }
예제 #16
0
        protected internal virtual MigratingActivityInstanceValidationReportImpl ValidateActivityInstance(
            MigratingActivityInstance migratingActivityInstance, MigratingProcessInstance migratingProcessInstance,
            IList <IMigratingActivityInstanceValidator> migratingActivityInstanceValidators)
        {
            var instanceReport = new MigratingActivityInstanceValidationReportImpl(migratingActivityInstance);

            foreach (var migratingActivityInstanceValidator in migratingActivityInstanceValidators)
            {
                migratingActivityInstanceValidator.Validate(migratingActivityInstance, migratingProcessInstance,
                                                            instanceReport);
            }
            return(instanceReport);
        }
예제 #17
0
        public virtual void OnParseMigratingInstance(MigratingInstanceParseContext parseContext,
                                                     MigratingActivityInstance migratingInstance)
        {
            var execution = migratingInstance.ResolveRepresentativeExecution();

            foreach (ExternalTaskEntity task in execution.ExternalTasks)
            {
                var migratingTask = new MigratingExternalTaskInstance(task, migratingInstance);
                migratingInstance.AddMigratingDependentInstance(migratingTask);
                parseContext.Consume(task);
                parseContext.Submit(migratingTask);
            }
        }
예제 #18
0
        public virtual void Handle(MigratingInstanceParseContext parseContext, IActivityInstance element)
        {
            MigratingActivityInstance migratingInstance = null;

            var       applyingInstruction     = parseContext.GetInstructionFor(element.ActivityId);
            ScopeImpl sourceScope             = null;
            ScopeImpl targetScope             = null;
            var       representativeExecution = parseContext.Mapping.GetExecution(element);

            if (element.Id.Equals(element.ProcessInstanceId))
            {
                sourceScope = parseContext.SourceProcessDefinition;
                targetScope = parseContext.TargetProcessDefinition;
            }
            else
            {
                sourceScope = (ScopeImpl)parseContext.SourceProcessDefinition.FindActivity(element.ActivityId);

                if (applyingInstruction != null)
                {
                    var activityId = applyingInstruction.TargetActivityId;
                    targetScope = (ScopeImpl)parseContext.TargetProcessDefinition.FindActivity(activityId);
                }
            }

            migratingInstance = parseContext.MigratingProcessInstance.AddActivityInstance(applyingInstruction, element,
                                                                                          sourceScope, targetScope, representativeExecution);

            var parentInstance = parseContext.GetMigratingActivityInstanceById(element.ParentActivityInstanceId);

            if (parentInstance != null)
            {
                //migratingInstance.setParent(parentInstance);
            }

            //JAVA TO C# CONVERTER WARNING: Java wildcard generics have no direct equivalent in .NET:
            //ORIGINAL LINE: org.camunda.bpm.engine.impl.core.delegate.CoreActivityBehavior<object> sourceActivityBehavior = sourceScope.getActivityBehavior();
            var sourceActivityBehavior = sourceScope.ActivityBehavior;

            if (sourceActivityBehavior is IMigrationObserverBehavior)
            {
                ((IMigrationObserverBehavior)sourceActivityBehavior).OnParseMigratingInstance(parseContext,
                                                                                              migratingInstance);
            }

            parseContext.Submit(migratingInstance);

            ParseTransitionInstances(parseContext, migratingInstance);

            ParseDependentInstances(parseContext, migratingInstance);
        }
        public virtual void Validate(MigratingActivityInstance migratingInstance,
                                     MigratingProcessInstance migratingProcessInstance,
                                     MigratingActivityInstanceValidationReportImpl instanceReport)
        {
            var sourceScope = migratingInstance.SourceScope;

            if (sourceScope != sourceScope.ProcessDefinition)
            {
                var sourceActivity = (ActivityImpl)migratingInstance.SourceScope;

                if (!SupportedActivityValidator.Instance.IsSupportedActivity(sourceActivity))
                {
                    instanceReport.AddFailure(
                        "The type of the source activity is not supported for activity instance migration");
                }
            }
        }
        protected internal virtual void InitActivityInstanceEvent(HistoricActivityInstanceEventEntity evt, MigratingActivityInstance migratingActivityInstance, IHistoryEventType eventType)
        {
            IPvmScope eventSource        = migratingActivityInstance.TargetScope;
            string    activityInstanceId = migratingActivityInstance.ActivityInstanceId;

            MigratingActivityInstance parentInstance = (MigratingActivityInstance)migratingActivityInstance.Parent;
            string parentActivityInstanceId          = null;

            if (parentInstance != null)
            {
                parentActivityInstanceId = parentInstance.ActivityInstanceId;
            }

            ExecutionEntity execution = migratingActivityInstance.ResolveRepresentativeExecution();

            InitActivityInstanceEvent(evt, execution, eventSource, activityInstanceId, parentActivityInstanceId, eventType);
        }
예제 #21
0
        public virtual void OnParseMigratingInstance(MigratingInstanceParseContext parseContext,
                                                     MigratingActivityInstance migratingInstance)
        {
            var callActivity = (ActivityImpl)migratingInstance.SourceScope;

            // A call activity is typically scope and since we guarantee stability of scope executions during migration,
            // the superExecution link does not have to be maintained during migration.
            // There are some exceptions, though: A multi-instance call activity is not scope and therefore
            // does not have a dedicated scope execution. In this case, the link to the super execution
            // must be maintained throughout migration
            if (!callActivity.IsScope)
            {
                var callActivityExecution = migratingInstance.ResolveRepresentativeExecution();
                //CaseExecutionEntity calledCaseInstance = callActivityExecution.getSubCaseInstance();
                //migratingInstance.addMigratingDependentInstance(new MigratingCalledCaseInstance(calledCaseInstance));
            }
        }
        GetMigratingVariableInstancesByName(MigratingActivityInstance activityInstance)
        {
            IDictionary <string, IList <MigratingVariableInstance> > result =
                new Dictionary <string, IList <MigratingVariableInstance> >();

            foreach (var migratingInstance in activityInstance.MigratingDependentInstances)
            {
                if (migratingInstance is MigratingVariableInstance)
                {
                    var migratingVariableInstance = (MigratingVariableInstance)migratingInstance;
                    CollectionUtil.AddToMapOfLists(result, migratingVariableInstance.VariableName,
                                                   migratingVariableInstance);
                }
            }

            return(result);
        }
예제 #23
0
        public virtual void Handle(MigratingInstanceParseContext parseContext,
                                   MigratingActivityInstance activityInstance, IList <JobEntity> elements)
        {
            var timerDeclarationsInEventScope = GetTimerDeclarationsByTriggeringActivity(activityInstance.TargetScope);

            foreach (var job in elements)
            {
                if (!IsTimerJob(job))
                {
                    continue;
                }

                //var migrationInstruction = parseContext.findSingleMigrationInstruction(job.ActivityId);
                //var targetActivity = parseContext.getTargetActivity(migrationInstruction);

                //if (targetActivity != null && activityInstance.migratesTo(targetActivity.EventScope))
                //{
                //    // the timer job is migrated
                //    JobDefinitionEntity targetJobDefinitionEntity =
                //        parseContext.getTargetJobDefinition(targetActivity.ActivityId, job.JobHandlerType);

                //    TimerDeclarationImpl targetTimerDeclaration = timerDeclarationsInEventScope.Remove(targetActivity.Id);

                //    MigratingJobInstance migratingTimerJobInstance = new MigratingTimerJobInstance(job,
                //        targetJobDefinitionEntity, targetActivity, migrationInstruction.UpdateEventTrigger,
                //        targetTimerDeclaration);
                //    activityInstance.addMigratingDependentInstance(migratingTimerJobInstance);
                //    parseContext.submit(migratingTimerJobInstance);
                //}
                //else
                //{
                //    // the timer job is removed
                //    MigratingJobInstance removingJobInstance = new MigratingTimerJobInstance(job);
                //    activityInstance.addRemovingDependentInstance(removingJobInstance);
                //    parseContext.submit(removingJobInstance);
                //}

                parseContext.Consume(job);
            }

            if (activityInstance.Migrates())
            {
                AddEmergingTimerJobs(activityInstance, timerDeclarationsInEventScope.Values);
            }
        }
예제 #24
0
        protected internal virtual void validateInstructions(CommandContext commandContext, MigratingProcessInstance migratingProcessInstance, MigratingProcessInstanceValidationReportImpl processInstanceReport)
        {
            IList <MigratingActivityInstanceValidator>     migratingActivityInstanceValidators     = commandContext.ProcessEngineConfiguration.MigratingActivityInstanceValidators;
            IList <MigratingTransitionInstanceValidator>   migratingTransitionInstanceValidators   = commandContext.ProcessEngineConfiguration.MigratingTransitionInstanceValidators;
            IList <MigratingCompensationInstanceValidator> migratingCompensationInstanceValidators = commandContext.ProcessEngineConfiguration.MigratingCompensationInstanceValidators;

            IDictionary <MigratingActivityInstance, MigratingActivityInstanceValidationReportImpl> instanceReports = new Dictionary <MigratingActivityInstance, MigratingActivityInstanceValidationReportImpl>();

            foreach (MigratingActivityInstance migratingActivityInstance in migratingProcessInstance.MigratingActivityInstances)
            {
                MigratingActivityInstanceValidationReportImpl instanceReport = validateActivityInstance(migratingActivityInstance, migratingProcessInstance, migratingActivityInstanceValidators);
                instanceReports[migratingActivityInstance] = instanceReport;
            }

            foreach (MigratingEventScopeInstance migratingEventScopeInstance in migratingProcessInstance.MigratingEventScopeInstances)
            {
                MigratingActivityInstance ancestorInstance = migratingEventScopeInstance.ClosestAncestorActivityInstance;

                validateEventScopeInstance(migratingEventScopeInstance, migratingProcessInstance, migratingCompensationInstanceValidators, instanceReports[ancestorInstance]);
            }

            foreach (MigratingCompensationEventSubscriptionInstance migratingEventSubscriptionInstance in migratingProcessInstance.MigratingCompensationSubscriptionInstances)
            {
                MigratingActivityInstance ancestorInstance = migratingEventSubscriptionInstance.ClosestAncestorActivityInstance;

                validateCompensateSubscriptionInstance(migratingEventSubscriptionInstance, migratingProcessInstance, migratingCompensationInstanceValidators, instanceReports[ancestorInstance]);
            }

            foreach (MigratingActivityInstanceValidationReportImpl instanceReport in instanceReports.Values)
            {
                if (instanceReport.hasFailures())
                {
                    processInstanceReport.addActivityInstanceReport(instanceReport);
                }
            }

            foreach (MigratingTransitionInstance migratingTransitionInstance in migratingProcessInstance.MigratingTransitionInstances)
            {
                MigratingTransitionInstanceValidationReportImpl instanceReport = validateTransitionInstance(migratingTransitionInstance, migratingProcessInstance, migratingTransitionInstanceValidators);
                if (instanceReport.hasFailures())
                {
                    processInstanceReport.addTransitionInstanceReport(instanceReport);
                }
            }
        }
        public virtual void OnParseMigratingInstance(MigratingInstanceParseContext parseContext,
                                                     MigratingActivityInstance migratingInstance)
        {
            ExecutionEntity scopeExecution = migratingInstance.ResolveRepresentativeExecution();

            IList <IActivityExecution> concurrentInActiveExecutions = scopeExecution.FindInactiveChildExecutions(GetInnerActivity((ActivityImpl)migratingInstance.SourceScope));

            //variables on ended inner instance executions need not be migrated anywhere
            //since they are also not represented in the tree of migrating instances, we remove
            // them from the parse context here to avoid a validation exception
            foreach (IActivityExecution execution in concurrentInActiveExecutions)
            {
                foreach (VariableInstanceEntity variable in ((ExecutionEntity)execution).VariablesInternal)
                {
                    parseContext.Consume(variable);
                }
            }
        }
예제 #26
0
        public virtual void handle(MigratingInstanceParseContext parseContext, MigratingActivityInstance activityInstance, IList <JobEntity> elements)
        {
            IDictionary <string, TimerDeclarationImpl> sourceTimerDeclarationsInEventScope = getTimerDeclarationsByTriggeringActivity(activityInstance.SourceScope);
            IDictionary <string, TimerDeclarationImpl> targetTimerDeclarationsInEventScope = getTimerDeclarationsByTriggeringActivity(activityInstance.TargetScope);

            foreach (JobEntity job in elements)
            {
                if (!isTimerJob(job))
                {
                    // skip non timer jobs
                    continue;
                }

                MigrationInstruction migrationInstruction = parseContext.findSingleMigrationInstruction(job.ActivityId);
                ActivityImpl         targetActivity       = parseContext.getTargetActivity(migrationInstruction);

                if (targetActivity != null && activityInstance.migratesTo(targetActivity.EventScope))
                {
                    // the timer job is migrated
                    JobDefinitionEntity targetJobDefinitionEntity = parseContext.getTargetJobDefinition(targetActivity.ActivityId, job.JobHandlerType);

                    TimerDeclarationImpl targetTimerDeclaration = targetTimerDeclarationsInEventScope.Remove(targetActivity.Id);

                    MigratingJobInstance migratingTimerJobInstance = new MigratingTimerJobInstance(job, targetJobDefinitionEntity, targetActivity, migrationInstruction.UpdateEventTrigger, targetTimerDeclaration);
                    activityInstance.addMigratingDependentInstance(migratingTimerJobInstance);
                    parseContext.submit(migratingTimerJobInstance);
                }
                else
                {
                    // the timer job is removed
                    MigratingJobInstance removingJobInstance = new MigratingTimerJobInstance(job);
                    activityInstance.addRemovingDependentInstance(removingJobInstance);
                    parseContext.submit(removingJobInstance);
                }

                parseContext.consume(job);
            }

            if (activityInstance.migrates())
            {
                addEmergingTimerJobs(parseContext, activityInstance, sourceTimerDeclarationsInEventScope, targetTimerDeclarationsInEventScope);
            }
        }
예제 #27
0
        public virtual void validate(MigratingActivityInstance migratingInstance, MigratingProcessInstance migratingProcessInstance, MigratingActivityInstanceValidationReportImpl instanceReport)
        {
            ScopeImpl sourceScope = migratingInstance.SourceScope;
            ScopeImpl targetScope = migratingInstance.TargetScope;

            if (migratingInstance.migrates())
            {
                bool becomesNonScope = sourceScope.Scope && !targetScope.Scope;
                if (becomesNonScope)
                {
                    IDictionary <string, IList <MigratingVariableInstance> > dependentVariablesByName = getMigratingVariableInstancesByName(migratingInstance);
                    foreach (string variableName in dependentVariablesByName.Keys)
                    {
                        if (dependentVariablesByName[variableName].Count > 1)
                        {
                            instanceReport.addFailure("The variable '" + variableName + "' exists in both, this scope and " + "concurrent local in the parent scope. " + "Migrating to a non-scope activity would overwrite one of them.");
                        }
                    }
                }
            }
        }
예제 #28
0
        protected internal virtual IList <VariableInstanceEntity> CollectActivityInstanceVariables(
            MigratingActivityInstance instance)
        {
            throw new NotImplementedException();
            IList <VariableInstanceEntity> variables = new List <VariableInstanceEntity>();
            var representativeExecution = instance.ResolveRepresentativeExecution();

            //ExecutionEntity parentExecution = representativeExecution.Parent;

            // decide for representative execution and parent execution whether to none/all/concurrentLocal variables
            // belong to this activity instance
            //var addAllRepresentativeExecutionVariables = instance.SourceScope.Scope ||
            //                                             representativeExecution.Concurrent;

            //if (addAllRepresentativeExecutionVariables)
            //{
            //    ((List<VariableInstanceEntity>) variables).AddRange(representativeExecution.VariablesInternal);
            //}
            //else
            //{
            //    ((List<VariableInstanceEntity>) variables).AddRange(getConcurrentLocalVariables(representativeExecution));
            //}

            //var addAnyParentExecutionVariables = parentExecution != null && instance.SourceScope.Scope;
            //if (addAnyParentExecutionVariables)
            //{
            //    bool addAllParentExecutionVariables = parentExecution.Concurrent;

            //    if (addAllParentExecutionVariables)
            //    {
            //        ((List<VariableInstanceEntity>) variables).AddRange(parentExecution.VariablesInternal);
            //    }
            //    else
            //    {
            //        ((List<VariableInstanceEntity>) variables).AddRange(getConcurrentLocalVariables(parentExecution));
            //    }
            //}

            return(variables);
        }
예제 #29
0
        public virtual void OnParseMigratingInstance(MigratingInstanceParseContext parseContext,
                                                     MigratingActivityInstance migratingInstance)
        {
            ExecutionEntity execution = migratingInstance.ResolveRepresentativeExecution();

            foreach (TaskEntity task in execution.Tasks)
            {
                migratingInstance.AddMigratingDependentInstance(new MigratingUserTaskInstance(task, migratingInstance));
                parseContext.Consume(task);

                ICollection <ICoreVariableInstance> variables = task.VariablesInternal;

                if (variables != null)
                {
                    foreach (VariableInstanceEntity variable in variables)
                    {
                        // we don't need to represent ITask variables in the migrating instance structure because
                        // they are migrated by the MigratingTaskInstance as well
                        parseContext.Consume(variable);
                    }
                }
            }
        }
예제 #30
0
        public virtual void handle(MigratingInstanceParseContext parseContext, MigratingActivityInstance owningInstance, IList <EventSubscriptionEntity> elements)
        {
            IDictionary <string, EventSubscriptionDeclaration> targetDeclarations = getDeclarationsByTriggeringActivity(owningInstance.TargetScope);

            foreach (EventSubscriptionEntity eventSubscription in elements)
            {
                if (!SupportedEventTypes.Contains(eventSubscription.EventType))
                {
                    // ignore unsupported event subscriptions
                    continue;
                }

                MigrationInstruction migrationInstruction = parseContext.findSingleMigrationInstruction(eventSubscription.ActivityId);
                ActivityImpl         targetActivity       = parseContext.getTargetActivity(migrationInstruction);

                if (targetActivity != null && owningInstance.migratesTo(targetActivity.EventScope))
                {
                    // the event subscription is migrated
                    EventSubscriptionDeclaration targetDeclaration = targetDeclarations.Remove(targetActivity.Id);

                    owningInstance.addMigratingDependentInstance(new MigratingEventSubscriptionInstance(eventSubscription, targetActivity, migrationInstruction.UpdateEventTrigger, targetDeclaration));
                }
                else
                {
                    // the event subscription will be removed
                    owningInstance.addRemovingDependentInstance(new MigratingEventSubscriptionInstance(eventSubscription));
                }

                parseContext.consume(eventSubscription);
            }

            if (owningInstance.migrates())
            {
                addEmergingEventSubscriptions(owningInstance, targetDeclarations);
            }
        }