merge -r 58060:58217
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaType.cs
1 //\r
2 // XmlSchemaType.cs\r
3 //\r
4 // Authors:\r
5 //      Dwivedi, Ajay kumar  Adwiv@Yahoo.com\r
6 //      Atsushi Enomoto  atsushi@ximian.com\r
7 //\r
8
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29 using System;\r
30 using System.Xml;\r
31 using System.ComponentModel;\r
32 using Mono.Xml.Schema;\r
33 using System.Xml.Serialization;\r
34 #if NET_2_0_in_the_future\r
35 using MS.Internal.Xml;\r
36 #endif\r
37 \r
38 namespace System.Xml.Schema\r
39 {\r
40         /// <summary>\r
41         /// Summary description for XmlSchemaType.\r
42         /// </summary>\r
43         public class XmlSchemaType : XmlSchemaAnnotated\r
44         {\r
45                 private XmlSchemaDerivationMethod final;\r
46                 private bool isMixed;\r
47                 private string name;\r
48                 bool recursed;\r
49 \r
50                 internal XmlQualifiedName BaseSchemaTypeName;\r
51                 internal XmlSchemaType BaseXmlSchemaTypeInternal;\r
52                 internal XmlSchemaDatatype DatatypeInternal;\r
53                 internal XmlSchemaDerivationMethod resolvedDerivedBy;\r
54                 internal XmlSchemaDerivationMethod finalResolved;\r
55                 internal XmlQualifiedName QNameInternal;\r
56 \r
57                 public XmlSchemaType ()\r
58                 {\r
59                         final = XmlSchemaDerivationMethod.None;\r
60                         QNameInternal = XmlQualifiedName.Empty;\r
61                 }\r
62 \r
63                 #region Attributes\r
64                 [System.Xml.Serialization.XmlAttribute("name")]\r
65                 public string Name {\r
66                         get{ return name; }\r
67                         set{ name = value; }\r
68                 }\r
69 \r
70                 [DefaultValue(XmlSchemaDerivationMethod.None)]\r
71                 [System.Xml.Serialization.XmlAttribute("final")]\r
72                 public XmlSchemaDerivationMethod Final {\r
73                         get{ return  final; }\r
74                         set{ final = value; }\r
75                 }\r
76                 #endregion\r
77 \r
78                 #region Post Compilation Schema Information\r
79                 [XmlIgnore]\r
80                 public XmlQualifiedName QualifiedName {\r
81                         get{ return QNameInternal; }\r
82                 }\r
83 \r
84                 [XmlIgnore]\r
85                 public XmlSchemaDerivationMethod FinalResolved {\r
86                         get{ return finalResolved; }\r
87                 }\r
88 \r
89                 [XmlIgnore]\r
90 #if NET_2_0\r
91                 [Obsolete ("This property is going away. Use BaseXmlSchemaType instead")]\r
92 #endif\r
93                 public object BaseSchemaType {\r
94                         get{\r
95                                 if (BaseXmlSchemaType != null)\r
96                                         return BaseXmlSchemaType;\r
97                                 else if (this == XmlSchemaComplexType.AnyType)\r
98                                         return null; // This property is designed so.\r
99                                 else\r
100                                         return Datatype;\r
101                         }\r
102                 }\r
103 \r
104                 [XmlIgnore]\r
105                 [MonoTODO ("This property works as always returning a valid schema type.")]\r
106                 // In .NET 2.0, all schema types used in schema documents must\r
107                 // be XmlSchemaType, even if it is primitive type, in terms of\r
108                 // non-obsolete System.Xml.Schema members.\r
109                 \r
110                 // To modify this property, we have to make sure that it does\r
111                 // not affect to any compilation/validation logic.\r
112 #if NET_2_0\r
113                 public XmlSchemaType BaseXmlSchemaType {\r
114 #else\r
115                 internal XmlSchemaType BaseXmlSchemaType {\r
116 #endif\r
117                         get { return  BaseXmlSchemaTypeInternal; }\r
118                 }\r
119 \r
120                 [XmlIgnore]\r
121                 public XmlSchemaDerivationMethod DerivedBy {\r
122                         get{ return resolvedDerivedBy; }\r
123                 }\r
124 \r
125                 [XmlIgnore]\r
126                 public XmlSchemaDatatype Datatype {\r
127                         get{ return DatatypeInternal; }\r
128                 }\r
129 \r
130                 [XmlIgnore]\r
131                 public virtual bool IsMixed {  \r
132                         get{ return  isMixed; }\r
133                         set{ isMixed = value; } \r
134                 }\r
135 \r
136 #if NET_2_0\r
137                 [MonoTODO]\r
138                 // LAMESPEC: for IDREFS it returns Idref. for ENTITIES \r
139                 // it returns Entity. for NMTOKENS it returns NmToken.\r
140                 [XmlIgnore]\r
141                 public XmlTypeCode TypeCode {\r
142                         get {\r
143                                 if (this == XmlSchemaComplexType.AnyType)\r
144                                         return XmlTypeCode.Item;\r
145                                 if (DatatypeInternal == XmlSchemaSimpleType.AnySimpleType)\r
146                                         return XmlTypeCode.AnyAtomicType;\r
147                                 if (this == XmlSchemaSimpleType.XsIDRefs)\r
148                                         return XmlTypeCode.Idref;\r
149                                 if (this == XmlSchemaSimpleType.XsEntities)\r
150                                         return XmlTypeCode.Entity;\r
151                                 if (this == XmlSchemaSimpleType.XsNMTokens)\r
152                                         return XmlTypeCode.NmToken;\r
153                                 if (DatatypeInternal != null)\r
154                                         return DatatypeInternal.TypeCode;\r
155                                 return BaseXmlSchemaType.TypeCode;\r
156                         }\r
157                 }\r
158 #endif\r
159                 #endregion\r
160 \r
161 #if NET_2_0\r
162                 internal static XmlSchemaType GetBuiltInType (XmlQualifiedName qualifiedName)\r
163                 {\r
164                         XmlSchemaType t = GetBuiltInSimpleType (qualifiedName);\r
165                         if (t == null)\r
166                                 t = GetBuiltInComplexType (qualifiedName);\r
167                         return t;\r
168                 }\r
169 \r
170                 internal static XmlSchemaType GetBuiltInType (XmlTypeCode typecode)\r
171                 {\r
172                         if (typecode == XmlTypeCode.Item)\r
173                                 return XmlSchemaComplexType.AnyType;\r
174                         return GetBuiltInSimpleType (typecode);\r
175                 }\r
176 #endif\r
177 \r
178 #if NET_2_0\r
179                 public static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)\r
180 #else\r
181                 internal static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)\r
182 #endif\r
183                 {\r
184                         if (qualifiedName.Name == "anyType" && qualifiedName.Namespace == XmlSchema.Namespace)\r
185                                 return XmlSchemaComplexType.AnyType;\r
186 \r
187                         return null;\r
188                 }\r
189 \r
190 #if NET_2_0\r
191                 public static XmlSchemaComplexType GetBuiltInComplexType (XmlTypeCode type)\r
192                 {\r
193                         switch (type) {\r
194                         case XmlTypeCode.Item:\r
195                                 return XmlSchemaComplexType.AnyType;\r
196                         }\r
197                         return null;\r
198                 }\r
199 #endif\r
200 \r
201 #if NET_2_0\r
202                 [MonoTODO]\r
203                 public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlQualifiedName qualifiedName)\r
204                 {\r
205                         if (qualifiedName.Namespace == "http://www.w3.org/2003/11/xpath-datatypes") {\r
206                                 switch (qualifiedName.Name) {\r
207                                 case "untypedAtomic":\r
208                                         return XmlSchemaSimpleType.XdtUntypedAtomic;\r
209                                 case "anyAtomicType":\r
210                                         return XmlSchemaSimpleType.XdtAnyAtomicType;\r
211                                 case "yearMonthDuration":\r
212                                         return XmlSchemaSimpleType.XdtYearMonthDuration;\r
213                                 case "dayTimeDuration":\r
214                                         return XmlSchemaSimpleType.XdtDayTimeDuration;\r
215                                 }\r
216                                 return null;\r
217                         }\r
218                         else if (qualifiedName.Namespace != XmlSchema.Namespace)\r
219                                 return null;\r
220                         switch (qualifiedName.Name) {\r
221                         case "anySimpleType":\r
222                                 return XmlSchemaSimpleType.XsAnySimpleType;\r
223                         case "string":\r
224                                 return XmlSchemaSimpleType.XsString;\r
225                         case "boolean":\r
226                                 return XmlSchemaSimpleType.XsBoolean;\r
227                         case "decimal":\r
228                                 return XmlSchemaSimpleType.XsDecimal;\r
229                         case "float":\r
230                                 return XmlSchemaSimpleType.XsFloat;\r
231                         case "double":\r
232                                 return XmlSchemaSimpleType.XsDouble;\r
233                         case "duration":\r
234                                 return XmlSchemaSimpleType.XsDuration;\r
235                         case "dateTime":\r
236                                 return XmlSchemaSimpleType.XsDateTime;\r
237                         case "time":\r
238                                 return XmlSchemaSimpleType.XsTime;\r
239                         case "date":\r
240                                 return XmlSchemaSimpleType.XsDate;\r
241                         case "gYearMonth":\r
242                                 return XmlSchemaSimpleType.XsGYearMonth;\r
243                         case "gYear":\r
244                                 return XmlSchemaSimpleType.XsGYear;\r
245                         case "gMonthDay":\r
246                                 return XmlSchemaSimpleType.XsGMonthDay;\r
247                         case "gDay":\r
248                                 return XmlSchemaSimpleType.XsGDay;\r
249                         case "gMonth":\r
250                                 return XmlSchemaSimpleType.XsGMonth;\r
251                         case "hexBinary":\r
252                                 return XmlSchemaSimpleType.XsHexBinary;\r
253                         case "base64Binary":\r
254                                 return XmlSchemaSimpleType.XsBase64Binary;\r
255                         case "anyURI":\r
256                                 return XmlSchemaSimpleType.XsAnyUri;\r
257                         case "QName":\r
258                                 return XmlSchemaSimpleType.XsQName;\r
259                         case "NOTATION":\r
260                                 return XmlSchemaSimpleType.XsNotation;\r
261                         case "normalizedString":\r
262                                 return XmlSchemaSimpleType.XsNormalizedString;\r
263                         case "token":\r
264                                 return XmlSchemaSimpleType.XsToken;\r
265                         case "language":\r
266                                 return XmlSchemaSimpleType.XsLanguage;\r
267                         case "NMTOKEN":\r
268                                 return XmlSchemaSimpleType.XsNMToken;\r
269                         case "NMTOKENS":\r
270                                 return XmlSchemaSimpleType.XsNMTokens;\r
271                         case "Name":\r
272                                 return XmlSchemaSimpleType.XsName;\r
273                         case "NCName":\r
274                                 return XmlSchemaSimpleType.XsNCName;\r
275                         case "ID":\r
276                                 return XmlSchemaSimpleType.XsID;\r
277                         case "IDREF":\r
278                                 return XmlSchemaSimpleType.XsIDRef;\r
279                         case "IDREFS":\r
280                                 return XmlSchemaSimpleType.XsIDRefs;\r
281                         case "ENTITY":\r
282                                 return XmlSchemaSimpleType.XsEntity;\r
283                         case "ENTITIES":\r
284                                 return XmlSchemaSimpleType.XsEntities;\r
285                         case "integer":\r
286                                 return XmlSchemaSimpleType.XsInteger;\r
287                         case "nonPositiveInteger":\r
288                                 return XmlSchemaSimpleType.XsNonPositiveInteger;\r
289                         case "negativeInteger":\r
290                                 return XmlSchemaSimpleType.XsNegativeInteger;\r
291                         case "long":\r
292                                 return XmlSchemaSimpleType.XsLong;\r
293                         case "int":\r
294                                 return XmlSchemaSimpleType.XsInt;\r
295                         case "short":\r
296                                 return XmlSchemaSimpleType.XsShort;\r
297                         case "byte":\r
298                                 return XmlSchemaSimpleType.XsByte;\r
299                         case "nonNegativeInteger":\r
300                                 return XmlSchemaSimpleType.XsNonNegativeInteger;\r
301                         case "positiveInteger":\r
302                                 return XmlSchemaSimpleType.XsPositiveInteger;\r
303                         case "unsignedLong":\r
304                                 return XmlSchemaSimpleType.XsUnsignedLong;\r
305                         case "unsignedInt":\r
306                                 return XmlSchemaSimpleType.XsUnsignedInt;\r
307                         case "unsignedShort":\r
308                                 return XmlSchemaSimpleType.XsUnsignedShort;\r
309                         case "unsignedByte":\r
310                                 return XmlSchemaSimpleType.XsUnsignedByte;\r
311                         }\r
312                         return null;\r
313                 }\r
314 \r
315                 internal static XmlSchemaSimpleType GetBuiltInSimpleType (XmlSchemaDatatype type)\r
316                 {\r
317                         if (type is XsdEntities)\r
318                                 return XmlSchemaSimpleType.XsEntities;\r
319                         else if (type is XsdNMTokens)\r
320                                 return XmlSchemaSimpleType.XsNMTokens;\r
321                         else if (type is XsdIDRefs)\r
322                                 return XmlSchemaSimpleType.XsIDRefs;\r
323                         else\r
324                                 return GetBuiltInSimpleType (type.TypeCode);\r
325                 }\r
326 \r
327                 [MonoTODO]\r
328                 // Don't use this method to cover all XML Schema datatypes.\r
329                 public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlTypeCode type)\r
330                 {\r
331                         switch (type) {\r
332                         case XmlTypeCode.None:\r
333                         case XmlTypeCode.Item:\r
334                         case XmlTypeCode.Node:\r
335                         case XmlTypeCode.Document: // node\r
336                         case XmlTypeCode.Element: // node\r
337                         case XmlTypeCode.Attribute: // node\r
338                         case XmlTypeCode.Namespace: // node\r
339                         case XmlTypeCode.ProcessingInstruction: // node\r
340                         case XmlTypeCode.Comment: // node\r
341                         case XmlTypeCode.Text:  // node\r
342                                 return null;\r
343                         case XmlTypeCode.AnyAtomicType:\r
344                                 return XmlSchemaSimpleType.XdtAnyAtomicType;\r
345                         case XmlTypeCode.UntypedAtomic:\r
346                                 return XmlSchemaSimpleType.XdtUntypedAtomic;\r
347                         case XmlTypeCode.String:\r
348                                 return XmlSchemaSimpleType.XsString;\r
349                         case XmlTypeCode.Boolean:\r
350                                 return XmlSchemaSimpleType.XsBoolean;\r
351                         case XmlTypeCode.Decimal:\r
352                                 return XmlSchemaSimpleType.XsDecimal;\r
353                         case XmlTypeCode.Float:\r
354                                 return XmlSchemaSimpleType.XsFloat;\r
355                         case XmlTypeCode.Double:\r
356                                 return XmlSchemaSimpleType.XsDouble;\r
357                         case XmlTypeCode.Duration:\r
358                                 return XmlSchemaSimpleType.XsDuration;\r
359                         case XmlTypeCode.DateTime:\r
360                                 return XmlSchemaSimpleType.XsDateTime;\r
361                         case XmlTypeCode.Time:\r
362                                 return XmlSchemaSimpleType.XsTime;\r
363                         case XmlTypeCode.Date:\r
364                                 return XmlSchemaSimpleType.XsDate;\r
365                         case XmlTypeCode.GYearMonth:\r
366                                 return XmlSchemaSimpleType.XsGYearMonth;\r
367                         case XmlTypeCode.GYear:\r
368                                 return XmlSchemaSimpleType.XsGYear;\r
369                         case XmlTypeCode.GMonthDay:\r
370                                 return XmlSchemaSimpleType.XsGMonthDay;\r
371                         case XmlTypeCode.GDay:\r
372                                 return XmlSchemaSimpleType.XsGDay;\r
373                         case XmlTypeCode.GMonth:\r
374                                 return XmlSchemaSimpleType.XsGMonth;\r
375                         case XmlTypeCode.HexBinary:\r
376                                 return XmlSchemaSimpleType.XsHexBinary;\r
377                         case XmlTypeCode.Base64Binary:\r
378                                 return XmlSchemaSimpleType.XsBase64Binary;\r
379                         case XmlTypeCode.AnyUri:\r
380                                 return XmlSchemaSimpleType.XsAnyUri;\r
381                         case XmlTypeCode.QName:\r
382                                 return XmlSchemaSimpleType.XsQName;\r
383                         case XmlTypeCode.Notation:\r
384                                 return XmlSchemaSimpleType.XsNotation;\r
385                         case XmlTypeCode.NormalizedString:\r
386                                 return XmlSchemaSimpleType.XsNormalizedString;\r
387                         case XmlTypeCode.Token:\r
388                                 return XmlSchemaSimpleType.XsToken;\r
389                         case XmlTypeCode.Language:\r
390                                 return XmlSchemaSimpleType.XsLanguage;\r
391                         case XmlTypeCode.NmToken: // NmTokens is not primitive\r
392                                 return XmlSchemaSimpleType.XsNMToken;\r
393                         case XmlTypeCode.Name:\r
394                                 return XmlSchemaSimpleType.XsName;\r
395                         case XmlTypeCode.NCName:\r
396                                 return XmlSchemaSimpleType.XsNCName;\r
397                         case XmlTypeCode.Id:\r
398                                 return XmlSchemaSimpleType.XsID;\r
399                         case XmlTypeCode.Idref: // Idrefs is not primitive\r
400                                 return XmlSchemaSimpleType.XsIDRef;\r
401                         case XmlTypeCode.Entity: // Entities is not primitive\r
402                                 return XmlSchemaSimpleType.XsEntity;\r
403                         case XmlTypeCode.Integer:\r
404                                 return XmlSchemaSimpleType.XsInteger;\r
405                         case XmlTypeCode.NonPositiveInteger:\r
406                                 return XmlSchemaSimpleType.XsNonPositiveInteger;\r
407                         case XmlTypeCode.NegativeInteger:\r
408                                 return XmlSchemaSimpleType.XsNegativeInteger;\r
409                         case XmlTypeCode.Long:\r
410                                 return XmlSchemaSimpleType.XsLong;\r
411                         case XmlTypeCode.Int:\r
412                                 return XmlSchemaSimpleType.XsInt;\r
413                         case XmlTypeCode.Short:\r
414                                 return XmlSchemaSimpleType.XsShort;\r
415                         case XmlTypeCode.Byte:\r
416                                 return XmlSchemaSimpleType.XsByte;\r
417                         case XmlTypeCode.NonNegativeInteger:\r
418                                 return XmlSchemaSimpleType.XsNonNegativeInteger;\r
419                         case XmlTypeCode.UnsignedLong:\r
420                                 return XmlSchemaSimpleType.XsUnsignedLong;\r
421                         case XmlTypeCode.UnsignedInt:\r
422                                 return XmlSchemaSimpleType.XsUnsignedInt;\r
423                         case XmlTypeCode.UnsignedShort:\r
424                                 return XmlSchemaSimpleType.XsUnsignedShort;\r
425                         case XmlTypeCode.UnsignedByte:\r
426                                 return XmlSchemaSimpleType.XsUnsignedByte;\r
427                         case XmlTypeCode.PositiveInteger:\r
428                                 return XmlSchemaSimpleType.XsPositiveInteger;\r
429                         case XmlTypeCode.YearMonthDuration:\r
430                                 return XmlSchemaSimpleType.XdtYearMonthDuration;\r
431                         case XmlTypeCode.DayTimeDuration:\r
432                                 return XmlSchemaSimpleType.XdtDayTimeDuration;\r
433                         }\r
434                         return null;\r
435                 }\r
436 \r
437                 public static bool IsDerivedFrom (XmlSchemaType derivedType, XmlSchemaType baseType, XmlSchemaDerivationMethod except)\r
438                 {\r
439                         if (derivedType.BaseXmlSchemaType == null)\r
440                                 return false;\r
441                         if ((derivedType.DerivedBy & except) != 0)\r
442                                 return false;\r
443                         if (derivedType.BaseXmlSchemaType == baseType)\r
444                                 return true;\r
445                         return IsDerivedFrom (derivedType.BaseXmlSchemaType,\r
446                                 baseType, except);\r
447                 }\r
448 #endif\r
449 \r
450                 internal bool ValidateRecursionCheck ()\r
451                 {\r
452                         if (recursed)\r
453                                 return (this != XmlSchemaComplexType.AnyType);\r
454                         recursed = true;\r
455                         XmlSchemaType baseType = this.BaseXmlSchemaType as XmlSchemaType;\r
456                         bool result = false;\r
457                         if (baseType != null)\r
458                                 result = baseType.ValidateRecursionCheck ();\r
459                         recursed = false;\r
460                         return result;\r
461                 }\r
462         }\r
463 }\r