Mercurial > hg > ucis.core
diff Pml/PmlBuilder.cs @ 0:3ab940a0c7a0
Initial commit
author | Ivo Smits <Ivo@UCIS.nl> |
---|---|
date | Tue, 11 Sep 2012 16:28:53 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Pml/PmlBuilder.cs Tue Sep 11 16:28:53 2012 +0200 @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace UCIS.Pml { + public class PmlBuilder { + private IPmlWriter pWriter; + private Stack<PmlElement> pStack = new Stack<PmlElement>(); + + public PmlBuilder(IPmlWriter Writer) { + pWriter = Writer; + } + public PmlBuilder() { + pWriter = null; + } + + public IPmlWriter BaseWriter { + get { return pWriter; } + set { pWriter = value; } + } + + private PmlElement AddChildElement(PmlElement Element, bool AddToStack) { + return AddChildElement(Element, AddToStack, null); + } + private PmlElement AddChildElement(PmlElement Element, bool AddToStack, string ChildName) { + PmlElement Parent; + if (pStack.Count > 0) { + Parent = pStack.Peek(); + if (Parent is PmlDictionary) { + if (ChildName == null) throw new ArgumentNullException("ChildName", "Dictionary items need a Name"); + ((PmlDictionary)Parent).Add(ChildName, Element); + } else if (Parent is PmlCollection) { + if (ChildName != null) throw new ArgumentOutOfRangeException("ChildName", "Can not add named element to a Collection"); + ((PmlCollection)Parent).Add(Element); + } else { + throw new InvalidOperationException("Invalid Element type in stack: " + Parent.Type.ToString()); + } + } else { + if (ChildName != null) { + throw new ArgumentOutOfRangeException("ChildName", "Can not create named element without container (Dictionary)"); + } else if (!AddToStack) { + pWriter.WriteMessage(Element); + } + } + if (AddToStack) pStack.Push(Element); + return Element; + } + + public PmlElement EndElement() { + if (pStack.Count > 0) { + PmlElement Element = pStack.Pop(); + if (pStack.Count == 0) { + if (pWriter != null) pWriter.WriteMessage(Element); + } + return Element; + } else { + return null; + } + } + public PmlElement GetMessage() { + if (pStack.Count == 1) { + PmlElement Element = pStack.Pop(); + return Element; + } else if (pStack.Count == 0) { + throw new InvalidOperationException("No stacked element. The top most element should not be ended. All elements, except Dictionary and Collection, are sent automatically."); + } else { + throw new InvalidOperationException("All elements, except for the top most element, should be ended."); + } + } + + public PmlElement SendMessage() { + PmlElement Element; + if (pWriter == null) throw new NullReferenceException("Writer is not set"); + Element = GetMessage(); + pWriter.WriteMessage(Element); + return Element; + } + + public PmlDictionary Dictionary() { + return (PmlDictionary)AddChildElement(new PmlDictionary(), true); + } + public PmlCollection Collection() { + return (PmlCollection)AddChildElement(new PmlCollection(), true); + } + public PmlString String(string Value) { + return (PmlString)AddChildElement(new PmlString(Value), false); + } + public PmlBinary Binary(byte[] Value) { + return (PmlBinary)AddChildElement(new PmlBinary(Value), false); + } + public PmlInteger Integer(UInt64 Value) { + return (PmlInteger)AddChildElement(new PmlInteger(Value), false); + } + public PmlInteger Integer(Int64 Value) { + return (PmlInteger)AddChildElement(new PmlInteger(Value), false); + } + public PmlNull Null() { + return (PmlNull)AddChildElement(new PmlNull(), false); + } + public PmlElement Element(PmlElement Child) { + return AddChildElement(Child, false); + } + + public PmlDictionary Dictionary(string Name) { + return (PmlDictionary)AddChildElement(new PmlDictionary(), true, Name); + } + public PmlCollection Collection(string Name) { + return (PmlCollection)AddChildElement(new PmlCollection(), true, Name); + } + public PmlString String(string Name, string Value) { + return (PmlString)AddChildElement(new PmlString(Value), false, Name); + } + public PmlBinary Binary(string Name, byte[] Value) { + return (PmlBinary)AddChildElement(new PmlBinary(Value), false, Name); + } + public PmlInteger Integer(string Name, UInt64 Value) { + return (PmlInteger)AddChildElement(new PmlInteger(Value), false, Name); + } + public PmlInteger Integer(string Name, Int64 Value) { + return (PmlInteger)AddChildElement(new PmlInteger(Value), false, Name); + } + public PmlNull Null(string Name) { + return (PmlNull)AddChildElement(new PmlNull(), false, Name); + } + public PmlElement Element(string Name, PmlElement Child) { + return AddChildElement(Child, false, Name); + } + } +} \ No newline at end of file