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;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| }
 |