Reformat changes, and add some small debugging information to catch errors
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaSequence.cs
1 // Author: Dwivedi, Ajay kumar\r
2 //            Adwiv@Yahoo.com\r
3 using System;\r
4 using System.Xml.Serialization;\r
5 using System.Xml;\r
6 \r
7 namespace System.Xml.Schema\r
8 {\r
9         /// <summary>\r
10         /// Summary description for XmlSchemaSequence.\r
11         /// </summary>\r
12         public class XmlSchemaSequence : XmlSchemaGroupBase\r
13         {\r
14                 private XmlSchemaObjectCollection items;\r
15                 private static string xmlname = "sequence";\r
16 \r
17                 public XmlSchemaSequence()\r
18                 {\r
19                         items = new XmlSchemaObjectCollection();\r
20                 }\r
21 \r
22                 [XmlElement("element",typeof(XmlSchemaElement),Namespace="http://www.w3.org/2001/XMLSchema")]\r
23                 [XmlElement("group",typeof(XmlSchemaGroupRef),Namespace="http://www.w3.org/2001/XMLSchema")]\r
24                 [XmlElement("choice",typeof(XmlSchemaChoice),Namespace="http://www.w3.org/2001/XMLSchema")]\r
25                 [XmlElement("sequence",typeof(XmlSchemaSequence),Namespace="http://www.w3.org/2001/XMLSchema")]\r
26                 [XmlElement("any",typeof(XmlSchemaAny),Namespace="http://www.w3.org/2001/XMLSchema")]\r
27                 public override XmlSchemaObjectCollection Items \r
28                 {\r
29                         get{ return items; }\r
30                 }\r
31                 [MonoTODO]\r
32                 internal int Compile(ValidationEventHandler h, XmlSchemaInfo info)\r
33                 {\r
34                         //FIXME: Should we reset the values\r
35                         if(MinOccurs > MaxOccurs)\r
36                                 error(h,"minOccurs must be less than or equal to maxOccurs");\r
37 \r
38                         XmlSchemaUtil.CompileID(Id, this, info.IDCollection, h);\r
39 \r
40                         foreach(XmlSchemaObject obj in Items)\r
41                         {\r
42                                 if(obj is XmlSchemaElement)\r
43                                 {\r
44                                         errorCount += ((XmlSchemaElement)obj).Compile(h,info);\r
45                                 }\r
46                                 else if(obj is XmlSchemaGroupRef)\r
47                                 {\r
48                                         errorCount += ((XmlSchemaGroupRef)obj).Compile(h,info);\r
49                                 }\r
50                                 else if(obj is XmlSchemaChoice)\r
51                                 {\r
52                                         errorCount += ((XmlSchemaChoice)obj).Compile(h,info);\r
53                                 }\r
54                                 else if(obj is XmlSchemaSequence)\r
55                                 {\r
56                                         errorCount += ((XmlSchemaSequence)obj).Compile(h,info);\r
57                                 }\r
58                                 else if(obj is XmlSchemaAny)\r
59                                 {\r
60                                         errorCount += ((XmlSchemaAny)obj).Compile(h,info);\r
61                                 }\r
62                         }\r
63                         return errorCount;\r
64                 }\r
65                 \r
66                 [MonoTODO]\r
67                 internal int Validate(ValidationEventHandler h)\r
68                 {\r
69                         return errorCount;\r
70                 }\r
71                 //<sequence\r
72                 //  id = ID\r
73                 //  maxOccurs =  (nonNegativeInteger | unbounded)  : 1\r
74                 //  minOccurs = nonNegativeInteger : 1\r
75                 //  {any attributes with non-schema namespace . . .}>\r
76                 //  Content: (annotation?, (element | group | choice | sequence | any)*)\r
77                 //</sequence>\r
78                 internal static XmlSchemaSequence Read(XmlSchemaReader reader, ValidationEventHandler h)\r
79                 {\r
80                         XmlSchemaSequence sequence = new XmlSchemaSequence();\r
81                         reader.MoveToElement();\r
82 \r
83                         if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
84                         {\r
85                                 error(h,"Should not happen :1: XmlSchemaSequence.Read, name="+reader.Name,null);\r
86                                 reader.Skip();\r
87                                 return null;\r
88                         }\r
89 \r
90                         sequence.LineNumber = reader.LineNumber;\r
91                         sequence.LinePosition = reader.LinePosition;\r
92                         sequence.SourceUri = reader.BaseURI;\r
93 \r
94                         while(reader.MoveToNextAttribute())\r
95                         {\r
96                                 if(reader.Name == "id")\r
97                                 {\r
98                                         sequence.Id = reader.Value;\r
99                                 }\r
100                                 else if(reader.Name == "maxOccurs")\r
101                                 {\r
102                                         try\r
103                                         {\r
104                                                 sequence.MaxOccursString = reader.Value;\r
105                                         }\r
106                                         catch(Exception e)\r
107                                         {\r
108                                                 error(h,reader.Value + " is an invalid value for maxOccurs",e);\r
109                                         }\r
110                                 }\r
111                                 else if(reader.Name == "minOccurs")\r
112                                 {\r
113                                         try\r
114                                         {\r
115                                                 sequence.MinOccursString = reader.Value;\r
116                                         }\r
117                                         catch(Exception e)\r
118                                         {\r
119                                                 error(h,reader.Value + " is an invalid value for minOccurs",e);\r
120                                         }\r
121                                 }\r
122                                 else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)\r
123                                 {\r
124                                         error(h,reader.Name + " is not a valid attribute for sequence",null);\r
125                                 }\r
126                                 else\r
127                                 {\r
128                                         XmlSchemaUtil.ReadUnhandledAttribute(reader,sequence);\r
129                                 }\r
130                         }\r
131                         \r
132                         reader.MoveToElement();\r
133                         if(reader.IsEmptyElement)\r
134                                 return sequence;\r
135 \r
136                         //  Content: (annotation?, (element | group | choice | sequence | any)*)\r
137                         int level = 1;\r
138                         while(reader.ReadNextElement())\r
139                         {\r
140                                 if(reader.NodeType == XmlNodeType.EndElement)\r
141                                 {\r
142                                         if(reader.LocalName != xmlname)\r
143                                                 error(h,"Should not happen :2: XmlSchemaSequence.Read, name="+reader.Name,null);\r
144                                         break;\r
145                                 }\r
146                                 if(level <= 1 && reader.LocalName == "annotation")\r
147                                 {\r
148                                         level = 2; //Only one annotation\r
149                                         XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);\r
150                                         if(annotation != null)\r
151                                                 sequence.Annotation = annotation;\r
152                                         continue;\r
153                                 }\r
154                                 if(level <=2)\r
155                                 {\r
156                                         if(reader.LocalName == "element")\r
157                                         {\r
158                                                 level = 2;\r
159                                                 XmlSchemaElement element = XmlSchemaElement.Read(reader,h);\r
160                                                 if(element != null)\r
161                                                         sequence.items.Add(element);\r
162                                                 continue;\r
163                                         }\r
164                                         if(reader.LocalName == "group")\r
165                                         {\r
166                                                 level = 2;\r
167                                                 XmlSchemaGroupRef group = XmlSchemaGroupRef.Read(reader,h);\r
168                                                 if(group != null)\r
169                                                         sequence.items.Add(group);\r
170                                                 continue;\r
171                                         }\r
172                                         if(reader.LocalName == "choice")\r
173                                         {\r
174                                                 level = 2;\r
175                                                 XmlSchemaChoice choice = XmlSchemaChoice.Read(reader,h);\r
176                                                 if(choice != null)\r
177                                                         sequence.items.Add(choice);\r
178                                                 continue;\r
179                                         }\r
180                                         if(reader.LocalName == "sequence")\r
181                                         {\r
182                                                 level = 2;\r
183                                                 XmlSchemaSequence seq = XmlSchemaSequence.Read(reader,h);\r
184                                                 if(seq != null)\r
185                                                         sequence.items.Add(seq);\r
186                                                 continue;\r
187                                         }\r
188                                         if(reader.LocalName == "any")\r
189                                         {\r
190                                                 level = 2;\r
191                                                 XmlSchemaAny any = XmlSchemaAny.Read(reader,h);\r
192                                                 if(any != null)\r
193                                                         sequence.items.Add(any);\r
194                                                 continue;\r
195                                         }\r
196                                 }\r
197                                 reader.RaiseInvalidElementError();\r
198                         }\r
199                         return sequence;\r
200                 }\r
201         }\r
202 }\r