コード例 #1
0
ファイル: Task.cs プロジェクト: wty0512/FyWorld
 public TaskData(TaskDef def, TargetList targets, BaseCharacter character, int ticksToPerform = 0)
 {
     this.def            = def;
     this.targets        = targets;
     this.character      = character;
     this.ticksToPerform = ticksToPerform;
 }
コード例 #2
0
        protected void output_bindings_code(Func <SC.IDictionary> fun, string codeStr)
        {
            TaskDef tsk = _curTask != null ? _curTask : (TaskDef)_currentCompositeTask;
            string  k   = DslUtil.TaskOutputDataBindingKey(tsk.Id);

            _variableBinds[k] = fun;
        }
コード例 #3
0
ファイル: Octopus.cs プロジェクト: AutomationConsultant/dotrl
        private ITaskTracker MakeTaskTracker(TaskDef def)
        {
            FoodTaskDef foodTaskDef = def as FoodTaskDef;

            if (foodTaskDef != null)
            {
                return(new FoodTaskTracker(this, foodTaskDef));
            }
            else
            {
                TargetTaskDef targetTaskDef = def as TargetTaskDef;
                if (targetTaskDef != null)
                {
                    return(new TargetTaskTracker(this, targetTaskDef));
                }
                else
                {
                    PointTaskDef pointTaskDef = def as PointTaskDef;
                    if (pointTaskDef != null)
                    {
                        return(new PointTaskTracker(this, pointTaskDef));
                    }
                    else
                    {
                        throw new System.ArgumentException("Unknown task definition given.");
                    }
                }
            }
        }
コード例 #4
0
        internal void ParseMethod(Token tok)
        {
            Advance(); //past 'method
            Token nameToken = CurrentToken;

            Advance(); //past name
            //
            ExpertDef parent    = (ExpertDef)CurrentNode;
            TaskDef   methodDef = parent.CreateTaskDef(nameToken, AstNodeKind.TaskDef);

            //
            ParseTrigger(methodDef);
            ParseProperties(methodDef);
            //
            if (CurrentToken == null)
            {
                return;
            }
            //else
            PushTaskDef(methodDef);
            PushNode(methodDef.ProcedureDef);
            do
            {
                CreateState(CurrentList);
                ParseMethodItem(methodDef);
                PopState();
            } while (Advance());
            PopNode();
            PopTaskDef();
        }
コード例 #5
0
        protected void multi_instance_split_expression(Func <object> dataSplitQuery, string code)
        {
            TaskDef tsk = _curTask != null ? _curTask : (TaskDef)_currentCompositeTask;
            string  k   = DslUtil.TaskMultiInstanceSplitKey(tsk.Id);

            tsk.MultiInstanceSplitExpression = string.IsNullOrEmpty(code) ? "# compiled code block" : code;
            _variableBinds[k] = dataSplitQuery;
        }
コード例 #6
0
 protected void GenerateBaseTaskScripts(TaskDef td)
 {
     if (td.Variables != null)
     {
         foreach (var vd in td.Variables.Where(x => !string.IsNullOrEmpty(x.DefaultValueExpr)))
         {
             GenExpression(DslUtil.TaskVariableDefaultKey(td.Id, vd.Name), vd.DefaultValueExpr);
         }
     }
     if (td.InputDataBindings != null)
     {
         foreach (var bnd in td.InputDataBindings.Where(x => x.BindType == DataBindingType.Expr))
         {
             GenExpression(DslUtil.TaskVarInBindingKey(td.Id, bnd.Target), bnd.Source);
         }
     }
     if (td.OutputDataBindings != null)
     {
         foreach (var bnd in td.OutputDataBindings.Where(x => x.BindType == DataBindingType.Expr))
         {
             GenExpression(DslUtil.TaskVarOutBindingKey(td.Id, bnd.Target), bnd.Source);
         }
     }
     if (td.InputParameterBindings != null)
     {
         foreach (var bnd in td.InputParameterBindings.Where(x => x.BindType == DataBindingType.Expr))
         {
             GenExpression(DslUtil.TaskParamInBindingKey(td.Id, bnd.Target), bnd.Source);
         }
     }
     if (td.OutputParameterBindings != null)
     {
         foreach (var bnd in td.OutputParameterBindings.Where(x => x.BindType == DataBindingType.Expr))
         {
             GenExpression(DslUtil.TaskParamOutBindingKey(td.Id, bnd.Target), bnd.Source);
         }
     }
     if (td.IsMultiInstance)
     {
         GenExpression(DslUtil.TaskMultiInstanceSplitKey(td.Id), td.MultiInstanceSplitExpression);
     }
     if (!string.IsNullOrEmpty(td.BeforeEnableScript))
     {
         GenStatement(DslUtil.TaskScriptKey(td.Id, "BeforeEnable"), td.BeforeEnableScript);
     }
     if (!string.IsNullOrEmpty(td.AfterCompleteScript))
     {
         GenStatement(DslUtil.TaskScriptKey(td.Id, "AfterComplete"), td.AfterCompleteScript);
     }
     if (!string.IsNullOrEmpty(td.AfterEnableScript))
     {
         GenStatement(DslUtil.TaskScriptKey(td.Id, "AfterEnable"), td.AfterEnableScript);
     }
 }
