You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

766 lines
25 KiB
Plaintext

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Reflection;
using System.IO;
using BP.DA;
using BP.En;
using BP.Sys;
using BP.Pub;
using BP.Sys.XML;
using BP.Sys.Base;
using BP.Difference;
namespace BP.En
{
/// <summary>
/// ClassFactory 的摘要说明。
/// </summary>
public class ClassFactory
{
#region public moen
/// <summary>
/// 装载xml配置文件
/// </summary>
/// <param name="path">文件路径</param>
/// <param name="tableName">物理表名</param>
/// <param name="key">key</param>
/// <param name="val">值</param>
/// <returns></returns>
public static bool LoadConfigXml(string path, string tableName, string key, string val)
{
try
{
SystemConfig.CS_AppSettings.Clear();
}
catch
{
}
DataSet ds = new DataSet();
ds.ReadXml(path);
DataTable dt = ds.Tables[tableName];
// SystemConfig.CS_AppSettings = new System.Collections.Specialized.NameValueCollection();
SystemConfig.CS_DBConnctionDic.Clear();
foreach (DataRow row in dt.Rows)
{
SystemConfig.CS_AppSettings.Add(row[key].ToString().Trim(), row[val].ToString().Trim());
}
ds.Dispose();
SystemConfig.isBSsystem_Test = false;
SystemConfig.isBSsystem = false;
return true;
}
/// <summary>
/// 加载web.config配置文件
/// </summary>
/// <param name="cfgFile">web.config配置文件路径</param>
/// <returns>true or false</returns>
public static bool LoadConfig(string cfgFile)
{
try
{
SystemConfig.CS_AppSettings.Clear();
}
catch
{
}
SystemConfig.isBSsystem = false;
#region 加载 Web.Config 文件配置
if (!File.Exists(cfgFile))
throw new Exception("找不到配置文件[" + cfgFile + "]2");
DataSet ds = new DataSet();
ds.ReadXml(cfgFile);
StreamReader read = new StreamReader(cfgFile);
string firstline = read.ReadLine();
string cfg = read.ReadToEnd();
read.Close();
int start = cfg.ToLower().IndexOf("<appsettings>");
int end = cfg.ToLower().IndexOf("</appsettings>");
cfg = cfg.Substring(start, end - start + "</appsettings".Length + 1);
cfgFile = "__$AppConfig.cfg";
StreamWriter write = new StreamWriter(cfgFile);
write.WriteLine(firstline);
write.Write(cfg);
write.Flush();
write.Close();
DataSet dscfg = new DataSet("cfg");
try
{
dscfg.ReadXml(cfgFile);
}
catch (Exception ex)
{
throw new Exception("加载配置文件[" + cfgFile + "]失败!\n" + ex.Message + "启动失败!");
}
// SystemConfig.CS_AppSettings = new System.Collections.Specialized.NameValueCollection();
SystemConfig.CS_DBConnctionDic.Clear();
DataTable dt = dscfg.Tables["add"];
foreach (DataRow dr in dt.Rows)
{
string key = dr["key"] as string;
if (key == null || key == "")
continue;
string value = dr["value"] as string;
if (value == null || value == "")
continue;
SystemConfig.CS_AppSettings.Add(key, value);
}
dscfg.Dispose();
// 增加特殊判断。
SystemConfig.AppCenterDSN = BP.Difference.SystemConfig.AppCenterDSN.Replace("VisualFlowDesigner", "VisualFlow");
#endregion
return true;
}
#endregion
#region 与报表有关系的
/// <summary>
/// 设置对象实例上指定属性的值
/// </summary>
/// <param name="obj">对象实例</param>
/// <param name="propertyName">属性名,属性为非静态特性</param>
/// <param name="val">值</param>
public static void SetValue(object obj, string propertyName, object val)
{
Type tp = obj.GetType();
PropertyInfo p = tp.GetProperty(propertyName);
if (p == null)
throw new Exception("设置属性值失败!类型[" + tp + "]没有属性[" + propertyName + "]");
p.SetValue(obj, val, null);
}
/// <summary>
/// 获取对象实例上指定属性的值
/// </summary>
/// <param name="obj">对象实例</param>
/// <param name="propertyName">属性名</param>
/// <returns>值</returns>
public static object GetValue(object obj, string propertyName)
{
Type tp = obj.GetType();
PropertyInfo p = tp.GetProperty(propertyName);
if (p == null)
throw new Exception("获取属性值失败!类型[" + tp + "]没有属性[" + propertyName + "]");
object val = p.GetValue(obj, null);
return val;
}
/// <summary>
/// 获取对象实例上指定属性的值转换为string
/// </summary>
/// <param name="obj"></param>
/// <param name="propertyName"></param>
/// <returns>值</returns>
public static string GetValueToStr(object obj, string propertyName)
{
object val = GetValue(obj, propertyName);
if (val == null)
return "";
else
return val.ToString();
}
#endregion
#region 构造函数, 属性
static ClassFactory()
{
string path = AppDomain.CurrentDomain.BaseDirectory;
if (Directory.Exists(path + "bin/"))
{
if (!DataType.IsNullOrEmpty(BP.Difference.SystemConfig.AppSettings["CCFlowAppPath"]) && Directory.Exists(path + BP.Difference.SystemConfig.AppSettings["CCFlowAppPath"] + "bin/"))
{
_BasePath = path + BP.Difference.SystemConfig.AppSettings["CCFlowAppPath"] + "bin/";
}
else
{
_BasePath = path + "bin/";
}
}
else
{
_BasePath = path;
}
}
private static string _BasePath = null;
public static string BasePath
{
get
{
if (_BasePath == null)
{
if (BP.Difference.SystemConfig.AppSettings["InstallPath"] == null)
_BasePath = "D:/";
else
_BasePath = BP.Difference.SystemConfig.AppSettings["InstallPath"];
}
return _BasePath;
}
}
#endregion 属性
#region 程序集
public static Assembly[] _BPAssemblies = null;
/// <summary>
/// 获取取程序集[dll]
/// </summary>
/// <returns></returns>
public static Assembly[] BPAssemblies
{
get
{
if (_BPAssemblies == null)
{
string[] fs = System.IO.Directory.GetFiles(BasePath, "BP.*.dll");
string[] fs1 = System.IO.Directory.GetFiles(BasePath, "*.ssss");
string strs = "";
foreach (string str in fs)
{
strs += str + ";";
}
foreach (string str in fs1)
{
strs += str + ";";
}
fs = strs.Split(';');
// 有多少个 不包含 .Web. 的ddl .
int fsCount = 0;
foreach (string s in fs)
{
if (s.Length == 0)
continue;
//if (s.IndexOf(".Web.") != -1)
// continue;
fsCount++;
}
//把它们加入到 asss 里面去。
Assembly[] asss = new Assembly[fsCount];
int idx = 0;
int fsIndex = -1;
foreach (string s in fs)
{
fsIndex++;
//if (s.IndexOf(".Web.") != -1)
// continue;
if (s.Length == 0)
continue;
asss[idx] = Assembly.LoadFrom(fs[fsIndex]);
idx++;
}
_BPAssemblies = asss;
}
return _BPAssemblies;
}
}
public static Assembly[] BPAssemblies_Bak
{
get
{
if (_BPAssemblies == null)
{
string[] fs = System.IO.Directory.GetFiles(BasePath, "BP.*.dll");
string[] fs1 = System.IO.Directory.GetFiles(BasePath, "*.ssss");
string strs = "";
foreach (string str in fs)
{
strs += str + ";";
}
foreach (string str in fs1)
{
strs += str + ";";
}
fs = strs.Split(';');
// 有多少个 不包含 .Web. 的ddl .
int fsCount = 0;
foreach (string s in fs)
{
if (s.Length == 0)
continue;
if (s.IndexOf(".Web.") != -1)
continue;
fsCount++;
}
//把它们加入到 asss 里面去。
Assembly[] asss = new Assembly[fsCount];
int idx = 0;
int fsIndex = -1;
foreach (string s in fs)
{
fsIndex++;
if (s.IndexOf(".Web.") != -1)
continue;
if (s.Length == 0)
continue;
asss[idx] = Assembly.LoadFrom(fs[fsIndex]);
idx++;
}
_BPAssemblies = asss;
}
return _BPAssemblies;
}
}
/// <summary>
/// 把class 放在内存中去
/// </summary>
public static void PutClassIntoCache()
{
Entity en = ClassFactory.GetEn("BP.Sys.FAQ");
Entities ens = ClassFactory.GetEns("BP.Sys.FAQs");
}
#endregion 程序集
#region 类型
public static Type GetBPType(string className)
{
Type typ = null;
foreach (Assembly ass in BPAssemblies)
{
typ = ass.GetType(className);
if (typ != null)
return typ;
}
return typ;
}
public static ArrayList GetBPTypes(string baseEnsName)
{
ArrayList arr = new ArrayList();
Type baseClass = null;
foreach (Assembly ass in BPAssemblies)
{
if (baseClass == null)
baseClass = ass.GetType(baseEnsName);
Type[] tps = ass.GetTypes();
for (int i = 0; i < tps.Length; i++)
{
if (tps[i].IsAbstract
|| tps[i].BaseType == null
|| !tps[i].IsClass
|| !tps[i].IsPublic
)
continue;
Type tmp = tps[i].BaseType;
if (tmp.Namespace == null)
throw new Exception(tmp.FullName);
while (tmp != null && tmp.Namespace.IndexOf("BP") != -1)
{
if (tmp.FullName == baseEnsName)
arr.Add(tps[i]);
tmp = tmp.BaseType;
}
}
}
if (baseClass == null)
{
throw new Exception("@找不到类型:" + baseEnsName + "");
}
return arr;
}
public static bool IsFromType(string childTypeFullName, string parentTypeFullName)
{
foreach (Assembly ass in BPAssemblies)
{
Type childType = ass.GetType(childTypeFullName);
while (childType != null && childType.BaseType != null)
{
if (childType.BaseType.FullName == parentTypeFullName)
return true;
childType = childType.BaseType;
}
}
return false;
}
#endregion 类型
#region 对象实例
/// <summary>
/// 尽量不用此方法来获取事例
/// </summary>
/// <param name="className"></param>
/// <returns></returns>
public static object GetObject_OK(string className)
{
if (className == "" || className == null)
throw new Exception("@要转化类名称为空...");
Type ty = null;
object obj = null;
foreach (Assembly ass in BPAssemblies)
{
ty = ass.GetType(className);
if (ty == null)
continue;
obj = ass.CreateInstance(className);
return obj;
}
return null;
}
/// <summary>
/// 根据一个抽象的基类,取出此系统中从他上面继承的子类集合。
/// 非抽象的类。
/// </summary>
/// <param name="baseEnsName">抽象的类名称</param>
/// <returns>ArrayList</returns>
public static ArrayList GetObjects(string baseEnsName)
{
//处理类名.
baseEnsName = BP.Sys.Base.Glo.DealClassEntityName(baseEnsName);
ArrayList arr = new ArrayList();
Type baseClass = null;
foreach (Assembly ass in BPAssemblies)
{
if (baseClass == null)
baseClass = ass.GetType(baseEnsName);
Type[] tps = null;
try
{
tps = ass.GetTypes();
}
catch
{
//throw new Exception(ass.FullName+ass.Evidence.ToString()+ ex.Message);
continue;
}
for (int i = 0; i < tps.Length; i++)
{
if (tps[i].IsAbstract
|| tps[i].BaseType == null
|| !tps[i].IsClass
|| !tps[i].IsPublic
)
continue;
Type tmp = tps[i].BaseType;
if (tmp.Namespace == null)
throw new Exception(tmp.FullName);
while (tmp != null && tmp.Namespace.IndexOf("BP") != -1)
{
if (tmp.FullName == baseEnsName)
arr.Add(ass.CreateInstance(tps[i].FullName));
tmp = tmp.BaseType;
}
}
}
if (baseClass == null)
{
throw new Exception("@找不到类型" + baseEnsName + "");
}
return arr;
}
#endregion 实例
#region 其他
#region 获取 en
public static Hashtable Htable_En;
/// <summary>
/// 得到一个实体
/// </summary>
/// <param name="className">类名称</param>
/// <returns>En</returns>
public static Entity GetEn(string className)
{
//判断标记初始化实体.
if (className.Contains(".") == false)
{
if (className.Contains("Dtl") == true)
return new GEDtl(className); //明细表.
else
return new GEEntity(className); //表单实体.
}
if (className.StartsWith("TS."))
{
Map map = BP.EnTS.Glo.GenerMap(className);
if (map.Attrs.Contains("No"))
return new TSEntityNoName(className);
if (map.Attrs.Contains("OID"))
return new TSEntityOID(className);
if (map.Attrs.Contains("MyPK"))
return new TSEntityMyPK(className);
if (map.Attrs.Contains("WorkID"))
return new TSEntityWorkID(className);
if (map.Attrs.Contains("NodeID"))
return new TSEntityNodeID(className);
throw new Exception("err@没有判断的类型.");
}
return GetObject_OK(className) as Entity;
if (Htable_En == null)
{
Htable_En = new Hashtable();
string cl = "BP.En.EnObj";
ArrayList al = ClassFactory.GetObjects(cl);
foreach (Entity en in al)
{
string key = string.Empty;
if (null == en || DataType.IsNullOrEmpty(key = en.ToString()))
continue;
if (Htable_En.ContainsKey(key) == false)
{
try
{
Htable_En.Add(key, en);
}
catch
{
}
}
}
}
Entity tmp = Htable_En[className] as Entity;
if (tmp != null)
tmp.Row = null;
return tmp;
}
#endregion
#region 获取 GetMethod
private static Hashtable Htable_Method;
/// <summary>
/// 得到一个实体
/// </summary>
/// <param name="className">类名称</param>
/// <returns>En</returns>
public static Method GetMethod(string className)
{
if (Htable_Method == null)
{
Htable_Method = new Hashtable();
string cl = "BP.En.Method";
ArrayList al = ClassFactory.GetObjects(cl);
foreach (Method en in al)
Htable_Method.Add(en.ToString(), en);
}
object tmp = Htable_Method[className];
return (tmp as Method);
}
#endregion
#region 获取 Entities
public static Hashtable Htable_Ens;
/// <summary>
/// 得到一个实体
/// </summary>
/// <param name="className">类名称</param>
/// <returns>En</returns>
public static Entities GetEns(string className)
{
if (className.Contains(".") == false)
{
GEEntitys myens = new GEEntitys(className);
return myens;
}
if (className.IndexOf("TS.") == 0)
{
Map map = BP.EnTS.Glo.GenerMap(className);
if (map.Attrs.Contains("No"))
return new TSEntitiesNoName(className);
if (map.Attrs.Contains("MyPK"))
return new TSEntitiesMyPK(className);
if (map.Attrs.Contains("WorkID"))
return new TSEntitiesWorkID(className);
if (map.Attrs.Contains("NodeID"))
return new TSEntitiesNodeID(className);
if (map.Attrs.Contains("OID"))
return new TSEntitiesOID(className);
throw new Exception("err@ GetEns 没有判断的类型.");
}
if (Htable_Ens == null || Htable_Ens.Count == 0)
{
Htable_Ens = new Hashtable();
string cl = "BP.En.Entities";
ArrayList al = ClassFactory.GetObjects(cl);
Htable_Ens.Clear();
foreach (Entities en in al)
{
if (en == null)
continue;
string str = en.ToString();
if (str == null)
continue;
if (Htable_Ens.ContainsKey(str) == true)
continue;
//增加字典属性.
try
{
Htable_Ens.Add(str, en);
}
catch
{
}
}
}
Entities ens = Htable_Ens[className] as Entities;
#warning 会清除 Cache 中的数据。
return ens;
}
#endregion
#region 获取 EventBase
public static Hashtable Htable_Evbase;
/// <summary>
/// 得到一个事件实体
/// </summary>
/// <param name="className">类名称</param>
/// <returns>BP.Sys.EventBase</returns>
public static BP.Sys.Base.EventBase GetEventBase(string className)
{
if (Htable_Evbase == null || Htable_Evbase.Count == 0)
{
Htable_Evbase = new Hashtable();
string cl = "BP.Sys.Base.EventBase";
ArrayList al = ClassFactory.GetObjects(cl);
Htable_Evbase.Clear();
foreach (EventBase en in al)
{
if (en.ToString() == null)
continue;
try
{
Htable_Evbase.Add(en.ToString(), en);
}
catch
{
}
}
}
BP.Sys.Base.EventBase ens = Htable_Evbase[className] as EventBase;
return ens;
}
#endregion
#region 获取 xmlEns
public static Hashtable Htable_XmlEns;
/// <summary>
/// 得到一个实体
/// </summary>
/// <param name="className">类名称</param>
/// <returns>En</returns>
public static XmlEns GetXmlEns(string className)
{
if (Htable_XmlEns == null)
{
Htable_XmlEns = new Hashtable();
string cl = "BP.Sys.XML.XmlEns";
ArrayList al = ClassFactory.GetObjects(cl);
foreach (XmlEns en in al)
Htable_XmlEns.Add(en.ToString(), en);
}
object tmp = Htable_XmlEns[className];
return (tmp as XmlEns);
}
#endregion
#region 获取 xmlen
public static Hashtable Htable_XmlEn;
/// <summary>
/// 得到一个实体
/// </summary>
/// <param name="className">类名称</param>
/// <returns>En</returns>
public static XmlEn GetXmlEn(string className)
{
if (Htable_XmlEn == null)
{
Htable_XmlEn = new Hashtable();
string cl = "BP.Sys.XML.XmlEn";
ArrayList al = ClassFactory.GetObjects(cl);
foreach (XmlEn en in al)
Htable_XmlEn.Add(en.ToString(), en);
}
object tmp = Htable_XmlEn[className];
return (tmp as XmlEn);
}
#endregion
#endregion
#region 获取 HandlerBase
private static Hashtable Htable_HandlerPage;
/// <summary>
/// 得到一个实体
/// </summary>
/// <param name="className">类名称</param>
/// <returns>En</returns>
public static object GetHandlerPage(string className)
{
if (Htable_HandlerPage == null)
{
Htable_HandlerPage = new Hashtable();
string cl = "BP.WF.HttpHandler.DirectoryPageBase";
ArrayList al = ClassFactory.GetObjects(cl);
foreach (Object en in al)
{
string key = string.Empty;
if (null == en || DataType.IsNullOrEmpty(key = en.ToString()))
continue;
if (Htable_HandlerPage.ContainsKey(key) == false)
Htable_HandlerPage.Add(key, en);
}
}
return Htable_HandlerPage[className];
}
#endregion
}
}