//
// (C)2003 Atsushi Enomoto
//
-using System;\r
-using System.Collections;\r
-using System.Collections.Specialized;\r
-using System.Xml;\r
-using System.Xml.Schema;\r
-\r
-namespace Mono.Xml.Schema\r
-{\r
- // Created per constraining element.\r
- public class XsdKeyTable\r
- {\r
- private XsdIdentitySelector selector;\r
- private XmlSchemaIdentityConstraint source;\r
- private XmlQualifiedName qname;\r
- private XmlQualifiedName refKeyName;\r
-\r
- public ArrayList Entries = new ArrayList ();\r
- public ArrayList FinishedEntries = new ArrayList ();\r
-\r
- public int StartDepth;\r
- public XsdKeyTable ReferencedKey;\r
-\r
- public XsdKeyTable (XmlSchemaIdentityConstraint source, XmlReader reader)\r
- {\r
- Reset (source, reader);\r
- }\r
-\r
- public XmlQualifiedName QualifiedName {\r
- get { return qname; }\r
- }\r
-\r
- public XmlQualifiedName RefKeyName {\r
- get { return refKeyName; }\r
- }\r
-\r
- public XmlSchemaIdentityConstraint SourceSchemaIdentity {\r
- get { return source; }\r
- }\r
-\r
- public XsdIdentitySelector Selector {\r
- get { return selector; }\r
- }\r
-\r
- public void Reset (XmlSchemaIdentityConstraint source, XmlReader reader)\r
- {\r
- this.source = source;\r
- this.selector = source.CompiledSelector;\r
- this.qname = source.QualifiedName;\r
- XmlSchemaKeyref kr = source as XmlSchemaKeyref;\r
- if (kr != null)\r
- this.refKeyName = kr.Refer;\r
- StartDepth = 0;\r
- }\r
-\r
- // In this method, attributes are ignored.\r
- public XsdIdentityPath SelectorMatches (ArrayList qnameStack, XmlReader reader)\r
- {\r
- foreach (XsdIdentityPath path in Selector.Paths) {\r
- // Only "." hits.\r
- if (reader.Depth == this.StartDepth) {\r
- if (path.OrderedSteps.Length == 0)\r
- return path;\r
- else\r
- continue;\r
- }\r
- // It does not hit as yet (too shallow to hit).\r
- if (reader.Depth - this.StartDepth < path.OrderedSteps.Length - 1)\r
- continue;\r
-\r
- int iter = path.OrderedSteps.Length;\r
- if (path.OrderedSteps [iter-1].IsAttribute)\r
- iter--;\r
-\r
- if (path.Descendants && reader.Depth < this.StartDepth + iter)\r
- continue;\r
- else if (!path.Descendants && reader.Depth != this.StartDepth + iter)\r
- continue;\r
-\r
- iter--;\r
-\r
- XsdIdentityStep step;\r
- for (int x = 0; x <= iter; x++, iter--) {\r
- step = path.OrderedSteps [iter - x];\r
- if (step.IsAnyName)\r
- continue;\r
- XmlQualifiedName qname = (XmlQualifiedName) qnameStack [qnameStack.Count - x - 1];\r
- if (step.NsName != null && qname.Namespace == step.NsName)\r
- continue;\r
- if (step.Name == qname.Name && step.Namespace == qname.Namespace)\r
- continue;\r
- else\r
- break;\r
- }\r
- if (iter >= 0) // i.e. did not match against the path.\r
- continue;\r
- return path;\r
- }\r
- return null;\r
- }\r
- }\r
-}\r
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+using System.Xml;
+using System.Xml.Schema;
+
+namespace Mono.Xml.Schema
+{
+ internal class XsdKeyEntryCollection : CollectionBase
+ {
+ public void Add (XsdKeyEntry entry)
+ {
+ List.Add (entry);
+ }
+
+ public XsdKeyEntry this [int i] {
+ get { return (XsdKeyEntry) List [i]; }
+ set { List [i] = value; }
+ }
+ }
+
+ // Created per constraining element.
+ internal class XsdKeyTable
+ {
+ // FIXME: no need after #70419
+ public readonly bool alwaysTrue = true;
+
+ private XsdIdentitySelector selector;
+ private XmlSchemaIdentityConstraint source;
+ private XmlQualifiedName qname;
+ private XmlQualifiedName refKeyName;
+
+ public XsdKeyEntryCollection Entries =
+ new XsdKeyEntryCollection ();
+ public XsdKeyEntryCollection FinishedEntries =
+ new XsdKeyEntryCollection ();
+
+ public int StartDepth;
+ public XsdKeyTable ReferencedKey;
+
+ public XsdKeyTable (XmlSchemaIdentityConstraint source)
+ {
+ Reset (source);
+ }
+
+ public XmlQualifiedName QualifiedName {
+ get { return qname; }
+ }
+
+ public XmlQualifiedName RefKeyName {
+ get { return refKeyName; }
+ }
+
+ public XmlSchemaIdentityConstraint SourceSchemaIdentity {
+ get { return source; }
+ }
+
+ public XsdIdentitySelector Selector {
+ get { return selector; }
+ }
+
+ public void Reset (XmlSchemaIdentityConstraint source)
+ {
+ this.source = source;
+ this.selector = source.CompiledSelector;
+ this.qname = source.QualifiedName;
+ XmlSchemaKeyref kr = source as XmlSchemaKeyref;
+ if (kr != null)
+ this.refKeyName = kr.Refer;
+ StartDepth = 0;
+ }
+
+ // In this method, attributes are ignored.
+ public XsdIdentityPath SelectorMatches (ArrayList qnameStack, int depth)
+ {
+ for (int i = 0; i < Selector.Paths.Length; i++) {
+ XsdIdentityPath path = Selector.Paths [i];
+ // Only "." hits.
+ if (depth == this.StartDepth) {
+ if (path.OrderedSteps.Length == 0)
+ return path;
+ else
+ continue;
+ }
+ // It does not hit as yet (too shallow to hit).
+ if (depth - this.StartDepth < path.OrderedSteps.Length - 1)
+ continue;
+
+ int iter = path.OrderedSteps.Length;
+ if (path.OrderedSteps [iter-1].IsAttribute)
+ iter--;
+
+ if (path.Descendants && depth < this.StartDepth + iter)
+ continue;
+ else if (!path.Descendants && depth != this.StartDepth + iter)
+ continue;
+
+ iter--;
+
+ XsdIdentityStep step;
+ for (int x = 0; 0 <= iter; x++, iter--) {
+ step = path.OrderedSteps [iter];
+ if (step.IsAnyName)
+ continue;
+ XmlQualifiedName qname = (XmlQualifiedName) qnameStack [qnameStack.Count - x - 1];
+ if (step.NsName != null && qname.Namespace == step.NsName)
+ continue;
+ if (step.Name == qname.Name && step.Namespace == qname.Namespace)
+ continue;
+ if (alwaysTrue)
+ break;
+ }
+ if (iter >= 0) // i.e. did not match against the path.
+ continue;
+ return path;
+ }
+ return null;
+ }
+ }
+}