コード例 #7
0
 protected void GenerateScript(TaskDef td)
 {
     if (td is CompositeTaskDef)
     {
         GenerateScript((CompositeTaskDef)td);
     }
     else
     {
         GenerateScript((AtomicTaskDef)td);
     }
 }
コード例 #8
0
 public virtual void Activate(ITaskExecutionContext ctx, ProcessDef processDef, IProcessScriptRuntime scriptRuntime)
 {
     Context           = ctx;
     ProcessDefinition = processDef;
     TaskDefinition    = processDef.GetRequiredTask(this.TaskId);
     ScriptRuntime     = scriptRuntime;
     if (TaskDefinition == null)
     {
         throw new Exception("Task not found in process definition: " + this.TaskId);
     }
 }
コード例 #9
0
        void ParseMethodItem(TaskDef parent)
        {
            switch (CurrentToken.Kind)
            {
            case TokenKind.Precondition:
                ParsePrecondition(parent.ProcedureDef);
                break;

            default:
                ParseTaskItem(parent.ProcedureDef);
                break;
            }
        }
コード例 #10
0
        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;
                    }
                }
            }
        }
コード例 #11
0
        void ParseTrigger(TaskDef taskDef)
        {
            TriggerStmt triggerDecl = new TriggerStmt(taskDef);

            PushNode(triggerDecl);
            ExprSeq exprSeq = ParseExprSeq();

            PopNode();
            //
            triggerDecl.ExprSeq = exprSeq;
            taskDef.TriggerDef  = triggerDecl;
            bool isCreator = taskDef.IsCreator;

            taskDef.Parent.AddTriggerDef(taskDef.TriggerDef, isCreator);
        }
コード例 #12
0
        void ParseTaskMessage(ClauseExpr messageDef)
        {
            Advance(); //past 'task
            //
            TaskDef taskDef = CurrentTaskDef.CreateSubtaskDef();

            messageDef.MessageTag.TaskDef = taskDef;
            //
            ParseProperties(taskDef);
            //
            PushTaskDef(taskDef);
            ParseTaskItems(taskDef.ProcedureDef);
            PopTaskDef();
            //
            messageDef.MakeCallback();
        }
コード例 #13
0
            public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            {
                JObject ob = JObject.Load(reader);
                string  s  = ob.Value <string>("TaskType");

                if (string.IsNullOrEmpty(s))
                {
                    s = ob.Value <string>("$type");
                }
                if (s == null)
                {
                    throw new Exception("task type missing: " + ob.ToString());
                }
                bool    composite = s.IndexOf("composite", StringComparison.InvariantCultureIgnoreCase) >= 0;
                TaskDef tsk       = composite ? (TaskDef) new CompositeTaskDef() : new AtomicTaskDef();

                serializer.Populate(ob.CreateReader(), tsk);
                return(tsk);
            }
コード例 #14
0
        protected TaskInstance CreateTaskInstance(TaskDef td)
        {
            if (td is CompositeTaskDef)
            {
                return(new CompositeTaskInstance());
            }
            AtomicTaskDef at = td as AtomicTaskDef;

            switch (at.TaskType)
            {
            case NGinnTaskType.Empty:
                return(new EmptyTaskInstance());

            case NGinnTaskType.Timer:
                return(new TimerTaskInstance());

            case NGinnTaskType.Debug:
                return(new DebugTaskInstance());

            case NGinnTaskType.Manual:
                return(new ManualTaskInstance());

            case NGinnTaskType.SendMessage:
                return(new SendMessageTaskInstance());

            case NGinnTaskType.ReceiveMessage:
                return(new AwaitMessageTaskInstance());

            case NGinnTaskType.Custom:
                if (string.IsNullOrEmpty(td.ImplementationClass))
                {
                    throw new Exception("ImplementationClass missing");
                }
                Type t  = Type.GetType(td.ImplementationClass);
                var  ti = (TaskInstance)Activator.CreateInstance(t);
                return(ti);

            default:
                return(new EmptyTaskInstance());
            }
        }
