implementing XmlElement.SetAttributeNode(localName, namespaceURI) and
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaAny.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 using System.ComponentModel;\r
7 \r
8 namespace System.Xml.Schema\r
9 {\r
10         /// <summary>\r
11         /// Summary description for XmlSchemaAny.\r
12         /// </summary>\r
13         public class XmlSchemaAny : XmlSchemaParticle\r
14         {\r
15                 private string nameSpace;\r
16                 private XmlSchemaContentProcessing processing;\r
17                 private static string xmlname = "any";\r
18 \r
19                 public XmlSchemaAny()\r
20                 {\r
21                 }\r
22 \r
23                 [System.Xml.Serialization.XmlAttribute("namespace")]\r
24                 public string Namespace \r
25                 {\r
26                         get{ return  nameSpace; } \r
27                         set{ nameSpace = value; }\r
28                 }\r
29                 \r
30                 [DefaultValue(XmlSchemaContentProcessing.None)]\r
31                 [System.Xml.Serialization.XmlAttribute("processContents")]\r
32                 public XmlSchemaContentProcessing ProcessContents\r
33                 { \r
34                         get{ return processing; } \r
35                         set{ processing = value; }\r
36                 }\r
37 \r
38                 /// <remarks>\r
39                 /// 1. id must be of type ID\r
40                 /// 2. namespace can have one of the following values:\r
41                 ///             a) ##any or ##other\r
42                 ///             b) list of anyURI and ##targetNamespace and ##local\r
43                 /// </remarks>\r
44                 [MonoTODO]\r
45                 internal int Compile(ValidationEventHandler h, XmlSchemaInfo info)\r
46                 {\r
47                         errorCount = 0;\r
48 \r
49                         XmlSchemaUtil.CompileID(Id,this,info.IDCollection,h);\r
50 \r
51                         //define ##any=1,##other=2,##targetNamespace=4,##local=8,anyURI=16\r
52                         int nscount = 0;\r
53                         string[] nslist = XmlSchemaUtil.SplitList(Namespace);\r
54                         foreach(string ns in nslist)\r
55                         {\r
56                                 switch(ns)\r
57                                 {\r
58                                         case "##any": \r
59                                                 nscount |= 1;\r
60                                                 break;\r
61                                         case "##other":\r
62                                                 nscount |= 2;\r
63                                                 break;\r
64                                         case "##targetNamespace":\r
65                                                 nscount |= 4;\r
66                                                 break;\r
67                                         case "##local":\r
68                                                 nscount |= 8;\r
69                                                 break;\r
70                                         default:\r
71                                                 if(!XmlSchemaUtil.CheckAnyUri(ns))\r
72                                                         error(h,"the namespace is not a valid anyURI");\r
73                                                 else\r
74                                                         nscount |= 16;\r
75                                                 break;\r
76                                 }\r
77                         }\r
78                         if((nscount&1) == 1 && nscount != 1)\r
79                                 error(h,"##any if present must be the only namespace attribute");\r
80                         if((nscount&2) == 2 && nscount != 2)\r
81                                 error(h,"##other if present must be the only namespace attribute");\r
82                         \r
83                         return errorCount;\r
84                 }\r
85                 \r
86                 [MonoTODO]\r
87                 internal int Validate(ValidationEventHandler h)\r
88                 {\r
89                         return errorCount;\r
90                 }\r
91                 //<any\r
92                 //  id = ID\r
93                 //  maxOccurs =  (nonNegativeInteger | unbounded)  : 1\r
94                 //  minOccurs = nonNegativeInteger : 1\r
95                 //  namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) )  : ##any\r
96                 //  processContents = (lax | skip | strict) : strict\r
97                 //  {any attributes with non-schema namespace . . .}>\r
98                 //  Content: (annotation?)\r
99                 //</any>\r
100                 internal static XmlSchemaAny Read(XmlSchemaReader reader, ValidationEventHandler h)\r
101                 {\r
102                         XmlSchemaAny any = new XmlSchemaAny();\r
103                         reader.MoveToElement();\r
104 \r
105                         if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
106                         {\r
107                                 error(h,"Should not happen :1: XmlSchemaAny.Read, name="+reader.Name,null);\r
108                                 reader.SkipToEnd();\r
109                                 return null;\r
110                         }\r
111 \r
112                         any.LineNumber = reader.LineNumber;\r
113                         any.LinePosition = reader.LinePosition;\r
114                         any.SourceUri = reader.BaseURI;\r
115 \r
116                         while(reader.MoveToNextAttribute())\r
117                         {\r
118                                 if(reader.Name == "id")\r
119                                 {\r
120                                         any.Id = reader.Value;\r
121                                 }\r
122                                 else if(reader.Name == "maxOccurs")\r
123                                 {\r
124                                         try\r
125                                         {\r
126                                                 any.MaxOccursString = reader.Value;\r
127                                         }\r
128                                         catch(Exception e)\r
129                                         {\r
130                                                 error(h,reader.Value + " is an invalid value for maxOccurs",e);\r
131                                         }\r
132                                 }\r
133                                 else if(reader.Name == "minOccurs")\r
134                                 {\r
135                                         try\r
136                                         {\r
137                                                 any.MinOccursString = reader.Value;\r
138                                         }\r
139                                         catch(Exception e)\r
140                                         {\r
141                                                 error(h,reader.Value + " is an invalid value for minOccurs", e);\r
142                                         }\r
143                                 }\r
144                                 else if(reader.Name == "namespace")\r
145                                 {\r
146                                         any.nameSpace = reader.Value;\r
147                                 }\r
148                                 else if(reader.Name == "processContents")\r
149                                 {\r
150                                         Exception innerex;\r
151                                         any.processing = XmlSchemaUtil.ReadProcessingAttribute(reader,out innerex);\r
152                                         if(innerex != null)\r
153                                                 error(h, reader.Value + " is not a valid value for processContents",innerex);\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 any",null);\r
158                                 }\r
159                                 else\r
160                                 {\r
161                                         XmlSchemaUtil.ReadUnhandledAttribute(reader,any);\r
162                                 }\r
163                         }\r
164                         \r
165                         reader.MoveToElement();\r
166                         if(reader.IsEmptyElement)\r
167                                 return any;\r
168                         \r
169                         //  Content: (annotation?)\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: XmlSchemaAny.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                                                 any.Annotation = annotation;\r
185                                         continue;\r
186                                 }\r
187                                 reader.RaiseInvalidElementError();\r
188                         }                       \r
189                         return any;\r
190                 }\r
191         }\r
192 }\r