public void ComplexDynamicActivityWithTwoAssigneesTest() { IWfProcessDescriptor processDesp = CreateComplexDynamicActivityProcess( (IUser)OguObjectSettings.GetConfig().Objects["approver1"].Object, (IUser)OguObjectSettings.GetConfig().Objects["cfo"].Object); IWfProcess process = processDesp.StartupProcess(); IWfActivityDescriptor templateActDesp = process.Descriptor.Activities["NormalActivity"]; IWfActivityDescriptor a1Activity = process.Descriptor.Activities["A1"]; IWfActivityDescriptor a2Activity = process.Descriptor.Activities["A2"]; IWfActivityDescriptor firstDynamicActDesp1 = ValidateDynamicActivities(a1Activity, templateActDesp); IWfActivityDescriptor firstDynamicActDesp2 = ValidateDynamicActivities(a2Activity, templateActDesp); Assert.AreEqual(firstDynamicActDesp1.Key, firstDynamicActDesp2.Key); IWfActivityDescriptor secondDynamicActDesp = firstDynamicActDesp1.GetToActivities().FirstOrDefault(); //第二个动态点的出线对应活动 WfActivityDescriptorCollection secondDynamicActDespOutDesps = secondDynamicActDesp.GetToActivities(); Assert.AreEqual(2, secondDynamicActDespOutDesps.Count); Assert.IsTrue(secondDynamicActDespOutDesps.ContainsKey("B1")); Assert.IsTrue(secondDynamicActDespOutDesps.ContainsKey("B2")); ValidateLastDynamicTransitions(templateActDesp); ValidateTemplateCandidatesAndDynamicActivityCandidates(firstDynamicActDesp1, templateActDesp); }
/// <summary> /// 删除已经生成的动态活动 /// </summary> /// <param name="dynInTransition"></param> /// <param name="templateActivity"></param> internal static void DeleteExistedDynamicActivities(IWfTransitionDescriptor dynInTransition, IWfActivityDescriptor templateActivity) { IWfActivityDescriptor currentActDesp = dynInTransition.ToActivity; WfActivityDescriptorCollection endActivities = templateActivity.GetToActivities(); //沈峥修改,2015-1-25,原来删除已经存在的动态活动时没有考虑多条出线的情况,现在改为递归删除 RemoveExistedDynamicActivityRecursively(currentActDesp, endActivities); ////判断当前活动不在结束的活动中 //while (currentActDesp != null && ((WfActivityDescriptor)currentActDesp).GeneratedByTemplate && endActivities.ContainsKey(currentActDesp.Key) == false) //{ // IWfActivityDescriptor nextActDesp = currentActDesp.GetToActivities().FirstOrDefault(); // if (currentActDesp.IsMainStreamActivity == false && currentActDesp.Instance != null) // currentActDesp.Instance.Remove(); // else // currentActDesp.Remove(); // currentActDesp = nextActDesp; //} foreach (IWfActivityDescriptor actDesp in templateActivity.GetFromActivities()) { IList <IWfTransitionDescriptor> transitions = actDesp.ToTransitions.FindAll(t => t.Properties.GetValue("DynamicSource", string.Empty) == templateActivity.Key); transitions.ForEach(t => actDesp.ToTransitions.Remove(t)); } }
private static void RemoveExistedDynamicActivityRecursively(IWfActivityDescriptor currentActDesp, WfActivityDescriptorCollection endActivities) { //判断当前活动不在结束的活动中 if (currentActDesp != null && ((WfActivityDescriptor)currentActDesp).GeneratedByTemplate && endActivities.ContainsKey(currentActDesp.Key) == false) { //判断当前活动是不已经被删除 if (currentActDesp.Process.Activities.ContainsKey(currentActDesp.Key)) { WfActivityDescriptorCollection nextActivities = currentActDesp.GetToActivities(); if (currentActDesp.IsMainStreamActivity == false && currentActDesp.Instance != null) { currentActDesp.Instance.Remove(); } else { currentActDesp.Remove(); } foreach (IWfActivityDescriptor nextActivity in nextActivities) { RemoveExistedDynamicActivityRecursively(nextActivity, endActivities); } } } }
public static void AssertActivityDescriptorCollection(this WfClientActivityDescriptorCollection cadc, WfActivityDescriptorCollection sadc) { Assert.AreEqual(cadc.Count, sadc.Count); for (int i = 0; i < cadc.Count; i++) cadc[i].AssertActivityDescriptor(sadc[i]); }
/// <summary> /// /// </summary> /// <param name="info"></param> /// <param name="context"></param> protected WfProcessDescriptor(SerializationInfo info, StreamingContext context) : base(info, context) { this._Activities = (WfActivityDescriptorCollection)info.GetValue("Activities", typeof(WfActivityDescriptorCollection)); this._Variables = (WfVariableDescriptorCollection)info.GetValue("Variables", typeof(WfVariableDescriptorCollection)); this._Version = info.GetString("Version"); this._ExtendedProperties = (WfExtendedPropertyDictionary)info.GetValue("ExtendedProperties", typeof(WfExtendedPropertyDictionary)); }
/// <summary> /// 动态活动生成后整理新生成的动态活动的属性 /// </summary> /// <param name="firstDynActDesp"></param> /// <param name="wfActivityBase"></param> private static void ChangeNewDynActivitiesProperties(WfActivityDescriptorCollection createdActivities, IWfActivityDescriptor templateActDesp) { foreach (IWfActivityDescriptor actDesp in createdActivities) { ((WfActivityDescriptor)actDesp).SetDynamicActivityProperties(templateActDesp.Key); if (actDesp.IsMainStreamActivity == false && actDesp.Instance != null) { actDesp.Instance.GenerateCandidatesFromResources(); } } }
/// <summary> /// 创建动态活动 /// </summary> /// <param name="createActivitiesParamsFetcher"></param> /// <returns></returns> private IList <IWfActivityDescriptor> InternalGenerateDynamicActivities(Func <WfCreateActivityParamCollection> createActivitiesParamsFetcher) { createActivitiesParamsFetcher.NullCheck("createActivitiesParamsFetcher"); List <IWfActivityDescriptor> result = null; //随便找一条进线和活动,构造动态活动的起始点。 IWfTransitionDescriptor firstTemplateTransition = this.FromTransitions.FirstOrDefault(); if (firstTemplateTransition != null) { //寻找动态活动的前一个点,如果有多个点,随机选取一个 WfActivityDescriptor startActDesp = (WfActivityDescriptor)firstTemplateTransition.FromActivity; IWfTransitionDescriptor dynInTransition = startActDesp.FindExsitedDynamicToTransition(this); ////没有生成过,或者已经生成过,且生成的活动还没有执行 if (dynInTransition == null || InstanceIsRunning(dynInTransition.ToActivity) == false) { //如果已经生成过 if (dynInTransition != null) { DeleteExistedDynamicActivities(dynInTransition, this); } WfCreateActivityParamCollection createActivityParams = createActivitiesParamsFetcher(); //活动矩阵定义的属性优先于活动模板定义的属性,矩阵中没有设置的属性,则使用活动模版的属性 MergeDynamicActivitiesProperties(createActivityParams, this); WfActivityDescriptorCollection createdActivities = CreateActivities(this.FromTransitions, createActivityParams, this.ToTransitions); ChangeNewDynActivitiesProperties(createdActivities, this); result = new List <IWfActivityDescriptor>(); createdActivities.CopyTo(result); } } return(result); }
/// <summary> /// 查找最后一个动态点的出线 /// </summary> /// <param name="templateActDesp"></param> private static void ValidateLastDynamicTransitions(IWfActivityDescriptor templateActDesp) { WfActivityDescriptorCollection toActivities = templateActDesp.GetToActivities(); List <IWfTransitionDescriptor> dynamicTransitions = new List <IWfTransitionDescriptor>(); foreach (IWfActivityDescriptor actDesp in toActivities) { foreach (IWfTransitionDescriptor transition in actDesp.FromTransitions) { if (transition.Properties.GetValue("DynamicSource", string.Empty) == templateActDesp.Key) { dynamicTransitions.Add(transition); } } } Assert.AreEqual(templateActDesp.ToTransitions.Count, dynamicTransitions.Count, "动态出线应该和模版出线的数量相同"); dynamicTransitions.ForEach(t => Assert.IsTrue(t.Enabled, "动态出线应该都是Enabled")); }
public void BasicDynamicActivityWithTwoAssigneesTest() { IWfProcessDescriptor processDesp = ProcessHelper.CreateSimpleProcessDescriptor(); IWfActivityDescriptor templateActDesp = processDesp.Activities["NormalActivity"]; FillDynamicActivitySimpleResource(templateActDesp, (IUser)OguObjectSettings.GetConfig().Objects["approver1"].Object, (IUser)OguObjectSettings.GetConfig().Objects["cfo"].Object); IWfProcess process = processDesp.StartupProcess(); IWfActivityDescriptor firstDynamicActDesp = ValidateDynamicActivities(process.InitialActivity.Descriptor, templateActDesp); ValidateInDynamicTransitionsProperties(firstDynamicActDesp.FromTransitions, templateActDesp); WfActivityDescriptorCollection dynamicToActivities = firstDynamicActDesp.GetToActivities(); ValidateLastDynamicTransitions(templateActDesp); ValidateTemplateCandidatesAndDynamicActivityCandidates(firstDynamicActDesp, templateActDesp); }
public override object Deserialize(IDictionary <string, object> dictionary, Type type, System.Web.Script.Serialization.JavaScriptSerializer serializer) { //WfProcessDescriptor processDesp = (WfProcessDescriptor)base.Deserialize(dictionary, type, serializer); #region "base Deserialize" string key = DictionaryHelper.GetValue(dictionary, "Key", string.Empty); WfProcessDescriptor processDesp = (WfProcessDescriptor)CreateInstance(key, dictionary, type, serializer); processDesp.Name = DictionaryHelper.GetValue(dictionary, "Name", string.Empty);; processDesp.Enabled = DictionaryHelper.GetValue(dictionary, "Enabled", false); processDesp.Description = DictionaryHelper.GetValue(dictionary, "Description", string.Empty); Dictionary <string, object> processProperties = new Dictionary <string, object>(); Dictionary <string, Type> constKey = new Dictionary <string, Type>(); constKey.Add("RelativeLinks", typeof(WfRelativeLinkDescriptorCollection)); constKey.Add("CancelEventReceivers", typeof(WfResourceDescriptorCollection)); constKey.Add("CompleteEventReceivers", typeof(WfResourceDescriptorCollection)); constKey.Add("InternalRelativeUsers", typeof(WfResourceDescriptorCollection)); constKey.Add("ExternalUsers", typeof(WfExternalUserCollection)); constKey.Add("Variables", typeof(WfVariableDescriptorCollection)); constKey.Add("ParametersNeedToBeCollected", typeof(WfParameterNeedToBeCollected)); constKey.Add("CancelBeforeExecuteServices", typeof(WfServiceOperationDefinitionCollection)); constKey.Add("CancelAfterExecuteServices", typeof(WfServiceOperationDefinitionCollection)); if (dictionary.ContainsKey("Properties")) { PropertyValueCollection properties = JSONSerializerExecute.Deserialize <PropertyValueCollection>(dictionary["Properties"]); properties.Remove(p => string.Compare(p.Definition.Name, "ImportWfMatrix") == 0); processDesp.Properties.Clear(); foreach (PropertyValue pv in properties) { if (constKey.ContainsKey(pv.Definition.Name)) { var objValue = JSONSerializerExecute.DeserializeObject(pv.StringValue, constKey[pv.Definition.Name]); processProperties.Add(pv.Definition.Name, objValue); } else { processDesp.Properties.Add(pv); } } } #endregion processDesp.GraphDescription = DictionaryHelper.GetValue(dictionary, "GraphDescription", string.Empty); WfActivityDescriptorCollection activities = JSONSerializerExecute.Deserialize <WfActivityDescriptorCollection>(dictionary["Activities"]); processDesp.Activities.Clear(); processDesp.Activities.CopyFrom(activities); ClearAllProperties(processDesp); SetProcessProperties(processDesp, processProperties, dictionary); ToTransitionsDescriptorCollection transitions = JSONSerializerExecute.Deserialize <ToTransitionsDescriptorCollection>(dictionary["Transitions"]); foreach (WfTransitionDescriptor tranDesp in transitions) { WfActivityDescriptor fromActDesc = (WfActivityDescriptor)processDesp.Activities[tranDesp.FromActivityKey]; WfActivityDescriptor toActDesc = (WfActivityDescriptor)processDesp.Activities[tranDesp.ToActivityKey]; if (fromActDesc != null && toActDesc != null) { fromActDesc.ToTransitions.AddTransition(toActDesc, tranDesp); } } return(processDesp); }
public static void AssertActivityDescriptorCollection(this WfClientActivityDescriptorCollection cadc, WfActivityDescriptorCollection sadc) { Assert.AreEqual(cadc.Count, sadc.Count); for (int i = 0; i < cadc.Count; i++) { cadc[i].AssertActivityDescriptor(sadc[i]); } }
private WfActivityDescriptorCollection CreateAndAppendActivities(WfActivityDescriptor currentActDesp, bool overrideInitActivity) { IWfProcessDescriptor processDesp = currentActDesp.Process; WfCreateActivityParam lastCreatedActivityParam = null; WfActivityDescriptorCollection result = new WfActivityDescriptorCollection(processDesp); if (currentActDesp != null) { int i = 0; foreach (WfCreateActivityParam cap in this) { if (overrideInitActivity && i == 0) { string key = currentActDesp.Key; cap.Template.CopyPropertiesTo(currentActDesp); currentActDesp.Key = key; } else { WfActivityDescriptor actDesp = (WfActivityDescriptor)cap.Template.Clone(); actDesp.Process = processDesp; actDesp.Key = processDesp.FindNotUsedActivityKey(); currentActDesp.Append(actDesp); currentActDesp = actDesp; } cap.CreatedDescriptor = currentActDesp; result.Add(currentActDesp); if (lastCreatedActivityParam != null) { lastCreatedActivityParam.DefaultNextDescriptor = currentActDesp; } lastCreatedActivityParam = cap; i++; } if (lastCreatedActivityParam != null) { IWfTransitionDescriptor defaultTransition = lastCreatedActivityParam.CreatedDescriptor.ToTransitions.GetAllCanTransitForwardTransitions().FindDefaultSelectTransition(); if (defaultTransition != null) { lastCreatedActivityParam.DefaultNextDescriptor = defaultTransition.ToActivity; } } AdjustTransitionsByTemplate(); } return(result); }
private WfActivityDescriptorCollection CreateActivities(WfTransitionDescriptorCollection fromTransitions, WfCreateActivityParamCollection capc, WfTransitionDescriptorCollection toTransitions) { WfActivityDescriptorCollection result = new WfActivityDescriptorCollection(this.Process); IWfActivityDescriptor firstDynamicActivity = null; IWfActivityDescriptor lastDynamicActivity = null; WfCreateActivityParam lastCreatedActivityParam = null; foreach (WfCreateActivityParam cap in capc) { WfActivityDescriptor actDesp = (WfActivityDescriptor)cap.Template.Clone(); actDesp.Process = this.Process; string newActKey = "ND" + cap.ActivitySN; if (this.Process.Activities.ContainsKey(newActKey)) { newActKey = this.Process.FindNotUsedActivityKey(); } actDesp.Key = newActKey; cap.CreatedDescriptor = actDesp; this.Process.Activities.Add(actDesp); if (lastCreatedActivityParam != null) { lastCreatedActivityParam.DefaultNextDescriptor = actDesp; } lastCreatedActivityParam = cap; if (this.IsMainStreamActivity == false && this.ProcessInstance != null) { WfActivityBase.CreateActivityInstance(actDesp, this.ProcessInstance); } if (firstDynamicActivity == null) { firstDynamicActivity = actDesp; } if (lastDynamicActivity != null) { WfTransitionDescriptor newTransition = (WfTransitionDescriptor)lastDynamicActivity.ToTransitions.AddForwardTransition(actDesp); //如果不是第一个生成的活动 if (firstDynamicActivity != actDesp) { newTransition.GeneratedByTemplate = true; newTransition.TemplateKey = this.Key; } } lastDynamicActivity = actDesp; result.Add(actDesp); } if (firstDynamicActivity != null && lastDynamicActivity != null) { SetEntryTransitionsProperties(firstDynamicActivity, fromTransitions); if (lastCreatedActivityParam != null) { IWfTransitionDescriptor defaultTransition = toTransitions.GetAllConditionMatchedTransitions().FindDefaultSelectTransition(true); if (defaultTransition != null) { lastCreatedActivityParam.DefaultNextDescriptor = defaultTransition.ToActivity; } } capc.AdjustTransitionsByTemplate(this.Key); //如果在活动模板参数的最后一个活动没有配置出线,则使用默认的出线;否则使用配置的出线 if (lastDynamicActivity.ToTransitions.Count == 0) { SetExitTransitionsProperties(lastDynamicActivity, toTransitions); } else { lastDynamicActivity.ToTransitions.ForEach(t => SetDynamicTransitionProperties(null, t, this, false)); } } else { //当没有动态活动生成时,前后的活动直接串联到一起 JoinOriginalActivitiesAndSetProperties(fromTransitions, toTransitions); } //将模版点的进出线的Enabled都设置为False fromTransitions.ForEach(t => ((WfTransitionDescriptor)t).Enabled = false); toTransitions.ForEach(t => ((WfTransitionDescriptor)t).Enabled = false); return(result); }
/// <summary> /// 动态活动生成后整理新生成的动态活动的属性 /// </summary> /// <param name="firstDynActDesp"></param> /// <param name="wfActivityBase"></param> private static void ChangeNewDynActivitiesProperties(WfActivityDescriptorCollection createdActivities, IWfActivityDescriptor templateActDesp) { foreach (IWfActivityDescriptor actDesp in createdActivities) { ((WfActivityDescriptor)actDesp).SetDynamicActivityProperties(templateActDesp.Key); if (actDesp.IsMainStreamActivity == false && actDesp.Instance != null) actDesp.Instance.GenerateCandidatesFromResources(); } }
private WfActivityDescriptorCollection CreateActivities(WfTransitionDescriptorCollection fromTransitions, WfCreateActivityParamCollection capc, WfTransitionDescriptorCollection toTransitions) { WfActivityDescriptorCollection result = new WfActivityDescriptorCollection(this.Process); IWfActivityDescriptor firstDynamicActivity = null; IWfActivityDescriptor lastDynamicActivity = null; WfCreateActivityParam lastCreatedActivityParam = null; foreach (WfCreateActivityParam cap in capc) { WfActivityDescriptor actDesp = (WfActivityDescriptor)cap.Template.Clone(); actDesp.Process = this.Process; string newActKey = "ND" + cap.ActivitySN; if (this.Process.Activities.ContainsKey(newActKey)) newActKey = this.Process.FindNotUsedActivityKey(); actDesp.Key = newActKey; cap.CreatedDescriptor = actDesp; this.Process.Activities.Add(actDesp); if (lastCreatedActivityParam != null) lastCreatedActivityParam.DefaultNextDescriptor = actDesp; lastCreatedActivityParam = cap; if (this.IsMainStreamActivity == false && this.ProcessInstance != null) WfActivityBase.CreateActivityInstance(actDesp, this.ProcessInstance); if (firstDynamicActivity == null) firstDynamicActivity = actDesp; if (lastDynamicActivity != null) { WfTransitionDescriptor newTransition = (WfTransitionDescriptor)lastDynamicActivity.ToTransitions.AddForwardTransition(actDesp); //如果不是第一个生成的活动 if (firstDynamicActivity != actDesp) { newTransition.GeneratedByTemplate = true; newTransition.TemplateKey = this.Key; } } lastDynamicActivity = actDesp; result.Add(actDesp); } if (firstDynamicActivity != null && lastDynamicActivity != null) { SetEntryTransitionsProperties(firstDynamicActivity, fromTransitions); if (lastCreatedActivityParam != null) { IWfTransitionDescriptor defaultTransition = toTransitions.GetAllConditionMatchedTransitions().FindDefaultSelectTransition(true); if (defaultTransition != null) lastCreatedActivityParam.DefaultNextDescriptor = defaultTransition.ToActivity; } capc.AdjustTransitionsByTemplate(this.Key); //如果在活动模板参数的最后一个活动没有配置出线,则使用默认的出线;否则使用配置的出线 if (lastDynamicActivity.ToTransitions.Count == 0) SetExitTransitionsProperties(lastDynamicActivity, toTransitions); else lastDynamicActivity.ToTransitions.ForEach(t => SetDynamicTransitionProperties(null, t, this, false)); } else { //当没有动态活动生成时,前后的活动直接串联到一起 JoinOriginalActivitiesAndSetProperties(fromTransitions, toTransitions); } //将模版点的进出线的Enabled都设置为False fromTransitions.ForEach(t => ((WfTransitionDescriptor)t).Enabled = false); toTransitions.ForEach(t => ((WfTransitionDescriptor)t).Enabled = false); return result; }
private static void RemoveExistedDynamicActivityRecursively(IWfActivityDescriptor currentActDesp, WfActivityDescriptorCollection endActivities) { //判断当前活动不在结束的活动中 if (currentActDesp != null && ((WfActivityDescriptor)currentActDesp).GeneratedByTemplate && endActivities.ContainsKey(currentActDesp.Key) == false) { //判断当前活动是不已经被删除 if (currentActDesp.Process.Activities.ContainsKey(currentActDesp.Key)) { WfActivityDescriptorCollection nextActivities = currentActDesp.GetToActivities(); if (currentActDesp.IsMainStreamActivity == false && currentActDesp.Instance != null) currentActDesp.Instance.Remove(); else currentActDesp.Remove(); foreach (IWfActivityDescriptor nextActivity in nextActivities) RemoveExistedDynamicActivityRecursively(nextActivity, endActivities); } } }