public void ExecuteScriptAsync(IfrmScriptEngine scriptEngine, string filePath, string projectPath, List <ScriptVariable> variables = null,
                                       List <ScriptElement> elements = null, Dictionary <string, object> appInstances = null)
        {
            Log.Information("Client requesting to execute script using frmEngine");

            ScriptEngineUI = scriptEngine;

            if (variables != null)
            {
                VariableList = variables;
            }

            if (elements != null)
            {
                ElementList = elements;
            }

            if (appInstances != null)
            {
                AppInstances = appInstances;
            }

            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = true;
                ExecuteScript(filePath, true, projectPath);
            }).Start();
        }
예제 #2
0
 public static void InitializeScriptEngine(IfrmScriptEngine newEngine)
 {
     if (_scriptEngine == null)
     {
         _scriptEngine = newEngine;
     }
 }
예제 #3
0
 public EngineContext(string filePath, string projectPath, IContainer container, IfrmScriptBuilder scriptBuilder, Logger engineLogger,
                      List <ScriptVariable> variables, List <ScriptArgument> arguments, List <ScriptElement> elements, Dictionary <string, object> appInstances,
                      IfrmScriptEngine scriptEngine, int startFromLineNumber)
 {
     FilePath            = filePath;
     ProjectPath         = projectPath;
     Container           = container;
     ScriptBuilder       = scriptBuilder;
     EngineLogger        = engineLogger;
     Variables           = variables;
     Arguments           = arguments;
     Elements            = elements;
     AppInstances        = appInstances;
     ScriptEngine        = scriptEngine;
     StartFromLineNumber = startFromLineNumber;
 }
예제 #4
0
 public EngineContext(string filePath, string projectPath, IContainer container, IfrmScriptBuilder scriptBuilder, Logger engineLogger,
                      List <OBScriptVariable> variables, List <ScriptArgument> arguments, List <ScriptElement> elements, Dictionary <string, List <AssemblyReference> > importedNamespaces,
                      Dictionary <string, object> sessionVariables, IfrmScriptEngine scriptEngine, int startFromLineNumber, bool isDebugMode, bool isChildEngine)
 {
     FilePath            = filePath;
     ProjectPath         = projectPath;
     Container           = container;
     ScriptBuilder       = scriptBuilder;
     EngineLogger        = engineLogger;
     Variables           = variables;
     Arguments           = arguments;
     Elements            = elements;
     ImportedNamespaces  = importedNamespaces;
     SessionVariables    = sessionVariables;
     ScriptEngine        = scriptEngine;
     StartFromLineNumber = startFromLineNumber;
     IsDebugMode         = isDebugMode;
     IsChildEngine       = isChildEngine;
     GuidPlaceholder     = GenerateGuidPlaceHolder();
 }
        public void ExecuteScriptAsync(IfrmScriptEngine scriptEngine, string filePath, List <ScriptVariable> variables = null,
                                       List <ScriptElement> elements = null)
        {
            EngineLogger.Information("Client requesting to execute script using frmEngine");

            TasktEngineUI = scriptEngine;

            if (variables != null)
            {
                VariableList = variables;
            }

            if (elements != null)
            {
                ElementList = elements;
            }

            new Thread(() =>
            {
                Thread.CurrentThread.IsBackground = true;
                ExecuteScript(filePath, true);
            }).Start();
        }
