protected internal virtual IList <IProcessDefinitionEntity> FindProcessDefinition(ICommandContext commandContext)
        {
            // If process definition is already provided (eg. when command is called through the DeployCmd)
            // we don't need to do an extra database fetch and we can simply return it, wrapped in a list
            if (processDefinitionEntity != null)
            {
                return(new List <IProcessDefinitionEntity>(new IProcessDefinitionEntity[] { processDefinitionEntity }));
            }

            // Validation of input parameters
            if (string.IsNullOrWhiteSpace(processDefinitionId) && string.IsNullOrWhiteSpace(processDefinitionKey))
            {
                throw new ActivitiIllegalArgumentException("Process definition id or key cannot be null");
            }

            IList <IProcessDefinitionEntity> processDefinitionEntities = new List <IProcessDefinitionEntity>();
            IProcessDefinitionEntityManager  processDefinitionManager  = commandContext.ProcessDefinitionEntityManager;

            if (!string.IsNullOrWhiteSpace(processDefinitionId))
            {
                IProcessDefinitionEntity processDefinitionEntity = processDefinitionManager.FindById <IProcessDefinitionEntity>(new KeyValuePair <string, object>("id", processDefinitionId));
                if (processDefinitionEntity == null)
                {
                    throw new ActivitiObjectNotFoundException("Cannot find process definition for id '" + processDefinitionId + "'", typeof(IProcessDefinition));
                }
                processDefinitionEntities.Add(processDefinitionEntity);
            }
            else
            {
                IProcessDefinitionQuery query = new ProcessDefinitionQueryImpl(commandContext).SetProcessDefinitionKey(processDefinitionKey);

                if (tenantId is null || ProcessEngineConfiguration.NO_TENANT_ID.Equals(tenantId))
                {
                    query.SetProcessDefinitionWithoutTenantId();
                }
        protected internal virtual IProcessDefinitionEntity TransformProcess(BpmnParse bpmnParse, Process process)
        {
            IProcessDefinitionEntity currentProcessDefinition = Context.CommandContext.ProcessDefinitionEntityManager.Create();

            bpmnParse.CurrentProcessDefinition = currentProcessDefinition;

            /*
             * Mapping object model - bpmn xml: processDefinition.id -> generated by activiti engine processDefinition.key -> bpmn id (required) processDefinition.name -> bpmn name (optional)
             */
            currentProcessDefinition.Key          = process.Id;
            currentProcessDefinition.Name         = process.Name;
            currentProcessDefinition.Category     = bpmnParse.BpmnModel.TargetNamespace;
            currentProcessDefinition.Description  = process.Documentation;
            currentProcessDefinition.DeploymentId = bpmnParse.Deployment.Id;

            if (bpmnParse.Deployment.EngineVersion is object)
            {
                currentProcessDefinition.EngineVersion = bpmnParse.Deployment.EngineVersion;
            }

            CreateEventListeners(bpmnParse, process.EventListeners);

            if (logger.IsEnabled(LogLevel.Debug))
            {
                logger.LogDebug($"Parsing process {currentProcessDefinition.Key}");
            }

            bpmnParse.ProcessFlowElements(process.FlowElements);
            ProcessArtifacts(bpmnParse, process.Artifacts);

            return(currentProcessDefinition);
        }
 public AbstractSetProcessDefinitionStateCmd(IProcessDefinitionEntity processDefinitionEntity, bool includeProcessInstances, DateTime?executionDate, string tenantId)
 {
     this.processDefinitionEntity = processDefinitionEntity;
     this.includeProcessInstances = includeProcessInstances;
     this.executionDate           = executionDate;
     this.tenantId = tenantId;
 }
Example #4
0
        public virtual object  Execute(ICommandContext commandContext)
        {
            if (string.IsNullOrWhiteSpace(processDefinitionId))
            {
                throw new ActivitiIllegalArgumentException("Process definition id is null");
            }

            IProcessDefinitionEntity processDefinition = commandContext.ProcessDefinitionEntityManager.FindById <IProcessDefinitionEntity>(processDefinitionId);

            if (processDefinition == null)
            {
                throw new ActivitiObjectNotFoundException("No process definition found for id = '" + processDefinitionId + "'", typeof(IProcessDefinition));
            }

            // Update category
            processDefinition.Category = category;

            // Remove process definition from cache, it will be refetched later
            IDeploymentCache <ProcessDefinitionCacheEntry> processDefinitionCache = commandContext.ProcessEngineConfiguration.ProcessDefinitionCache;

            if (processDefinitionCache != null)
            {
                processDefinitionCache.Remove(processDefinitionId);
            }

            if (commandContext.EventDispatcher.Enabled)
            {
                commandContext.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateEntityEvent(ActivitiEventType.ENTITY_UPDATED, processDefinition));
            }

            return(null);
        }
Example #5
0
        /// <summary>
        /// Finds the name of a resource for the diagram for a process definition.  Assumes that the
        /// process definition's key and (BPMN) resource name are already set.
        ///
        /// <para>It will first look for an image resource which matches the process specifically, before
        /// resorting to an image resource which matches the BPMN 2.0 xml file resource.
        ///
        /// </para>
        /// <para>Example: if the deployment contains a BPMN 2.0 xml resource called 'abc.bpmn20.xml'
        /// containing only one process with key 'myProcess', then this method will look for an image resources
        /// called'abc.myProcess.png' (or .jpg, or .gif, etc.) or 'abc.png' if the previous one wasn't
        /// found.
        ///
        /// </para>
        /// <para>Example 2: if the deployment contains a BPMN 2.0 xml resource called 'abc.bpmn20.xml'
        /// containing three processes (with keys a, b and c), then this method will first look for an image resource
        /// called 'abc.a.png' before looking for 'abc.png' (likewise for b and c). Note that if abc.a.png,
        /// abc.b.png and abc.c.png don't exist, all processes will have the same image: abc.png.
        ///
        /// </para>
        /// </summary>
        /// <returns> name of an existing resource, or null if no matching image resource is found in the resources. </returns>
        public static string GetProcessDiagramResourceNameFromDeployment(IProcessDefinitionEntity processDefinition, IDictionary <string, IResourceEntity> resources)
        {
            if (string.IsNullOrWhiteSpace(processDefinition.ResourceName))
            {
                throw new System.InvalidOperationException("Provided process definition must have its resource name set.");
            }

            string bpmnResourceBase = StripBpmnFileSuffix(processDefinition.ResourceName);
            string key = processDefinition.Key;

            foreach (string diagramSuffix in DIAGRAM_SUFFIXES)
            {
                string possibleName = bpmnResourceBase + key + "." + diagramSuffix;
                if (resources.ContainsKey(possibleName))
                {
                    return(possibleName);
                }

                possibleName = bpmnResourceBase + diagramSuffix;
                if (resources.ContainsKey(possibleName))
                {
                    return(possibleName);
                }
            }

            return(null);
        }
Example #6
0
 protected internal virtual void RemoveObsoleteSignalEventSubScription(IProcessDefinitionEntity previousProcessDefinition)
 {
     // remove all subscriptions for the previous version
     if (previousProcessDefinition != null)
     {
         RemoveObsoleteEventSubscriptionsImpl(previousProcessDefinition, SignalEventHandler.EVENT_HANDLER_TYPE);
     }
 }
Example #7
0
        protected internal virtual void RemoveObsoleteTimers(IProcessDefinitionEntity processDefinition)
        {
            IList <ITimerJobEntity> jobsToDelete;

            if (!(processDefinition.TenantId is null) && !ProcessEngineConfiguration.NO_TENANT_ID.Equals(processDefinition.TenantId))
            {
                jobsToDelete = Context.CommandContext.TimerJobEntityManager.FindJobsByTypeAndProcessDefinitionKeyAndTenantId(TimerStartEventJobHandler.TYPE, processDefinition.Key, processDefinition.TenantId);
            }
        public virtual void DeleteIdentityLink(IProcessDefinitionEntity processDefinitionEntity, string userId, string groupId)
        {
            IList <IIdentityLinkEntity> identityLinks = FindIdentityLinkByProcessDefinitionUserAndGroup(processDefinitionEntity.Id, userId, groupId);

            foreach (IIdentityLinkEntity identityLink in identityLinks)
            {
                DeleteIdentityLink(identityLink, false);
            }
        }
 public static void SetSuspensionState(IProcessDefinitionEntity processDefinitionEntity, ISuspensionState state)
 {
     if (processDefinitionEntity.SuspensionState == state.StateCode)
     {
         throw new ActivitiException("Cannot set suspension state '" + state + "' for " + processDefinitionEntity + "': already in state '" + state + "'.");
     }
     processDefinitionEntity.SuspensionState = state.StateCode;
     DispatchStateChangeEvent(processDefinitionEntity, state);
 }
Example #10
0
        protected internal virtual void ScheduleTimers(IProcessDefinitionEntity processDefinition, Process process)
        {
            IJobManager             jobManager = Context.CommandContext.JobManager;
            IList <ITimerJobEntity> timers     = GetTimerDeclarations(processDefinition, process);

            foreach (ITimerJobEntity timer in timers)
            {
                jobManager.ScheduleTimerJob(timer);
            }
        }
Example #11
0
        protected internal virtual void RemoveObsoleteEventSubscriptionsImpl(IProcessDefinitionEntity processDefinition, string eventHandlerType)
        {
            // remove all subscriptions for the previous version
            IEventSubscriptionEntityManager  eventSubscriptionEntityManager = Context.CommandContext.EventSubscriptionEntityManager;
            IList <IEventSubscriptionEntity> subscriptionsToDelete          = eventSubscriptionEntityManager.FindEventSubscriptionsByTypeAndProcessDefinitionId(eventHandlerType, processDefinition.Id, processDefinition.TenantId);

            foreach (IEventSubscriptionEntity eventSubscriptionEntity in subscriptionsToDelete)
            {
                eventSubscriptionEntityManager.Delete(eventSubscriptionEntity);
            }
        }
Example #12
0
        public static IProcessDefinitionEntity GetProcessDefinitionFromDatabase(string processDefinitionId)
        {
            IProcessDefinitionEntityManager processDefinitionEntityManager = Context.ProcessEngineConfiguration.ProcessDefinitionEntityManager;
            IProcessDefinitionEntity        processDefinition = processDefinitionEntityManager.FindById <IProcessDefinitionEntity>(new KeyValuePair <string, object>("processDefinitionId", processDefinitionId));

            if (processDefinition == null)
            {
                throw new ActivitiException("No process definition found with id " + processDefinitionId);
            }

            return(processDefinition);
        }
        public virtual IIdentityLinkEntity AddIdentityLink(IProcessDefinitionEntity processDefinitionEntity, string userId, string groupId)
        {
            IIdentityLinkEntity identityLinkEntity = identityLinkDataManager.Create();

            processDefinitionEntity.IdentityLinks.Add(identityLinkEntity);
            identityLinkEntity.ProcessDef = processDefinitionEntity;
            identityLinkEntity.UserId     = userId;
            identityLinkEntity.GroupId    = groupId;
            identityLinkEntity.Type       = IdentityLinkType.CANDIDATE;
            Insert(identityLinkEntity);
            return(identityLinkEntity);
        }
Example #14
0
        public virtual object Execute(ICommandContext commandContext)
        {
            IProcessDefinitionEntity processDefinition = commandContext.ProcessDefinitionEntityManager.FindById <IProcessDefinitionEntity>(new KeyValuePair <string, object>("id", processDefinitionId));

            if (processDefinition == null)
            {
                throw new ActivitiObjectNotFoundException("Cannot find process definition with id " + processDefinitionId, typeof(IProcessDefinition));
            }

            commandContext.IdentityLinkEntityManager.AddIdentityLink(processDefinition, userId, groupId);

            return(null);
        }
Example #15
0
        public virtual IList <IIdentityLink> Execute(ICommandContext commandContext)
        {
            IProcessDefinitionEntity processDefinition = commandContext.ProcessDefinitionEntityManager.FindById <IProcessDefinitionEntity>(new KeyValuePair <string, object>("id", processDefinitionId));

            if (processDefinition == null)
            {
                throw new ActivitiObjectNotFoundException("Cannot find process definition with id " + processDefinitionId, typeof(IProcessDefinition));
            }

            IList <IIdentityLink> identityLinks = (IList <IIdentityLink>)processDefinition.IdentityLinks;

            return(identityLinks);
        }
Example #16
0
        /// <summary>
        /// Returns the ID to use for a new process definition; subclasses may override this to provide
        /// their own identification scheme.
        /// <para>
        /// Process definition ids NEED to be unique accross the whole engine!
        /// </para>
        /// </summary>
        protected internal virtual string GetIdForNewProcessDefinition(IProcessDefinitionEntity processDefinition)
        {
            string nextId = idGenerator.GetNextId();

            //string result = processDefinition.Key + ":" + processDefinition.Version + ":" + nextId; // ACT-505
            // ACT-115: maximum id length is 64 characters
            //if (result.Length > 64)
            //{
            //result = nextId;
            //}

            return(nextId);
        }
Example #17
0
        /// <summary>
        /// Loads the persisted version of each process definition and set values on the in-memory
        /// version to be consistent.
        /// </summary>
        protected internal virtual void MakeProcessDefinitionsConsistentWithPersistedVersions(ParsedDeployment parsedDeployment)
        {
            foreach (IProcessDefinitionEntity processDefinition in parsedDeployment.AllProcessDefinitions)
            {
                IProcessDefinitionEntity persistedProcessDefinition = bpmnDeploymentHelper.GetPersistedInstanceOfProcessDefinition(processDefinition);

                if (persistedProcessDefinition != null)
                {
                    processDefinition.Id              = persistedProcessDefinition.Id;
                    processDefinition.Version         = persistedProcessDefinition.Version;
                    processDefinition.SuspensionState = persistedProcessDefinition.SuspensionState;
                }
            }
        }
Example #18
0
        protected internal virtual IProcessDefinitionEntity findLatestProcessDefinition(IProcessDefinition processDefinition)
        {
            IProcessDefinitionEntity latestProcessDefinition = null;

            if (!ReferenceEquals(processDefinition.TenantId, null) && !Engine.ProcessEngineConfiguration.NO_TENANT_ID.Equals(processDefinition.TenantId))
            {
                latestProcessDefinition = ProcessDefinitionEntityManager.FindLatestProcessDefinitionByKeyAndTenantId(processDefinition.Key, processDefinition.TenantId);
            }
            else
            {
                latestProcessDefinition = ProcessDefinitionEntityManager.FindLatestProcessDefinitionByKey(processDefinition.Key);
            }
            return(latestProcessDefinition);
        }
Example #19
0
        protected internal virtual void AddDefinitionInfoToCache(IProcessDefinitionEntity processDefinition, ProcessEngineConfigurationImpl processEngineConfiguration, ICommandContext commandContext)
        {
            if (!processEngineConfiguration.EnableProcessDefinitionInfoCache)
            {
                return;
            }

            DeploymentManager deploymentManager = processEngineConfiguration.DeploymentManager;
            IProcessDefinitionInfoEntityManager definitionInfoEntityManager = commandContext.ProcessDefinitionInfoEntityManager;
            ObjectMapper objectMapper = commandContext.ProcessEngineConfiguration.ObjectMapper;
            IProcessDefinitionInfoEntity definitionInfoEntity = definitionInfoEntityManager.FindProcessDefinitionInfoByProcessDefinitionId(processDefinition.Id);

            JToken infoNode = null;

            if (definitionInfoEntity is object && definitionInfoEntity.InfoJsonId is object)
            {
                byte[] infoBytes = definitionInfoEntityManager.FindInfoJsonById(definitionInfoEntity.InfoJsonId);
                if (infoBytes != null)
                {
                    try
                    {
                        infoNode = objectMapper.ReadTree(infoBytes);
                    }
                    catch (Exception)
                    {
                        throw new ActivitiException("Error deserializing json info for process definition " + processDefinition.Id);
                    }
                }
            }

            ProcessDefinitionInfoCacheObject definitionCacheObject = new ProcessDefinitionInfoCacheObject();

            if (definitionInfoEntity == null)
            {
                definitionCacheObject.Revision = 0;
            }
            else
            {
                definitionCacheObject.Id       = definitionInfoEntity.Id;
                definitionCacheObject.Revision = definitionInfoEntity.Revision;
            }

            if (infoNode == null)
            {
                infoNode = objectMapper.CreateObjectNode();
            }
            definitionCacheObject.InfoNode = infoNode;

            deploymentManager.ProcessDefinitionInfoCache.Add(processDefinition.Id, definitionCacheObject);
        }
Example #20
0
        public virtual void Execute(IJobEntity job, string configuration, IExecutionEntity execution, ICommandContext commandContext)
        {
            IProcessDefinitionEntity processDefinitionEntity = ProcessDefinitionUtil.GetProcessDefinitionFromDatabase(job.ProcessDefinitionId); // From DB -> need to get latest suspended state

            if (processDefinitionEntity == null)
            {
                throw new ActivitiException("Could not find process definition needed for timer start event");
            }

            try
            {
                if (!processDefinitionEntity.Suspended)
                {
                    if (commandContext.EventDispatcher.Enabled)
                    {
                        commandContext.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateEntityEvent(ActivitiEventType.TIMER_FIRED, job));
                    }

                    // Find initial flow element matching the signal start event
                    Process process    = ProcessDefinitionUtil.GetProcess(job.ProcessDefinitionId);
                    string  activityId = GetActivityIdFromConfiguration(configuration);
                    if (string.IsNullOrWhiteSpace(activityId) == false)
                    {
                        FlowElement flowElement = process.GetFlowElement(activityId, true);
                        if (flowElement == null)
                        {
                            throw new ActivitiException("Could not find matching FlowElement for activityId " + activityId);
                        }
                        ProcessInstanceHelper processInstanceHelper = commandContext.ProcessEngineConfiguration.ProcessInstanceHelper;
                        processInstanceHelper.CreateAndStartProcessInstanceWithInitialFlowElement(processDefinitionEntity, null, null, flowElement, process, null, null, true);
                    }
                    else
                    {
                        (new StartProcessInstanceCmd(processDefinitionEntity.Key, null, null, null, job.TenantId)).Execute(commandContext);
                    }
                }
                else
                {
                    log.LogDebug($"ignoring timer of suspended process definition {processDefinitionEntity.Name}");
                }
            }
            catch (Exception e)
            {
                log.LogError($"exception during timer execution: {e.Message}");

                throw new ActivitiException("exception during timer execution: " + e.Message, e);
            }
        }
Example #21
0
        public virtual T  Execute(ICommandContext commandContext)
        {
            IProcessDefinitionEntity processDefinition = ProcessDefinitionUtil.GetProcessDefinitionFromDatabase(processDefinitionId);

            if (processDefinition == null)
            {
                throw new ActivitiObjectNotFoundException("No process definition found for id = '" + processDefinitionId + "'", typeof(IProcessDefinition));
            }

            if (processDefinition.Suspended)
            {
                throw new ActivitiException("Cannot execute operation because process definition '" + processDefinition.Name + "' (id=" + processDefinition.Id + ") is suspended");
            }

            return(Execute(commandContext, processDefinition));
        }
Example #22
0
        /// <summary>
        /// Constructs a map from new ProcessDefinitionEntities to the previous version by key and tenant.
        /// If no previous version exists, no map entry is created.
        /// </summary>
        protected internal virtual IDictionary <IProcessDefinitionEntity, IProcessDefinitionEntity> GetPreviousVersionsOfProcessDefinitions(ParsedDeployment parsedDeployment)
        {
            IDictionary <IProcessDefinitionEntity, IProcessDefinitionEntity> result = new Dictionary <IProcessDefinitionEntity, IProcessDefinitionEntity>();

            foreach (IProcessDefinitionEntity newDefinition in parsedDeployment.AllProcessDefinitions)
            {
                IProcessDefinitionEntity existingDefinition = bpmnDeploymentHelper.GetMostRecentVersionOfProcessDefinition(newDefinition);

                if (existingDefinition != null)
                {
                    result[newDefinition] = existingDefinition;
                }
            }

            return(result);
        }
Example #23
0
        public override JToken ToJsonObject(IProcessDefinition processDefinition)
        {
            IProcessDefinitionEntity processDefinitionEntity = (IProcessDefinitionEntity)processDefinition;
            JToken jsonObject = new JObject();

            jsonObject["id"] = processDefinitionEntity.Id;
            if (!ReferenceEquals(processDefinitionEntity.Key, null))
            {
                jsonObject["key"] = processDefinitionEntity.Key;
            }
            if (!ReferenceEquals(processDefinitionEntity.DeploymentId, null))
            {
                jsonObject["deploymentId"] = processDefinitionEntity.DeploymentId;
            }
            return(jsonObject);
        }
Example #24
0
        protected internal virtual void restorePreviousStartEventsIfNeeded(IProcessDefinition processDefinition)
        {
            IProcessDefinitionEntity latestProcessDefinition = findLatestProcessDefinition(processDefinition);

            if (processDefinition.Id.Equals(latestProcessDefinition.Id))
            {
                // Try to find a previous version (it could be some versions are missing due to deletions)
                IProcessDefinition previousProcessDefinition = findNewLatestProcessDefinitionAfterRemovalOf(processDefinition);
                if (previousProcessDefinition != null)
                {
                    BpmnModel bpmnModel       = ProcessDefinitionUtil.GetBpmnModel(previousProcessDefinition.Id);
                    Process   previousProcess = ProcessDefinitionUtil.GetProcess(previousProcessDefinition.Id);
                    if (CollectionUtil.IsNotEmpty(previousProcess.FlowElements))
                    {
                        IList <StartEvent> startEvents = previousProcess.FindFlowElementsOfType <StartEvent>();

                        if (CollectionUtil.IsNotEmpty(startEvents))
                        {
                            foreach (StartEvent startEvent in startEvents)
                            {
                                if (CollectionUtil.IsNotEmpty(startEvent.EventDefinitions))
                                {
                                    EventDefinition eventDefinition = startEvent.EventDefinitions[0];
                                    if (eventDefinition is TimerEventDefinition)
                                    {
                                        restoreTimerStartEvent(previousProcessDefinition, startEvent, eventDefinition);
                                    }
                                    else if (eventDefinition is SignalEventDefinition)
                                    {
                                        restoreSignalStartEvent(previousProcessDefinition, bpmnModel, startEvent, eventDefinition);
                                    }
                                    else if (eventDefinition is MessageEventDefinition)
                                    {
                                        restoreMessageStartEvent(previousProcessDefinition, bpmnModel, startEvent, eventDefinition);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Example #25
0
 protected internal virtual void AddMessageEventSubscriptions(IProcessDefinitionEntity processDefinition, Process process, BpmnModel bpmnModel)
 {
     if (CollectionUtil.IsNotEmpty(process.FlowElements))
     {
         foreach (FlowElement element in process.FlowElements)
         {
             if (element is StartEvent startEvent)
             {
                 if (CollectionUtil.IsNotEmpty(startEvent.EventDefinitions))
                 {
                     EventDefinition eventDefinition = startEvent.EventDefinitions[0];
                     if (eventDefinition is MessageEventDefinition messageEventDefinition)
                     {
                         InsertMessageEvent(messageEventDefinition, startEvent, processDefinition, bpmnModel);
                     }
                 }
             }
         }
     }
 }
Example #26
0
        protected internal virtual void RemoveObsoleteTimers(IProcessDefinitionEntity processDefinition)
        {
            IList <ITimerJobEntity> jobsToDelete;

            if (processDefinition.TenantId is object && !ProcessEngineConfiguration.NO_TENANT_ID.Equals(processDefinition.TenantId))
            {
                jobsToDelete = Context.CommandContext.TimerJobEntityManager.FindJobsByTypeAndProcessDefinitionKeyAndTenantId(TimerStartEventJobHandler.TYPE, processDefinition.Key, processDefinition.TenantId);
            }
            else
            {
                jobsToDelete = Context.CommandContext.TimerJobEntityManager.FindJobsByTypeAndProcessDefinitionKeyNoTenantId(TimerStartEventJobHandler.TYPE, processDefinition.Key);
            }

            if (jobsToDelete != null)
            {
                foreach (ITimerJobEntity job in jobsToDelete)
                {
                    (new CancelJobsCmd(job.Id)).Execute(Context.CommandContext);
                }
            }
        }
        public IJobEntity Execute(ICommandContext commandContext)
        {
            IJobEntity timer = commandContext.JobEntityManager.Create();

            timer.Id        = commandContext.ProcessEngineConfiguration.IdGenerator.GetNextId();
            timer.Duedate   = this.startDate;
            timer.Exclusive = JobFields.DEFAULT_EXCLUSIVE;
            timer.JobHandlerConfiguration = startActivityId;
            timer.JobHandlerType          = TimerStartEventJobHandler.TYPE;
            timer.JobType = JobFields.JOB_TYPE_TIMER;

            IProcessDefinitionEntity pd = commandContext.ProcessDefinitionEntityManager.FindLatestProcessDefinitionByKey(processDefinitionId);

            if (pd == null)
            {
                throw new ActivitiException("Could not find process definition needed for timer start event");
            }
            timer.ProcessDefinitionId = pd.Id;

            commandContext.JobEntityManager.Insert(timer);

            return(timer);
        }
Example #28
0
        protected internal virtual IList <ITimerJobEntity> GetTimerDeclarations(IProcessDefinitionEntity processDefinition, Process process)
        {
            IJobManager             jobManager = Context.CommandContext.JobManager;
            IList <ITimerJobEntity> timers     = new List <ITimerJobEntity>();

            if (CollectionUtil.IsNotEmpty(process.FlowElements))
            {
                foreach (FlowElement element in process.FlowElements)
                {
                    if (element is StartEvent startEvent)
                    {
                        if (CollectionUtil.IsNotEmpty(startEvent.EventDefinitions))
                        {
                            EventDefinition eventDefinition = startEvent.EventDefinitions[0];
                            if (eventDefinition is TimerEventDefinition timerEventDefinition)
                            {
                                ITimerJobEntity timerJob = jobManager.CreateTimerJob(timerEventDefinition, false, null, TimerStartEventJobHandler.TYPE, TimerEventHandler.CreateConfiguration(startEvent.Id, timerEventDefinition.EndDate, timerEventDefinition.CalendarName));

                                if (timerJob != null)
                                {
                                    timerJob.ProcessDefinitionId = processDefinition.Id;

                                    if (processDefinition.TenantId is object)
                                    {
                                        timerJob.TenantId = processDefinition.TenantId;
                                    }
                                    timers.Add(timerJob);
                                }
                            }
                        }
                    }
                }
            }

            return(timers);
        }
 public virtual IProcessInstance CreateProcessInstance(IProcessDefinitionEntity processDefinition, string businessKey, string processInstanceName, IDictionary <string, object> variables, IDictionary <string, object> transientVariables)
 {
     return(CreateAndStartProcessInstance(processDefinition, businessKey, processInstanceName, variables, transientVariables, false));
 }
Example #30
0
        public virtual Process GetProcessModelForProcessDefinition(IProcessDefinitionEntity processDefinition)
        {
            BpmnModel model = GetBpmnModelForProcessDefinition(processDefinition);

            return(model?.GetProcessById(processDefinition.Key));
        }