コード例 #15
0
 //
 public void PushTaskDef(TaskDef def)
 {
     TaskDefStack.Push(def);
 }
コード例 #16
0
        public void InitializeNewTask(TaskInstance ti, Dictionary <string, object> inputData, 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);

            TaskDef td = _def.GetRequiredTask(ti.TaskId);

            if (td.Variables != null)
            {
                foreach (var vd in td.Variables)
                {
                    if (vd.VariableDir == ProcessModel.Data.VariableDef.Dir.In ||
                        vd.VariableDir == ProcessModel.Data.VariableDef.Dir.InOut)
                    {
                        if (inputData.ContainsKey(vd.Name))
                        {
                            ti.TaskData[vd.Name] = inputData[vd.Name];
                        }
                    }
                    if (!ti.TaskData.ContainsKey(vd.Name))
                    {
                        var k = DslUtil.TaskVariableDefaultKey(td.Id, vd.Name);
                        if (_pd._variableBinds.ContainsKey(k))
                        {
                            ti.TaskData[vd.Name] = _pd._variableBinds[k]();
                        }
                        else if (!string.IsNullOrEmpty(vd.DefaultValueExpr))
                        {
                            ti.TaskData[vd.Name] = vd.DefaultValueExpr; //TODO: add type conversion
                        }
                        else if (vd.IsRequired)
                        {
                            throw new NGinnBPM.ProcessModel.Exceptions.DataValidationException("Required variable missing: " + vd.Name).SetTaskId(ti.TaskId).SetProcessDef(ti.ProcessDefinitionId);
                        }
                    }
                }
            }
            //now initialize task parameters
            if (td.InputParameterBindings != null)
            {
                foreach (var bd in td.InputParameterBindings)
                {
                    var pi = ti.GetType().GetProperty(bd.Target);
                    if (pi == null)
                    {
                        throw new NGinnBPM.ProcessModel.Exceptions.TaskParameterInvalidException(bd.Target, "Property not found: " + bd.Target).SetTaskId(ti.TaskId);
                    }
                    string k = DslUtil.TaskParamInBindingKey(td.Id, bd.Target);
                    if (bd.BindType == DataBindingType.Expr)
                    {
                        pi.SetValue(ti, _pd._variableBinds[k](), null);
                    }
                    else if (bd.BindType == DataBindingType.CopyVar)
                    {
                        pi.SetValue(ti, ti.TaskData.ContainsKey(bd.Source) ? ti.TaskData[bd.Source] : null, null);
                    }
                    else if (bd.BindType == DataBindingType.Literal)
                    {
                        pi.SetValue(ti, Convert.ChangeType(bd.Source, pi.PropertyType), null);
                    }
                    else
                    {
                        throw new Exception();
                    }
                }
            }
            string ks = DslUtil.TaskScriptKey(ti.TaskId, "_paramInit");

            if (_pd._taskScripts.ContainsKey(ks))
            {
                _pd._taskScripts[ks]();
            }
        }
コード例 #17
0
        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);
        }
コード例 #18
0
        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();
        }
コード例 #19
0
 protected internal TimeLimitTaskTracker(TaskDef def)
 {
     this.timeLimit  = int.Parse(def.TimeLimit, System.Globalization.CultureInfo.CurrentCulture);
     this.stepReward = def.StepReward;
     timeLeft        = timeLimit;
 }
コード例 #20
0
 public Task(TaskDef def)
 {
     this.def            = def;
     this.ticksToPerform = def.ticksToPerform;
 }
コード例 #21
0
 public Task(TaskDef def, int ticksToPerform) : this(def) {
     this.ticksToPerform = ticksToPerform;
 }
コード例 #22
0
 public Task(TaskDef def, TargetList targets, int ticksToPerform) : this(def, targets)
 {
     this.ticksToPerform = ticksToPerform;
 }
コード例 #23
0
 public Task(TaskDef def, TargetList targets) : this(def) {
     this.targets        = targets;
     this.ticksToPerform = def.ticksToPerform;
 }