From: Oleg T. <he...@us...> - 2004-11-07 14:50:49
|
Update of /cvsroot/mvp-xml/XPointer/v1/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8583/v1/src Modified Files: XPointerReader.cs Log Message: Caching for XPathDocuments. Index: XPointerReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/XPointer/v1/src/XPointerReader.cs,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- XPointerReader.cs 4 Nov 2004 15:49:44 -0000 1.8 +++ XPointerReader.cs 7 Nov 2004 14:50:34 -0000 1.9 @@ -27,7 +27,7 @@ //Nodes selected by xpointer private XPathNodeIterator _pointedNodes; //Document cache - private Hashtable _cache; + private static Hashtable _cache; /// <summary> @@ -41,27 +41,39 @@ //XPathNodeIterator is already at the first node _reader = new XPathNavigatorReader(_pointedNodes.Current); } + + private XPathDocument CreateAndCacheDocument(XmlReader r, bool supportSchemaDeterminedIDs) + { + string uri = r.BaseURI; + XmlValidatingReader vr = null; + if (supportSchemaDeterminedIDs) + { + vr = new IdAssuredValidatingReader(r); + vr.ValidationType = ValidationType.Auto; + } + else + { + vr = new XmlValidatingReader(r); + vr.ValidationType = ValidationType.None; + } + vr.EntityHandling = EntityHandling.ExpandEntities; + vr.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(ValidationCallback); + XPathDocument doc = new XPathDocument(vr, XmlSpace.Preserve); + vr.Close(); + + lock(_cache) + { + if (!_cache.ContainsKey(uri)) + _cache.Add(uri, new WeakReference(doc)); + } + return doc; + } //Dummy validation even handler private static void ValidationCallback(object sender, ValidationEventArgs args) { //do nothing - } - - /// <summary> - /// - /// </summary> - /// <param name="uri"></param> - /// <returns></returns> - private XPathDocument GetCachedDocument(Uri uri) - { - WeakReference wr = (WeakReference)_cache[uri.AbsoluteUri]; - if (wr.IsAlive) - return (XPathDocument)wr.Target; - else - return null; - - } + } #endregion @@ -117,31 +129,66 @@ /// </summary> public XPointerReader(XmlReader reader, string xpointer) : this (reader, xpointer, false) {} - + /// <summary> /// Creates <c>XPointerReader</c> instance with given XmlReader and xpointer. /// Additionally sets a flag whether to support schema-determined IDs. /// </summary> public XPointerReader(XmlReader reader, string xpointer, bool supportSchemaDeterminedIDs) - { - XmlValidatingReader vr = null; - if (supportSchemaDeterminedIDs) + { + XPathDocument doc = null; + if (_cache == null) + _cache = new Hashtable(); + WeakReference wr = (WeakReference)_cache[reader.BaseURI]; + if (wr != null && wr.IsAlive) { - vr = new IdAssuredValidatingReader(reader); - vr.ValidationType = ValidationType.Auto; - } + doc = (XPathDocument)wr.Target; + reader.Close(); + } else { - vr = new XmlValidatingReader(reader); - vr.ValidationType = ValidationType.None; - } - vr.EntityHandling = EntityHandling.ExpandEntities; - vr.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(ValidationCallback); - XPathDocument doc = new XPathDocument(vr, XmlSpace.Preserve); - vr.Close(); + //Not cached or GCollected + doc = CreateAndCacheDocument(reader, supportSchemaDeterminedIDs); + } Init(doc.CreateNavigator(), xpointer); } + /// <summary> + /// Creates <c>XPointerReader</c> instance with given + /// document's URI and content. + /// </summary> + /// <param name="uri">XML document's base URI</param> + /// <param name="content">XML document's content</param> + /// <param name="xpointer">XPointer pointer</param> + public XPointerReader(string uri, string content, string xpointer) + : this(uri, content, xpointer, false) {} + + /// <summary> + /// Creates <c>XPointerReader</c> instance with given + /// document's URI and content. + /// </summary> + /// <param name="uri">XML document's base URI</param> + /// <param name="content">XML document's content</param> + /// <param name="xpointer">XPointer pointer</param> + /// <param name="supportSchemaDeterminedIDs">A flag whether to + /// support schema-determined IDs</param> + public XPointerReader(string uri, string content, string xpointer, bool supportSchemaDeterminedIDs) + { + XPathDocument doc = null; + if (_cache == null) + _cache = new Hashtable(); + WeakReference wr = (WeakReference)_cache[uri]; + if (wr != null && wr.IsAlive) + doc = (XPathDocument)wr.Target; + else + { + //Not cached or GCollected + XmlTextReader r = new XmlTextReader(uri, new StringReader(content)); + doc = CreateAndCacheDocument(r, supportSchemaDeterminedIDs); + } + Init(doc.CreateNavigator(), xpointer); + } + #endregion #region XmlReader overrides |