using System;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
using Abp.Runtime.Caching;
using Abp.UI;
using IwbZero.IwbBase;
using IwbZero.ToolCommon;
using IwbZero.ToolCommon.LogHelpers;
using IwbZero.ToolCommon.StringModel;
using WeEngine.CommonDto.WeInfo;
using WeEngine.ComponentInfo;
namespace WeEngine
{
public static class PackageHelper
{
private static readonly string PackageBasePath = $"{WeEngineConst.DataFileBasePath}Packages/";
#region 方案包
///
/// 查询方案包
///
///
///
///
public static IwbXmlNode GetPackageXml(this ICacheManager cacheManager, string packageId)
{
var xml = cacheManager.GetCache(EngineCacheName.Package).Get(packageId, () => GetPackageXmlById(packageId));
return xml;
}
///
/// 查询方案包
///
///
///
public static IwbXmlNode GetPackageXmlById(string packageId)
{
var path = $"{PackageBasePath}{packageId}/";
var fileName = $"{path}Package.iwbx";
var xDoc = new XmlDocument();
if (Directory.Exists(path) && File.Exists(fileName))
{
return GetPackageXmlFromFile(packageId);
}
try
{
//访问数据中心获取
string baseUrl = ConfigurationManager.AppSettings["DataCenter.Platform.BaseUrl"] ?? "http://shvber.com:5015/";
string apiUrl = ConfigurationManager.AppSettings["DataCenter.Engine.PackageUrl"] ?? "api/services/WePlatform/WePackage/GetPackageXml";
string url=$"{baseUrl.Ew("/")}{apiUrl}?no={packageId}";
string authKey = ConfigurationManager.AppSettings["DataCenter.Engine.AuthKey"];
string result = url.RequestPost(new { PackageNo = packageId }.Obj2String(), authKey);
WePackageXmlDto xmlDto = result.Str2Obj();
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
if (xmlDto.FlowXml.IsNotEmpty())
{
xDoc.InnerXml = xmlDto.FlowXml;
xDoc.Save($"{path}flow.iwbx");
}
if (xmlDto.SceneXml.IsNotEmpty())
{
xDoc.InnerXml = xmlDto.SceneXml;
xDoc.Save($"{path}scene.iwbx");
}
if (xmlDto.BehaviorXml.IsNotEmpty())
{
xDoc.InnerXml = xmlDto.BehaviorXml;
xDoc.Save($"{path}behavior.iwbx");
}
if (xmlDto.ComponentXml.IsNotEmpty())
{
xDoc.InnerXml = xmlDto.ComponentXml;
xDoc.Save($"{path}component.iwbx");
}
if (xmlDto.GuideXml.IsNotEmpty())
{
xDoc.InnerXml = xmlDto.GuideXml;
xDoc.Save($"{path}guide.iwbx");
}
if (xmlDto.EnvironResourceXml.IsNotEmpty())
{
xDoc.InnerXml = xmlDto.EnvironResourceXml;
xDoc.Save($"{path}environment.iwbx");
}
IwbXmlNode iwbNode = null;
if (xmlDto.PackageXml.IsNotEmpty())
{
xDoc.InnerXml = xmlDto.PackageXml;
xDoc.Save($"{path}package.iwbx");
iwbNode = IwbXmlNode.ParseGenericXml(xmlDto.PackageXml);
}
return iwbNode;
}
catch (Exception e)
{
typeof(PackageHelper).LogError(e);
throw new UserFriendlyException("方案包获取、解析失败!");
}
}
///
/// 从文件加载方案包
///
///
///
public static IwbXmlNode GetPackageXmlFromFile(string packageId)
{
string fileName = $"{PackageBasePath}{packageId}/package.iwbx";
if (!File.Exists(fileName))
{
return null;
}
try
{
var xDoc = new XmlDocument();
xDoc.Load(fileName);
var iwbNode = IwbXmlNode.ParseGenericXml(xDoc.InnerXml);
return iwbNode;
}
catch (Exception e)
{
typeof(PackageHelper).LogError(e);
throw new UserFriendlyException("方案包解析失败!");
}
}
#endregion
#region 情景流
///
/// 加载情景流
///
///
///
///
///
public static IwbXmlNode GetSceneFlowXml(this ICacheManager cacheManager, string packageId, string flowNo)
{
var xml = cacheManager.GetCache(EngineCacheName.EngineSceneFlowCache).Get($"{packageId}.{flowNo}", () => GetSceneFlowXmlFromFile(packageId, flowNo));
return xml;
}
///
/// 从文件加载情景流
///
///
///
///
public static IwbXmlNode GetSceneFlowXmlFromFile(string packageId, string flowNo)
{
string fileName = $"{PackageBasePath}{packageId}/flow.iwbx";
if (!File.Exists(fileName))
{
return null;
}
var xDoc = XDocument.Load(fileName);
var root = xDoc.Root;
var flow = root != null && root.HasElements
? (from e in root.Elements("SceneFlow") where e.Attribute("id")?.Value == flowNo select e).FirstOrDefault()
: null;
if (flow == null)
{
return null;
}
//var xmlDoc= new XmlDocument();
//xmlDoc.LoadXml(flow.ToString());
//XmlNode xmlNode = xmlDoc.FirstChild;
var iwbNode = IwbXmlNode.ParseGenericXml(flow.ToString());
return iwbNode;
}
///
/// 从xml字符串中加载情景流
///
///
///
///
public static IwbXmlNode GetSceneFlowXmlFromXml(string xml, string flowNo)
{
if (xml.IsEmpty())
{
return null;
}
var xDoc = XDocument.Parse(xml);
var root = xDoc.Root;
var flow = root != null && root.HasElements
? (from e in root.Elements("SceneFlow") where e.Attribute("id")?.Value == flowNo select e).FirstOrDefault()
: null;
if (flow == null)
{
return null;
}
//var xmlDoc= new XmlDocument();
//xmlDoc.LoadXml(flow.ToString());
//XmlNode xmlNode = xmlDoc.FirstChild;
var iwbNode = IwbXmlNode.ParseGenericXml(flow.ToString());
return iwbNode;
}
#endregion
#region 情景
///
/// 加载情景
///
///
///
///
///
public static IwbXmlNode GetSceneInfoXml(this ICacheManager cacheManager, string packageId, string sceneNo)
{
var xml = cacheManager.GetCache(EngineCacheName.EngineSceneInfoCache).Get($"{packageId}.{sceneNo}", () => GetSceneXmlFromFile(packageId, sceneNo));
return xml;
}
///
/// 从文件加载情景
///
///
///
///
public static IwbXmlNode GetSceneXmlFromFile(string packageId, string sceneNo)
{
string fileName = $"{PackageBasePath}{packageId}/scene.iwbx";
if (!File.Exists(fileName))
{
return null;
}
var xDoc = XDocument.Load(fileName);
var root = xDoc.Root;
var scene = root != null && root.HasElements
? (from e in root.Elements("SceneInfo") where e.Attribute("id")?.Value == sceneNo select e).FirstOrDefault()
: null;
if (scene == null)
{
return null;
}
//var xmlDoc = new XmlDocument();
//xmlDoc.LoadXml(scene.ToString());
//XmlNode xmlNode = xmlDoc.FirstChild;
//return xmlNode;
var iwbNode = IwbXmlNode.ParseGenericXml(scene.ToString());
return iwbNode;
}
///
/// 从xml加载情景
///
///
///
///
public static IwbXmlNode GetSceneXmlFromXml(string xml, string sceneNo)
{
if (xml.IsEmpty())
{
return null;
}
var xDoc = XDocument.Parse(xml);
var root = xDoc.Root;
var scene = root != null && root.HasElements
? (from e in root.Elements("SceneInfo") where e.Attribute("id")?.Value == sceneNo select e).FirstOrDefault()
: null;
if (scene == null)
{
return null;
}
//var xmlDoc = new XmlDocument();
//xmlDoc.LoadXml(scene.ToString());
//XmlNode xmlNode = xmlDoc.FirstChild;
//return xmlNode;
var iwbNode = IwbXmlNode.ParseGenericXml(scene.ToString());
return iwbNode;
}
#endregion
#region 行为
///
/// 加载处理行为
///
///
///
///
///
public static IwbXmlNode GetBehaviorXml(this ICacheManager cacheManager, string packageId, string behaviorNo)
{
var xml = cacheManager.GetCache(EngineCacheName.EngineBehaviorCache).Get($"{packageId}.{behaviorNo}", () => GetBehaviorXmlFromFile(packageId, behaviorNo));
return xml;
}
///
/// 从文件加载处理行为
///
///
///
///
public static IwbXmlNode GetBehaviorXmlFromFile(string packageId, string behaviorNo)
{
string fileName = $"{PackageBasePath}{packageId}/behavior.iwbx";
if (!File.Exists(fileName))
{
return null;
}
var xDoc = XDocument.Load(fileName);
var root = xDoc.Root;
var behavior = root != null && root.HasElements
? (from e in root.Elements("Behavior") where e.Attribute("id")?.Value == behaviorNo select e).FirstOrDefault()
: null;
if (behavior == null)
{
return null;
}
var iwbNode = IwbXmlNode.ParseGenericXml(behavior.ToString());
return iwbNode;
}
///
/// 从xml加载处理行为
///
///
///
///
public static IwbXmlNode GetBehaviorXmlFromXml(string xml, string behaviorNo)
{
if (xml.IsEmpty())
{
return null;
}
var xDoc = XDocument.Parse(xml);
var root = xDoc.Root;
var behavior = root != null && root.HasElements
? (from e in root.Elements("Behavior") where e.Attribute("id")?.Value == behaviorNo select e).FirstOrDefault()
: null;
if (behavior == null)
{
return null;
}
var iwbNode = IwbXmlNode.ParseGenericXml(behavior.ToString());
return iwbNode;
}
#endregion
#region 引导信息
///
/// 加载引导信息
///
///
///
///
///
public static IwbXmlNode GetGuideXml(this ICacheManager cacheManager, string packageId, string guideNo)
{
var xml = cacheManager.GetCache(EngineCacheName.EngineGuideCache).Get($"{packageId}.{guideNo}", () => GetGuideXmlFromFile(packageId, guideNo));
return xml;
}
///
/// 从文件加载引导信息
///
///
///
///
public static IwbXmlNode GetGuidesXmlFromFile(string packageId, string guideNos)
{
string xmlStr = "";
foreach (var guideNo in guideNos.StrToArray())
{
xmlStr += GetGuideStrXmlFromFile(packageId, guideNo);
}
if (xmlStr.IsEmpty())
{
return null;
}
xmlStr = $"{xmlStr}";
var iwbNode = IwbXmlNode.ParseGenericXml(xmlStr);
return iwbNode;
}
///
/// 从文件加载引导信息
///
///
///
///
public static IwbXmlNode GetGuideXmlFromFile(string packageId, string guideNo)
{
string xmlStr = GetGuideStrXmlFromFile(packageId, guideNo);
var iwbNode = IwbXmlNode.ParseGenericXml(xmlStr);
return iwbNode;
}
///
/// 从文件加载引导信息
///
///
///
///
public static string GetGuideStrXmlFromFile(string packageId, string guideNo)
{
string fileName = $"{PackageBasePath}{packageId}/guide.iwbx";
if (!File.Exists(fileName))
return null;
var xDoc = XDocument.Load(fileName);
var root = xDoc.Root;
var guide = root != null && root.HasElements
? (from e in root.Elements("GuideInfo") where e.Attribute("id")?.Value == guideNo select e).FirstOrDefault()
: null;
return guide?.ToString() ?? "";
}
///
/// 从xml加载引导信息
///
///
///
///
public static IwbXmlNode GetGuidesXmlFromXml(string xml, string guideNo)
{
if (xml.IsEmpty())
{
return null;
}
var xDoc = XDocument.Parse(xml);
var root = xDoc.Root;
var guide = root != null && root.HasElements
? (from e in root.Elements("GuideInfo") where e.Attribute("id")?.Value == guideNo select e).FirstOrDefault()
: null;
if (guide == null)
{
return null;
}
var iwbNode = IwbXmlNode.ParseGenericXml(guide.ToString());
return iwbNode;
}
#endregion
#region 环境资源
///
/// 加载环境资源信息
///
///
///
///
///
public static IwbXmlNode GetEnvironResourceXml(this ICacheManager cacheManager, string packageId, string resourceNo)
{
var xml = cacheManager.GetCache(EngineCacheName.EngineEnvironResourceCache).Get($"{packageId}.{resourceNo}", () => GetEnvironResourceXmlFromFile(packageId, resourceNo));
return xml;
}
///
/// 从文件加载环境资源信息
///
///
///
///
public static IwbXmlNode GetEnvironResourcesXmlFromFile(string packageId, string resourceNos)
{
string xmlStr = "";
foreach (var no in resourceNos.StrToArray())
{
xmlStr += GetEnvironResourceXmlFromFile(packageId, no);
}
if (xmlStr.IsEmpty())
{
return null;
}
xmlStr = $"{xmlStr}";
//var xmlDoc= new XmlDocument();
//xmlDoc.LoadXml(xmlStr);
//XmlNode xmlNode = xmlDoc.FirstChild;
//return xmlNode;
var iwbNode = IwbXmlNode.ParseGenericXml(xmlStr);
return iwbNode;
}
///
/// 从文件加载环境资源信息
///
///
///
///
public static IwbXmlNode GetEnvironResourceXmlFromFile(string packageId, string resourceNo)
{
string xmlStr = GetEnvironResourceStrXmlFromFile(packageId, resourceNo);
//var xmlDoc= new XmlDocument();
//xmlDoc.LoadXml(xmlStr);
//XmlNode xmlNode = xmlDoc.FirstChild;
//return xmlNode;
var iwbNode = IwbXmlNode.ParseGenericXml(xmlStr);
return iwbNode;
}
///
/// 从文件加载环境资源信息
///
///
///
///
public static string GetEnvironResourceStrXmlFromFile(string packageId, string resourceNo)
{
string fileName = $"{PackageBasePath}{packageId}/environment.iwbx";
if (!File.Exists(fileName))
return null;
var xDoc = XDocument.Load(fileName);
var root = xDoc.Root;
var resource = root != null && root.HasElements
? (from e in root.Elements("Environment") where e.Attribute("id")?.Value == resourceNo select e).FirstOrDefault()
: null;
return resource?.ToString() ?? "";
}
///
/// 从xml加载环境资源信息
///
///
///
///
public static IwbXmlNode GetEnvironResourceXmlFromXml(string xml, string resourceNo)
{
if (xml.IsEmpty())
{
return null;
}
var xDoc = XDocument.Parse(xml);
var root = xDoc.Root;
var resource = root != null && root.HasElements
? (from e in root.Elements("Environment") where e.Attribute("id")?.Value == resourceNo select e).FirstOrDefault()
: null;
if (resource == null)
{
return null;
}
var iwbNode = IwbXmlNode.ParseGenericXml(resource.ToString());
return iwbNode;
}
#endregion
#region 事务组件
///
/// 加载事务组件
///
///
///
///
///
public static EngineComponent GetEngineComponent(this ICacheManager cacheManager, string packageId, string compId)
{
var key = packageId.IsEmpty() ? compId : $"{packageId}.{compId}";
var component = cacheManager.GetCache(EngineCacheName.EngineComponentCache).Get(key, () => GetEngineComponent(packageId, compId));
return component;
}
///
/// 加载事务组件
///
///
///
///
public static EngineComponent GetEngineComponent(string packageId, string compId)
{
var componentXml = GetComponentFromFile(packageId, compId);
if (componentXml == null)
return null;
var component = new EngineComponent().ModelFrom(componentXml);
return component;
}
///
/// 从文件加载事务组件
///
///
///
///
public static IwbXmlNode GetComponentFromFile(string packageId, string compId)
{
string fileName = $"{PackageBasePath}{packageId}/component.iwbx";
if (!File.Exists(fileName))
return null;
var xDoc = XDocument.Load(fileName);
var root = xDoc.Root;
var component = root != null && root.HasElements
? (from e in root.Elements("ComponentInfo") where e.Attribute("id")?.Value == compId select e).FirstOrDefault()
: null;
if (component == null)
return null;
var iwbNode = IwbXmlNode.ParseGenericXml(component.ToString());
return iwbNode;
}
///
/// 从xml加载事务组件
///
///
///
///
public static IwbXmlNode GetComponentFromXml(string xml, string compId)
{
if (xml.IsEmpty())
{
return null;
}
var xDoc = XDocument.Parse(xml);
var root = xDoc.Root;
var component = root != null && root.HasElements
? (from e in root.Elements("ComponentInfo") where e.Attribute("id")?.Value == compId select e).FirstOrDefault()
: null;
if (component == null)
return null;
var iwbNode = IwbXmlNode.ParseGenericXml(component.ToString());
return iwbNode;
}
#endregion
}
}