예제 #6
0
        public override void RunCommand(object sender)
        {
            var parentAutomationEngineInstance = (IAutomationEngineInstance)sender;

            if (parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine == null)
            {
                RunServerTask(sender);
                return;
            }

            var childTaskPath = v_TaskPath.ConvertUserVariableToString(parentAutomationEngineInstance);

            if (!File.Exists(childTaskPath))
            {
                throw new FileNotFoundException("Task file was not found");
            }

            IfrmScriptEngine parentfrmScriptEngine = parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine;
            string           parentTaskPath        = parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine.ScriptEngineContext.FilePath;
            int parentDebugLine = parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine.DebugLineNumber;

            //create argument list
            InitializeArgumentLists(parentAutomationEngineInstance);

            string projectPath = parentfrmScriptEngine.ScriptEngineContext.ProjectPath;

            EngineContext childEngineContext = new EngineContext(childTaskPath, projectPath, parentAutomationEngineInstance.AutomationEngineContext.Container, CurrentScriptBuilder,
                                                                 parentfrmScriptEngine.ScriptEngineContext.EngineLogger, null, _argumentList, null, parentAutomationEngineInstance.AutomationEngineContext.AppInstances, null, 1);

            _childfrmScriptEngine = parentfrmScriptEngine.CommandControls.CreateScriptEngineForm(childEngineContext, false, parentfrmScriptEngine.IsDebugMode);

            if (parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine.IsScheduledOrAttendedTask)
            {
                _childfrmScriptEngine.IsScheduledOrAttendedTask = true;
            }

            _childfrmScriptEngine.IsChildEngine      = true;
            _childfrmScriptEngine.IsHiddenTaskEngine = true;

            if (IsSteppedInto)
            {
                _childfrmScriptEngine.IsNewTaskSteppedInto = true;
                _childfrmScriptEngine.IsHiddenTaskEngine   = false;
            }

            if (CurrentScriptBuilder != null)
            {
                CurrentScriptBuilder.EngineLogger.Information("Executing Child Task: " + Path.GetFileName(childTaskPath));
            }
            else
            {
                Log.Information("Executing Child Task: " + Path.GetFileName(childTaskPath));
            }

            ((Form)parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine).Invoke((Action) delegate()
            {
                ((Form)parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine).TopMost = false;
            });
            Application.Run((Form)_childfrmScriptEngine);

            if (_childfrmScriptEngine.ClosingAllEngines)
            {
                parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine.ClosingAllEngines = true;
                parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine.CloseWhenDone     = true;
            }

            // Update Current Engine Context Post Run Task
            _childfrmScriptEngine.UpdateCurrentEngineContext(parentAutomationEngineInstance, _childfrmScriptEngine, _argumentList);

            if (CurrentScriptBuilder != null)
            {
                CurrentScriptBuilder.EngineLogger.Information("Resuming Parent Task: " + Path.GetFileName(parentTaskPath));
            }
            else
            {
                Log.Information("Resuming Parent Task: " + Path.GetFileName(parentTaskPath));
            }

            if (parentfrmScriptEngine.IsDebugMode)
            {
                ((Form)parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine).Invoke((Action) delegate()
                {
                    ((Form)parentfrmScriptEngine).TopMost    = true;
                    parentfrmScriptEngine.IsHiddenTaskEngine = true;

                    if ((IsSteppedInto || !_childfrmScriptEngine.IsHiddenTaskEngine) && !_childfrmScriptEngine.IsNewTaskResumed && !_childfrmScriptEngine.IsNewTaskCancelled)
                    {
                        parentfrmScriptEngine.ScriptEngineContext.ScriptBuilder.CurrentEngine       = parentfrmScriptEngine;
                        parentfrmScriptEngine.ScriptEngineContext.ScriptBuilder.IsScriptSteppedInto = true;
                        parentfrmScriptEngine.IsHiddenTaskEngine = false;

                        //toggle running flag to allow for tab selection
                        parentfrmScriptEngine.ScriptEngineContext.ScriptBuilder.IsScriptRunning = false;
                        parentfrmScriptEngine.ScriptEngineContext.ScriptBuilder.OpenScriptFile(parentTaskPath, true);
                        parentfrmScriptEngine.ScriptEngineContext.ScriptBuilder.IsScriptRunning = true;

                        parentfrmScriptEngine.UpdateLineNumber(parentDebugLine + 1);
                        parentfrmScriptEngine.AddStatus("Pausing Before Execution");
                    }
                    else if (_childfrmScriptEngine.IsNewTaskResumed)
                    {
                        parentfrmScriptEngine.ScriptEngineContext.ScriptBuilder.CurrentEngine = parentfrmScriptEngine;
                        parentfrmScriptEngine.IsNewTaskResumed   = true;
                        parentfrmScriptEngine.IsHiddenTaskEngine = true;
                        parentfrmScriptEngine.ScriptEngineContext.ScriptBuilder.IsScriptSteppedInto = false;
                        parentfrmScriptEngine.ScriptEngineContext.ScriptBuilder.IsScriptPaused      = false;
                        parentfrmScriptEngine.ResumeParentTask();
                    }
                    else if (_childfrmScriptEngine.IsNewTaskCancelled)
                    {
                        parentfrmScriptEngine.uiBtnCancel_Click(null, null);
                    }
                    else                     //child task never stepped into
                    {
                        parentfrmScriptEngine.IsHiddenTaskEngine = false;
                    }
                });
            }
            else
            {
                ((Form)parentAutomationEngineInstance.AutomationEngineContext.ScriptEngine).Invoke((Action) delegate()
                {
                    ((Form)parentfrmScriptEngine).TopMost = true;
                });
            }
        }
