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; }
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); }
/// <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); }
protected internal virtual void RemoveObsoleteSignalEventSubScription(IProcessDefinitionEntity previousProcessDefinition) { // remove all subscriptions for the previous version if (previousProcessDefinition != null) { RemoveObsoleteEventSubscriptionsImpl(previousProcessDefinition, SignalEventHandler.EVENT_HANDLER_TYPE); } }
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); }
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); } }
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); } }
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); }
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); }
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); }
/// <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); }
/// <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; } } }
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); }
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); }
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); } }
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)); }
/// <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); }
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); }
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); } } } } } } } }
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); } } } } } }
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); }
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)); }
public virtual Process GetProcessModelForProcessDefinition(IProcessDefinitionEntity processDefinition) { BpmnModel model = GetBpmnModelForProcessDefinition(processDefinition); return(model?.GetProcessById(processDefinition.Key)); }