예제 #1
0
        public virtual IProcessInstance Execute(CommandContext commandContext)
        {
            var                     processEngineConfiguration = context.Impl.Context.ProcessEngineConfiguration;
            DeploymentCache         deploymentCache            = processEngineConfiguration.DeploymentCache;
            ProcessDefinitionEntity processDefinition          =
                deploymentCache.FindDeployedProcessDefinitionById(ProcessDefinitionId);

            EnsureUtil.EnsureNotNull("No process definition found for id = '" + ProcessDefinitionId + "'",
                                     "processDefinition", processDefinition);

            foreach (var checker in commandContext.ProcessEngineConfiguration.CommandCheckers)
            {
                checker.CheckCreateProcessInstance(processDefinition);
            }

            ExecutionEntity processInstance = null;

            if (!ReferenceEquals(BusinessKey, null))
            {
                processInstance = (ExecutionEntity)processDefinition.CreateProcessInstance(BusinessKey);
            }
            else
            {
                processInstance = (ExecutionEntity)processDefinition.CreateProcessInstance();
            }

            //if the start event is async, we have to set the variables already here
            //since they are lost after the async continuation otherwise
            if (processDefinition.Initial.AsyncBefore)
            {
                // avoid firing history events
                processInstance.StartContext = new ProcessInstanceStartContext(processInstance.Activity as ActivityImpl);
                FormPropertyHelper.InitFormPropertiesOnScope(Variables, processInstance);
                processInstance.Start();
            }
            else
            {
                processInstance.StartWithFormProperties(Variables);
            }


            return((IProcessInstance)processInstance);
        }