283 lines
6.7 KiB
C#
283 lines
6.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Xml.Serialization;
|
|
using System.Xml;
|
|
using System.Xml.Schema;
|
|
using System.Collections;
|
|
using System.IO;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace vlnObjectLibrary
|
|
{
|
|
[Serializable()]
|
|
public class vlnObject : IXmlSerializable , IDisposable
|
|
{
|
|
#region Log4Net
|
|
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
|
#endregion
|
|
public void Dispose()
|
|
{
|
|
/* See if I need to do anything */
|
|
}
|
|
#region XML Serialization
|
|
public void WriteXml(XmlWriter w)
|
|
{
|
|
WriteXml(w, true);
|
|
}
|
|
public void WriteXml(XmlWriter w,bool bSaveParent)
|
|
{
|
|
w.WriteAttributeString("title", Title);
|
|
w.WriteAttributeString("path", Path);
|
|
w.WriteAttributeString("type", Type);
|
|
if (m_PropArray.Count > 0)
|
|
{
|
|
w.WriteStartElement("properties");
|
|
foreach (string sKey in m_PropArray.Keys)
|
|
{
|
|
w.WriteStartElement("property");
|
|
w.WriteAttributeString("name", sKey);
|
|
w.WriteAttributeString("value", PropArray[sKey]);
|
|
w.WriteEndElement();
|
|
}
|
|
w.WriteEndElement();
|
|
}
|
|
if (bSaveParent && Parent != null)
|
|
{
|
|
w.WriteStartElement("parent");
|
|
Parent.WriteXml(w);
|
|
w.WriteEndElement();
|
|
}
|
|
}
|
|
private bool SkipToElement(XmlReader xr)
|
|
{
|
|
while (xr.Read())
|
|
if (xr.NodeType == XmlNodeType.Element || xr.NodeType == XmlNodeType.EndElement)
|
|
return xr.NodeType == XmlNodeType.Element;
|
|
return false;
|
|
}
|
|
public void ReadXml(XmlReader xr)
|
|
{
|
|
SkipToElement(xr);
|
|
if (xr.MoveToAttribute("title")) m_Title = xr.Value;
|
|
if (xr.MoveToAttribute("type")) m_Type = xr.Value;
|
|
if (xr.MoveToAttribute("path")) m_Path = xr.Value;
|
|
while (SkipToElement(xr))
|
|
{
|
|
if (xr.NodeType == XmlNodeType.Element && xr.Name == "properties")
|
|
while (SkipToElement(xr))
|
|
if (xr.NodeType == XmlNodeType.Element && xr.Name == "property")
|
|
AddProp(xr.ReadSubtree());
|
|
if (xr.NodeType == XmlNodeType.Element && xr.Name == "parent")
|
|
m_Parent = new vlnObject(xr.ReadSubtree());
|
|
}
|
|
xr.Close();
|
|
}
|
|
|
|
public XmlSchema GetSchema()
|
|
{
|
|
return (null);
|
|
}
|
|
#endregion
|
|
#region Constructors
|
|
public vlnObject(vlnObject parent, string type, string title, string path)
|
|
{
|
|
m_Parent = parent;
|
|
m_Type = type;
|
|
m_Title = title;
|
|
m_Path = path;
|
|
m_PropArray = new Dictionary<string,string>();
|
|
}
|
|
public vlnObject()
|
|
{
|
|
m_Parent = null;
|
|
m_Title = null;
|
|
m_Path = null;
|
|
m_Type = null;
|
|
m_PropArray = new Dictionary<string, string>();
|
|
}
|
|
public vlnObject(XmlReader xr)
|
|
{
|
|
m_Parent = null;
|
|
m_PropArray = new Dictionary<string, string>();
|
|
this.ReadXml(xr);
|
|
}
|
|
public vlnObject(string sXML)
|
|
{
|
|
m_Parent = null;
|
|
m_PropArray = new Dictionary<string, string>();
|
|
this.ReadXml(new XmlTextReader(new StringReader(sXML)));
|
|
}
|
|
#endregion
|
|
#region Public Properties
|
|
private vlnObject m_Parent;
|
|
public vlnObject Parent
|
|
{
|
|
get { return m_Parent; }
|
|
set { m_Parent = value; }
|
|
}
|
|
private string m_Title;
|
|
public string Title
|
|
{
|
|
get { return m_Title; }
|
|
set { m_Title = value; }
|
|
}
|
|
private string m_Path;
|
|
public string Path
|
|
{
|
|
get { return m_Path; }
|
|
set { m_Path = value; }
|
|
}
|
|
private string m_Type;
|
|
|
|
public string Type
|
|
{
|
|
get { return m_Type; }
|
|
set { m_Type = value; }
|
|
}
|
|
private Dictionary<string,string> m_PropArray;
|
|
public Dictionary<string, string> PropArray
|
|
{
|
|
get { return m_PropArray; }
|
|
set { m_PropArray = value; }
|
|
}
|
|
#endregion
|
|
#region Public Methods
|
|
public vlnObject Add(string type, string title, string path)
|
|
{
|
|
vlnObject b = new vlnObject(this, type, title, path);
|
|
return b;
|
|
}
|
|
public void AddProp(string name, string value)
|
|
{
|
|
PropArray[name.ToUpper()] = value;
|
|
}
|
|
public void AddProp(XmlReader xr)
|
|
{
|
|
SkipToElement(xr);
|
|
string sName = null;
|
|
string sValue = null;
|
|
if (xr.MoveToAttribute("name")) sName = xr.Value;
|
|
if (xr.MoveToAttribute("value")) sValue = xr.Value;
|
|
if (sName != null && sValue != null) AddProp(sName, sValue);
|
|
xr.Close();
|
|
}
|
|
public override string ToString()
|
|
{
|
|
StringWriter swxml = new StringWriter();
|
|
XmlSerializer mySer = new XmlSerializer(this.GetType());
|
|
mySer.Serialize(swxml, this);
|
|
return swxml.ToString();
|
|
}
|
|
#endregion
|
|
private List<vlnObject> m_Children;
|
|
public List<vlnObject> Children
|
|
{
|
|
get
|
|
{
|
|
return m_Children;
|
|
}
|
|
set
|
|
{
|
|
m_Children = value;
|
|
}
|
|
}
|
|
public void LoadChildren(string sXml)
|
|
{
|
|
LoadChildren(new XmlTextReader(new StringReader(sXml)));
|
|
}
|
|
public void LoadChildren(XmlReader xr)
|
|
{
|
|
m_Children = new List<vlnObject>();
|
|
SkipToElement(xr);
|
|
while(SkipToElement(xr)){
|
|
vlnObject o = new vlnObject(xr.ReadSubtree());
|
|
o.Parent = this;
|
|
m_Children.Add(o);
|
|
}
|
|
}
|
|
public string AllChildren()
|
|
{
|
|
StringWriter sw = new StringWriter();
|
|
XmlTextWriter xw = new XmlTextWriter(sw);
|
|
xw.WriteStartElement("children");
|
|
foreach (vlnObject vb in Children)
|
|
{
|
|
xw.WriteStartElement("vlnObject");
|
|
vb.WriteXml(xw,false);
|
|
xw.WriteEndElement();
|
|
}
|
|
xw.WriteEndElement();
|
|
return sw.ToString();
|
|
}
|
|
public string ProcessString(string s)
|
|
{
|
|
//string retval=s;
|
|
//string retval = Regex.Replace(s, "{[.]*}", new MatchEvaluator(ReplaceKey));
|
|
string retval = Regex.Replace(s, "{{.*?}}", new MatchEvaluator(ReplaceRow));
|
|
retval = Regex.Replace(retval, "{.*?}", new MatchEvaluator(ReplaceDrv));
|
|
return retval;
|
|
}
|
|
private string ReplaceRow(Match m)
|
|
{
|
|
string sResult = FindField(m.Value.Substring(2, m.Value.Length - 4));
|
|
if (sResult == null && Parent != null)
|
|
{
|
|
sResult = Parent.ReplaceRow(m);
|
|
}
|
|
if (sResult == null)
|
|
{
|
|
log.ErrorFormat("vlnObject - Couldn't find {0}", m.Value);
|
|
}
|
|
return sResult;
|
|
}
|
|
private string ReplaceDrv(Match m)
|
|
{
|
|
string sRetVal = FindField(m.Value.Substring(1, m.Value.Length - 2));
|
|
if (sRetVal == null) sRetVal = "";
|
|
return sRetVal;
|
|
}
|
|
private string FindField(string s)
|
|
{
|
|
string retval = "";
|
|
string[] parts = s.ToUpper().Split(":".ToCharArray());
|
|
switch (s.ToUpper())
|
|
{
|
|
case "PATH":
|
|
retval = m_Path;
|
|
break;
|
|
//case "TITLE":
|
|
//retval = m_Title;
|
|
//break;
|
|
case "TYPE":
|
|
retval = m_Type;
|
|
break;
|
|
default:
|
|
if (PropArray.ContainsKey(parts[0]))
|
|
{
|
|
retval = PropArray[parts[0]].ToString();
|
|
}
|
|
else
|
|
{
|
|
return null;
|
|
}
|
|
break;
|
|
}
|
|
if (parts.Length > 1)
|
|
{
|
|
int width = Convert.ToInt32(parts[1]);
|
|
if (parts[1][0] == ' ' || parts[1][0] == '0')
|
|
{
|
|
retval = retval.PadLeft(width, parts[1][0]);
|
|
}
|
|
else
|
|
{
|
|
retval = retval.PadRight(width).Substring(0, width).Trim();
|
|
}
|
|
}
|
|
return retval;
|
|
}
|
|
}
|
|
|
|
}
|