public IList <WfActivityDefinition> FindAllDefaultActivityDefinitions(WfWorkflowDefinition wfWorkflowDefinition, int startingPos = 0) { Debug.Assert(wfWorkflowDefinition != null); //--- int?idStartActivity = wfWorkflowDefinition.WfadId; IList <WfActivityDefinition> retAllDefaultActivities = new List <WfActivityDefinition>(); if (idStartActivity != null) { WfActivityDefinition first = inMemoryActivityDefinitionStore[idStartActivity]; retAllDefaultActivities.Add(first); WfTransitionDefinition transitionNext; transitionsNext.TryGetValue(idStartActivity + "|" + WfCodeTransition.Default.ToString(), out transitionNext); while (transitionNext != null) { WfActivityDefinition wfNextActivityDefinition = inMemoryActivityDefinitionStore[transitionNext.WfadIdTo]; retAllDefaultActivities.Add(wfNextActivityDefinition); transitionsNext.TryGetValue(wfNextActivityDefinition.WfadId + "|" + WfCodeTransition.Default.ToString(), out transitionNext); } } return(retAllDefaultActivities); }
public void CreateActivityDefinition(WfWorkflowDefinition wfWorkflowDefinition, WfActivityDefinition wfActivityDefinition) { int generatedId = Interlocked.Increment(ref memoryActivityDefinitionSequenceGenerator); wfActivityDefinition.WfadId = generatedId; inMemoryActivityDefinitionStore[generatedId] = wfActivityDefinition; }
public WfActivityDefinition FindActivityDefinitionByPosition(WfWorkflowDefinition wfWorkflowDefinition, int position) { int?idActivity = wfWorkflowDefinition.WfadId; if (idActivity == null) { //The workflow don't have a starting activity return(null); } WfTransitionDefinition transitionNext = transitionsNext[idActivity + "|" + WfCodeTransition.Default.ToString()]; int i = 1; while (transitionNext != null && i < position) { WfActivityDefinition wfNextActivityDefinition = inMemoryActivityDefinitionStore[transitionNext.WfadIdTo]; idActivity = wfNextActivityDefinition.WfadId; transitionNext = transitionsNext[wfNextActivityDefinition.WfadId + "|" + WfCodeTransition.Default.ToString()]; i++; } if (transitionNext == null) { return(null); } return(ReadActivityDefinition(transitionNext.WfadIdTo)); }
public void RenameActivityDefinition(WfActivityDefinition wfActivityDefinition) { Debug.Assert(wfActivityDefinition != null); Debug.Assert(wfActivityDefinition.WfadId != null); //--- inMemoryActivityDefinitionStore[wfActivityDefinition.WfadId].Name = wfActivityDefinition.Name; }
public int CountDefaultTransitions(WfWorkflowDefinition wfWorkflowDefinition) { Debug.Assert(wfWorkflowDefinition != null); //-- int?idActivityDefinition = wfWorkflowDefinition.WfadId; if (idActivityDefinition == null) { //The workflow don't have a starting activity return(0); } WfTransitionDefinition transitionNext; transitionsNext.TryGetValue(idActivityDefinition + "|" + WfCodeTransition.Default.ToString(), out transitionNext); int count = 0; while (transitionNext != null) { WfActivityDefinition wfNextActivityDefinition = inMemoryActivityDefinitionStore[transitionNext.WfadIdTo]; idActivityDefinition = wfNextActivityDefinition.WfadId; transitionsNext.TryGetValue(idActivityDefinition + "|" + WfCodeTransition.Default.ToString(), out transitionNext); count++; } return(count); }
public void UnsetCurrentActivity(WfActivityDefinition wfActivityDefinition) { var cmd = GetSqlServerCommand("UnsetCurrentActivity.sql"); cmd.Parameters.AddWithValue(WfActivityDefinition.Cols.WFAD_ID, wfActivityDefinition.WfadId.Value); cmd.ExecuteNonQuery(); }
public void MoveActivity(WfWorkflowDefinition wfWorkflowDefinition, int src, int dst, bool after) { WfActivityDefinition wfActivityDefinitionFrom = _workflowStorePlugin.FindActivityDefinitionByPosition(wfWorkflowDefinition, src); WfActivityDefinition wfActivityDefinitionTo = _workflowStorePlugin.FindActivityDefinitionByPosition(wfWorkflowDefinition, dst); MoveActivity(wfWorkflowDefinition, wfActivityDefinitionFrom, wfActivityDefinitionTo, after); }
public void AutoValidateNextActivities(WfWorkflow wfWorkflow, int wfActivityDefinitionId) { WfActivityDefinition activityDefinition = _workflowStorePlugin.ReadActivityDefinition(wfActivityDefinitionId); object obj = _itemStorePlugin.ReadItem((int)wfWorkflow.ItemId); int? wfCurrentActivityDefinitionId = null; while (CanAutoValidateActivity(activityDefinition, obj)) { WfActivity wfActivityCurrent = AutoValidateActivity(activityDefinition); wfCurrentActivityDefinitionId = wfActivityCurrent.WfadId; if (_workflowStorePlugin.HasNextActivity(wfActivityCurrent) == false) { break; } activityDefinition = _workflowStorePlugin.FindNextActivity(wfActivityCurrent); } // Remove this workflow update ? if (wfCurrentActivityDefinitionId != null) { wfWorkflow.WfaId2 = wfCurrentActivityDefinitionId; _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow); } }
public WfActivity FindActivityByDefinitionWorkflow(WfWorkflow wfWorkflow, WfActivityDefinition wfActivityDefinition) { FilterCriteria filterCriteria = new FilterCriteria(); filterCriteria.Equals(WfActivity.Cols.WFW_ID, wfWorkflow.WfwId.Value); filterCriteria.Equals(WfActivity.Cols.WFAD_ID, wfActivityDefinition.WfadId.Value); return(BrokerManager.GetBroker <WfActivity>().FindByCriteria(filterCriteria)); }
public void RenameActivityDefinition(WfActivityDefinition wfActivityDefinition) { var cmd = GetSqlServerCommand("RenameActivityDefinition.sql"); cmd.Parameters.AddWithValue(WfActivityDefinition.Cols.WFAD_ID, wfActivityDefinition.WfadId); cmd.Parameters.AddWithValue(WfActivityDefinition.Cols.NAME, wfActivityDefinition.Name); cmd.ExecuteNonQuery(); }
public void UpdateActivityDefinition(WfActivityDefinition wfActivityDefinition) { Debug.Assert(wfActivityDefinition != null); Debug.Assert(wfActivityDefinition.WfadId != null); Debug.Assert(inMemoryActivityDefinitionStore.ContainsKey(wfActivityDefinition.WfadId), "This activity cannot be updated : It does not exist in the store"); //--- inMemoryActivityDefinitionStore[wfActivityDefinition.WfadId] = wfActivityDefinition; }
public WfActivityDefinition FindActivityDefinitionByPosition(WfWorkflowDefinition wfWorkflowDefinition, int position) { var cmd = GetSqlServerCommand("FindActivityDefinitionByPosition.sql"); cmd.Parameters.AddWithValue(WfActivityDefinition.Cols.WFWD_ID, wfWorkflowDefinition.WfwdId); cmd.Parameters.AddWithValue(WfActivityDefinition.Cols.LEVEL, position); WfActivityDefinition activity = cmd.ReadScalar <WfActivityDefinition>(); return(activity); }
public void UnsetCurrentActivity(WfActivityDefinition wfActivityDefinition) { foreach (WfWorkflow wf in inMemoryWorkflowInstanceStore.Values) { WfActivity currentActivity = ReadActivity(wf.WfaId2.Value); if (wf.WfaId2.Equals(currentActivity.WfaId) && wfActivityDefinition.WfadId.Equals(currentActivity.WfadId)) { wf.WfaId2 = null; } } }
private WfActivity GetNewActivity(WfActivityDefinition activityDefinition, WfWorkflow wfWorkflow, bool isAuto, bool isValid) { WfActivity wfActivity = new WfActivity(); wfActivity.CreationDate = DateTime.Now; wfActivity.WfadId = activityDefinition.WfadId.Value; wfActivity.WfwId = wfWorkflow.WfwId.Value; wfActivity.IsAuto = isAuto; wfActivity.IsValid = isValid; return(wfActivity); }
public WfActivityDefinition FindActivityDefinitionByPosition(WfWorkflowDefinition wfWorkflowDefinition, int position) { var cmd = GetSqlServerCommand("FindActivityDefinitionByPosition.sql"); cmd.Parameters.AddWithValue(WfActivityDefinition.Cols.WFWD_ID, wfWorkflowDefinition.WfwdId); cmd.Parameters.AddWithValue(WfActivityDefinition.Cols.LEVEL, position); WfActivityDefinition activity = CollectionBuilder <WfActivityDefinition> .ParseCommandForSingleObject(cmd, true); return(activity); }
public WfActivityDefinition Build() { WfActivityDefinition wfActivityDefinition = new WfActivityDefinition(); wfActivityDefinition.Name = myName; wfActivityDefinition.Level = myLevel; // Multiplicity : Single by default wfActivityDefinition.WfmdCode = myWfCodeMultiplicityDefinition.ToString(); wfActivityDefinition.WfwdId = myWfwdId; return(wfActivityDefinition); }
public bool CanAutoValidateActivity(WfActivityDefinition activityDefinition, object obj) { RuleConstants ruleConstants = _ruleManager.GetConstants(activityDefinition.WfwdId); bool ruleValid = _ruleManager.IsRuleValid((int)activityDefinition.WfadId, obj, ruleConstants); IList <AccountUser> accounts = _ruleManager.SelectAccounts((int)activityDefinition.WfadId, obj, ruleConstants); bool atLeastOnePerson = accounts.Count > 0; // If no rule is defined for validation or no one can validate this activity, we can autovalidate it. return(ruleValid == false || atLeastOnePerson == false); }
public WfActivity FindActivityByDefinitionWorkflow(WfWorkflow wfWorkflow, WfActivityDefinition wfActivityDefinition) { foreach (WfActivity wfActivity in inMemoryActivityStore.Values) { if (wfActivityDefinition.WfadId.Equals(wfActivity.WfadId)) { return(wfActivity); } } return(null); }
public void AddSelector(WfActivityDefinition wfActivity, SelectorDefinition selector, List <RuleFilterDefinition> filters) { Debug.Assert(wfActivity != null); Debug.Assert(selector != null); Debug.Assert(filters != null); // -- selector.ItemId = wfActivity.WfadId; _ruleManager.AddSelector(selector); foreach (RuleFilterDefinition ruleFilterDefinition in filters) { ruleFilterDefinition.SelId = selector.Id; _ruleManager.AddFilter(ruleFilterDefinition); } }
public void AddRule(WfActivityDefinition wfActivity, RuleDefinition ruleDefinition, List <RuleConditionDefinition> conditions) { Debug.Assert(wfActivity != null); Debug.Assert(ruleDefinition != null); Debug.Assert(conditions != null); // -- ruleDefinition.ItemId = wfActivity.WfadId; _ruleManager.AddRule(ruleDefinition); foreach (RuleConditionDefinition ruleConditionDefinition in conditions) { ruleConditionDefinition.RudId = ruleDefinition.Id; _ruleManager.AddCondition(ruleConditionDefinition); } }
public bool CanAutoValidateActivity(WfActivityDefinition activityDefinition, RuleContext ruleContext, IDictionary <int, List <RuleDefinition> > dicRules, IDictionary <int, List <RuleConditionDefinition> > dicConditions, IDictionary <int, List <SelectorDefinition> > dicSelectors, IDictionary <int, List <RuleFilterDefinition> > dicFilters) { bool ruleValid = _ruleManager.IsRuleValid(activityDefinition.WfadId.Value, ruleContext, dicRules, dicConditions); if (ruleValid == false) { return(true); } IList <AccountUser> accounts = _ruleManager.SelectAccounts(activityDefinition.WfadId.Value, ruleContext, dicSelectors, dicFilters); bool atLeastOnePerson = accounts.Count > 0; // If no rule is defined for validation or no one can validate this activity, we can autovalidate it. return(atLeastOnePerson == false); }
public IList <WfActivityDefinition> FindAllDefaultActivityDefinitions(WfWorkflowDefinition wfWorkflowDefinition) { Debug.Assert(wfWorkflowDefinition != null); //--- long?idStartActivity = wfWorkflowDefinition.WfadId; IList <WfActivityDefinition> retAllDefaultActivities = new List <WfActivityDefinition>(); WfTransitionDefinition transitionNext = transitionsNext[idStartActivity + "|" + WfCodeTransition.Default.ToString()]; while (transitionNext != null) { WfActivityDefinition wfNextActivityDefinition = inMemoryActivityDefinitionStore[transitionNext.WfadIdTo]; retAllDefaultActivities.Add(wfNextActivityDefinition); transitionNext = transitionsNext[wfNextActivityDefinition.WfadId + "|" + WfCodeTransition.Default.ToString()]; } return(retAllDefaultActivities); }
private WfActivity AutoValidateActivity(WfActivityDefinition wfNextActivityDefinition) { //Automatic validation of this activity DateTime now = new DateTime(); WfActivity wfActivityCurrent = new WfActivity(); wfActivityCurrent.CreationDate = now; wfActivityCurrent.WfadId = (int)wfNextActivityDefinition.WfadId; _workflowStorePlugin.CreateActivity(wfActivityCurrent); WfDecision decision = new WfDecision(); decision.User = USER_AUTO; decision.DecisionDate = now; return(wfActivityCurrent); }
public void AddActivity(WfWorkflowDefinition wfWorkflowDefinition, WfActivityDefinition wfActivityDefinitionToAdd, int position) { WfActivityDefinition wfActivityDefinition = _workflowStorePlugin.FindActivityDefinitionByPosition(wfWorkflowDefinition, position); if (wfActivityDefinition == null) { // Inserting a activity in trail int size = _workflowStorePlugin.CountDefaultTransitions(wfWorkflowDefinition); Debug.Assert(size == Math.Max(0, position - 2), "Position is not valid"); wfActivityDefinitionToAdd.Level = position; _workflowStorePlugin.CreateActivityDefinition(wfWorkflowDefinition, wfActivityDefinitionToAdd); //Find the previous activity to add a link to the newly created if (position == 2) { WfTransitionDefinition wfTransitionDefinition = new WfTransitionBuilder(wfWorkflowDefinition.WfadId, wfActivityDefinitionToAdd.WfadId).build(); _workflowStorePlugin.AddTransition(wfTransitionDefinition); } else if (position > 2) { WfActivityDefinition wfActivityDefinitionPrevious = _workflowStorePlugin.FindActivityDefinitionByPosition(wfWorkflowDefinition, position - 2); WfTransitionDefinition wfTransitionDefinition = new WfTransitionBuilder(wfActivityDefinitionPrevious.WfadId, wfActivityDefinitionToAdd.WfadId).build(); _workflowStorePlugin.AddTransition(wfTransitionDefinition); } else { //Saving starting activity wfWorkflowDefinition.WfadId = wfActivityDefinitionToAdd.WfadId; _workflowStorePlugin.UpdateWorkflowDefinition(wfWorkflowDefinition); } } else { // Inserting an activity inside the default activities "linked list" _workflowStorePlugin.CreateActivityDefinition(wfWorkflowDefinition, wfActivityDefinitionToAdd); // Automatically move the next activity after the newly created MoveActivity(wfWorkflowDefinition, wfActivityDefinitionToAdd, wfActivityDefinition, false); } }
public void RemoveActivity(WfActivityDefinition wfActivityDefinition) { _workflowStorePlugin.DeleteActivityDefinition(wfActivityDefinition); }
public void DeleteActivityDefinition(WfActivityDefinition wfActivityDefinition) { BrokerManager.GetBroker <WfActivityDefinition>().Delete(wfActivityDefinition); }
public void CreateActivityDefinition(WfWorkflowDefinition wfWorkflowDefinition, WfActivityDefinition wfActivityDefinition) { wfActivityDefinition.WfwdId = (int)wfWorkflowDefinition.WfwdId; int id = (int)BrokerManager.GetBroker <WfActivityDefinition>().Save(wfActivityDefinition); wfActivityDefinition.WfadId = id; }
public void UpdateActivityDefinition(WfActivityDefinition wfActivityDefinition) { BrokerManager.GetBroker <WfActivityDefinition>().Save(wfActivityDefinition); }
public void SaveDecisionAndGoToNextActivity(WfWorkflow wfWorkflow, string transitionName, WfDecision wfDecision) { Debug.Assert(WfCodeStatusWorkflow.Sta.ToString().Equals(wfWorkflow.WfsCode), "A workflow must be started before saving decision"); //--- WfActivity currentActivity = _workflowStorePlugin.ReadActivity((int)wfWorkflow.WfaId2); // Updating the decision SaveDecision(wfWorkflow, wfDecision); WfActivityDefinition currentActivityDefinition = _workflowStorePlugin.ReadActivityDefinition(currentActivity.WfadId); WfCodeMultiplicityDefinition wfCodeMultiplicityDefinition = (WfCodeMultiplicityDefinition)Enum.Parse(typeof(WfCodeMultiplicityDefinition), currentActivityDefinition.WfmdCode); bool canGoToNextActivity = false; if (wfCodeMultiplicityDefinition == WfCodeMultiplicityDefinition.Mul) { IList <WfDecision> wfDecisions = _workflowStorePlugin.FindAllDecisionByActivity(currentActivity); object obj = _itemStorePlugin.ReadItem((int)wfWorkflow.ItemId); RuleConstants ruleConstants = _ruleManager.GetConstants((int)wfWorkflow.WfwdId); IList <AccountUser> accounts = _ruleManager.SelectAccounts(currentActivity.WfadId, obj, ruleConstants); //TODO : better impl than O(n²) int match = 0; foreach (AccountUser account in accounts) { foreach (WfDecision decision in wfDecisions) { if (account.Id.Equals(decision.User)) { match++; break; } } } if (match == accounts.Count) { canGoToNextActivity = true; } } else { canGoToNextActivity = true; } if (canGoToNextActivity) { if (_workflowStorePlugin.HasNextActivity(currentActivity, transitionName)) { WfActivityDefinition nextActivityDefinition = _workflowStorePlugin.FindNextActivity(currentActivity, transitionName); //Autovalidating next activities AutoValidateNextActivities(wfWorkflow, (int)nextActivityDefinition.WfadId); WfActivity lastAutoValidateActivity = _workflowStorePlugin.ReadActivity((int)wfWorkflow.WfaId2); WfActivityDefinition nextActivityDefinitionPrepare = _workflowStorePlugin.FindNextActivity(lastAutoValidateActivity); DateTime now = new DateTime(); // Creating the next activity to validate. WfActivity nextActivity = new WfActivity(); nextActivity.CreationDate = now; nextActivity.WfadId = (int)nextActivityDefinitionPrepare.WfadId; nextActivity.WfwId = (int)wfWorkflow.WfwId; _workflowStorePlugin.CreateActivity(nextActivity); wfWorkflow.WfaId2 = nextActivity.WfaId; _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow); } else { // No next activity to go. Ending the workflow wfWorkflow.WfsCode = WfCodeStatusWorkflow.End.ToString(); _workflowStorePlugin.UpdateWorkflowInstance(wfWorkflow); } } }
public void DeleteActivityDefinition(WfActivityDefinition wfActivityDefinition) { inMemoryActivityDefinitionStore.Remove(wfActivityDefinition.WfadId); }