http://git-wip-us.apache.org/repos/asf/lucenenet/blob/198e5868/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs ---------------------------------------------------------------------- diff --git a/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs new file mode 100644 index 0000000..4034dad --- /dev/null +++ b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/NamespaceSupport.cs @@ -0,0 +1,841 @@ +// NamespaceSupport.java - generic Namespace support for SAX. +// http://www.saxproject.org +// Written by David Megginson +// This class is in the Public Domain. NO WARRANTY! +// $Id: NamespaceSupport.java,v 1.15 2004/04/26 17:34:35 dmegginson Exp $ + +using Lucene.Net.Support; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace Sax.Helpers +{ + /// <summary> + /// Encapsulate Namespace logic for use by applications using SAX, + /// or internally by SAX drivers. + /// <para/> + /// <em>This module, both source code and documentation, is in the + /// Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> + /// See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> + /// for further information. + /// <para/> + /// This class encapsulates the logic of Namespace processing: it + /// tracks the declarations currently in force for each context and + /// automatically processes qualified XML names into their Namespace + /// parts; it can also be used in reverse for generating XML qnames + /// from Namespaces. + /// <para/> + /// Namespace support objects are reusable, but the reset method + /// must be invoked between each session. + /// <para/>Here is a simple session: + /// <code> + /// string parts[] = new string[3]; + /// NamespaceSupport support = new NamespaceSupport(); + /// support.PushContext(); + /// support.DeclarePrefix("", "http://www.w3.org/1999/xhtml"); + /// support.DeclarePrefix("dc", "http://www.purl.org/dc#"); + /// parts = support.ProcessName("p", parts, false); + /// Console.WriteLine("Namespace URI: " + parts[0]); + /// Console.WriteLine("Local name: " + parts[1]); + /// Console.WriteLine("Raw name: " + parts[2]); + /// parts = support.ProcessName("dc:title", parts, false); + /// Console.WriteLine("Namespace URI: " + parts[0]); + /// Console.WriteLine("Local name: " + parts[1]); + /// Console.WriteLine("Raw name: " + parts[2]); + /// support.PopContext(); + /// </code> + /// <para/> + /// Note that this class is optimized for the use case where most + /// elements do not contain Namespace declarations: if the same + /// prefix/URI mapping is repeated for each context (for example), this + /// class will be somewhat less efficient. + /// <para/> + /// Although SAX drivers (parsers) may choose to use this class to + /// implement namespace handling, they are not required to do so. + /// Applications must track namespace information themselves if they + /// want to use namespace information. + /// </summary> + public class NamespaceSupport + { + /// <summary> + /// The XML Namespace URI as a constant. + /// The value is <c>http://www.w3.org/XML/1998/namespace</c> + /// as defined in the "Namespaces in XML" * recommendation. + /// <para>This is the Namespace URI that is automatically mapped to the "xml" prefix.</para> + /// </summary> + public const string XMLNS = "http://www.w3.org/XML/1998/namespace"; + + /// <summary> + /// The namespace declaration URI as a constant. + /// The value is <c>http://www.w3.org/xmlns/2000/</c>, as defined + /// in a backwards-incompatible erratum to the "Namespaces in XML" + /// recommendation. Because that erratum postdated SAX2, SAX2 defaults + /// to the original recommendation, and does not normally use this URI. + /// <para/> + /// This is the Namespace URI that is optionally applied to + /// <em>xmlns</em> and <em>xmlns:*</em> attributes, which are used to + /// declare namespaces. + /// </summary> + /// <seealso cref="SetNamespaceDeclUris(bool)" /> + /// <seealso cref="IsNamespaceDeclUris" /> + //// + public const string NSDECL = "http://www.w3.org/xmlns/2000/"; + + + //////////////////////////////////////////////////////////////////// + // Constructor. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Create a new Namespace support object. + /// </summary> + public NamespaceSupport() + { + Reset(); + } + + //////////////////////////////////////////////////////////////////// + // Context management. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Reset this Namespace support object for reuse. + /// <para/> + /// It is necessary to invoke this method before reusing the + /// Namespace support object for a new session. If namespace + /// declaration URIs are to be supported, that flag must also + /// be set to a non-default value. + /// </summary> + /// <seealso cref="SetNamespaceDeclUris" /> + public void Reset() + { + contexts = new Context[32]; + namespaceDeclUris = false; + contextPos = 0; + contexts[contextPos] = currentContext = new Context(this); + currentContext.DeclarePrefix("xml", XMLNS); + } + + /// <summary> + /// Start a new Namespace context. + /// The new context will automatically inherit + /// the declarations of its parent context, but it will also keep + /// track of which declarations were made within this context. + /// <para/> + /// Event callback code should start a new context once per element. + /// This means being ready to call this in either of two places. + /// For elements that don't include namespace declarations, the + /// <see cref="IContentHandler.StartElement(string, string, string, IAttributes)"/> callback is the right place. + /// For elements with such a declaration, it'd done in the first + /// <see cref="IContentHandler.StartPrefixMapping(string, string)"/> callback. + /// A boolean flag can be used to + /// track whether a context has been started yet. When either of + /// those methods is called, it checks the flag to see if a new context + /// needs to be started. If so, it starts the context and sets the + /// flag. After <see cref="IContentHandler.StartElement(string, string, string, IAttributes)"/> + /// does that, it always clears the flag. + /// <para/> + /// Normally, SAX drivers would push a new context at the beginning + /// of each XML element. Then they perform a first pass over the + /// attributes to process all namespace declarations, making + /// <see cref="IContentHandler.StartPrefixMapping(string, string)"/> callbacks. + /// Then a second pass is made, to determine the namespace-qualified + /// names for all attributes and for the element name. + /// Finally all the information for the + /// <see cref="IContentHandler.StartElement(string, string, string, IAttributes)"/> callback is available, + /// so it can then be made. + /// <para/> + /// The Namespace support object always starts with a base context + /// already in force: in this context, only the "xml" prefix is + /// declared. + /// </summary> + /// <seealso cref="IContentHandler" /> + /// <seealso cref="PopContext()" /> + public void PushContext() + { + int max = contexts.Length; + + contexts[contextPos].declsOK = false; + contextPos++; + + // Extend the array if necessary + if (contextPos >= max) + { + var newContexts = new Context[max * 2]; + Array.Copy(contexts, 0, newContexts, 0, max); + max *= 2; + contexts = newContexts; + } + + // Allocate the context if necessary. + currentContext = contexts[contextPos]; + if (currentContext == null) + { + contexts[contextPos] = currentContext = new Context(this); + } + + // Set the parent, if any. + if (contextPos > 0) + { + currentContext.SetParent(contexts[contextPos - 1]); + } + } + + /// <summary> + /// Revert to the previous Namespace context. + /// <para/> + /// Normally, you should pop the context at the end of each + /// XML element. After popping the context, all Namespace prefix + /// mappings that were previously in force are restored. + /// <para/> + /// You must not attempt to declare additional Namespace + /// prefixes after popping a context, unless you push another + /// context first. + /// </summary> + /// <seealso cref="PushContext()" /> + public void PopContext() + { + contexts[contextPos].Clear(); + contextPos--; + if (contextPos < 0) + { + throw new InvalidOperationException(); + } + currentContext = contexts[contextPos]; + } + + //////////////////////////////////////////////////////////////////// + // Operations within a context. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Declare a Namespace prefix. All prefixes must be declared + /// before they are referenced. For example, a SAX driver (parser) + /// would scan an element's attributes + /// in two passes: first for namespace declarations, + /// then a second pass using <see cref="ProcessName" /> to + /// interpret prefixes against (potentially redefined) prefixes. + /// <para/> + /// This method declares a prefix in the current Namespace + /// context; the prefix will remain in force until this context + /// is popped, unless it is shadowed in a descendant context. + /// <para/> + /// To declare the default element Namespace, use the empty string as + /// the prefix. + /// <para/> + /// Note that you must <em>not</em> declare a prefix after + /// you've pushed and popped another Namespace context, or + /// treated the declarations phase as complete by processing + /// a prefixed name. + /// <para/> + /// Note that there is an asymmetry in this library: <see cref="GetPrefix" /> will not return the "" prefix, + /// even if you have declared a default element namespace. + /// To check for a default namespace, + /// you have to look it up explicitly using <see cref="GetUri" />. + /// This asymmetry exists to make it easier to look up prefixes + /// for attribute names, where the default prefix is not allowed. + /// </summary> + /// <param name="prefix"> + /// The prefix to declare, or the empty string to + /// indicate the default element namespace. This may never have + /// the value "xml" or "xmlns". + /// </param> + /// <param name="uri"> + /// The Namespace URI to associate with the prefix. + /// </param> + /// <returns><c>true</c> if the prefix was legal, <c>false</c> otherwise</returns> + /// <seealso cref="ProcessName(string, string[], bool)" /> + /// <seealso cref="GetUri(string)" /> + /// <seealso cref="GetPrefix(string)" /> + public bool DeclarePrefix(string prefix, string uri) + { + if (prefix.Equals("xml") || prefix.Equals("xmlns")) + { + return false; + } + currentContext.DeclarePrefix(prefix, uri); + return true; + } + + /// <summary> + /// Process a raw XML qualified name, after all declarations in the + /// current context have been handled by <see cref="DeclarePrefix" />. + /// <para> + /// This method processes a raw XML qualified name in the + /// current context by removing the prefix and looking it up among + /// the prefixes currently declared. The return value will be the + /// array supplied by the caller, filled in as follows: + /// </para> + /// <list type="table"> + /// <item> + /// <term>parts[0]</term> + /// <description>The Namespace URI, or an empty string if none is in use.</description> + /// </item> + /// <item> + /// <term>parts[1]</term> + /// <description>The local name (without prefix).</description> + /// </item> + /// <item> + /// <term>parts[2]</term> + /// <description>The original raw name.</description> + /// </item> + /// </list> + /// <para> + /// All of the strings in the array will be internalized. If + /// the raw name has a prefix that has not been declared, then + /// the return value will be null. + /// </para> + /// <para> + /// Note that attribute names are processed differently than + /// element names: an unprefixed element name will receive the + /// default Namespace (if any), while an unprefixed attribute name + /// will not. + /// </para> + /// </summary> + /// <param name="qName"> + /// The XML qualified name to be processed. + /// </param> + /// <param name="parts"> + /// An array supplied by the caller, capable of + /// holding at least three members. + /// </param> + /// <param name="isAttribute"> + /// A flag indicating whether this is an + /// attribute name (true) or an element name (false). + /// </param> + /// <returns> + /// The supplied array holding three internalized strings + /// representing the Namespace URI (or empty string), the + /// local name, and the XML qualified name; or null if there + /// is an undeclared prefix. + /// </returns> + /// <seealso cref="DeclarePrefix" /> + /// <seealso cref="string.Intern(string)" /> + public string[] ProcessName(string qName, string[] parts, bool isAttribute) + { + string[] myParts = currentContext.ProcessName(qName, isAttribute); + if (myParts == null) + { + return null; + } + parts[0] = myParts[0]; + parts[1] = myParts[1]; + parts[2] = myParts[2]; + return parts; + } + + /// <summary> + /// Look up a prefix and get the currently-mapped Namespace URI. + /// <para> + /// This method looks up the prefix in the current context. + /// Use the empty string ("") for the default Namespace. + /// </para> + /// </summary> + /// <param name="prefix"> + /// The prefix to look up. + /// </param> + /// <returns> + /// The associated Namespace URI, or null if the prefix + /// is undeclared in this context. + /// </returns> + /// <seealso cref="GetPrefix" /> + /// <seealso cref="GetPrefixes()" /> + public string GetUri(string prefix) + { + return currentContext.GetURI(prefix); + } + + /// <summary> + /// Return an enumeration of all prefixes whose declarations are + /// active in the current context. + /// This includes declarations from parent contexts that have + /// not been overridden. + /// <para> + /// <strong>Note:</strong> if there is a default prefix, it will not be + /// returned in this enumeration; check for the default prefix + /// using the <see cref="GetUri" /> with an argument of "". + /// </para> + /// </summary> + /// <returns>An enumeration of prefixes (never empty).</returns> + /// <seealso cref="GetDeclaredPrefixes" /> + /// <seealso cref="GetUri" /> + public IEnumerable GetPrefixes() + { + return currentContext.GetPrefixes(); + } + + /// <summary> + /// Return one of the prefixes mapped to a Namespace URI. + /// <para> + /// If more than one prefix is currently mapped to the same + /// URI, this method will make an arbitrary selection; if you + /// want all of the prefixes, use the <see cref="GetPrefixes()" /> + /// method instead. + /// </para> + /// <para> + /// <strong>Note:</strong> this will never return the empty (default) prefix; + /// to check for a default prefix, use the <see cref="GetUri" /> + /// method with an argument of "". + /// </para> + /// </summary> + /// <param name="uri"> + /// the namespace URI + /// </param> + /// <returns> + /// one of the prefixes currently mapped to the URI supplied, + /// or null if none is mapped or if the URI is assigned to + /// the default namespace + /// </returns> + /// <seealso cref="GetPrefixes(string)" /> + /// <seealso cref="GetUri" /> + public string GetPrefix(string uri) + { + return currentContext.GetPrefix(uri); + } + + /// <summary> + /// Return an enumeration of all prefixes for a given URI whose + /// declarations are active in the current context. + /// This includes declarations from parent contexts that have + /// not been overridden. + /// <para> + /// This method returns prefixes mapped to a specific Namespace + /// URI. The xml: prefix will be included. If you want only one + /// prefix that's mapped to the Namespace URI, and you don't care + /// which one you get, use the <see cref="GetPrefix" /> + /// method instead. + /// </para> + /// <para> + /// <strong>Note:</strong> the empty (default) prefix is <em>never</em> included + /// in this enumeration; to check for the presence of a default + /// Namespace, use the <see cref="GetUri" /> method with an + /// argument of "". + /// </para> + /// </summary> + /// <param name="uri"> + /// The Namespace URI. + /// </param> + /// <returns>An enumeration of prefixes (never empty).</returns> + /// <seealso cref="GetPrefix" /> + /// <seealso cref="GetDeclaredPrefixes" /> + /// <seealso cref="GetUri" /> + public IEnumerable GetPrefixes(string uri) + { + var prefixes = new ArrayList(); + IEnumerator allPrefixes = GetPrefixes().GetEnumerator(); + while (allPrefixes.MoveNext()) + { + var prefix = (string)allPrefixes.Current; + if (uri.Equals(GetUri(prefix))) + { + prefixes.Add(prefix); + } + } + return prefixes; + } + + /// <summary> + /// Return an enumeration of all prefixes declared in this context. + /// <para> + /// The empty (default) prefix will be included in this + /// enumeration; note that this behaviour differs from that of + /// <see cref="GetPrefix" /> and <see cref="GetPrefixes()" />. + /// </para> + /// </summary> + /// <returns> + /// An enumeration of all prefixes declared in this + /// context. + /// </returns> + /// <seealso cref="GetPrefixes()" /> + /// <seealso cref="GetUri" /> + public IEnumerable GetDeclaredPrefixes() + { + return currentContext.GetDeclaredPrefixes(); + } + + /// <summary> + /// Controls whether namespace declaration attributes are placed + /// into the <see cref="NSDECL" /> namespace + /// by <see cref="ProcessName" />. This may only be + /// changed before any contexts have been pushed. + /// </summary> + /// <exception cref="InvalidOperationException"> + /// when attempting to set this + /// after any context has been pushed. + /// </exception> + public void SetNamespaceDeclUris(bool value) + { + if (contextPos != 0) + { + throw new InvalidOperationException(); + } + if (value == namespaceDeclUris) + { + return; + } + namespaceDeclUris = value; + if (value) + { + currentContext.DeclarePrefix("xmlns", NSDECL); + } + else + { + contexts[contextPos] = currentContext = new Context(this); + currentContext.DeclarePrefix("xml", XMLNS); + } + } + + /// <summary> + /// Returns true if namespace declaration attributes are placed into + /// a namespace. This behavior is not the default. + /// </summary> + public bool IsNamespaceDeclUris + { + get { return namespaceDeclUris; } + } + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + private Context[] contexts; + private Context currentContext; + private int contextPos; + private bool namespaceDeclUris; + + //////////////////////////////////////////////////////////////////// + // Internal classes. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Internal class for a single Namespace context. + /// </summary> + /// <remarks> + /// This module caches and reuses Namespace contexts, + /// so the number allocated + /// will be equal to the element depth of the document, not to the total + /// number of elements (i.e. 5-10 rather than tens of thousands). + /// Also, data structures used to represent contexts are shared when + /// possible (child contexts without declarations) to further reduce + /// the amount of memory that's consumed. + /// </remarks> + internal sealed class Context + { + private readonly NamespaceSupport outerInstance; + + /// <summary> + /// Create the root-level Namespace context. + /// </summary> + public Context(NamespaceSupport outerInstance) + { + this.outerInstance = outerInstance; + CopyTables(); + } + + /// <summary> + /// (Re)set the parent of this Namespace context. + /// The context must either have been freshly constructed, + /// or must have been cleared. + /// </summary> + /// <param name="parent">The parent Namespace context object.</param> + public void SetParent(Context parent) + { + this.parent = parent; + declarations = null; + prefixTable = parent.prefixTable; + uriTable = parent.uriTable; + elementNameTable = parent.elementNameTable; + attributeNameTable = parent.attributeNameTable; + defaultNs = parent.defaultNs; + declSeen = false; + declsOK = true; + } + + /// <summary> + /// Makes associated state become collectible, + /// invalidating this context. + /// <see cref="SetParent(Context)"/> must be called before + /// this context may be used again. + /// </summary> + public void Clear() + { + parent = null; + prefixTable = null; + uriTable = null; + elementNameTable = null; + attributeNameTable = null; + defaultNs = null; + } + + /// <summary> + /// Declare a Namespace prefix for this context. + /// </summary> + /// <param name="prefix">The prefix to declare.</param> + /// <param name="uri">The associated Namespace URI.</param> + /// <seealso cref="DeclarePrefix(string, string)"/> + public void DeclarePrefix(string prefix, string uri) + { + // Lazy processing... + if (!declsOK) + { + throw new InvalidOperationException("can't declare any more prefixes in this context"); + } + if (!declSeen) + { + CopyTables(); + } + if (declarations == null) + { + declarations = new List<string>(); + } + + prefix = prefix.Intern(); + uri = uri.Intern(); + if ("".Equals(prefix)) + { + if ("".Equals(uri)) + { + defaultNs = null; + } + else + { + defaultNs = uri; + } + } + else + { + prefixTable.Add(prefix, uri); + uriTable.Add(uri, prefix); // may wipe out another prefix + } + declarations.Add(prefix); + } + + /// <summary> + /// Process an XML qualified name in this context. + /// </summary> + /// <param name="qName">The XML qualified name.</param> + /// <param name="isAttribute">true if this is an attribute name.</param> + /// <param name="namespaceDeclUris"></param> + /// <returns>An array of three strings containing the + /// URI part (or empty string), the local part, + /// and the raw name, all internalized, or null + /// if there is an undeclared prefix.</returns> + /// <seealso cref="NamespaceSupport.ProcessName(string, bool)"/> + internal string[] ProcessName(string qName, bool isAttribute) + { + string[] name; + IDictionary<string, string[]> table; + + // detect errors in call sequence + declsOK = false; + + // Select the appropriate table. + if (isAttribute) + { + table = attributeNameTable; + } + else + { + table = elementNameTable; + } + + // Start by looking in the cache, and + // return immediately if the name + // is already known in this content + if (table.ContainsKey(qName)) + { + return (string[])table[qName]; + } + + // We haven't seen this name in this + // context before. Maybe in the parent + // context, but we can't assume prefix + // bindings are the same. + name = new string[3]; + name[2] = qName.Intern(); + int index = qName.IndexOf(':'); + + // No prefix. + if (index == -1) + { + if (isAttribute) + { + if (qName == "xmlns" && outerInstance.namespaceDeclUris) + { + name[0] = NSDECL; + } + else + { + name[0] = ""; + } + } + else if (defaultNs == null) + { + name[0] = ""; + } + else + { + name[0] = defaultNs; + } + name[1] = name[2]; + } + + // Prefix + else + { + string prefix = qName.Substring(0, index); + string local = qName.Substring(index + 1); + string uri = null; + if ("".Equals(prefix)) + { + uri = defaultNs; + } + else if (prefixTable.ContainsKey(prefix)) + { + uri = (string)prefixTable[prefix]; + } + if (uri == null || (!isAttribute && "xmlns".Equals(prefix))) + { + return null; + } + name[0] = uri; + name[1] = local.Intern(); + } + + // Save in the cache for future use. + // (Could be shared with parent context...) + table.Add(name[2], name); + return name; + } + + /// <summary> + /// Look up the URI associated with a prefix in this context. + /// </summary> + /// <param name="prefix">The prefix to look up.</param> + /// <returns>The associated Namespace URI, or null if none is declared.</returns> + /// <seealso cref="NamespaceSupport.GetUri(string)"/> + internal string GetURI(string prefix) + { + if ("".Equals(prefix)) + { + return defaultNs; + } + if (prefixTable == null) + { + return null; + } + if (prefixTable.ContainsKey(prefix)) + { + return (string)prefixTable[prefix]; + } + return null; + } + + /// <summary> + /// Look up one of the prefixes associated with a URI in this context. + /// <para/> + /// Since many prefixes may be mapped to the same URI, the return value may be unreliable. + /// </summary> + /// <param name="uri">The URI to look up.</param> + /// <returns>The associated prefix, or null if none is declared.</returns> + /// <seealso cref="NamespaceSupport.GetPrefix(string)"/> + internal string GetPrefix(string uri) + { + if (uriTable == null) + { + return null; + } + if (uriTable.ContainsKey(uri)) + { + return (string)uriTable[uri]; + } + return null; + } + + /// <summary> + /// Return an enumeration of prefixes declared in this context. + /// </summary> + /// <returns>An enumeration of prefixes (possibly empty).</returns> + /// <seealso cref="NamespaceSupport.GetDeclaredPrefixes()"/> + internal IEnumerable GetDeclaredPrefixes() + { + if (declarations == null) + { + return Enumerable.Empty<object>(); + } + return declarations; + } + + /// <summary> + /// Return an enumeration of all prefixes currently in force. + /// <para/> + /// The default prefix, if in force, is <em>not</em> + /// returned, and will have to be checked for separately. + /// </summary> + /// <returns>An enumeration of prefixes (never empty).</returns> + /// <seealso cref="NamespaceSupport.GetPrefixes()"/> + internal IEnumerable GetPrefixes() + { + if (prefixTable == null) + { + return Enumerable.Empty<object>(); + } + return prefixTable.Keys; + } + + //////////////////////////////////////////////////////////////// + // Internal methods. + //////////////////////////////////////////////////////////////// + + /// <summary> + /// Copy on write for the internal tables in this context. + /// <para/> + /// This class is optimized for the normal case where most + /// elements do not contain Namespace declarations. + /// </summary> + private void CopyTables() + { + if (prefixTable != null) + { + prefixTable = (Hashtable)prefixTable.Clone(); + } + else + { + prefixTable = new Hashtable(); + } + if (uriTable != null) + { + uriTable = (Hashtable)uriTable.Clone(); + } + else + { + uriTable = new Hashtable(); + } + elementNameTable = new Dictionary<string, string[]>(); + attributeNameTable = new Dictionary<string, string[]>(); + declSeen = true; + } + + //////////////////////////////////////////////////////////////// + // Protected state. + //////////////////////////////////////////////////////////////// + + private Hashtable prefixTable; + private Hashtable uriTable; + private IDictionary<string, string[]> elementNameTable; + private IDictionary<string, string[]> attributeNameTable; + private string defaultNs; + internal bool declsOK = true; + + //////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////// + + private IList<string> declarations; + private bool declSeen; + private Context parent; + } + } +}
http://git-wip-us.apache.org/repos/asf/lucenenet/blob/198e5868/src/Lucene.Net.Benchmark/Support/Sax/Helpers/XMLFilterImpl.cs ---------------------------------------------------------------------- diff --git a/src/Lucene.Net.Benchmark/Support/Sax/Helpers/XMLFilterImpl.cs b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/XMLFilterImpl.cs new file mode 100644 index 0000000..cbf9e6d --- /dev/null +++ b/src/Lucene.Net.Benchmark/Support/Sax/Helpers/XMLFilterImpl.cs @@ -0,0 +1,587 @@ +// XMLFilterImpl.java - base SAX2 filter implementation. +// http://www.saxproject.org +// Written by David Megginson +// NO WARRANTY! This class is in the Public Domain. +// $Id: XMLFilterImpl.java,v 1.9 2004/04/26 17:34:35 dmegginson Exp $ + +using System; + +namespace Sax.Helpers +{ + /// <summary> + /// Base class for deriving an XML filter. + /// <para/> + /// <em>This module, both source code and documentation, is in the + /// Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> + /// See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> + /// for further information. + /// <para/> + /// This class is designed to sit between an <see cref="IXMLReader" /> + /// and the client application's event handlers. By default, it + /// does nothing but pass requests up to the reader and events + /// on to the handlers unmodified, but subclasses can override + /// specific methods to modify the event stream or the configuration + /// requests as they pass through. + /// </summary> + /// <seealso cref="IXMLFilter" /> + /// <seealso cref="IXMLReader" /> + /// <seealso cref="IEntityResolver" /> + /// <seealso cref="IDTDHandler" /> + /// <seealso cref="IContentHandler" /> + /// <seealso cref="IErrorHandler" /> + public class XMLFilter : IXMLFilter, IEntityResolver, IDTDHandler, IContentHandler, IErrorHandler + { + /// <summary> + /// Construct an empty XML filter, with no parent. + /// <para> + /// This filter will have no parent: you must assign a parent + /// before you start a parse or do any configuration with + /// setFeature or setProperty, unless you use this as a pure event + /// consumer rather than as an <see cref="IXmlReader" />. + /// </para> + /// </summary> + /// <seealso cref="IXMLReader.SetFeature" /> + /// <seealso cref="IXMLReader.SetProperty" /> + /// <seealso cref="Parent" /> + public XMLFilter() + { + } + + /// <summary> + /// Construct an XML filter with the specified parent. + /// </summary> + /// <param name="parent">The parent</param> + /// <seealso cref="Parent" /> + public XMLFilter(IXMLReader parent) + { + this.parent = parent; + } + + //////////////////////////////////////////////////////////////////// + // Implementation of IXMLFilter. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Gets or sets the parent reader. + /// </summary> + /// <remarks> + /// This is the <see cref="IXMLReader"/> from which + /// this filter will obtain its events and to which it will pass its + /// configuration requests. The parent may itself be another filter. + /// <para/> + /// If there is no parent reader set, any attempt to parse + /// or to set or get a feature or property will fail. + /// </remarks> + public IXMLReader Parent + { + get { return parent; } + set { parent = value; } + } + + //////////////////////////////////////////////////////////////////// + // Implementation of IXMLReader. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Set the value of a feature. + /// <para/> + /// This will always fail if the parent is null. + /// </summary> + /// <param name="name">The feature name.</param> + /// <param name="value">The requested feature value.</param> + /// <exception cref="SAXNotRecognizedException">If the feature + /// value can't be assigned or retrieved from the parent.</exception> + /// <exception cref="SAXNotSupportedException">When the + /// parent recognizes the feature name but + /// cannot set the requested value.</exception> + public virtual void SetFeature(string name, bool value) + { + if (parent != null) + { + parent.SetFeature(name, value); + } + else + { + throw new SAXNotRecognizedException("Feature: " + name); + } + } + + /// <summary> + /// Look up the value of a feature. + /// <para/> + /// This will always fail if the parent is null. + /// </summary> + /// <param name="name">The feature name.</param> + /// <returns>The current value of the feature.</returns> + /// <exception cref="SAXNotRecognizedException">If the feature + /// value can't be assigned or retrieved from the parent.</exception> + /// <exception cref="SAXNotSupportedException">When the + /// parent recognizes the feature name but + /// cannot determine its value at this time.</exception> + public virtual bool GetFeature(string name) + { + if (parent != null) + { + return parent.GetFeature(name); + } + throw new SAXNotRecognizedException("Feature: " + name); + } + + /// <summary> + /// Set the value of a property. + /// <para/> + /// This will always fail if the parent is null. + /// </summary> + /// <param name="name">The property name.</param> + /// <param name="value">The requested property value.</param> + /// <exception cref="SAXNotRecognizedException">If the property + /// value can't be assigned or retrieved from the parent.</exception> + /// <exception cref="SAXNotSupportedException">When the + /// parent recognizes the property name but + /// cannot set the requested value.</exception> + public virtual void SetProperty(string name, object value) + { + if (parent != null) + { + parent.SetProperty(name, value); + } + else + { + throw new SAXNotRecognizedException("Property: " + name); + } + } + + /// <summary> + /// Look up the value of a property. + /// </summary> + /// <param name="name">The property name.</param> + /// <returns>The current value of the property.</returns> + /// <exception cref="SAXNotRecognizedException">If the property + /// value can't be assigned or retrieved from the parent.</exception> + /// <exception cref="SAXNotSupportedException">When the + /// parent recognizes the property name but + /// cannot determine its value at this time.</exception> + public virtual object GetProperty(string name) + { + if (parent != null) + { + return parent.GetProperty(name); + } + throw new SAXNotRecognizedException("Property: " + name); + } + + /// <summary> + /// Gets or Sets the entity resolver. + /// </summary> + public IEntityResolver EntityResolver + { + get { return entityResolver; } + set { entityResolver = value; } + } + + /// <summary> + /// Gets or Sets the DTD event handler. + /// </summary> + public IDTDHandler DTDHandler + { + get { return dtdHandler; } + set { dtdHandler = value; } + } + + /// <summary> + /// Gets or Sets the content event handler. + /// </summary> + public IContentHandler ContentHandler + { + get { return contentHandler; } + set { contentHandler = value; } + } + + /// <summary> + /// Gets or Sets the error event handler. + /// </summary> + public IErrorHandler ErrorHandler + { + get { return errorHandler; } + set { errorHandler = value; } + } + + /// <summary> + /// Parse an XML document. + /// <para> + /// The application can use this method to instruct the XML + /// reader to begin parsing an XML document from any valid input + /// source (a character stream, a byte stream, or a URI). + /// </para> + /// <para> + /// Applications may not invoke this method while a parse is in + /// progress (they should create a new XMLReader instead for each + /// nested XML document). Once a parse is complete, an + /// application may reuse the same XMLReader object, possibly with a + /// different input source. + /// Configuration of the XMLReader object (such as handler bindings and + /// values established for feature flags and properties) is unchanged + /// by completion of a parse, unless the definition of that aspect of + /// the configuration explicitly specifies other behavior. + /// (For example, feature flags or properties exposing + /// characteristics of the document being parsed.) + /// </para> + /// <para> + /// During the parse, the XMLReader will provide information + /// about the XML document through the registered event + /// handlers. + /// </para> + /// <para> + /// This method is synchronous: it will not return until parsing + /// has ended. If a client application wants to terminate + /// parsing early, it should throw an exception. + /// </para> + /// </summary> + /// <param name="input"> + /// The input source for the top-level of the + /// XML document. + /// </param> + /// <exception cref="SAXException"> + /// Any SAX exception, possibly + /// wrapping another exception. + /// </exception> + /// <exception cref="System.IO.IOException"> + /// An IO exception from the parser, + /// possibly from a byte stream or character stream + /// supplied by the application. + /// </exception> + /// <seealso cref="InputSource" /> + /// <seealso cref="Parse(string)" /> + /// <seealso cref="IEntityResolver" /> + /// <seealso cref="IDTDHandler" /> + /// <seealso cref="IContentHandler" /> + /// <seealso cref="IErrorHandler" /> + public virtual void Parse(InputSource input) + { + SetupParse(); + parent.Parse(input); + } + + /// <summary> + /// Parse a document. + /// </summary> + /// <param name="systemId">The system identifier as a fully-qualified URI.</param> + /// <exception cref="SAXException">Any SAX exception, possibly + /// wrapping another exception.</exception> + /// <exception cref="System.IO.IOException">An IO exception from the parser, + /// possibly from a byte stream or character stream + /// supplied by the application.</exception> + public virtual void Parse(string systemId) + { + Parse(new InputSource(systemId)); + } + + + //////////////////////////////////////////////////////////////////// + // Implementation of IEntityResolver. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Filter an external entity resolution. + /// </summary> + /// <param name="publicId">The entity's public identifier, or null.</param> + /// <param name="systemId">The entity's system identifier.</param> + /// <returns>A new <see cref="InputSource"/> or null for the default.</returns> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + /// <exception cref="System.IO.IOException">The client may throw an + /// I/O-related exception while obtaining the + /// new <see cref="InputSource"/>.</exception> + public virtual InputSource ResolveEntity(string publicId, string systemId) + { + if (entityResolver != null) + { + return entityResolver.ResolveEntity(publicId, systemId); + } + return null; + } + + //////////////////////////////////////////////////////////////////// + // Implementation of IDTDHandler. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Filter a notation declaration event. + /// </summary> + /// <param name="name">The notation name.</param> + /// <param name="publicId">The notation's public identifier, or null.</param> + /// <param name="systemId">The notation's system identifier, or null.</param> + /// <seealso cref="SAXException">The client may throw + /// an exception during processing.</seealso> + public virtual void NotationDecl(string name, string publicId, string systemId) + { + if (dtdHandler != null) + { + dtdHandler.NotationDecl(name, publicId, systemId); + } + } + + /// <summary> + /// Filter an unparsed entity declaration event. + /// </summary> + /// <param name="name">The entity name.</param> + /// <param name="publicId">The entity's public identifier, or null.</param> + /// <param name="systemId">The entity's system identifier, or null.</param> + /// <param name="notationName">The name of the associated notation.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void UnparsedEntityDecl(string name, string publicId, string systemId, string notationName) + { + if (dtdHandler != null) + { + dtdHandler.UnparsedEntityDecl(name, publicId, systemId, notationName); + } + } + + //////////////////////////////////////////////////////////////////// + // Implementation of IContentHandler. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Filter a new document locator event. + /// </summary> + /// <param name="locator">The document locator.</param> + public virtual void SetDocumentLocator(ILocator locator) + { + this.locator = locator; + if (contentHandler != null) + { + contentHandler.SetDocumentLocator(locator); + } + } + + /// <summary> + /// Filter a start document event. + /// </summary> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void StartDocument() + { + if (contentHandler != null) + { + contentHandler.StartDocument(); + } + } + + /// <summary> + /// Filter an end document event. + /// </summary> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void EndDocument() + { + if (contentHandler != null) + { + contentHandler.EndDocument(); + } + } + + /// <summary> + /// Filter a start Namespace prefix mapping event. + /// </summary> + /// <param name="prefix">The Namespace prefix.</param> + /// <param name="uri">The Namespace URI.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void StartPrefixMapping(string prefix, string uri) + { + if (contentHandler != null) + { + contentHandler.StartPrefixMapping(prefix, uri); + } + } + + /// <summary> + /// Filter an end Namespace prefix mapping event. + /// </summary> + /// <param name="prefix">The Namespace prefix.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void EndPrefixMapping(string prefix) + { + if (contentHandler != null) + { + contentHandler.EndPrefixMapping(prefix); + } + } + + /// <summary> + /// Filter a start element event. + /// </summary> + /// <param name="uri">The element's Namespace URI, or the empty string.</param> + /// <param name="localName">The element's local name, or the empty string.</param> + /// <param name="qName">The element's qualified (prefixed) name, or the empty string.</param> + /// <param name="atts">The element's attributes.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void StartElement(string uri, string localName, string qName, IAttributes atts) + { + if (contentHandler != null) + { + contentHandler.StartElement(uri, localName, qName, atts); + } + } + + /// <summary> + /// Filter an end element event. + /// </summary> + /// <param name="uri">The element's Namespace URI, or the empty string.</param> + /// <param name="localName">The element's local name, or the empty string.</param> + /// <param name="qName">The element's qualified (prefixed) name, or the empty string.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void EndElement(string uri, string localName, string qName) + { + if (contentHandler != null) + { + contentHandler.EndElement(uri, localName, qName); + } + } + + /// <summary> + /// Filter a character data event. + /// </summary> + /// <param name="ch">An array of characters.</param> + /// <param name="start">The starting position in the array.</param> + /// <param name="length">The number of characters to use from the array.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void Characters(char[] ch, int start, int length) + { + if (contentHandler != null) + { + contentHandler.Characters(ch, start, length); + } + } + + /// <summary> + /// Filter an ignorable whitespace event. + /// </summary> + /// <param name="ch">An array of characters.</param> + /// <param name="start">The starting position in the array.</param> + /// <param name="length">The number of characters to use from the array.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void IgnorableWhitespace(char[] ch, int start, int length) + { + if (contentHandler != null) + { + contentHandler.IgnorableWhitespace(ch, start, length); + } + } + + /// <summary> + /// Filter a processing instruction event. + /// </summary> + /// <param name="target">The processing instruction target.</param> + /// <param name="data">The text following the target.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void ProcessingInstruction(string target, string data) + { + if (contentHandler != null) + { + contentHandler.ProcessingInstruction(target, data); + } + } + + /// <summary> + /// Filter a skipped entity event. + /// </summary> + /// <param name="name">The name of the skipped entity.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void SkippedEntity(string name) + { + if (contentHandler != null) + { + contentHandler.SkippedEntity(name); + } + } + + //////////////////////////////////////////////////////////////////// + // Implementation of IErrorHandler. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Filter a warning event. + /// </summary> + /// <param name="e">The warning as an exception.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void Warning(SAXParseException e) + { + if (errorHandler != null) + { + errorHandler.Warning(e); + } + } + + /// <summary> + /// Filter an error event. + /// </summary> + /// <param name="e">The error as an exception.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void Error(SAXParseException e) + { + if (errorHandler != null) + { + errorHandler.Error(e); + } + } + + /// <summary> + /// Filter a fatal error event. + /// </summary> + /// <param name="e">The error as an exception.</param> + /// <exception cref="SAXException">The client may throw + /// an exception during processing.</exception> + public virtual void FatalError(SAXParseException e) + { + if (errorHandler != null) + { + errorHandler.FatalError(e); + } + } + + //////////////////////////////////////////////////////////////////// + // Internal methods. + //////////////////////////////////////////////////////////////////// + + /// <summary> + /// Set up before a parse. + /// <para/> + /// Before every parse, check whether the parent is + /// non-null, and re-register the filter for all of the + /// events. + /// </summary> + private void SetupParse() + { + if (parent == null) + { + throw new InvalidOperationException("No parent for filter"); + } + parent.EntityResolver = this; + parent.DTDHandler = this; + parent.ContentHandler = this; + parent.ErrorHandler = this; + } + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + private IXMLReader parent = null; + private ILocator locator = null; + private IEntityResolver entityResolver = null; + private IDTDHandler dtdHandler = null; + private IContentHandler contentHandler = null; + private IErrorHandler errorHandler = null; + } +} http://git-wip-us.apache.org/repos/asf/lucenenet/blob/198e5868/src/Lucene.Net.Benchmark/Support/Sax/InputSource.cs ---------------------------------------------------------------------- diff --git a/src/Lucene.Net.Benchmark/Support/Sax/InputSource.cs b/src/Lucene.Net.Benchmark/Support/Sax/InputSource.cs new file mode 100644 index 0000000..00b3490 --- /dev/null +++ b/src/Lucene.Net.Benchmark/Support/Sax/InputSource.cs @@ -0,0 +1,242 @@ +// SAX input source. +// http://www.saxproject.org +// No warranty; no copyright -- use this as you will. +// $Id: InputSource.java,v 1.10 2004/12/02 02:49:58 dmegginson Exp $ + +using System.IO; +using System.Text; + +namespace Sax +{ + /// <summary> + /// A single input source for an XML entity. + /// </summary> + /// <remarks> + /// <em>This module, both source code and documentation, is in the + /// Public Domain, and comes with<strong> NO WARRANTY</strong>.</em> + /// See<a href='http://www.saxproject.org'>http://www.saxproject.org</a> + /// for further information. + /// <para/> + /// This class allows a SAX application to encapsulate information + /// about an input source in a single object, which may include + /// a public identifier, a system identifier, a byte stream (possibly + /// with a specified encoding), and/or a character stream. + /// <para/> + /// There are two places that the application can deliver an + /// input source to the parser: as the argument to the <see cref="IParser.Parse(InputSource)"/> + /// method, or as the return value of the <see cref="IEntityResolver.ResolveEntity(string, string)"/> + /// method. + /// <para/> + /// The SAX parser will use the InputSource object to determine how + /// to read XML input. If there is a character stream available, the + /// parser will read that stream directly, disregarding any text + /// encoding declaration found in that stream. + /// If there is no character stream, but there is + /// a byte stream, the parser will use that byte stream, using the + /// encoding specified in the <see cref="InputSource"/> or else (if no encoding is + /// specified) autodetecting the character encoding using an algorithm + /// such as the one in the XML specification. If neither a character + /// stream nor a + /// byte stream is available, the parser will attempt to open a URL + /// connection to the resource identified by the system + /// identifier. + /// <para/> + /// An <see cref="InputSource"/> object belongs to the application: the SAX parser + /// shall never modify it in any way (it may modify a copy if + /// necessary). However, standard processing of both byte and + /// character streams is to close them on as part of end-of-parse cleanup, + /// so applications should not attempt to re-use such streams after they + /// have been handed to a parser. + /// </remarks> + /// <since>SAX 1.0</since> + /// <author>David Megginson</author> + /// <version>2.0.1 (sax2r2)</version> + /// <seealso cref="IXMLReader.Parse(InputSource)"/> + /// <seealso cref="IEntityResolver.ResolveEntity(string, string)"/> + /// <seealso cref="System.IO.Stream"/> + /// <seealso cref="System.IO.TextReader"/> + public class InputSource + { + /// <summary> + /// Zero-argument default constructor. + /// </summary> + /// <seealso cref="PublicId"/> + /// <seealso cref="SystemId"/> + /// <seealso cref="Stream"/> + /// <seealso cref="TextReader"/> + /// <seealso cref="Encoding"/> + public InputSource() + { + } + + /// <summary> + /// Create a new input source with a system identifier. + /// </summary> + /// <remarks> + /// Applications may use <see cref="PublicId"/> to include a + /// public identifier as well, or <see cref="Encoding"/> to specify + /// the character encoding, if known. + /// <para/> + /// If the system identifier is a URL, it must be fully + /// resolved (it may not be a relative URL). + /// </remarks> + /// <param name="systemId">The system identifier (URI).</param> + /// <seealso cref="PublicId"/> + /// <seealso cref="SystemId"/> + /// <seealso cref="Stream"/> + /// <seealso cref="TextReader"/> + /// <seealso cref="Encoding"/> + public InputSource(string systemId) + { + this.systemId = systemId; + } + + /// <summary> + /// Create a new input source with a byte stream. + /// </summary> + /// <remarks> + /// Application writers should use <see cref="SystemId"/> to provide a base + /// for resolving relative URIs, may use <see cref="PublicId"/> to include a + /// public identifier, and may use <see cref="Encoding"/> to specify the object's + /// character encoding. + /// </remarks> + /// <param name="byteStream">The raw byte stream containing the document.</param> + /// <seealso cref="PublicId"/> + /// <seealso cref="SystemId"/> + /// <seealso cref="Encoding"/> + /// <seealso cref="Stream"/> + /// <seealso cref="TextReader"/> + public InputSource(Stream byteStream) + { + this.byteStream = byteStream; + } + + /// <summary> + /// Create a new input source with a character stream. + /// </summary> + /// <remarks> + /// Application writers should use <see cref="SystemId"/> to provide a base + /// for resolving relative URIs, and may use <see cref="PublicId"/> to include a + /// public identifier. + /// <para/> + /// The character stream shall not include a byte order mark. + /// </remarks> + /// <param name="characterStream"></param> + /// <seealso cref="PublicId"/> + /// <seealso cref="SystemId"/> + /// <seealso cref="Stream"/> + /// <seealso cref="TextReader"/> + public InputSource(TextReader characterStream) + { + this.characterStream = characterStream; + } + + /// <summary> + /// Gets or Sets the public identifier for this input source. + /// </summary> + /// <remarks> + /// The public identifier is always optional: if the application + /// writer includes one, it will be provided as part of the + /// location information. + /// </remarks> + /// <seealso cref="ILocator.PublicId"/> + /// <seealso cref="SAXParseException.PublicId"/> + public virtual string PublicId + { + get { return publicId; } + set { publicId = value; } + } + + /// <summary> + /// Gets or Sets the system identifier for this input source. + /// </summary> + /// <remarks> + /// The system identifier is optional if there is a byte stream + /// or a character stream, but it is still useful to provide one, + /// since the application can use it to resolve relative URIs + /// and can include it in error messages and warnings(the parser + /// will attempt to open a connection to the URI only if + /// there is no byte stream or character stream specified). + /// <para/> + /// If the application knows the character encoding of the + /// object pointed to by the system identifier, it can register + /// the encoding using the <see cref="Encoding"/> property setter. + /// <para/> + /// If the system identifier is a URL, it must be fully + /// resolved(it may not be a relative URL). + /// </remarks> + /// <seealso cref="Encoding"/> + /// <seealso cref="SystemId"/> + /// <seealso cref="ILocator.SystemId"/> + /// <seealso cref="SAXParseException.SystemId"/> + public virtual string SystemId + { + get { return systemId; } + set { systemId = value; } + } + + /// <summary> + /// Gets or Sets the byte stream for this input source. + /// </summary> + /// <remarks> + /// The SAX parser will ignore this if there is also a character + /// stream specified, but it will use a byte stream in preference + /// to opening a URI connection itself. + /// <para/> + /// If the application knows the character encoding of the + /// byte stream, it should set it with the setEncoding method. + /// </remarks> + /// <seealso cref="Encoding"/> + /// <seealso cref="Stream"/> + /// <seealso cref="System.IO.Stream"/> + public virtual Stream Stream + { + get { return byteStream; } + set { byteStream = value; } + } + + /// <summary> + /// Gets or Sets the character encoding. + /// </summary> + /// <remarks> + /// The encoding must be a string acceptable for an + /// XML encoding declaration(see section 4.3.3 of the XML 1.0 + /// recommendation). + /// <para/> + /// This method has no effect when the application provides a + /// character stream. + /// </remarks> + /// <seealso cref="SystemId"/> + /// <seealso cref="Stream"/> + public virtual Encoding Encoding + { + get { return encoding; } + set { encoding = value; } + } + + /// <summary> + /// Gets or Sets the character stream for this input source. + /// </summary> + /// <remarks> + /// If there is a character stream specified, the SAX parser + /// will ignore any byte stream and will not attempt to open + /// a URI connection to the system identifier. + /// </remarks> + /// <seealso cref="System.IO.TextReader"/> + public virtual TextReader TextReader + { + get { return characterStream; } + set { characterStream = value; } + } + + //////////////////////////////////////////////////////////////////// + // Internal state. + //////////////////////////////////////////////////////////////////// + + private string publicId; + private string systemId; + private Stream byteStream; + private Encoding encoding; + private TextReader characterStream; + } +} http://git-wip-us.apache.org/repos/asf/lucenenet/blob/198e5868/src/Lucene.Net.Benchmark/Support/Sax/Locator.cs ---------------------------------------------------------------------- diff --git a/src/Lucene.Net.Benchmark/Support/Sax/Locator.cs b/src/Lucene.Net.Benchmark/Support/Sax/Locator.cs new file mode 100644 index 0000000..25d1fce --- /dev/null +++ b/src/Lucene.Net.Benchmark/Support/Sax/Locator.cs @@ -0,0 +1,125 @@ +// SAX locator interface for document events. +// http://www.saxproject.org +// No warranty; no copyright -- use this as you will. +// $Id: Locator.java,v 1.8 2002/01/30 21:13:47 dbrownell Exp $ + +namespace Sax +{ + /// <summary> + /// Interface for associating a SAX event with a document location. + /// </summary> + /// <remarks> + /// <em>This module, both source code and documentation, is in the + /// Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> + /// See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> + /// for further information. + /// <para/> + /// If a SAX parser provides location information to the SAX + /// application, it does so by implementing this interface and then + /// passing an instance to the application using the content + /// handler's <see cref="IContentHandler.SetDocumentLocator(ILocator)"/> + /// method.The application can use the + /// object to obtain the location of any other SAX event + /// in the XML source document. + /// <para/> + /// Note that the results returned by the object will be valid only + /// during the scope of each callback method: the application + /// will receive unpredictable results if it attempts to use the + /// locator at any other time, or after parsing completes. + /// <para/> + /// SAX parsers are not required to supply a locator, but they are + /// very strongly encouraged to do so. If the parser supplies a + /// locator, it must do so before reporting any other document events. + /// If no locator has been set by the time the application receives + /// the <see cref="IContentHandler.StartDocument()"/> + /// event, the application should assume that a locator is not + /// available. + /// </remarks> + /// <since>SAX 1.0</since> + /// <author>David Megginson</author> + /// <version>2.0.1 (sax2r2)</version> + /// <seealso cref="IContentHandler.SetDocumentLocator(ILocator)"/> + public interface ILocator + { + /// <summary> + /// Gets the public identifier for the current document event. + /// <para/> + /// The return value is the public identifier of the document + /// entity or of the external parsed entity in which the markup + /// triggering the event appears. + /// <para/> + /// Returns a string containing the public identifier, or null if none is available. + /// </summary> + /// <seealso cref="SystemId"/> + string PublicId { get; } + + /// <summary> + /// Return the system identifier for the current document event. + /// <para/> + /// The return value is the system identifier of the document + /// entity or of the external parsed entity in which the markup + /// triggering the event appears. + /// <para/>If the system identifier is a URL, the parser must resolve it + /// fully before passing it to the application. For example, a file + /// name must always be provided as a <em>file:...</em> URL, and other + /// kinds of relative URI are also resolved against their bases. + /// <para/> + /// Returns a string containing the system identifier, or null + /// if none is available. + /// </summary> + /// <seealso cref="PublicId"/> + string SystemId { get; } + + /// <summary> + /// Return the line number where the current document event ends. + /// Lines are delimited by line ends, which are defined in + /// the XML specification. + /// <para/> + /// <strong>Warning:</strong> The return value from the method + /// is intended only as an approximation for the sake of diagnostics; + /// it is not intended to provide sufficient information + /// to edit the character content of the original XML document. + /// In some cases, these "line" numbers match what would be displayed + /// as columns, and in others they may not match the source text + /// due to internal entity expansion. + /// <para/> + /// The return value is an approximation of the line number + /// in the document entity or external parsed entity where the + /// markup triggering the event appears. + /// <para/> + /// If possible, the SAX driver should provide the line position + /// of the first character after the text associated with the document + /// event. The first line is line 1. + /// <para/> + /// Returns the line number, or -1 if none is available. + /// </summary> + /// <seealso cref="ColumnNumber"/> + int LineNumber { get; } + + /// <summary> + /// Return the column number where the current document event ends. + /// This is one-based number of Java<code>char</code> values since + /// the last line end. + /// <para/> + /// <strong>Warning:</strong> The return value from the method + /// is intended only as an approximation for the sake of diagnostics; + /// it is not intended to provide sufficient information + /// to edit the character content of the original XML document. + /// For example, when lines contain combining character sequences, wide + /// characters, surrogate pairs, or bi-directional text, the value may + /// not correspond to the column in a text editor's display. + /// <para/> + /// The return value is an approximation of the column number + /// in the document entity or external parsed entity where the + /// markup triggering the event appears. + /// <para/> + /// If possible, the SAX driver should provide the line position + /// of the first character after the text associated with the document + /// event. The first column in each line is column 1. + /// <para/> + /// Returns the column number, or -1 if none is available. + /// </summary> + /// <seealso cref="LineNumber"/> + int ColumnNumber { get; } + } +} http://git-wip-us.apache.org/repos/asf/lucenenet/blob/198e5868/src/Lucene.Net.Benchmark/Support/Sax/SAXException.cs ---------------------------------------------------------------------- diff --git a/src/Lucene.Net.Benchmark/Support/Sax/SAXException.cs b/src/Lucene.Net.Benchmark/Support/Sax/SAXException.cs new file mode 100644 index 0000000..fc075d8 --- /dev/null +++ b/src/Lucene.Net.Benchmark/Support/Sax/SAXException.cs @@ -0,0 +1,165 @@ +// SAX exception class. +// http://www.saxproject.org +// No warranty; no copyright -- use this as you will. +// $Id: SAXException.java,v 1.7 2002/01/30 21:13:48 dbrownell Exp $ + +using System; +#if FEATURE_SERIALIZABLE +using System.Runtime.Serialization; +#endif + +namespace Sax +{ + /// <summary> + /// Encapsulate a general SAX error or warning. + /// </summary> + /// <remarks> + /// <em>This module, both source code and documentation, is in the + /// Public Domain, and comes with<strong> NO WARRANTY</strong>.</em> + /// See<a href='http://www.saxproject.org'>http://www.saxproject.org</a> + /// for further information. + /// <para/> + /// This class can contain basic error or warning information from + /// either the XML parser or the application: a parser writer or + /// application writer can subclass it to provide additional + /// functionality. SAX handlers may throw this exception or + /// any exception subclassed from it. + /// <para/> + /// If the application needs to pass through other types of + /// exceptions, it must wrap those exceptions in a <see cref="SAXException"/> + /// or an exception derived from a <see cref="SAXException"/>. + /// <para/> + /// If the parser or application needs to include information about a + /// specific location in an XML document, it should use the + /// <see cref="SAXParseException"/> subclass. + /// </remarks> + // LUCENENET: All exeption classes should be marked serializable +#if FEATURE_SERIALIZABLE + [Serializable] +#endif + public class SAXException : Exception + { + /// <summary> + /// Create a new <see cref="SAXException"/>. + /// </summary> + public SAXException() + : base() + { + this.exception = null; + } + + /// <summary> + /// Create a new <see cref="SAXException"/>. + /// </summary> + /// <param name="message">The error or warning message.</param> + public SAXException(string message) + : base(message) + { + this.exception = null; + } + + /// <summary> + /// Create a new <see cref="SAXException"/> wrapping an existing exception. + /// </summary> + /// <remarks> + /// The existing exception will be embedded in the new + /// one, and its message will become the default message for + /// the <see cref="SAXException"/>. + /// </remarks> + /// <param name="e">The exception to be wrapped in a <see cref="SAXException"/>.</param> + public SAXException(Exception e) + : base() + { + this.exception = e; + } + + /// <summary> + /// Create a new <see cref="SAXException"/> from an existing exception. + /// </summary> + /// <remarks> + /// The existing exception will be embedded in the new + /// one, but the new exception will have its own message. + /// </remarks> + /// <param name="message">The detail message.</param> + /// <param name="e">The exception to be wrapped in a SAXException.</param> + public SAXException(string message, Exception e) + : base(message) + { + this.exception = e; + } + +#if FEATURE_SERIALIZABLE + /// <summary> + /// Initializes a new instance of this class with serialized data. + /// </summary> + /// <param name="info">The <see cref="SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param> + /// <param name="context">The <see cref="StreamingContext"/> that contains contextual information about the source or destination.</param> + public SAXException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } +#endif + + /// <summary> + /// Return a detail message for this exception. + /// </summary> + /// <remarks> + /// If there is an embedded exception, and if the SAXException + /// has no detail message of its own, this method will return + /// the detail message from the embedded exception. + /// </remarks> + public override string Message + { + get + { + string message = base.Message; + + if (message == null && exception != null) + { + return exception.Message; + } + else + { + return message; + } + } + } + + /// <summary> + /// Gets the embedded exception, if any, or <c>null</c> if there is none. + /// </summary> + public virtual Exception Exception + { + get { return exception; } + } + + /// <summary> + /// Override ToString to pick up any embedded exception. + /// </summary> + /// <returns>A string representation of this exception.</returns> + public override string ToString() + { + if (exception != null) + { + return exception.ToString(); + } + else + { + return base.ToString(); + } + } + + + + ////////////////////////////////////////////////////////////////////// + // Internal state. + ////////////////////////////////////////////////////////////////////// + + + /// <summary> + /// The embedded exception if tunnelling, or null. + /// </summary> + private Exception exception; + + } +} http://git-wip-us.apache.org/repos/asf/lucenenet/blob/198e5868/src/Lucene.Net.Benchmark/Support/Sax/SAXNotRecognizedException.cs ---------------------------------------------------------------------- diff --git a/src/Lucene.Net.Benchmark/Support/Sax/SAXNotRecognizedException.cs b/src/Lucene.Net.Benchmark/Support/Sax/SAXNotRecognizedException.cs new file mode 100644 index 0000000..e0ef4f5 --- /dev/null +++ b/src/Lucene.Net.Benchmark/Support/Sax/SAXNotRecognizedException.cs @@ -0,0 +1,66 @@ +// SAXNotRecognizedException.java - unrecognized feature or value. +// http://www.saxproject.org +// Written by David Megginson +// NO WARRANTY! This class is in the Public Domain. +// $Id: SAXNotRecognizedException.java,v 1.7 2002/01/30 21:13:48 dbrownell Exp $ + +using System; +#if FEATURE_SERIALIZABLE +using System.Runtime.Serialization; +#endif + +namespace Sax +{ + /// <summary> + /// Exception class for an unrecognized identifier. + /// </summary> + /// <remarks> + /// <em>This module, both source code and documentation, is in the + /// Public Domain, and comes with<strong> NO WARRANTY</strong>.</em> + /// See<a href='http://www.saxproject.org'>http://www.saxproject.org</a> + /// for further information. + /// <para/> + /// An XMLReader will throw this exception when it finds an + /// unrecognized feature or property identifier; SAX applications and + /// extensions may use this class for other, similar purposes. + /// </remarks> + /// <since>SAX 2.0</since> + /// <author>David Megginson</author> + /// <version>2.0.1 (sax2r2)</version> + /// <see cref="SAXNotSupportedException"/> + // LUCENENET: All exeption classes should be marked serializable +#if FEATURE_SERIALIZABLE + [Serializable] +#endif + public class SAXNotRecognizedException : SAXException + { + /// <summary> + /// Default constructor. + /// </summary> + public SAXNotRecognizedException() + : base() + { + } + + /// <summary> + /// Construct a new exception with the given message. + /// </summary> + /// <param name="message">The text message of the exception.</param> + public SAXNotRecognizedException(string message) + : base(message) + { + } + +#if FEATURE_SERIALIZABLE + /// <summary> + /// Initializes a new instance of this class with serialized data. + /// </summary> + /// <param name="info">The <see cref="SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param> + /// <param name="context">The <see cref="StreamingContext"/> that contains contextual information about the source or destination.</param> + public SAXNotRecognizedException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } +#endif + } +} http://git-wip-us.apache.org/repos/asf/lucenenet/blob/198e5868/src/Lucene.Net.Benchmark/Support/Sax/SAXNotSupportedException.cs ---------------------------------------------------------------------- diff --git a/src/Lucene.Net.Benchmark/Support/Sax/SAXNotSupportedException.cs b/src/Lucene.Net.Benchmark/Support/Sax/SAXNotSupportedException.cs new file mode 100644 index 0000000..d5184c9 --- /dev/null +++ b/src/Lucene.Net.Benchmark/Support/Sax/SAXNotSupportedException.cs @@ -0,0 +1,67 @@ +// SAXNotSupportedException.java - unsupported feature or value. +// http://www.saxproject.org +// Written by David Megginson +// NO WARRANTY! This class is in the Public Domain. +// $Id: SAXNotSupportedException.java,v 1.7 2002/01/30 21:13:48 dbrownell Exp $ + +using System; +#if FEATURE_SERIALIZABLE +using System.Runtime.Serialization; +#endif + +namespace Sax +{ + /// <summary> + /// Exception class for an unsupported operation. + /// </summary> + /// <remarks> + /// <em>This module, both source code and documentation, is in the + /// Public Domain, and comes with<strong> NO WARRANTY</strong>.</em> + /// See<a href='http://www.saxproject.org'>http://www.saxproject.org</a> + /// for further information. + /// <para/> + /// An XMLReader will throw this exception when it recognizes a + /// feature or property identifier, but cannot perform the requested + /// operation(setting a state or value). Other SAX2 applications and + /// extensions may use this class for similar purposes. + /// </remarks> + /// <since>SAX 2.0</since> + /// <author>David Megginson</author> + /// <version>2.0.1 (sax2r2)</version> + /// <seealso cref="SAXNotRecognizedException"/> + // LUCENENET: All exeption classes should be marked serializable +#if FEATURE_SERIALIZABLE + [Serializable] +#endif + public class SAXNotSupportedException : SAXException + { + /// <summary> + /// Construct a new exception with no message. + /// </summary> + public SAXNotSupportedException() + : base() + { + } + + /// <summary> + /// Construct a new exception with the given message. + /// </summary> + /// <param name="message">The text message of the exception.</param> + public SAXNotSupportedException(string message) + : base(message) + { + } + +#if FEATURE_SERIALIZABLE + /// <summary> + /// Initializes a new instance of this class with serialized data. + /// </summary> + /// <param name="info">The <see cref="SerializationInfo"/> that holds the serialized object data about the exception being thrown.</param> + /// <param name="context">The <see cref="StreamingContext"/> that contains contextual information about the source or destination.</param> + public SAXNotSupportedException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } +#endif + } +}
