2002-06-10 Dwivedi, Ajay kumar <adwiv@yahoo.com>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaSimpleContentExtension.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 XmlSchemaSimpleContentExtension.\r
11         /// </summary>\r
12         public class XmlSchemaSimpleContentExtension : XmlSchemaContent\r
13         {\r
14 \r
15                 private XmlSchemaAnyAttribute any;\r
16                 private XmlSchemaObjectCollection attributes;\r
17                 private XmlQualifiedName baseTypeName;\r
18                 private static string xmlname = "extension";\r
19 \r
20                 public XmlSchemaSimpleContentExtension()\r
21                 {\r
22                         baseTypeName = XmlQualifiedName.Empty;\r
23                         attributes       = new XmlSchemaObjectCollection();\r
24                 }\r
25 \r
26                 [XmlElement("anyAttribute",Namespace="http://www.w3.org/2001/XMLSchema")]\r
27                 public XmlSchemaAnyAttribute AnyAttribute \r
28                 {\r
29                         get{ return  any; }\r
30                         set{ any = value; }\r
31                 }\r
32 \r
33                 [XmlElement("attribute",typeof(XmlSchemaAttribute),Namespace="http://www.w3.org/2001/XMLSchema")]\r
34                 [XmlElement("attributeGroup",typeof(XmlSchemaAttributeGroupRef),Namespace="http://www.w3.org/2001/XMLSchema")]\r
35                 public XmlSchemaObjectCollection Attributes \r
36                 {\r
37                         get{ return attributes; }\r
38                 }\r
39 \r
40                 [System.Xml.Serialization.XmlAttribute("base")]\r
41                 public XmlQualifiedName BaseTypeName \r
42                 {\r
43                         get{ return  baseTypeName; }\r
44                         set{ baseTypeName = value; }\r
45                 }\r
46                 ///<remarks>\r
47                 /// 1. Base must be present and a QName\r
48                 ///</remarks>\r
49                 [MonoTODO]\r
50                 internal int Compile(ValidationEventHandler h, XmlSchemaInfo info)\r
51                 {\r
52                         if(BaseTypeName == null || BaseTypeName.IsEmpty)\r
53                         {\r
54                                 error(h, "base must be present and a QName");\r
55                         }\r
56                         \r
57                         if(this.AnyAttribute != null)\r
58                         {\r
59                                 AnyAttribute.Compile(h,info);\r
60                         }\r
61 \r
62                         foreach(XmlSchemaObject obj in Attributes)\r
63                         {\r
64                                 if(obj is XmlSchemaAttribute)\r
65                                 {\r
66                                         XmlSchemaAttribute attr = (XmlSchemaAttribute) obj;\r
67                                         attr.Compile(h,info);\r
68                                 }\r
69                                 else if(obj is XmlSchemaAttributeGroup)\r
70                                 {\r
71                                         XmlSchemaAttributeGroup atgrp = (XmlSchemaAttributeGroup) obj;\r
72                                         atgrp.Compile(h,info);\r
73                                 }\r
74                                 else\r
75                                         error(h,obj.GetType() +" is not valid in this place::SimpleConentExtension");\r
76                         }\r
77                         if(this.Id != null && !XmlSchemaUtil.CheckID(Id))\r
78                                 error(h, "id must be a valid ID");\r
79 \r
80                         return errorCount;\r
81                 }\r
82                 \r
83                 [MonoTODO]\r
84                 internal int Validate(ValidationEventHandler h)\r
85                 {\r
86                         return errorCount;\r
87                 }\r
88                 //<extension \r
89                 //base = QName \r
90                 //id = ID \r
91                 //{any attributes with non-schema namespace . . .}>\r
92                 //Content: (annotation?, ((attribute | attributeGroup)*, anyAttribute?))\r
93                 //</extension>\r
94                 internal static XmlSchemaSimpleContentExtension Read(XmlSchemaReader reader, ValidationEventHandler h)\r
95                 {\r
96                         XmlSchemaSimpleContentExtension extension = new XmlSchemaSimpleContentExtension();\r
97                         reader.MoveToElement();\r
98 \r
99                         if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
100                         {\r
101                                 error(h,"Should not happen :1: XmlSchemaAttributeGroup.Read, name="+reader.Name,null);\r
102                                 reader.Skip();\r
103                                 return null;\r
104                         }\r
105 \r
106                         extension.LineNumber = reader.LineNumber;\r
107                         extension.LinePosition = reader.LinePosition;\r
108                         extension.SourceUri = reader.BaseURI;\r
109 \r
110                         while(reader.MoveToNextAttribute())\r
111                         {\r
112                                 if(reader.Name == "base")\r
113                                 {\r
114                                         Exception innerex;\r
115                                         extension.baseTypeName= XmlSchemaUtil.ReadQNameAttribute(reader,out innerex);\r
116                                         if(innerex != null)\r
117                                                 error(h, reader.Value + " is not a valid value for base attribute",innerex);\r
118                                 }\r
119                                 else if(reader.Name == "id")\r
120                                 {\r
121                                         extension.Id = reader.Value;\r
122                                 }\r
123                                 else if(reader.NamespaceURI == "" || reader.NamespaceURI == XmlSchema.Namespace)\r
124                                 {\r
125                                         error(h,reader.Name + " is not a valid attribute for extension in this context",null);\r
126                                 }\r
127                                 else\r
128                                 {\r
129                                         //TODO: Add to Unhandled attributes\r
130                                 }\r
131                         }\r
132                         \r
133                         reader.MoveToElement();\r
134                         if(reader.IsEmptyElement)\r
135                                 return extension;\r
136 \r
137                         //Content: 1.annotation?, 2.(attribute | attributeGroup)*, 3.anyAttribute?\r
138                         int level = 1;\r
139                         while(reader.ReadNextElement())\r
140                         {\r
141                                 if(reader.NodeType == XmlNodeType.EndElement)\r
142                                 {\r
143                                         if(reader.LocalName != xmlname)\r
144                                                 error(h,"Should not happen :2: XmlSchemaSimpleContentExtension.Read, name="+reader.Name,null);\r
145                                         break;\r
146                                 }\r
147                                 if(level <= 1 && reader.LocalName == "annotation")\r
148                                 {\r
149                                         level = 2; //Only one annotation\r
150                                         XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);\r
151                                         if(annotation != null)\r
152                                                 extension.Annotation = annotation;\r
153                                         continue;\r
154                                 }\r
155                                 if(level <= 2)\r
156                                 {\r
157                                         if(reader.LocalName == "attribute")\r
158                                         {\r
159                                                 level = 2;\r
160                                                 XmlSchemaAttribute attr = XmlSchemaAttribute.Read(reader,h);\r
161                                                 if(attr != null)\r
162                                                         extension.Attributes.Add(attr);\r
163                                                 continue;\r
164                                         }\r
165                                         if(reader.LocalName == "attributeGroup")\r
166                                         {\r
167                                                 level = 2;\r
168                                                 XmlSchemaAttributeGroupRef attr = XmlSchemaAttributeGroupRef.Read(reader,h);\r
169                                                 if(attr != null)\r
170                                                         extension.attributes.Add(attr);\r
171                                                 continue;\r
172                                         }\r
173                                 }\r
174                                 if(level <= 3 && reader.LocalName == "anyAttribute")\r
175                                 {\r
176                                         level = 4;\r
177                                         XmlSchemaAnyAttribute anyattr = XmlSchemaAnyAttribute.Read(reader,h);\r
178                                         if(anyattr != null)\r
179                                                 extension.AnyAttribute = anyattr;\r
180                                         continue;\r
181                                 }\r
182                                 reader.RaiseInvalidElementError();\r
183                         }\r
184                         return extension;\r
185                 }\r
186         }\r
187 }\r