Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAtsushi Eno <atsushieno@gmail.com>2004-12-16 12:53:19 +0300
committerAtsushi Eno <atsushieno@gmail.com>2004-12-16 12:53:19 +0300
commitfea4a4c50c1abb8fb487d6567cc906c95235c7ac (patch)
tree6be6594f75fc73976a83e2484acb6c544cfb0a00 /mcs/class/System.XML/Mono.Xml.Schema
parent8b46ebf6545c4a29c606190ca01924c60490f8ba (diff)
2004-12-16 Atsushi Enomoto <atsushi@ximian.com>
* XsdParticleValidationState.cs : Removed some unused or unnecessary members. Readonlify some members. Added GetExpectedParticles(ArrayList) and overriden in all state types, which is used in XmlSchemaValidator.GetExpectedParticles(). * XmlSchemaValidator.cs : implemented GetExpectedParticles() and SkipToEndElement (). svn path=/trunk/mcs/; revision=37823
Diffstat (limited to 'mcs/class/System.XML/Mono.Xml.Schema')
-rw-r--r--mcs/class/System.XML/Mono.Xml.Schema/ChangeLog7
-rw-r--r--mcs/class/System.XML/Mono.Xml.Schema/XsdParticleValidationState.cs150
2 files changed, 117 insertions, 40 deletions
diff --git a/mcs/class/System.XML/Mono.Xml.Schema/ChangeLog b/mcs/class/System.XML/Mono.Xml.Schema/ChangeLog
index b4489d424fe..bca32836653 100644
--- a/mcs/class/System.XML/Mono.Xml.Schema/ChangeLog
+++ b/mcs/class/System.XML/Mono.Xml.Schema/ChangeLog
@@ -1,3 +1,10 @@
+2004-12-16 Atsushi Enomoto <atsushi@ximian.com>
+
+ * XsdParticleValidationState.cs :
+ Removed some unused or unnecessary members. Readonlify some members.
+ Added GetExpectedParticles(ArrayList) and overriden in all state
+ types, which is used in XmlSchemaValidator.GetExpectedParticles().
+
2004-12-15 Atsushi Enomoto <atsushi@ximian.com>
* XmlSchemaValidatingReader.cs : xsi:* attributes are now handled via
diff --git a/mcs/class/System.XML/Mono.Xml.Schema/XsdParticleValidationState.cs b/mcs/class/System.XML/Mono.Xml.Schema/XsdParticleValidationState.cs
index 0071bc472dd..ef7fb08e4c6 100644
--- a/mcs/class/System.XML/Mono.Xml.Schema/XsdParticleValidationState.cs
+++ b/mcs/class/System.XML/Mono.Xml.Schema/XsdParticleValidationState.cs
@@ -164,8 +164,7 @@ namespace Mono.Xml.Schema
// Dynamic members
int occured;
- string message;
- XsdParticleStateManager manager;
+ readonly XsdParticleStateManager manager;
public XsdValidationState (XsdParticleStateManager manager)
{
@@ -180,19 +179,12 @@ namespace Mono.Xml.Schema
internal abstract bool EvaluateIsEmptiable ();
+ public abstract void GetExpectedParticles (ArrayList al);
+
public XsdParticleStateManager Manager {
get { return manager; }
}
- public string Message {
- get { return message; }
- }
-
- public string MessageInternal {
- get { return message; }
- set { message = value; }
- }
-
public int Occured {
get { return occured; }
}
@@ -209,20 +201,35 @@ namespace Mono.Xml.Schema
: base (manager)
{
this.element = element;
- name = element.QualifiedName.Name;
- ns = element.QualifiedName.Namespace;
}
// final fields
- XmlSchemaElement element;
- string name;
- string ns;
+ readonly XmlSchemaElement element;
+
+ string Name {
+ get { return element.QualifiedName.Name; }
+ }
+
+ string NS {
+ get { return element.QualifiedName.Namespace; }
+ }
// Methods
-
+ public override void GetExpectedParticles (ArrayList al)
+ {
+ XmlSchemaElement copy = (XmlSchemaElement) MemberwiseClone ();
+ decimal mo = element.ValidatedMinOccurs - Occured;
+ copy.MinOccurs = mo > 0 ? mo : 0;
+ if (element.ValidatedMaxOccurs == decimal.MaxValue)
+ copy.MaxOccursString = "unbounded";
+ else
+ copy.MaxOccurs = element.ValidatedMaxOccurs - Occured;
+ al.Add (copy);
+ }
+
public override XsdValidationState EvaluateStartElement (string name, string ns)
{
- if (this.name == name && this.ns == ns && !element.IsAbstract) {
+ if (this.Name == name && this.NS == ns && !element.IsAbstract) {
return this.CheckOccurence (element);
} else {
for (int i = 0; i < element.SubstitutingElements.Count; i++) {
@@ -241,7 +248,6 @@ namespace Mono.Xml.Schema
OccuredInternal++;
Manager.CurrentElement = maybeSubstituted;
if (Occured > element.ValidatedMaxOccurs) {
- MessageInternal = "Element occurence excess.";
return XsdValidationState.Invalid;
} else if (Occured == element.ValidatedMaxOccurs) {
return Manager.Create (XmlSchemaParticle.Empty);
@@ -264,26 +270,53 @@ namespace Mono.Xml.Schema
internal class XsdSequenceValidationState : XsdValidationState
{
- XmlSchemaSequence seq;
+ readonly XmlSchemaSequence seq;
int current;
XsdValidationState currentAutomata;
bool emptiable;
- decimal minOccurs;
- decimal maxOccurs;
public XsdSequenceValidationState (XmlSchemaSequence sequence, XsdParticleStateManager manager)
- : this (sequence, manager, sequence.ValidatedMinOccurs, sequence.ValidatedMaxOccurs, -1)
+ : base (manager)
{
+ seq = sequence;
+ this.current = -1;
}
- public XsdSequenceValidationState (XmlSchemaSequence sequence, XsdParticleStateManager manager,
- decimal minOccurs, decimal maxOccurs, int current)
- : base (manager)
+ public override void GetExpectedParticles (ArrayList al)
{
- seq = sequence;
- this.minOccurs = minOccurs;
- this.maxOccurs = maxOccurs;
- this.current = current;
+ // if not started, then just collect all items from seq.
+ if (currentAutomata == null) {
+ foreach (XmlSchemaParticle p in seq.CompiledItems) {
+ al.Add (p);
+ if (!p.ValidateIsEmptiable ())
+ break;
+ }
+ return;
+ }
+
+ // automata for ongoing iteration
+ if (currentAutomata != null) {
+ currentAutomata.GetExpectedParticles (al);
+ if (!currentAutomata.EvaluateIsEmptiable ())
+ return;
+
+ // remaining items after currentAutomata
+ for (int i = current + 1; i < seq.CompiledItems.Count; i++) {
+ XmlSchemaParticle p = seq.CompiledItems [i] as XmlSchemaParticle;
+ al.Add (p);
+ if (!p.ValidateIsEmptiable ())
+ break;
+ }
+ }
+
+ // itself
+ if (Occured + 1 == seq.ValidatedMaxOccurs)
+ return;
+
+ {
+ for (int i = 0; i <= current; i++)
+ al.Add (seq.CompiledItems [i]);
+ }
}
public override XsdValidationState EvaluateStartElement (string name, string ns)
@@ -308,7 +341,7 @@ namespace Mono.Xml.Schema
}
if (xa is XsdEmptyValidationState &&
seq.CompiledItems.Count == idx + 1 &&
- Occured == maxOccurs) {
+ Occured == seq.ValidatedMaxOccurs) {
return XsdValidationState.Invalid;
} else {
XsdValidationState result = xa.EvaluateStartElement (name, ns);
@@ -322,7 +355,7 @@ namespace Mono.Xml.Schema
currentAutomata = result;
if (increment) {
OccuredInternal++;
- if (Occured > maxOccurs)
+ if (Occured > seq.ValidatedMaxOccurs)
return XsdValidationState.Invalid;
}
// current++;
@@ -350,11 +383,11 @@ namespace Mono.Xml.Schema
public override bool EvaluateEndElement ()
{
- if (minOccurs > Occured + 1)
+ if (seq.ValidatedMinOccurs > Occured + 1)
return false;
if (seq.CompiledItems.Count == 0)
return true;
- if (currentAutomata == null && minOccurs <= Occured)
+ if (currentAutomata == null && seq.ValidatedMinOccurs <= Occured)
return true;
int idx = current < 0 ? 0 : current;
@@ -374,14 +407,14 @@ namespace Mono.Xml.Schema
if (current < 0)
OccuredInternal++;
- return minOccurs <= Occured && maxOccurs >= Occured;
+ return seq.ValidatedMinOccurs <= Occured && seq.ValidatedMaxOccurs >= Occured;
}
internal override bool EvaluateIsEmptiable ()
{
- if (minOccurs > Occured + 1)
+ if (seq.ValidatedMinOccurs > Occured + 1)
return false;
- if (minOccurs == 0 && currentAutomata == null)
+ if (seq.ValidatedMinOccurs == 0 && currentAutomata == null)
return true;
if (emptiable)
@@ -410,7 +443,7 @@ namespace Mono.Xml.Schema
internal class XsdChoiceValidationState : XsdValidationState
{
- XmlSchemaChoice choice;
+ readonly XmlSchemaChoice choice;
bool emptiable;
bool emptiableComputed;
@@ -420,6 +453,13 @@ namespace Mono.Xml.Schema
this.choice = choice;
}
+ public override void GetExpectedParticles (ArrayList al)
+ {
+ if (Occured < choice.ValidatedMaxOccurs)
+ foreach (XmlSchemaParticle p in choice.CompiledItems)
+ al.Add (p);
+ }
+
public override XsdValidationState EvaluateStartElement (string localName, string ns)
{
emptiableComputed = false;
@@ -489,7 +529,7 @@ namespace Mono.Xml.Schema
internal class XsdAllValidationState : XsdValidationState
{
- XmlSchemaAll all;
+ readonly XmlSchemaAll all;
ArrayList consumed = new ArrayList ();
public XsdAllValidationState (XmlSchemaAll all, XsdParticleStateManager manager)
@@ -498,6 +538,13 @@ namespace Mono.Xml.Schema
this.all = all;
}
+ public override void GetExpectedParticles (ArrayList al)
+ {
+ foreach (XmlSchemaParticle p in all.CompiledItems)
+ if (!consumed.Contains (p))
+ al.Add (p);
+ }
+
public override XsdValidationState EvaluateStartElement (string localName, string ns)
{
if (all.CompiledItems.Count == 0)
@@ -551,7 +598,7 @@ namespace Mono.Xml.Schema
internal class XsdAnyValidationState : XsdValidationState
{
- XmlSchemaAny any;
+ readonly XmlSchemaAny any;
public XsdAnyValidationState (XmlSchemaAny any, XsdParticleStateManager manager)
: base (manager)
@@ -560,6 +607,11 @@ namespace Mono.Xml.Schema
}
// Methods
+ public override void GetExpectedParticles (ArrayList al)
+ {
+ al.Add (any);
+ }
+
public override XsdValidationState EvaluateStartElement (string name, string ns)
{
if (!MatchesNamespace (ns))
@@ -617,6 +669,12 @@ namespace Mono.Xml.Schema
XsdValidationState rest;
// Methods
+ public override void GetExpectedParticles (ArrayList al)
+ {
+ head.GetExpectedParticles (al);
+ rest.GetExpectedParticles (al);
+ }
+
public override XsdValidationState EvaluateStartElement (string name, string ns)
{
XsdValidationState afterHead = head.EvaluateStartElement (name, ns);
@@ -657,6 +715,12 @@ namespace Mono.Xml.Schema
}
// Methods
+
+ public override void GetExpectedParticles (ArrayList al)
+ {
+ // do nothing
+ }
+
public override XsdValidationState EvaluateStartElement (string name, string ns)
{
return XsdValidationState.Invalid;
@@ -682,6 +746,12 @@ namespace Mono.Xml.Schema
}
// Methods
+
+ public override void GetExpectedParticles (ArrayList al)
+ {
+ // do nothing
+ }
+
public override XsdValidationState EvaluateStartElement (string name, string ns)
{
return this;