using System;
using System.Collections;
using System.Configuration;
using Abp.Dependency;
using Abp.Runtime.Caching;
using Abp.UI;
using IwbZero.Expr;
using IwbZero.IwbBase;
using IwbZero.IwbDataQuery;
using IwbZero.ToolCommon;
using IwbZero.ToolCommon.LogHelpers;
using IwbZero.ToolCommon.StringModel;
using WeEngine.ComponentInfo;
using WeEngine.Components.InterfaceFactory;
using WeEngine.Packages;
namespace WeEngine.Components
{
///
/// 事务运行器
///
public class ComponentRunner : ISingletonDependency
{
#region 属性
///
/// 当前运行节点
///
public NodeBase CurrentNode { get; set; }
public ICacheManager CacheManager { get; }
public IIocManager IocManager { get; }
private int Depth { get; set; }
public EngineComponent Component { get; set; }
public string ParameterMapping { get; set; }
public Hashtable Variables { get; set; }
public Hashtable DataSources { get; }
public Hashtable FilterFields { get; }
public string ProcessInstanceId => GetValue(CompStmtType.CompInstanceId.VariableName);
public string ProcessMessage
{
get => GetValue(CompStmtType.CompMessage.VariableName);
set => SetValue(CompStmtType.CompMessage.VariableName, value);
}
public bool ProcessResult => (GetValue(CompStmtType.CompResult.VariableName).ValI() != 0);
#endregion
public ComponentRunner(ICacheManager cacheManager, IIocManager iocManager)
{
CacheManager = cacheManager;
IocManager = iocManager;
Variables = new Hashtable();
DataSources = new Hashtable();
FilterFields = new Hashtable();
}
///
/// 运行事务组件
///
///
///
///
public bool Run(string cId, string mapping="")
{
var flag = false;
var component = LoadComponentById(cId);
if (component != null)
{
flag = Run(component, mapping);
}
return flag;
}
///
/// 运行事务组件
///
///
///
///
public bool Run(EngineComponent component,string mapping="")
{
DataSources.Clear();
FilterFields.Clear();
//Variables.Clear();
Component = component;
ParameterMapping = mapping;
InitializeVariables();
if (Component.ComponentScript != "")
{
var xml = component.ComponentScript;
IwbXmlNode node = IwbXmlNode.ParseGenericXml(xml);
if (node != null)
{
foreach (ComponentParameter parameter in ParseComponentParameter(component.Parameters))
{
FilterFields.Add(IwbVariableType.Global + parameter.Id.UAndT(), "");
}
if (mapping != "")
{
ArrayList list2 = mapping.MappingToArrayList();
if (list2 != null)
{
foreach (IwbIdName name in list2)
{
SetValue(IwbVariableType.Global + name.Id, name.Name);
}
}
}
RunStatements(node.Nodes);
}
}
else
{
IComponentRunner runner = IocManager.Resolve(Component.RegisterKey);
if (!runner.Run(Component, mapping))
{
typeof(ComponentRunner).LogError(runner.ErrorMessage);
}
//object obj2 = AssemblyHelper.CreateInstance(Component.ProcessClass, Component.ProcessLib);
//if (obj2 == null)
//{
// typeof(ComponentRunner).LogError(
// $"Unable to create static process runner at {Component.ProcessClass}.");
// //AbortProcessWithMessage(string.Format("Unable to create static process runner at {0}.", _Process.ProcessClass));
//}
//else if (!(obj2 is IComponentRunner))
//{
// typeof(ComponentRunner).LogError($"The process runner, {Component.ProcessClass}, is invalid.");
// //AbortProcessWithMessage(string.Format("The process runner, {0}, is invalid.", _Process.ProcessClass));
//}
//else
//{
// IComponentRunner runner = (IComponentRunner)obj2;
// if (!runner.Run(Component, pcParameterMappings))
// {
// typeof(ComponentRunner).LogError(runner.ErrorMessage);
// //AbortProcessWithMessage(runner.ErrorMessage);
// }
//}
}
return true;
}
#region 私有方法
///
/// 解析参数
///
///
///
private ArrayList ParseComponentParameter(string pcParameter)
{
ArrayList list = new ArrayList();
foreach (string str in pcParameter.StrToArray())
{
if (str.IndexOf(":", StringComparison.Ordinal) != -1)
{
string pcStr = str.Substring(0, str.IndexOf(":", StringComparison.Ordinal));
ComponentParameter parameter = new ComponentParameter(str.Substring(str.IndexOf(":", StringComparison.Ordinal) + 1, (str.Length - str.IndexOf(":", StringComparison.Ordinal)) - 1), ParameterTypeFromStr(pcStr));
list.Add(parameter);
}
}
return list;
}
///
/// 转换参数类型
///
///
///
private ComponentParameterType ParameterTypeFromStr(string pcStr)
{
ComponentParameterType filterField = ComponentParameterType.Variable;
string str = pcStr;
if (str.IsEmpty())
{
return filterField;
}
str = string.IsInterned(str);
if (str == "FilterField")
{
return ComponentParameterType.FilterField;
}
if (str == "File")
{
return ComponentParameterType.File;
}
if (str == "Folder")
{
return ComponentParameterType.Folder;
}
if (str != "PrinterSetting")
{
return filterField;
}
return ComponentParameterType.PrinterSetting;
}
///
/// 变量初始化
///
private void InitializeVariables()
{
CreateVariable(CompStmtType.CompMessage.VariableName, CompStmtType.CompMessage.VariableType,false);
CreateVariable(CompStmtType.CompInstanceId.VariableName, CompStmtType.CompInstanceId.VariableType, false);
CreateVariable(CompStmtType.CompResult.VariableName, CompStmtType.CompResult.VariableType, false);
SetValue(CompStmtType.CompMessage.VariableName, "");
SetValue(CompStmtType.CompInstanceId.VariableName, "0");
SetValue(CompStmtType.CompResult.VariableName, "1");
}
///
/// 转换表达式变量
///
///
private void TransComponentVariables(ExprObject poRoot)
{
foreach (ExprObject expr in poRoot.ChildNodes)
{
if (expr.ElementType == ExprElements.Variable)
{
if (expr.Expr.Trim() != "")
{
expr.Expr = GetValue(expr.Expr);
expr.ElementType = ExprElements.Value;
}
}
else if ((expr.ElementType == ExprElements.Expression) || (expr.ElementType == ExprElements.Function))
{
TransComponentVariables(expr);
}
}
}
///
/// 加载组件
///
///
///
private EngineComponent LoadComponentById(string cId)
{
var packageId = CurrentNode?.CurPackageInfo?.Id ?? "";
EngineComponent component = null;
if (packageId.IsNotEmpty()) component = CacheManager.GetEngineComponent(packageId, cId);
if (component == null)
{
try
{
string url = $"{ConfigurationManager.AppSettings["DataCenter.Engine.Component"]}";
string authKey = ConfigurationManager.AppSettings["DataCenter.Engine.AuthKey"];
var result = url.RequestPost(new { Id = cId }.Obj2String(),authKey);
var obj = result.Str2Obj();
return obj;
}
catch (Exception e)
{
throw new UserFriendlyException($"没有找到Id为{cId}的引擎组件!{e.Message}");
}
}
return component;
}
public string TransMappingWithRunner( string pcMapping)
{
string pcSource = "";
foreach (IwbIdName name in pcMapping.MappingToArrayList())
{
string str2 = Evaluate(name.Name);
if (str2 != "")
{
pcSource = pcSource.AddStr($"{name.Id}={str2}");
}
}
return pcSource;
}
#endregion
#region 事务
///
/// 运行事务
///
///
///
public bool RunOneStatement(IwbXmlNode poStatement)
{
IStatementRunner StatementRunner = null;
try
{
StatementRunner = IocManager.Resolve().Create(poStatement.Name);
}
catch (Exception e)
{
this.LogError(e);
}
return StatementRunner?.Run(this, poStatement) ?? false;
}
///
/// 运行事务
///
///
///
public bool RunStatements(ArrayList poStatements)
{
bool flag = true;
Depth++;
int count = poStatements.Count;
for (int i = 0; i < count; i++)
{
var poStatement = (IwbXmlNode)poStatements[i];
string childValue = poStatement.GetChildValue("Comment");
//ShowStepInfo(count, i + 1, childValue);
string processMessage = ProcessMessage;
try
{
bool flag2 = poStatement.GetChildValue("RunWhenFail").StrToBool();
bool processResult = ProcessResult;
if (childValue != "")
{
typeof(ComponentRunner).LogInfo("\r\n\r\n");
typeof(ComponentRunner).LogInfo(childValue);
typeof(ComponentRunner).LogInfo($"Process Result: {processResult}");
typeof(ComponentRunner).LogInfo($"RunWhenFail option: {(flag2 ? "On" : "Off")}");
}
if (processResult || flag2)
{
flag = RunOneStatement(poStatement);
}
}
catch (Exception e)
{
typeof(ComponentRunner).LogError(e);
// AbortProcessWithMessage(exception.Message);
}
if (!ProcessResult)
{
flag = false;
}
if (ProcessMessage != processMessage)
{
typeof(ComponentRunner).LogInfo(processMessage);
}
}
Depth--;
return flag;
}
///
/// 创建变量
///
///
///
///
public void CreateVariable(string pcVariableId, string pcVariableType,bool save2node=true)
{
pcVariableId = pcVariableId.UAndT();
var variable = new IwbRtVariable(pcVariableId, pcVariableType);
Variables[pcVariableId] = variable;
if(save2node && CurrentNode != null && !CurrentNode.Variables.ContainsKey(pcVariableId))
{
CurrentNode.Variables[pcVariableId] = variable;
}
}
///
/// 设置变量值
///
///
///
///
public void SetValue(string pcIdentifier, string pcExpression, bool plToEvaluate = false)
{
pcIdentifier = pcIdentifier.UAndT();
string pcValue = pcExpression;
if (plToEvaluate)
{
pcValue = Evaluate(pcExpression);
}
if (pcIdentifier.IndexOf(IwbVariableType.Global, StringComparison.Ordinal) == 0)
{
if (FilterFields.ContainsKey(pcIdentifier))
{
FilterFields[pcIdentifier] = pcValue;
}
//else
//{
// UserSession.SetSessionVariable(pcIdentifier, pcValue);
//}
}
else if (Variables.ContainsKey(pcIdentifier))
{
var variable = (IwbRtVariable)Variables[pcIdentifier];
variable.VarValue = pcValue;
CurrentNode.Variables[pcIdentifier] = variable;
}
else
{
Array array = pcIdentifier.StrToArrayEx("$");
if (array.Length == 2)
{
string pcDataSourceId = array.GetValue(0).ToString();
string name = array.GetValue(1).ToString();
IwbDataSource dataSource = GetDataSource(pcDataSourceId);
if (dataSource?.Data != null && (dataSource.Data.IsOpened))
{
dataSource.Data.SetField(name, pcValue);
}
}
else
{
var variable = new IwbRtVariable(pcIdentifier.UAndT()).SetValue(pcValue);
CurrentNode.Variables[pcIdentifier] = variable;
}
}
}
///
/// 查询变量值
///
///
///
public string GetValue(string pcIdentity)
{
string str = pcIdentity;
pcIdentity = pcIdentity.UAndT();
if (pcIdentity.IndexOf(IwbVariableType.Global, StringComparison.Ordinal) == 0)
{
if (FilterFields.ContainsKey(pcIdentity))
{
return FilterFields[pcIdentity].ToString();
}
//return UserSession.GetSessionVariableValue(pcIdentity);
}
if (Variables.ContainsKey(pcIdentity))
{
var variable = (IwbRtVariable)Variables[pcIdentity];
return variable.GetStringValue();
}
Array array = pcIdentity.StrToArrayEx(CompStmtType.Separator);
if (array.Length == 2)
{
string pcDataSourceId = array.GetValue(0).ToString();
string name = array.GetValue(1).ToString();
var dataSource = GetDataSource(pcDataSourceId);
if (dataSource?.Data != null && dataSource.Data.IsOpened)
{
str = dataSource.Data.GetString(name);
}
}
return str;
}
///
/// 计算表达式
///
///
///
public string Evaluate(string pcExpression)
{
string str = "";
var poRoot = new ExprObject(pcExpression);
if (EvalExpr.Parse(poRoot, true))
{
TransComponentVariables(poRoot);
str = EvalExpr.Evaluate(poRoot);
}
return str;
}
///
/// 计算表达式
///
///
///
public bool EvaluateBool(string pcExpression)
{
bool flag = true;
if (pcExpression != "")
{
flag = Evaluate(pcExpression).ValB();
}
return flag;
}
///
/// 查询数据源
///
///
///
public IwbDataSource GetDataSource(string pcDataSourceId)
{
IwbDataSource source = null;
pcDataSourceId = pcDataSourceId.UAndT();
if (DataSources.ContainsKey(pcDataSourceId))
{
source = (IwbDataSource)DataSources[pcDataSourceId];
}
return source;
}
#endregion
}
}