public Dictionary <string, object> PrepareChildTaskInputData(CompositeTaskInstance cti, TaskDef childTask, ITaskExecutionContext ctx) { _pd.SetTaskInstanceInfo(cti, ctx); string k1 = DslUtil.TaskInputDataBindingKey(childTask.Id); if (_pd._variableBinds.ContainsKey(k1)) { //get full data record SC.IDictionary dic = (SC.IDictionary)_pd._variableBinds[k1](); return(ToTaskData(dic)); } Dictionary <string, object> ret = new Dictionary <string, object>(); if (childTask.Variables != null) { if (childTask.AutoBindVariables) { foreach (var vd in childTask.Variables) { if (vd.VariableDir == ProcessModel.Data.VariableDef.Dir.In || vd.VariableDir == ProcessModel.Data.VariableDef.Dir.InOut) { //TODO add type conversion/control if (cti.TaskData.ContainsKey(vd.Name)) { ret[vd.Name] = cti.TaskData[vd.Name]; } } } } if (childTask.InputDataBindings != null) { foreach (var bd in childTask.InputDataBindings) { if (bd.BindType == DataBindingType.CopyVar) { ret[bd.Target] = cti.TaskData[bd.Source]; } else if (bd.BindType == DataBindingType.Literal) { ret[bd.Target] = bd.Source; } else if (bd.BindType == DataBindingType.Expr) { string k = DslUtil.TaskVarInBindingKey(childTask.Id, bd.Target); if (!_pd._variableBinds.ContainsKey(k)) { throw new Exception("Fail: missing delegate: " + k); } ret[bd.Target] = _pd._variableBinds[k](); } } } } return(ret); }
public void ExecuteChildTaskOutputDataBinding(CompositeTaskInstance ti, TaskDef childTask, Dictionary <string, object> childOutputData, ITaskExecutionContext ctx) { if (string.IsNullOrEmpty(ti.InstanceId) || string.IsNullOrEmpty(ti.TaskId) || string.IsNullOrEmpty(ti.ProcessDefinitionId) || string.IsNullOrEmpty(ti.ProcessInstanceId)) { throw new Exception("Task not inited properly"); } _pd.SetTaskInstanceInfo(ti, ctx); _pd.SetOutputData(childOutputData); _pd.SetInputData(null); var ctd = childTask.Parent; if (childTask.AutoBindVariables && ctd.Variables != null) { foreach (var vd in ctd.Variables) { if (childOutputData.ContainsKey(vd.Name)) { ti.TaskData[vd.Name] = childOutputData[vd.Name]; } } } if (childTask.OutputDataBindings != null) { foreach (var bd in childTask.OutputDataBindings) { switch (bd.BindType) { case DataBindingType.CopyVar: ti.TaskData[bd.Target] = childOutputData[bd.Source]; break; case DataBindingType.Literal: ti.TaskData[bd.Target] = bd.Source; break; case DataBindingType.Expr: string k = DslUtil.TaskVarOutBindingKey(childTask.Id, bd.Target); if (!_pd._exprs.ContainsKey(k)) { throw new Exception("!"); } ti.TaskData[bd.Target] = _pd._exprs[k](); break; } } } }
public CompositeTaskInstanceInfo GetTaskInstanceInfo(string instanceId) { CompositeTaskInstanceInfo ret = null; RunProcessTransaction(this.DefaultPersistenceMode, ps => { CompositeTaskInstance cti = (CompositeTaskInstance)ps.PersisterSession.GetForRead(instanceId); CompositeTaskInstanceInfo rt = new CompositeTaskInstanceInfo(); rt.InstanceId = cti.InstanceId; rt.TaskId = cti.TaskId; rt.ProcessDefinitionId = cti.ProcessDefinitionId; rt.ProcessInstanceId = cti.ProcessInstanceId; rt.Marking = cti.Marking.Where(x => x.Value > 0).Select(x => x.Key).ToList(); rt.ActiveTasks = cti.ActiveTasks.Select(x => x.TaskId).ToList(); ret = rt; }); return(ret); }
public IEnumerable <Dictionary <string, object> > PrepareMultiInstanceTaskInputData(CompositeTaskInstance cti, TaskDef childTask, ITaskExecutionContext ctx) { if (!childTask.IsMultiInstance) { throw new Exception(); } var k = DslUtil.TaskMultiInstanceSplitKey(childTask.Id); Func <object> fun = _pd._variableBinds[k]; if (fun == null) { throw new Exception(); } _pd.SetTaskInstanceInfo(cti, ctx); SC.IEnumerable enu; var val = fun(); enu = val is SC.IEnumerable ? (SC.IEnumerable)val : new object[] { val }; List <Dictionary <string, object> > ret = new List <Dictionary <string, object> >(); foreach (object item in enu) { if (item is Dictionary <string, object> ) { ret.Add((Dictionary <string, object>)item); } else if (item is SC.IDictionary) { ret.Add(ToTaskData((SC.IDictionary)item)); } else { throw new Exception(); } } return(ret); /* * ITaskScript scr = Context.ScriptManager.GetTaskScript(this.ParentProcess, taskId); * Task tsk = MyTask.RequireTask(taskId); * scr.TaskContext = Context; * Dictionary<string, object> srcData = new Dictionary<string, object>(TaskData); * scr.SourceData = srcData; * object obj = scr.EvalMultiInstanceSplitQuery(); * IEnumerable enu; * if (obj is IEnumerable) * enu = (IEnumerable)obj; * else * { * ArrayList al = new ArrayList(); * al.Add(obj); * enu = al; * } * List<Dictionary<string, object>> lst = new List<Dictionary<string, object>>(); * * foreach (object v in enu) * { * srcData[tsk.MultiInstanceItemAlias] = v; * lst.Add(ExecuteInputDataBindings(scr, tsk)); * } * return lst; */ throw new NotImplementedException(); }