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); } }