2002-12-24 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaComplexContentExtension.cs
1 // Author: Dwivedi, Ajay kumar\r
2 //            Adwiv@Yahoo.com\r
3 using System;\r
4 using System.Xml;\r
5 using System.Xml.Serialization;\r
6 \r
7 namespace System.Xml.Schema\r
8 {\r
9         /// <summary>\r
10         /// Summary description for XmlSchemaComplexContentExtension.\r
11         /// </summary>\r
12         public class XmlSchemaComplexContentExtension : XmlSchemaContent\r
13         {\r
14                 private XmlSchemaAnyAttribute any;\r
15                 private XmlSchemaObjectCollection attributes;\r
16                 private XmlQualifiedName baseTypeName;\r
17                 private XmlSchemaParticle particle;\r
18                 private static string xmlname = "extension";\r
19 \r
20                 public XmlSchemaComplexContentExtension()\r
21                 {\r
22                         attributes = new XmlSchemaObjectCollection();\r
23                         baseTypeName = XmlQualifiedName.Empty;\r
24                 }\r
25                 \r
26                 [System.Xml.Serialization.XmlAttribute("base")]\r
27                 public XmlQualifiedName BaseTypeName \r
28                 {\r
29                         get{ return  baseTypeName; }\r
30                         set{ baseTypeName = value; }\r
31                 }\r
32 \r
33                 [XmlElement("group",typeof(XmlSchemaGroupRef),Namespace="http://www.w3.org/2001/XMLSchema")]\r
34                 [XmlElement("all",typeof(XmlSchemaAll),Namespace="http://www.w3.org/2001/XMLSchema")]\r
35                 [XmlElement("choice",typeof(XmlSchemaChoice),Namespace="http://www.w3.org/2001/XMLSchema")]\r
36                 [XmlElement("sequence",typeof(XmlSchemaSequence),Namespace="http://www.w3.org/2001/XMLSchema")]\r
37                 public XmlSchemaParticle Particle\r
38                 {\r
39                         get{ return  particle; }\r
40                         set{ particle = value; }\r
41                 }\r
42 \r
43                 [XmlElement("attribute",typeof(XmlSchemaAttribute),Namespace="http://www.w3.org/2001/XMLSchema")]\r
44                 [XmlElement("attributeGroup",typeof(XmlSchemaAttributeGroupRef),Namespace="http://www.w3.org/2001/XMLSchema")]\r
45                 public XmlSchemaObjectCollection Attributes \r
46                 {\r
47                         get{ return attributes; }\r
48                 }\r
49 \r
50                 [XmlElement("anyAttribute",Namespace="http://www.w3.org/2001/XMLSchema")]\r
51                 public XmlSchemaAnyAttribute AnyAttribute \r
52                 {\r
53                         get{ return any; }\r
54                         set{ any = value;}\r
55                 }\r
56 \r
57                 /// <remarks>\r
58                 /// </remarks>\r
59                 [MonoTODO]\r
60                 internal int Compile(ValidationEventHandler h, XmlSchemaInfo info)\r
61                 {\r
62                         if(BaseTypeName == null || BaseTypeName.IsEmpty)\r
63                         {\r
64                                 error(h, "base must be present and a QName");\r
65                         }\r
66                         else if(!XmlSchemaUtil.CheckQName(BaseTypeName))\r
67                                 error(h,"BaseTypeName is not a valid XmlQualifiedName");\r
68                         \r
69                         if(this.AnyAttribute != null)\r
70                         {\r
71                                 errorCount += AnyAttribute.Compile(h,info);\r
72                         }\r
73 \r
74                         foreach(XmlSchemaObject obj in Attributes)\r
75                         {\r
76                                 if(obj is XmlSchemaAttribute)\r
77                                 {\r
78                                         XmlSchemaAttribute attr = (XmlSchemaAttribute) obj;\r
79                                         errorCount += attr.Compile(h,info);\r
80                                 }\r
81                                 else if(obj is XmlSchemaAttributeGroupRef)\r
82                                 {\r
83                                         XmlSchemaAttributeGroupRef atgrp = (XmlSchemaAttributeGroupRef) obj;\r
84                                         errorCount += atgrp.Compile(h,info);\r
85                                 }\r
86                                 else\r
87                                         error(h,obj.GetType() +" is not valid in this place::ComplexConetnetExtension");\r
88                         }\r
89                         \r
90                         if(Particle != null)\r
91                         {\r
92                                 if(Particle is XmlSchemaGroupRef)\r
93                                 {\r
94                                         errorCount += ((XmlSchemaGroupRef)Particle).Compile(h,info);\r
95                                 }\r
96                                 else if(Particle is XmlSchemaAll)\r
97                                 {\r
98                                         errorCount += ((XmlSchemaAll)Particle).Compile(h,info);\r
99                                 }\r
100                                 else if(Particle is XmlSchemaChoice)\r
101                                 {\r
102                                         errorCount += ((XmlSchemaChoice)Particle).Compile(h,info);\r
103                                 }\r
104                                 else if(Particle is XmlSchemaSequence)\r
105                                 {\r
106                                         errorCount += ((XmlSchemaSequence)Particle).Compile(h,info);\r
107                                 }\r
108                         }\r
109                         \r
110                         XmlSchemaUtil.CompileID(Id,this,info.IDCollection,h);\r
111 \r
112                         return errorCount;\r
113                 }\r
114                 \r
115                 [MonoTODO]\r
116                 internal int Validate(ValidationEventHandler h)\r
117                 {\r
118                         return errorCount;\r
119                 }\r
120                 //<extension\r
121                 //  base = QName\r
122                 //  id = ID\r
123                 //  {any attributes with non-schema namespace . . .}>\r
124                 //  Content: (annotation?, ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))\r
125                 //</extension>\r
126                 internal static XmlSchemaComplexContentExtension Read(XmlSchemaReader reader, ValidationEventHandler h)\r
127                 {\r
128                         XmlSchemaComplexContentExtension extension = new XmlSchemaComplexContentExtension();\r
129                         reader.MoveToElement();\r
130 \r
131                         if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
132                         {\r
133                                 error(h,"Should not happen :1: XmlSchemaComplexContentExtension.Read, name="+reader.Name,null);\r
134                                 reader.Skip();\r
135                                 return null;\r
136                         }\r
137 \r
138                         extension.LineNumber = reader.LineNumber;\r
139                         extension.LinePosition = reader.LinePosition;\r
140                         extension.SourceUri = reader.BaseURI;\r
141 \r
142                         while(reader.MoveToNextAttribute())\r
143                         {\r
144                                 if(reader.Name == "base")\r
145                                 {\r
146                                         Exception innerex;\r
147                                         extension.baseTypeName = XmlSchemaUtil.ReadQNameAttribute(reader,out innerex);\r
148                                         if(innerex != null)\r
149                                                 error(h, reader.Value + " is not a valid value for base attribute",innerex);\r
150                                 }\r
151                                 else if(reader.Name == "id")\r
152                                 {\r
153                                         extension.Id = reader.Value;\r
154                                 }\r
155                                 else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)\r
156                                 {\r
157                                         error(h,reader.Name + " is not a valid attribute for extension",null);\r
158                                 }\r
159                                 else\r
160                                 {\r
161                                         XmlSchemaUtil.ReadUnhandledAttribute(reader,extension);\r
162                                 }\r
163                         }\r
164                         \r
165                         reader.MoveToElement();\r
166                         if(reader.IsEmptyElement)\r
167                                 return extension;\r
168                         //Content: 1. annotation?, \r
169                         //                      (2.(group | all | choice | sequence)?, (3.(attribute | attributeGroup)*, 4.anyAttribute?)))\r
170                         int level = 1;\r
171                         while(reader.ReadNextElement())\r
172                         {\r
173                                 if(reader.NodeType == XmlNodeType.EndElement)\r
174                                 {\r
175                                         if(reader.LocalName != xmlname)\r
176                                                 error(h,"Should not happen :2: XmlSchemaComplexContentExtension.Read, name="+reader.Name,null);\r
177                                         break;\r
178                                 }\r
179                                 if(level <= 1 && reader.LocalName == "annotation")\r
180                                 {\r
181                                         level = 2; //Only one annotation\r
182                                         XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);\r
183                                         if(annotation != null)\r
184                                                 extension.Annotation = annotation;\r
185                                         continue;\r
186                                 }\r
187                                 if(level <= 2)\r
188                                 {\r
189                                         if(reader.LocalName == "group")\r
190                                         {\r
191                                                 level = 3;\r
192                                                 XmlSchemaGroupRef group = XmlSchemaGroupRef.Read(reader,h);\r
193                                                 if(group != null)\r
194                                                         extension.particle = group;\r
195                                                 continue;\r
196                                         }\r
197                                         if(reader.LocalName == "all")\r
198                                         {\r
199                                                 level = 3;\r
200                                                 XmlSchemaAll all = XmlSchemaAll.Read(reader,h);\r
201                                                 if(all != null)\r
202                                                         extension.particle = all;\r
203                                                 continue;\r
204                                         }\r
205                                         if(reader.LocalName == "choice")\r
206                                         {\r
207                                                 level = 3;\r
208                                                 XmlSchemaChoice choice = XmlSchemaChoice.Read(reader,h);\r
209                                                 if(choice != null)\r
210                                                         extension.particle = choice;\r
211                                                 continue;\r
212                                         }\r
213                                         if(reader.LocalName == "sequence")\r
214                                         {\r
215                                                 level = 3;\r
216                                                 XmlSchemaSequence sequence = XmlSchemaSequence.Read(reader,h);\r
217                                                 if(sequence != null)\r
218                                                         extension.particle = sequence;\r
219                                                 continue;\r
220                                         }\r
221                                 }\r
222                                 if(level <= 3)\r
223                                 {\r
224                                         if(reader.LocalName == "attribute")\r
225                                         {\r
226                                                 level = 3;\r
227                                                 XmlSchemaAttribute attr = XmlSchemaAttribute.Read(reader,h);\r
228                                                 if(attr != null)\r
229                                                         extension.Attributes.Add(attr);\r
230                                                 continue;\r
231                                         }\r
232                                         if(reader.LocalName == "attributeGroup")\r
233                                         {\r
234                                                 level = 3;\r
235                                                 XmlSchemaAttributeGroupRef attr = XmlSchemaAttributeGroupRef.Read(reader,h);\r
236                                                 if(attr != null)\r
237                                                         extension.attributes.Add(attr);\r
238                                                 continue;\r
239                                         }\r
240                                 }\r
241                                 if(level <= 4 && reader.LocalName == "anyAttribute")\r
242                                 {\r
243                                         level = 5;\r
244                                         XmlSchemaAnyAttribute anyattr = XmlSchemaAnyAttribute.Read(reader,h);\r
245                                         if(anyattr != null)\r
246                                                 extension.AnyAttribute = anyattr;\r
247                                         continue;\r
248                                 }\r
249                                 reader.RaiseInvalidElementError();\r
250                         }\r
251                         return extension;\r
252                 }\r
253         }\r
254 }\r