From: Oleg T. <he...@us...> - 2004-11-01 05:44:54
|
Update of /cvsroot/mvp-xml/XInclude/v1/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9467/v1/src Modified Files: XIncludingReader.cs Log Message: Ok, no in-memory mode for XIncludingReader. Only streaming mode. Index: XIncludingReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/XInclude/v1/src/XIncludingReader.cs,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- XIncludingReader.cs 31 Oct 2004 08:02:27 -0000 1.21 +++ XIncludingReader.cs 1 Nov 2004 05:44:44 -0000 1.22 @@ -70,11 +70,7 @@ //XmlResolver to resolve URIs XmlResolver _xmlResolver; //Expose text inclusions as CDATA - private bool _exposeTextAsCDATA; - //Work in streaming mode (no support for intra-document references) - private bool _streamingMode = true; - //Precompiled XPath expression for selecting ancestors with xml:base - private XPathExpression _selectBases; + private bool _exposeTextAsCDATA; #endregion #region Constructors @@ -82,12 +78,9 @@ /// Creates new instance of <c>XIncludingReader</c> class with /// specified underlying <c>XmlReader</c> reader. /// </summary> - /// <param name="reader">Underlying reader to read from</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(XmlReader reader, bool streamingMode) - { - _streamingMode = streamingMode; + /// <param name="reader">Underlying reader to read from</param> + public XIncludingReader(XmlReader reader) + { XmlTextReader xtr = reader as XmlTextReader; if (xtr != null) { @@ -98,154 +91,27 @@ ValidationCallback); _normalization = xtr.Normalization; _whiteSpaceHandling = xtr.WhitespaceHandling; - - if (_streamingMode) - _reader = vr; - else - { - //In-memory mode - _reader = CreateInMemoryReader(vr); - } + _reader = vr; } else { - if (_streamingMode) - _reader = reader; - else - { - //In-memory mode - _reader = CreateInMemoryReader(reader); - } + _reader = reader; } - _nameTable = reader.NameTable; - Init(); + _nameTable = reader.NameTable; + _keywords = new XIncludeKeywords(NameTable); + _topBaseUri = new Uri(_reader.BaseURI); + _readers = new Stack(); + _state = XIncludingReaderState.Default; } - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified URL. - /// </summary> - /// <param name="url">Document location.</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(string url, bool streamingMode) - : this(new XmlBaseAwareXmlTextReader(url), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified URL and nametable. - /// </summary> - /// <param name="url">Document location.</param> - /// <param name="nt">Name table.</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(string url, XmlNameTable nt, bool streamingMode) : - this(new XmlBaseAwareXmlTextReader(url, nt), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified <c>TextReader</c> reader. - /// </summary> - /// <param name="reader"><c>TextReader</c>.</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(TextReader reader, bool streamingMode) - : this(new XmlBaseAwareXmlTextReader(reader), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified URL and <c>TextReader</c> reader. - /// </summary> - /// <param name="reader"><c>TextReader</c>.</param> - /// <param name="url">Source document's URL</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(string url, TextReader reader, bool streamingMode) - : this(new XmlBaseAwareXmlTextReader(url, reader), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified <c>TextReader</c> reader and nametable. - /// </summary> - /// <param name="reader"><c>TextReader</c>.</param> - /// <param name="nt">Nametable.</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(TextReader reader, XmlNameTable nt, bool streamingMode) : - this(new XmlBaseAwareXmlTextReader(reader, nt), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified URL, <c>TextReader</c> reader and nametable. - /// </summary> - /// <param name="reader"><c>TextReader</c>.</param> - /// <param name="nt">Nametable.</param> - /// <param name="url">Source document's URI</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(string url, TextReader reader, XmlNameTable nt, bool streamingMode) : - this(new XmlBaseAwareXmlTextReader(url, reader, nt), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified <c>Stream</c>. - /// </summary> - /// <param name="input"><c>Stream</c>.</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(Stream input, bool streamingMode) - : this(new XmlBaseAwareXmlTextReader(input), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified URL and <c>Stream</c>. - /// </summary> - /// <param name="input"><c>Stream</c>.</param> - /// <param name="url">Source document's URL</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(string url, Stream input, bool streamingMode) - : this(new XmlBaseAwareXmlTextReader(url, input), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified <c>Stream</c> and nametable. - /// </summary> - /// <param name="input"><c>Stream</c>.</param> - /// <param name="nt">Nametable</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(Stream input, XmlNameTable nt, bool streamingMode) : - this(new XmlBaseAwareXmlTextReader(input, nt), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified URL, <c>Stream</c> and nametable. - /// </summary> - /// <param name="input"><c>Stream</c>.</param> - /// <param name="nt">Nametable</param> - /// <param name="url">Source document's URL</param> - /// <param name="streamingMode">Work in streaming mode</param> - /// <remarks>Note: intra-document references are not supported in streaming mode.</remarks> - public XIncludingReader(string url, Stream input, XmlNameTable nt, bool streamingMode) : - this(new XmlBaseAwareXmlTextReader(url, input, nt), streamingMode) {} - - /// <summary> - /// Creates new instance of <c>XIncludingReader</c> class with - /// specified underlying <c>XmlReader</c> reader. - /// </summary> - /// <param name="reader">Underlying reader to read from.</param> - public XIncludingReader(XmlReader reader) - : this(reader, true) {} - + /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with /// specified URL. /// </summary> /// <param name="url">Document location.</param> public XIncludingReader(string url) - : this(new XmlBaseAwareXmlTextReader(url), true) {} + : this(new XmlBaseAwareXmlTextReader(url)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -254,7 +120,7 @@ /// <param name="url">Document location.</param> /// <param name="nt">Name table.</param> public XIncludingReader(string url, XmlNameTable nt) : - this(new XmlBaseAwareXmlTextReader(url, nt), true) {} + this(new XmlBaseAwareXmlTextReader(url, nt)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -262,7 +128,7 @@ /// </summary> /// <param name="reader"><c>TextReader</c>.</param> public XIncludingReader(TextReader reader) - : this(new XmlBaseAwareXmlTextReader(reader), true) {} + : this(new XmlBaseAwareXmlTextReader(reader)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -271,7 +137,7 @@ /// <param name="reader"><c>TextReader</c>.</param> /// <param name="url">Source document's URL</param> public XIncludingReader(string url, TextReader reader) - : this(new XmlBaseAwareXmlTextReader(url, reader), true) {} + : this(new XmlBaseAwareXmlTextReader(url, reader)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -280,7 +146,7 @@ /// <param name="reader"><c>TextReader</c>.</param> /// <param name="nt">Nametable.</param> public XIncludingReader(TextReader reader, XmlNameTable nt) : - this(new XmlBaseAwareXmlTextReader(reader, nt), true) {} + this(new XmlBaseAwareXmlTextReader(reader, nt)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -290,7 +156,7 @@ /// <param name="nt">Nametable.</param> /// <param name="url">Source document's URI</param> public XIncludingReader(string url, TextReader reader, XmlNameTable nt) : - this(new XmlBaseAwareXmlTextReader(url, reader, nt), true) {} + this(new XmlBaseAwareXmlTextReader(url, reader, nt)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -298,7 +164,7 @@ /// </summary> /// <param name="input"><c>Stream</c>.</param> public XIncludingReader(Stream input) - : this(new XmlBaseAwareXmlTextReader(input), true) {} + : this(new XmlBaseAwareXmlTextReader(input)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -307,7 +173,7 @@ /// <param name="input"><c>Stream</c>.</param> /// <param name="url">Source document's URL</param> public XIncludingReader(string url, Stream input) - : this(new XmlBaseAwareXmlTextReader(url, input), true) {} + : this(new XmlBaseAwareXmlTextReader(url, input)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -316,7 +182,7 @@ /// <param name="input"><c>Stream</c>.</param> /// <param name="nt">Nametable</param> public XIncludingReader(Stream input, XmlNameTable nt) : - this(new XmlBaseAwareXmlTextReader(input, nt), true) {} + this(new XmlBaseAwareXmlTextReader(input, nt)) {} /// <summary> /// Creates new instance of <c>XIncludingReader</c> class with @@ -326,7 +192,7 @@ /// <param name="nt">Nametable</param> /// <param name="url">Source document's URL</param> public XIncludingReader(string url, Stream input, XmlNameTable nt) : - this(new XmlBaseAwareXmlTextReader(url, input, nt), true) {} + this(new XmlBaseAwareXmlTextReader(url, input, nt)) {} #endregion @@ -1033,16 +899,7 @@ get { return _exposeTextAsCDATA; } set { _exposeTextAsCDATA = value; } } - - /// <summary> - /// Streaming or in-memory mode (streaming by default). - /// </summary> - public bool StreamingMode - { - get { return _streamingMode; } - } - - + #endregion #region Private methods @@ -1054,17 +911,6 @@ } /// <summary> - /// Internal initializer. - /// </summary> - private void Init() - { - _keywords = new XIncludeKeywords(NameTable); - _topBaseUri = new Uri(_reader.BaseURI); - _readers = new Stack(); - _state = XIncludingReaderState.Default; - } - - /// <summary> /// Checks if given reader is positioned on a xi:include element. /// </summary> private bool IsIncludeElement(XmlReader r) @@ -1179,17 +1025,13 @@ SR.GetString("MissingHrefAndXpointerException", _reader.BaseURI.ToString())); } - //No support for intra-document refs in streaming mode - if (_streamingMode) - throw new InvalidOperationException(SR.IntradocumentReferencesNotSupported); - return ProcessIntraDocXMLInclusion(xpointer); + //No support for intra-document refs + throw new InvalidOperationException(SR.IntradocumentReferencesNotSupported); } else if (parse.Equals(_keywords.Text)) { - //No support for intra-document refs in streaming mode - if (_streamingMode) - throw new InvalidOperationException(SR.IntradocumentReferencesNotSupported); - return ProcessIntraDocTextInclusion(); + //No support for intra-document refs + throw new InvalidOperationException(SR.IntradocumentReferencesNotSupported); } } else @@ -1224,37 +1066,7 @@ try { if (_xmlResolver == null) - { - if (_streamingMode) - { - includeLocation = new Uri(new Uri(_reader.BaseURI), href, false); - } - else - { - //Reconstruct base URI - IHasXPathNavigator hasXPathNav = _reader as IHasXPathNavigator; - if (hasXPathNav != null) - { - Uri baseUri = new Uri(_reader.BaseURI); - XPathNavigator node = hasXPathNav.GetNavigator(); - if (_selectBases == null) - { - _selectBases = node.Compile("ancestor-or-self::*/@xml:base"); - XmlNamespaceManager nsm = new XmlNamespaceManager(_nameTable); - nsm.AddNamespace(_keywords.Xml, _keywords.XmlNamespace); - _selectBases.SetContext(nsm); - } - XPathNodeIterator ni = node.Select(_selectBases); - while (ni.MoveNext()) - baseUri = new Uri(baseUri, ni.Current.Value, false); - includeLocation = new Uri(baseUri, href, false); - } - else - { - throw new InvalidOperationException("WTF????"); - } - } - } + includeLocation = new Uri(new Uri(_reader.BaseURI), href, false); else includeLocation = _xmlResolver.ResolveUri(new Uri(_reader.BaseURI), href); } @@ -1456,7 +1268,7 @@ private XmlReader CreateAcquiredInfoset(string uri, Stream stream) { //TODO: Try to stream out this stuff - XIncludingReader xir = new XIncludingReader(uri, stream, _nameTable, _streamingMode); + XIncludingReader xir = new XIncludingReader(uri, stream, _nameTable); StringWriter sw = new StringWriter(); XmlTextWriter w = new XmlTextWriter(sw); try @@ -1490,32 +1302,7 @@ xir.Close(); w.Close(); return new XmlTextReader(uri, new StringReader(sw.ToString())); - } - - /// <summary> - /// Processes intra-document inclusion (no href attribute). - /// </summary> - /// <param name="xpointer">Required XPointer pointer</param> - private bool ProcessIntraDocXMLInclusion(string xpointer) - { - //Include current document as XML - CheckLoops(null, xpointer); - //No XML resolving for intra-doc references - //Push current reader to the stack - _readers.Push(_reader); - //For an intra-document reference (via xpointer attribute) - //the source infoset is used as the acquired infoset. - IHasXPathNavigator hasXPathNav = _reader as IHasXPathNavigator; - if (hasXPathNav != null) - { - XPathNavigator nav = hasXPathNav.GetNavigator(); - nav.MoveToRoot(); - _reader = new XPointerReader(nav, xpointer); - return Read(); - } - else - throw new InvalidOperationException("How on earth this could happen?"); - } + } /// <summary> /// Processes inter-document inclusion (xml mode). @@ -1549,11 +1336,8 @@ { XmlTextReader r = new XmlBaseAwareXmlTextReader(wRes.ResponseUri.AbsoluteUri, stream, _nameTable); r.Normalization = _normalization; - r.WhitespaceHandling = _whiteSpaceHandling; - if (_streamingMode) - _reader = r; - else - _reader = CreateInMemoryReader(r); + r.WhitespaceHandling = _whiteSpaceHandling; + _reader = r; } return Read(); } @@ -1603,20 +1387,9 @@ { //No XPointer if (resource is Stream) - { - XmlTextReader r = new XmlBaseAwareXmlTextReader(includeLocation.AbsoluteUri, (Stream)resource, _nameTable); - if (_streamingMode) - _reader = r; - else - _reader = CreateInMemoryReader(r); - } - else if (resource is XmlReader) - { - if (_streamingMode) - _reader = (XmlReader)resource; - else - _reader = CreateInMemoryReader((XmlReader)resource); - } + _reader = new XmlBaseAwareXmlTextReader(includeLocation.AbsoluteUri, (Stream)resource, _nameTable); + else if (resource is XmlReader) + _reader = (XmlReader)resource; else { //Unsupported type @@ -1648,67 +1421,7 @@ _exposeTextAsCDATA); return Read(); } - - /// <summary> - /// Process intra-document inclusion as text. - /// </summary> - private bool ProcessIntraDocTextInclusion() - { - //Ok, in non-streaming mode _reader must implement IHasXPathNavigator - IHasXPathNavigator hasXPathNav = _reader as IHasXPathNavigator; - if (hasXPathNav != null) - { - XPathNavigator nav = hasXPathNav.GetNavigator(); - IHasXmlNode hasXmlNode = nav as IHasXmlNode; - if (hasXmlNode != null) - { - XmlDocument currentDoc = hasXmlNode.GetNode().OwnerDocument; - //Push current reader to the stack - _readers.Push(_reader); - _reader = new TextIncludingReader(currentDoc.OuterXml, _exposeTextAsCDATA); - return Read(); - } - else - { - throw new InvalidOperationException("How this could happen?"); -// nav.MoveToRoot(); -// XPathNavigatorReader r= new XPathNavigatorReader(nav); -// r.Read(); -// //Push current reader to the stack -// _readers.Push(_reader); -// _reader = new TextIncludingReader(r.ReadOuterXml(), _exposeTextAsCDATA); -// r.Close(); -// return Read(); - } - } - else - throw new InvalidOperationException("How this could happen?"); - } - - /// <summary> - /// Creates XmlReader for non-streaming mode. - /// </summary> - /// <param name="reader">Source reader</param> - private XmlReader CreateInMemoryReader(XmlReader reader) - { - XmlReader r = null; - if (reader is XmlTextReader) - { - XmlValidatingReader vr = new XmlValidatingReader(reader); - vr.ValidationType = ValidationType.None; - vr.EntityHandling = EntityHandling.ExpandEntities; - vr.ValidationEventHandler += new ValidationEventHandler( - ValidationCallback); - r = vr; - } - else - r = reader; - XmlDocument doc = new XmlDocument(); - doc.PreserveWhitespace = true; - doc.Load(r); - r.Close(); - return new XPathNavigatorReader(doc.CreateNavigator()); - } + /// <summary> /// Checks for inclusion loops. |