private ExpressionOperatorConfiguration GetExpressionTokens(GlobalConfigData globalConfigData, ConfigDataLoader dataLoader)
        {
            string testflowHome         = globalConfigData.GetConfigValue <string>(Constants.GlobalConfig, "TestflowHome");
            string expressionConfigFile = $"{testflowHome}{CommonConst.DeployDir}{Path.DirectorySeparatorChar}expressionconfig.xml";
            ExpressionOperatorConfiguration expressionTokens = dataLoader.LoadExpressionTokens(expressionConfigFile);

            // 有效化ExpressTokens
            ValidateExpressionTokens(globalConfigData, expressionTokens);
            return(expressionTokens);
        }
        public void CreateExpressionConfigFile()
        {
            List <ExpressionOperatorInfo> tokenCollection = new List <ExpressionOperatorInfo>(10);

            tokenCollection.Add(new ExpressionOperatorInfo()
            {
                Name           = "GetElement",
                Description    = "Get the element in specified subscript.",
                Symbol         = "[]",
                FormatString   = "{0}[{1}]",
                Priority       = 10,
                ArgumentsCount = 1
            });


            List <ExpressionCalculatorInfo> calculatorInfos        = new List <ExpressionCalculatorInfo>(10);
            ExpressionCalculatorInfo        getArrayElemCalculator = new ExpressionCalculatorInfo()
            {
                Name            = "GetArrayElement",
                OperatorName    = "GetElement",
                Description     = "Get the array data element in specified subscript.",
                CalculatorClass = new ExpressionTypeData()
                {
                    AssemblyPath = "ExpressionCalculators.dll",
                    ClassName    = "Testflow.ExpressionCalculators.ArrayElementAcquirer"
                },
                SourceType = new ExpressionTypeData()
                {
                    AssemblyPath = "mscorlib.dll",
                    ClassName    = "System.Array"
                },
                ArgumentsType = new List <ExpressionTypeData>()
            };

            getArrayElemCalculator.ArgumentsType.Add(new ExpressionTypeData()
            {
                AssemblyPath = "mscorlib.dll",
                ClassName    = "System.Int32"
            });
            calculatorInfos.Add(getArrayElemCalculator);

            ExpressionOperatorConfiguration configData = new ExpressionOperatorConfiguration()
            {
                Version     = "1.0.1.0",
                Operators   = tokenCollection,
                Calculators = calculatorInfos
            };

            FileStream    fileStream    = new FileStream("expressionconfig.xml", FileMode.Create);
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(ExpressionOperatorConfiguration),
                                                            new Type[] { typeof(ExpressionOperatorInfo), typeof(ExpressionCalculatorInfo),
                                                                         typeof(ExpressionTypeData) });

            xmlSerializer.Serialize(fileStream, configData);
        }
        private void InitializeExpressionInfos(GlobalConfigData globalConfigData, ConfigDataLoader dataLoader)
        {
            // 获取表达式符号信息并添加到SequenceManager和EngineCore的配置信息中
            ExpressionOperatorConfiguration expressionTokens = GetExpressionTokens(globalConfigData, dataLoader);
            // 添加操作符到操作符信息的映射
            Dictionary <string, ExpressionOperatorInfo> operatorInfos = new Dictionary <string, ExpressionOperatorInfo>(expressionTokens.Operators.Count);

            foreach (ExpressionOperatorInfo operatorInfo in expressionTokens.Operators)
            {
                operatorInfos.Add(operatorInfo.Symbol, operatorInfo);
            }
            globalConfigData.AddConfigItem(Constants.SequenceManage, "ExpressionOperators", operatorInfos);
            globalConfigData.AddConfigItem(Constants.EngineConfig, "ExpressionOperators", operatorInfos);
            globalConfigData.AddConfigItem(Constants.ParamCheck, "ExpressionOperators", operatorInfos);
            // 添加计算类的信息
            globalConfigData.AddConfigItem(Constants.SequenceManage, "ExpressionCalculators", expressionTokens.Calculators);
            globalConfigData.AddConfigItem(Constants.EngineConfig, "ExpressionCalculators", expressionTokens.Calculators);
            globalConfigData.AddConfigItem(Constants.ParamCheck, "ExpressionCalculators", expressionTokens.Calculators);
        }
        private void ValidateExpressionTokens(GlobalConfigData configData, ExpressionOperatorConfiguration expressionTokens)
        {
            List <string> availableDirs = new List <string>(5);

            availableDirs.AddRange(configData.GetConfigValue <string[]>(Constants.GlobalConfig, "WorkspaceDir"));
            availableDirs.Add(configData.GetConfigValue <string>(Constants.GlobalConfig, "PlatformLibDir"));
            availableDirs.Add(configData.GetConfigValue <string>(Constants.GlobalConfig, "DotNetLibDir"));
            availableDirs.Add(configData.GetConfigValue <string>(Constants.GlobalConfig, "DotNetRootDir"));

            string calculatorName = string.Empty;

            try
            {
                foreach (ExpressionCalculatorInfo calculatorInfo in expressionTokens.Calculators)
                {
                    // 获取表达式计算类的对象
                    SetAssemblyAbsolutePath(calculatorInfo.CalculatorClass, availableDirs);
                    SetAssemblyAbsolutePath(calculatorInfo.SourceType, availableDirs);
                    if (null != calculatorInfo.ArgumentsType)
                    {
                        foreach (ExpressionTypeData argumentTypeInfo in calculatorInfo.ArgumentsType)
                        {
                            SetAssemblyAbsolutePath(argumentTypeInfo, availableDirs);
                        }
                    }
                }
            }
            catch (TestflowException)
            {
                throw;
            }
            catch (ApplicationException ex)
            {
                TestflowRunner.GetInstance().LogService.Print(LogLevel.Fatal, CommonConst.PlatformLogSession, ex,
                                                              $"Invalid expression token {calculatorName}");
                throw new TestflowRuntimeException(ModuleErrorCode.ConfigDataError,
                                                   ex.Message, ex);
            }
        }