Example #1
0
 public DeserializedObject(SerializableType type, object deserializedObject, byte[] serializedBytes, IVariableInstanceEntity variableInstanceEntity)
 {
     this.type = type;
     this.deserializedObject     = deserializedObject;
     this.originalBytes          = serializedBytes;
     this.variableInstanceEntity = variableInstanceEntity;
 }
        protected internal virtual void UpdateVariableInstance(IVariableInstanceEntity variableInstance, object value, IExecutionEntity sourceActivityExecution)
        {
            // Always check if the type should be altered. It's possible that the
            // previous type is lower in the type
            // checking chain (e.g. serializable) and will return true on
            // isAbleToStore(), even though another type
            // higher in the chain is eligible for storage.

            IVariableTypes variableTypes = Context.ProcessEngineConfiguration.VariableTypes;

            IVariableType newType = variableTypes.FindVariableType(value);

            if (newType != null && !newType.Equals(variableInstance.Type))
            {
                variableInstance.Value = null;
                variableInstance.Type  = newType;
                variableInstance.ForceUpdate();
                variableInstance.Value = value;
            }
            else
            {
                variableInstance.Value = value;
            }

            Context.CommandContext.HistoryManager.RecordHistoricDetailVariableCreate(variableInstance, sourceActivityExecution, ActivityIdUsedForDetails);

            Context.CommandContext.HistoryManager.RecordVariableUpdate(variableInstance);
        }