예제 #7
0
        public void UpdateCurrentEngineContext(IAutomationEngineInstance parentAutomationEngineIntance, IfrmScriptEngine childfrmScriptEngine, List <ScriptArgument> argumentList)
        {
            //get new variable list from the new task engine after it finishes running
            var childEngine = ((frmScriptEngine)childfrmScriptEngine).EngineInstance;

            var parentVariableList = parentAutomationEngineIntance.AutomationEngineContext.Variables;
            var parentArgumentList = parentAutomationEngineIntance.AutomationEngineContext.Arguments;

            //get new argument list from the new task engine after it finishes running
            var childArgumentList = childfrmScriptEngine.ScriptEngineContext.Arguments;

            foreach (var argument in argumentList)
            {
                if ((argument.Direction == ScriptArgumentDirection.Out || argument.Direction == ScriptArgumentDirection.InOut) &&
                    argument.AssignedVariable != null)
                {
                    var assignedParentVariable = parentVariableList.Where(v => v.VariableName == argument.AssignedVariable).FirstOrDefault();
                    var assignedParentArgument = parentArgumentList.Where(a => a.ArgumentName == argument.AssignedVariable).FirstOrDefault();
                    if (assignedParentVariable != null)
                    {
                        assignedParentVariable.VariableValue = childArgumentList.Where(a => a.ArgumentName == argument.ArgumentName).First().ArgumentValue;
                    }
                    else if (assignedParentArgument != null)
                    {
                        assignedParentArgument.ArgumentValue = childArgumentList.Where(a => a.ArgumentName == argument.ArgumentName).First().ArgumentValue;
                    }
                    else
                    {
                        throw new ArgumentException($"Unable to assign the value of '{argument.ArgumentName}' to '{argument.AssignedVariable}' " +
                                                    "because no variable/argument with this name exists.");
                    }
                }
            }

            //get updated app instance dictionary after the new engine finishes running
            parentAutomationEngineIntance.AutomationEngineContext.AppInstances = childEngine.AutomationEngineContext.AppInstances;

            //get errors from new engine (if any)
            var newEngineErrors = childEngine.ErrorsOccured;

            if (newEngineErrors.Count > 0 && !(parentAutomationEngineIntance.LastExecutedCommand.CommandName == "RunTaskCommand" && parentAutomationEngineIntance.LastExecutedCommand.v_ErrorHandling == "Ignore Error"))
            {
                parentAutomationEngineIntance.ChildScriptFailed = true;
                foreach (var error in newEngineErrors)
                {
                    parentAutomationEngineIntance.ErrorsOccured.Add(error);
                }
            }
        }