Beispiel #1
0
        protected void variable_input_binding(Func <object> f, string codeString)
        {
            if (_curVar == null)
            {
                throw new Exception("input_binding only in variable def");
            }
            string k = DslUtil.TaskVarInBindingKey(_curTask != null ? _curTask.Id : _currentCompositeTask.Id, _curVar.Name);
            var    b = new DataBindingDef
            {
                BindType = DataBindingType.Expr,
                Source   = codeString,
                Target   = _curVar.Name
            };

            _variableBinds[k] = f;
            if (_curTask != null)
            {
                _curTask.AddInputDataBinding(b);
            }
            else if (_currentCompositeTask != null)
            {
                _currentCompositeTask.AddInputDataBinding(b);
            }
            else
            {
                throw new Exception();
            }
        }
        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);
        }