2007-12-03 16:28:26 +00:00

250 lines
6.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using vlnObjectLibrary;
using System.Xml;
using System.IO;
using System.Data;
using System.Data.OleDb;
using System.Reflection;
namespace vlnServerLibrary
{
public class vlnServer // This class loads children for a vlnObject
{
#region Log4Net
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#endregion
#region Static Properties
private static string m_XmlControlPath;
private static XmlDocument m_XmlControl;
public static string XMLControlPath
{
get { return m_XmlControlPath; }
set
{
m_XmlControlPath = value;
}
}
public static XmlDocument XMLControl
{
get
{
if (m_XmlControl == null)
{
m_XmlControl = new XmlDocument();
lock (m_XmlControl)
{
XMLControlPath = "vlnControl.xml";
m_XmlControl.Load(m_XmlControlPath);
}
}
return m_XmlControl;
}
}
#endregion
private List<vlnObject> LoadChildren(vlnObject o)
{
o.Children = new List<vlnObject>();
LoadChildrenFromFolders(o);// TODO: Load children based upon directory lookup
LoadChildrenFromDB(o,LookUp(o,"select"));// TODO: Load children based upon select statement
return o.Children;
}
public string GetChildren(string sVlnObject)
{
using (vlnObject o = new vlnObject(sVlnObject))
{
LoadChildren(o);
return o.AllChildren();
}
}
public string GetDataPath()
{
vlnObject o = new vlnObject();
o.Type="datapath";
o.Title="Data Path";
o.Path=LookUpX(o,".//default/@datapath");
return o.ToString();
}
protected string LookUp(vlnObject o,string s)
{
string xPath = string.Format(".//dbObject[@type='{0}']/@{1}", o.Type, s);
return LookUpX(o,xPath);
}
protected string LookUpP(vlnObject o,string s)
{
string xPath = string.Format(".//dbObject[@type='{0}']/@{1}", o.Parent.Type, s);
return LookUpX(o,xPath);
}
protected string LookUpX(vlnObject o,string xPath)
{
return LookUpX(o,xPath, XMLControl);
}
private void LoadChildrenFromDB(vlnObject o,string sSelect)
{
if (sSelect != "")
{
try
{
string s = LookUpX(o,".//connection/@string");
OleDbConnectionStringBuilder csb = new OleDbConnectionStringBuilder(s);
OleDbConnection dbConn = new OleDbConnection(csb.ConnectionString);
string sTable = LookUp(o,"table");
//if (dbConn.State != ConnectionState.Open) dbConn.Open();
OleDbDataAdapter da = new OleDbDataAdapter(sSelect, dbConn);
DataSet ds = new DataSet();
da.Fill(ds, sTable);
string srt = LookUp(o,"sort");
DataView dv = new DataView(ds.Tables[sTable], LookUp(o,"criteria"), LookUp(o,"sort"), DataViewRowState.CurrentRows);
foreach (DataRowView mydrv in dv)
{
vlnObject vb = o.Add(LookUp(o,"child"), "", o.Path);
foreach (DataColumn dc in dv.Table.Columns)
{
vb.AddProp(dc.ColumnName, mydrv[dc.ColumnName].ToString());
}
vb.Title = LookUpP(vb,"title");
o.Children.Add(vb);
}
}
catch (Exception ex)
{
log.ErrorFormat("{0}\r\n{1}", ex.Message, ex.InnerException);
}
}
}
public DataSet GetDataSet(vlnObject o, string sSelect)
{
if (sSelect != "")
{
try
{
OleDbConnection dbConn = new OleDbConnection(LookUpX(o, ".//connection/@string"));
OleDbDataAdapter da = new OleDbDataAdapter(sSelect, dbConn);
DataSet ds = new DataSet();
da.Fill(ds, LookUp(o, "table"));
return ds;
}
catch (Exception ex)
{
log.ErrorFormat("{0}\r\n{1}", ex.Message, ex.InnerException);
}
}
return null;
}
public OleDbDataReader GetDataReader(vlnObject o, string sSelect)
{
if (sSelect != "")
{
OleDbConnection dbConn = new OleDbConnection(LookUpX(o, ".//connection/@string"));
OleDbCommand cmd = new OleDbCommand(sSelect, dbConn);
cmd.CommandType = CommandType.Text;
dbConn.Open();
OleDbDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return dr;
}
return null;
}
private void LoadChildrenFromFolders(vlnObject o)
{
// First look in the XML to see if there are any folders for the specified item
XmlNodeList nl = XMLControl.SelectNodes(string.Format(".//dbObject[@type='{0}']/folders/folder", o.Type));
if (nl.Count != 0)
{
foreach (XmlNode xn in nl)
{
LoadChildrenFromFolder(o,xn);
}
}
}
private void LoadChildrenFromFolder(vlnObject o, XmlNode xn)
{
// First look in the XML to see if there are any folders for the specified item
string sTmp = LookUpX(o,"@template", xn);
if (sTmp != "")
{
string sException = LookUpX(o,"@exception", xn);
string sRequired = LookUpX(o,"@requires", xn);
DirectoryInfo di = new DirectoryInfo(o.Path);
if (sRequired == "" || di.GetFileSystemInfos(sRequired).Length > 0)
{
if (sException == "" || di.GetFileSystemInfos(sException).Length == 0)
{
try
{
if (sTmp == ".")
{
LoadChildrenFromFolder(o, xn, di);
}
else
{
if(sTmp.Contains("\\")){
string[] sTmps = sTmp.Split('\\');
DirectoryInfo [] dis = di.GetDirectories(sTmps[0]);
foreach (DirectoryInfo di2 in dis)
{
foreach (FileSystemInfo di3 in di2.GetFileSystemInfos(sTmps[1]))
{
LoadChildrenFromFolder(o, xn, di3);
}
}
}
else
{
foreach (FileSystemInfo di1 in di.GetFileSystemInfos(sTmp))
{
LoadChildrenFromFolder(o, xn, di1);
}
}
}
}
catch (DirectoryNotFoundException ex)
{
// Ignore this exception
log.InfoFormat("Directory {0} Template {1} Error {2}",di, sTmp,ex.Message);
}
catch (Exception ex)
{
log.ErrorFormat("Error: {0}\r\n{1}", ex.Message, ex.InnerException);
}
}
}
}
}
private void LoadChildrenFromFolder(vlnObject o,XmlNode xn, FileSystemInfo fi)
{
vlnObject vb = o.Add(LookUpX(o,"@child", xn), "", fi.FullName);
vb.AddProp("filename", fi.Name);
vb.Title = GetTitle(fi.FullName, LookUpX(vb,"@title", xn));
o.Children.Add(vb);
}
protected string GetTitle(string sPath, string sDefault)
{
string sRetval = sDefault;
if (sRetval[0] == '~')
{
string sTitlePath = sPath + "\\title";
if (File.Exists(sTitlePath))
{
StreamReader sr = File.OpenText(sTitlePath);
return sr.ReadToEnd();
}
sRetval = sRetval.Substring(1);
}
return sRetval;
}
protected string LookUpX(vlnObject o, string xPath, XmlNode xn)
{
XmlNode nd = xn;
XmlNode ndf = nd.SelectSingleNode(xPath);
while (ndf == null && nd.ParentNode != null)
{
nd = nd.ParentNode;
ndf = nd.SelectSingleNode(xPath);
}
if (ndf == null) return "";
return o.ProcessString(ndf.InnerText);
}
}
}