Example #3
0
        // Variables related history

        /// <summary>
        ///
        /// </summary>
        /// <param name="variable"></param>
        public virtual void RecordVariableCreate(IVariableInstanceEntity variable)
        {
            // Historic variables
            if (IsHistoryLevelAtLeast(HistoryLevel.ACTIVITY))
            {
                HistoricVariableInstanceEntityManager.CopyAndInsert(variable);
            }
        }
        public virtual object SetVariableLocal(string variableName, object value, IExecutionEntity sourceActivityExecution, bool fetchAllVariables)
        {
            if (fetchAllVariables == true)
            {
                // If it's in the cache, it's more recent
                if (usedVariablesCache.ContainsKey(variableName))
                {
                    UpdateVariableInstance(usedVariablesCache[variableName], value, sourceActivityExecution);
                }

                EnsureVariableInstancesInitialized();

                variableInstances.TryGetValue(variableName, out IVariableInstanceEntity variableInstance);
                if (variableInstance == null)
                {
                    usedVariablesCache.TryGetValue(variableName, out variableInstance);
                }

                if (variableInstance == null)
                {
                    CreateVariableLocal(variableName, value);
                }
                else
                {
                    UpdateVariableInstance(variableInstance, value, sourceActivityExecution);
                }

                return(null);
            }
            else
            {
                if (usedVariablesCache.ContainsKey(variableName))
                {
                    UpdateVariableInstance(usedVariablesCache[variableName], value, sourceActivityExecution);
                }
                else if (variableInstances != null && variableInstances.ContainsKey(variableName))
                {
                    UpdateVariableInstance(variableInstances[variableName], value, sourceActivityExecution);
                }
                else
                {
                    IVariableInstanceEntity variable = GetSpecificVariable(variableName);
                    if (variable != null)
                    {
                        UpdateVariableInstance(variable, value, sourceActivityExecution);
                    }
                    else
                    {
                        variable = CreateVariableInstance(variableName, value, sourceActivityExecution);
                    }
                    usedVariablesCache[variableName] = variable;
                }

                return(null);
            }
        }
        public virtual IVariableInstance GetVariableInstance(string variableName, bool fetchAllVariables)
        {
            // Transient variable
            if (transientVariabes != null && transientVariabes.ContainsKey(variableName))
            {
                return(transientVariabes[variableName]);
            }

            // Check the local single-fetch cache
            if (usedVariablesCache.ContainsKey(variableName))
            {
                return(usedVariablesCache[variableName]);
            }

            if (fetchAllVariables == true)
            {
                EnsureVariableInstancesInitialized();
                variableInstances.TryGetValue(variableName, out IVariableInstanceEntity variableInstance);
                if (variableInstance != null)
                {
                    return(variableInstance);
                }

                // Go up the hierarchy
                IVariableScope parentScope = ParentVariableScope;
                if (parentScope != null)
                {
                    return(parentScope.GetVariableInstance(variableName, true));
                }

                return(null);
            }
            else
            {
                if (variableInstances != null && variableInstances.ContainsKey(variableName))
                {
                    return(variableInstances[variableName]);
                }

                IVariableInstanceEntity variable = GetSpecificVariable(variableName);
                if (variable != null)
                {
                    usedVariablesCache[variableName] = variable;
                    return(variable);
                }

                // Go up the hierarchy
                IVariableScope parentScope = ParentVariableScope;
                if (parentScope != null)
                {
                    return(parentScope.GetVariableInstance(variableName, false));
                }

                return(null);
            }
        }
        protected internal virtual void DeleteVariableInstanceForExplicitUserCall(IVariableInstanceEntity variableInstance, IExecutionEntity sourceActivityExecution)
        {
            Context.CommandContext.VariableInstanceEntityManager.Delete(variableInstance);
            variableInstance.Value = null;

            // Record historic variable deletion
            Context.CommandContext.HistoryManager.RecordVariableRemoved(variableInstance);

            // Record historic detail
            Context.CommandContext.HistoryManager.RecordHistoricDetailVariableCreate(variableInstance, sourceActivityExecution, ActivityIdUsedForDetails);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="variableInstance"></param>
        /// <param name="value"></param>
        /// <param name="sourceActivityExecution"></param>
        protected internal override void UpdateVariableInstance(IVariableInstanceEntity variableInstance, object value, IExecutionEntity sourceActivityExecution)
        {
            base.UpdateVariableInstance(variableInstance, value, sourceActivityExecution);

            // Dispatch event, if needed
            ProcessEngineConfigurationImpl processEngineConfiguration = Context.ProcessEngineConfiguration;

            if (processEngineConfiguration is object && processEngineConfiguration.EventDispatcher.Enabled)
            {
                processEngineConfiguration.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateVariableEvent(ActivitiEventType.VARIABLE_UPDATED, variableInstance.Name, value, variableInstance.Type, variableInstance.TaskId, variableInstance.ExecutionId, ProcessInstanceId, ProcessDefinitionId));
            }
        }
        // VariableScopeImpl methods //////////////////////////////////////////////////////////////////


        /// <summary>
        ///
        /// </summary>
        // TODO: this should ideally move to another place
        protected internal override void InitializeVariableInstanceBackPointer(IVariableInstanceEntity variableInstance)
        {
            if (processInstanceId is object)
            {
                variableInstance.ProcessInstanceId = processInstanceId;
            }
            else
            {
                variableInstance.ProcessInstanceId = Id;
            }
            variableInstance.ExecutionId = Id;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="variableName"></param>
        /// <returns></returns>
        protected internal override IVariableInstanceEntity GetSpecificVariable(string variableName)
        {
            ICommandContext commandContext = Context.CommandContext;

            if (commandContext == null)
            {
                throw new ActivitiException("lazy loading outside command context");
            }
            IVariableInstanceEntity variableInstance = commandContext.VariableInstanceEntityManager.FindVariableInstanceByExecutionAndName(Id, variableName);

            return(variableInstance);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="variableName"></param>
        /// <param name="value"></param>
        /// <param name="sourceActivityExecution"></param>
        /// <returns></returns>
        protected internal override IVariableInstanceEntity CreateVariableInstance(string variableName, object value, IExecutionEntity sourceActivityExecution)
        {
            IVariableInstanceEntity result = base.CreateVariableInstance(variableName, value, sourceActivityExecution);

            // Dispatch event, if needed
            ProcessEngineConfigurationImpl processEngineConfiguration = Context.ProcessEngineConfiguration;

            if (processEngineConfiguration is object && processEngineConfiguration.EventDispatcher.Enabled)
            {
                processEngineConfiguration.EventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateVariableEvent(ActivitiEventType.VARIABLE_CREATED, variableName, value, result.Type, result.TaskId, result.ExecutionId, ProcessInstanceId, ProcessDefinitionId));
            }
            return(result);
        }
Example #11
0
        public virtual void RecordVariableRemoved(IVariableInstanceEntity variable)
        {
            if (variable != null && IsHistoryLevelAtLeast(HistoryLevel.ACTIVITY))
            {
                if (!(EntityCache.FindInCache(variable.GetType(), variable.Id) is IHistoricVariableInstanceEntity historicProcessVariable))
                {
                    historicProcessVariable = HistoricVariableInstanceEntityManager.FindHistoricVariableInstanceByVariableInstanceId(variable.Id);
                }

                if (historicProcessVariable != null)
                {
                    HistoricVariableInstanceEntityManager.Delete(historicProcessVariable);
                }
            }
        }
Example #12
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="variable"></param>
        /// <param name="sourceActivityExecution"></param>
        /// <param name="useActivityId"></param>
        public virtual void RecordHistoricDetailVariableCreate(IVariableInstanceEntity variable, IExecutionEntity sourceActivityExecution, bool useActivityId)
        {
            if (IsHistoryLevelAtLeast(HistoryLevel.FULL))
            {
                IHistoricDetailVariableInstanceUpdateEntity historicVariableUpdate = HistoricDetailEntityManager.CopyAndInsertHistoricDetailVariableInstanceUpdateEntity(variable);

                if (useActivityId && sourceActivityExecution != null)
                {
                    IHistoricActivityInstanceEntity historicActivityInstance = FindActivityInstance(sourceActivityExecution, false, false);
                    if (historicActivityInstance != null)
                    {
                        historicVariableUpdate.ActivityInstanceId = historicActivityInstance.Id;
                    }
                }
            }
        }
Example #13
0
        public virtual IVariableInstance GetVariableInstanceLocal(string variableName, bool fetchAllVariables)
        {
            if (transientVariabes != null && transientVariabes.ContainsKey(variableName))
            {
                return(transientVariabes[variableName]);
            }

            if (usedVariablesCache.ContainsKey(variableName))
            {
                return(usedVariablesCache[variableName]);
            }

            if (fetchAllVariables == true)
            {
                EnsureVariableInstancesInitialized();

                variableInstances.TryGetValue(variableName, out IVariableInstanceEntity variableInstance);
                if (variableInstance != null)
                {
                    return(variableInstance);
                }
                return(null);
            }
            else
            {
                if (variableInstances != null && variableInstances.ContainsKey(variableName))
                {
                    IVariableInstanceEntity v = variableInstances[variableName];
                    if (v != null)
                    {
                        return(variableInstances[variableName]);
                    }
                }

                IVariableInstanceEntity variable = GetSpecificVariable(variableName);
                if (variable != null)
                {
                    usedVariablesCache[variableName] = variable;
                    return(variable);
                }

                return(null);
            }
        }
        public virtual IHistoricVariableInstanceEntity CopyAndInsert(IVariableInstanceEntity variableInstance)
        {
            IHistoricVariableInstanceEntity historicVariableInstance = historicVariableInstanceDataManager.Create();

            historicVariableInstance.Id = variableInstance.Id;
            historicVariableInstance.ProcessInstanceId = variableInstance.ProcessInstanceId;
            historicVariableInstance.ExecutionId       = variableInstance.ExecutionId;
            historicVariableInstance.TaskId            = variableInstance.TaskId;
            historicVariableInstance.Revision          = variableInstance.Revision;
            historicVariableInstance.Name         = variableInstance.Name;
            historicVariableInstance.VariableType = variableInstance.Type;

            CopyVariableValue(historicVariableInstance, variableInstance);

            DateTime time = Clock.CurrentTime;

            historicVariableInstance.CreateTime      = time;
            historicVariableInstance.LastUpdatedTime = time;

            Insert(historicVariableInstance);

            return(historicVariableInstance);
        }
Example #15
0
 public virtual void Initialize(IVariableTypes types)
 {
     if (variableInstanceEntity == null)
     {
         IVariableType type = types.FindVariableType(value);
         if (type is ByteArrayType)
         {
             throw new ActivitiIllegalArgumentException("Variables of type ByteArray cannot be used to query");
         }
         else if (type is IEntityVariableType && @operator != QueryOperator.EQUALS)
         {
             throw new ActivitiIllegalArgumentException("JPA entity variables can only be used in 'variableValueEquals'");
         }
         else if (type is IEntityListVariableType)
         {
             throw new ActivitiIllegalArgumentException("Variables containing a list of JPA entities cannot be used to query");
         }
         else
         {
             // Type implementation determines which fields are set on the entity
             variableInstanceEntity = Context.CommandContext.VariableInstanceEntityManager.Create(name, type, value);
         }
     }
 }
Example #16
0
        protected internal virtual IVariableInstanceEntity CreateVariableInstance(string variableName, object value, IExecutionEntity sourceActivityExecution)
        {
            IVariableTypes variableTypes = Context.ProcessEngineConfiguration.VariableTypes;

            IVariableType type = variableTypes.FindVariableType(value);

            IVariableInstanceEntity variableInstance = Context.CommandContext.VariableInstanceEntityManager.Create(variableName, type, value);

            InitializeVariableInstanceBackPointer(variableInstance);
            Context.CommandContext.VariableInstanceEntityManager.Insert(variableInstance);

            if (variableInstances != null)
            {
                variableInstances[variableName] = variableInstance;
            }

            // Record historic variable
            Context.CommandContext.HistoryManager.RecordVariableCreate(variableInstance);

            // Record historic detail
            Context.CommandContext.HistoryManager.RecordHistoricDetailVariableCreate(variableInstance, sourceActivityExecution, ActivityIdUsedForDetails);

            return(variableInstance);
        }
Example #17
0
 protected internal override void InitializeVariableInstanceBackPointer(IVariableInstanceEntity variableInstance)
 {
     variableInstance.TaskId            = id;
     variableInstance.ExecutionId       = executionId;
     variableInstance.ProcessInstanceId = processInstanceId;
 }
Example #18
0
        /// <summary>
        /// Sets a variable as high as possible (highest parent).
        /// </summary>
        ///  <param name="sourceExecution"> The execution where the variable was originally set, used for history data. </param>
        ///  <param name="fetchAllVariables"> If true, all existing variables will be fetched when setting the variable. </param>
        protected internal virtual void SetVariable(string variableName, object value, IExecutionEntity sourceExecution, bool fetchAllVariables)
        {
            if (fetchAllVariables == true)
            {
                // If it's in the cache, it's more recent
                if (usedVariablesCache.ContainsKey(variableName))
                {
                    UpdateVariableInstance(usedVariablesCache[variableName], value, sourceExecution);
                }

                // If the variable exists on this scope, replace it
                if (HasVariableLocal(variableName))
                {
                    SetVariableLocal(variableName, value, sourceExecution, true);
                    return;
                }

                // Otherwise, go up the hierarchy (we're trying to put it as high as possible)
                VariableScopeImpl parentVariableScope = ParentVariableScope;
                if (parentVariableScope != null)
                {
                    if (sourceExecution == null)
                    {
                        parentVariableScope.SetVariable(variableName, value);
                    }
                    else
                    {
                        parentVariableScope.SetVariable(variableName, value, sourceExecution, true);
                    }
                    return;
                }

                // We're as high as possible and the variable doesn't exist yet, so
                // we're creating it
                if (sourceExecution != null)
                {
                    CreateVariableLocal(variableName, value, sourceExecution);
                }
                else
                {
                    CreateVariableLocal(variableName, value);
                }
            }
            else
            {
                // Check local cache first
                if (usedVariablesCache.ContainsKey(variableName))
                {
                    UpdateVariableInstance(usedVariablesCache[variableName], value, sourceExecution);
                }
                else if (variableInstances != null && variableInstances.ContainsKey(variableName))
                {
                    UpdateVariableInstance(variableInstances[variableName], value, sourceExecution);
                }
                else
                {
                    // Not in local cache, check if defined on this scope
                    // Create it if it doesn't exist yet
                    IVariableInstanceEntity variable = GetSpecificVariable(variableName);
                    if (variable != null)
                    {
                        UpdateVariableInstance(variable, value, sourceExecution);
                        usedVariablesCache[variableName] = variable;
                    }
                    else
                    {
                        VariableScopeImpl parent = ParentVariableScope;
                        if (parent != null)
                        {
                            if (sourceExecution == null)
                            {
                                parent.SetVariable(variableName, value, fetchAllVariables);
                            }
                            else
                            {
                                parent.SetVariable(variableName, value, sourceExecution, fetchAllVariables);
                            }

                            return;
                        }

                        variable = CreateVariableInstance(variableName, value, sourceExecution);
                        usedVariablesCache[variableName] = variable;
                    }
                }
            }
        }
Example #19
0
 protected internal abstract void InitializeVariableInstanceBackPointer(IVariableInstanceEntity variableInstance);
        // VariableScopeImpl methods //////////////////////////////////////////////////////////////////


        // TODO: this should ideally move to another place
        protected internal override void InitializeVariableInstanceBackPointer(IVariableInstanceEntity variableInstance)
        {
            if (!(processInstanceId is null))
            {
                variableInstance.ProcessInstanceId = processInstanceId;
            }
        public virtual void CopyVariableValue(IHistoricVariableInstanceEntity historicVariableInstance, IVariableInstanceEntity variableInstance)
        {
            historicVariableInstance.TextValue   = variableInstance.TextValue;
            historicVariableInstance.TextValue2  = variableInstance.TextValue2;
            historicVariableInstance.DoubleValue = variableInstance.DoubleValue;
            historicVariableInstance.LongValue   = variableInstance.LongValue;

            historicVariableInstance.VariableType = variableInstance.Type;
            if (variableInstance.ByteArrayRef != null)
            {
                historicVariableInstance.Bytes = variableInstance.Bytes;
            }

            historicVariableInstance.LastUpdatedTime = Clock.CurrentTime;
        }
        public virtual IHistoricDetailVariableInstanceUpdateEntity CopyAndInsertHistoricDetailVariableInstanceUpdateEntity(IVariableInstanceEntity variableInstance)
        {
            IHistoricDetailVariableInstanceUpdateEntity historicVariableUpdate = historicDetailDataManager.CreateHistoricDetailVariableInstanceUpdate();

            historicVariableUpdate.ProcessInstanceId = variableInstance.ProcessInstanceId;
            historicVariableUpdate.ExecutionId       = variableInstance.ExecutionId;
            historicVariableUpdate.TaskId            = variableInstance.TaskId;
            historicVariableUpdate.Time         = Clock.CurrentTime;
            historicVariableUpdate.Revision     = variableInstance.Revision;
            historicVariableUpdate.Name         = variableInstance.Name;
            historicVariableUpdate.VariableType = variableInstance.Type;
            historicVariableUpdate.TextValue    = variableInstance.TextValue;
            historicVariableUpdate.TextValue2   = variableInstance.TextValue2;
            historicVariableUpdate.DoubleValue  = variableInstance.DoubleValue;
            historicVariableUpdate.LongValue    = variableInstance.LongValue;

            if (variableInstance.Bytes != null)
            {
                historicVariableUpdate.Bytes = variableInstance.Bytes;
            }

            Insert(historicVariableUpdate);
            return(historicVariableUpdate);
        }