Example #1
0
        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);
        }
Example #8
0
        /// <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"));
        }
Example #9
0
        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);
        }
Example #11
0
        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);
                }
            }
        }