merge -r 61110:61111
[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                 // LAMESPEC: for IDREFS it returns Idref. for ENTITIES \r
138                 // it returns Entity. for NMTOKENS it returns NmToken.\r
139                 [XmlIgnore]\r
140                 public XmlTypeCode TypeCode {\r
141                         get {\r
142                                 if (this == XmlSchemaComplexType.AnyType)\r
143                                         return XmlTypeCode.Item;\r
144                                 if (DatatypeInternal == XmlSchemaSimpleType.AnySimpleType)\r
145                                         return XmlTypeCode.AnyAtomicType;\r
146                                 if (this == XmlSchemaSimpleType.XsIDRefs)\r
147                                         return XmlTypeCode.Idref;\r
148                                 if (this == XmlSchemaSimpleType.XsEntities)\r
149                                         return XmlTypeCode.Entity;\r
150                                 if (this == XmlSchemaSimpleType.XsNMTokens)\r
151                                         return XmlTypeCode.NmToken;\r
152                                 if (DatatypeInternal != null)\r
153                                         return DatatypeInternal.TypeCode;\r
154                                 return BaseXmlSchemaType.TypeCode;\r
155                         }\r
156                 }\r
157 #endif\r
158                 #endregion\r
159 \r
160 #if NET_2_0\r
161                 internal static XmlSchemaType GetBuiltInType (XmlQualifiedName qualifiedName)\r
162                 {\r
163                         XmlSchemaType t = GetBuiltInSimpleType (qualifiedName);\r
164                         if (t == null)\r
165                                 t = GetBuiltInComplexType (qualifiedName);\r
166                         return t;\r
167                 }\r
168 \r
169                 internal static XmlSchemaType GetBuiltInType (XmlTypeCode typecode)\r
170                 {\r
171                         if (typecode == XmlTypeCode.Item)\r
172                                 return XmlSchemaComplexType.AnyType;\r
173                         return GetBuiltInSimpleType (typecode);\r
174                 }\r
175 #endif\r
176 \r
177 #if NET_2_0\r
178                 public static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)\r
179 #else\r
180                 internal static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)\r
181 #endif\r
182                 {\r
183                         if (qualifiedName.Name == "anyType" && qualifiedName.Namespace == XmlSchema.Namespace)\r
184                                 return XmlSchemaComplexType.AnyType;\r
185 \r
186                         return null;\r
187                 }\r
188 \r
189 #if NET_2_0\r
190                 public static XmlSchemaComplexType GetBuiltInComplexType (XmlTypeCode type)\r
191                 {\r
192                         switch (type) {\r
193                         case XmlTypeCode.Item:\r
194                                 return XmlSchemaComplexType.AnyType;\r
195                         }\r
196                         return null;\r
197                 }\r
198 #endif\r
199 \r
200 #if NET_2_0\r
201                 [MonoTODO]\r
202                 public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlQualifiedName qualifiedName)\r
203                 {\r
204                         if (qualifiedName.Namespace == "http://www.w3.org/2003/11/xpath-datatypes") {\r
205                                 switch (qualifiedName.Name) {\r
206                                 case "untypedAtomic":\r
207                                         return XmlSchemaSimpleType.XdtUntypedAtomic;\r
208                                 case "anyAtomicType":\r
209                                         return XmlSchemaSimpleType.XdtAnyAtomicType;\r
210                                 case "yearMonthDuration":\r
211                                         return XmlSchemaSimpleType.XdtYearMonthDuration;\r
212                                 case "dayTimeDuration":\r
213                                         return XmlSchemaSimpleType.XdtDayTimeDuration;\r
214                                 }\r
215                                 return null;\r
216                         }\r
217                         else if (qualifiedName.Namespace != XmlSchema.Namespace)\r
218                                 return null;\r
219                         switch (qualifiedName.Name) {\r
220                         case "anySimpleType":\r
221                                 return XmlSchemaSimpleType.XsAnySimpleType;\r
222                         case "string":\r
223                                 return XmlSchemaSimpleType.XsString;\r
224                         case "boolean":\r
225                                 return XmlSchemaSimpleType.XsBoolean;\r
226                         case "decimal":\r
227                                 return XmlSchemaSimpleType.XsDecimal;\r
228                         case "float":\r
229                                 return XmlSchemaSimpleType.XsFloat;\r
230                         case "double":\r
231                                 return XmlSchemaSimpleType.XsDouble;\r
232                         case "duration":\r
233                                 return XmlSchemaSimpleType.XsDuration;\r
234                         case "dateTime":\r
235                                 return XmlSchemaSimpleType.XsDateTime;\r
236                         case "time":\r
237                                 return XmlSchemaSimpleType.XsTime;\r
238                         case "date":\r
239                                 return XmlSchemaSimpleType.XsDate;\r
240                         case "gYearMonth":\r
241                                 return XmlSchemaSimpleType.XsGYearMonth;\r
242                         case "gYear":\r
243                                 return XmlSchemaSimpleType.XsGYear;\r
244                         case "gMonthDay":\r
245                                 return XmlSchemaSimpleType.XsGMonthDay;\r
246                         case "gDay":\r
247                                 return XmlSchemaSimpleType.XsGDay;\r
248                         case "gMonth":\r
249                                 return XmlSchemaSimpleType.XsGMonth;\r
250                         case "hexBinary":\r
251                                 return XmlSchemaSimpleType.XsHexBinary;\r
252                         case "base64Binary":\r
253                                 return XmlSchemaSimpleType.XsBase64Binary;\r
254                         case "anyURI":\r
255                                 return XmlSchemaSimpleType.XsAnyUri;\r
256                         case "QName":\r
257                                 return XmlSchemaSimpleType.XsQName;\r
258                         case "NOTATION":\r
259                                 return XmlSchemaSimpleType.XsNotation;\r
260                         case "normalizedString":\r
261                                 return XmlSchemaSimpleType.XsNormalizedString;\r
262                         case "token":\r
263                                 return XmlSchemaSimpleType.XsToken;\r
264                         case "language":\r
265                                 return XmlSchemaSimpleType.XsLanguage;\r
266                         case "NMTOKEN":\r
267                                 return XmlSchemaSimpleType.XsNMToken;\r
268                         case "NMTOKENS":\r
269                                 return XmlSchemaSimpleType.XsNMTokens;\r
270                         case "Name":\r
271                                 return XmlSchemaSimpleType.XsName;\r
272                         case "NCName":\r
273                                 return XmlSchemaSimpleType.XsNCName;\r
274                         case "ID":\r
275                                 return XmlSchemaSimpleType.XsID;\r
276                         case "IDREF":\r
277                                 return XmlSchemaSimpleType.XsIDRef;\r
278                         case "IDREFS":\r
279                                 return XmlSchemaSimpleType.XsIDRefs;\r
280                         case "ENTITY":\r
281                                 return XmlSchemaSimpleType.XsEntity;\r
282                         case "ENTITIES":\r
283                                 return XmlSchemaSimpleType.XsEntities;\r
284                         case "integer":\r
285                                 return XmlSchemaSimpleType.XsInteger;\r
286                         case "nonPositiveInteger":\r
287                                 return XmlSchemaSimpleType.XsNonPositiveInteger;\r
288                         case "negativeInteger":\r
289                                 return XmlSchemaSimpleType.XsNegativeInteger;\r
290                         case "long":\r
291                                 return XmlSchemaSimpleType.XsLong;\r
292                         case "int":\r
293                                 return XmlSchemaSimpleType.XsInt;\r
294                         case "short":\r
295                                 return XmlSchemaSimpleType.XsShort;\r
296                         case "byte":\r
297                                 return XmlSchemaSimpleType.XsByte;\r
298                         case "nonNegativeInteger":\r
299                                 return XmlSchemaSimpleType.XsNonNegativeInteger;\r
300                         case "positiveInteger":\r
301                                 return XmlSchemaSimpleType.XsPositiveInteger;\r
302                         case "unsignedLong":\r
303                                 return XmlSchemaSimpleType.XsUnsignedLong;\r
304                         case "unsignedInt":\r
305                                 return XmlSchemaSimpleType.XsUnsignedInt;\r
306                         case "unsignedShort":\r
307                                 return XmlSchemaSimpleType.XsUnsignedShort;\r
308                         case "unsignedByte":\r
309                                 return XmlSchemaSimpleType.XsUnsignedByte;\r
310                         }\r
311                         return null;\r
312                 }\r
313 \r
314                 internal static XmlSchemaSimpleType GetBuiltInSimpleType (XmlSchemaDatatype type)\r
315                 {\r
316                         if (type is XsdEntities)\r
317                                 return XmlSchemaSimpleType.XsEntities;\r
318                         else if (type is XsdNMTokens)\r
319                                 return XmlSchemaSimpleType.XsNMTokens;\r
320                         else if (type is XsdIDRefs)\r
321                                 return XmlSchemaSimpleType.XsIDRefs;\r
322                         else\r
323                                 return GetBuiltInSimpleType (type.TypeCode);\r
324                 }\r
325 \r
326                 [MonoTODO]\r
327                 // Don't use this method to cover all XML Schema datatypes.\r
328                 public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlTypeCode type)\r
329                 {\r
330                         switch (type) {\r
331                         case XmlTypeCode.None:\r
332                         case XmlTypeCode.Item:\r
333                         case XmlTypeCode.Node:\r
334                         case XmlTypeCode.Document: // node\r
335                         case XmlTypeCode.Element: // node\r
336                         case XmlTypeCode.Attribute: // node\r
337                         case XmlTypeCode.Namespace: // node\r
338                         case XmlTypeCode.ProcessingInstruction: // node\r
339                         case XmlTypeCode.Comment: // node\r
340                         case XmlTypeCode.Text:  // node\r
341                                 return null;\r
342                         case XmlTypeCode.AnyAtomicType:\r
343                                 return XmlSchemaSimpleType.XdtAnyAtomicType;\r
344                         case XmlTypeCode.UntypedAtomic:\r
345                                 return XmlSchemaSimpleType.XdtUntypedAtomic;\r
346                         case XmlTypeCode.String:\r
347                                 return XmlSchemaSimpleType.XsString;\r
348                         case XmlTypeCode.Boolean:\r
349                                 return XmlSchemaSimpleType.XsBoolean;\r
350                         case XmlTypeCode.Decimal:\r
351                                 return XmlSchemaSimpleType.XsDecimal;\r
352                         case XmlTypeCode.Float:\r
353                                 return XmlSchemaSimpleType.XsFloat;\r
354                         case XmlTypeCode.Double:\r
355                                 return XmlSchemaSimpleType.XsDouble;\r
356                         case XmlTypeCode.Duration:\r
357                                 return XmlSchemaSimpleType.XsDuration;\r
358                         case XmlTypeCode.DateTime:\r
359                                 return XmlSchemaSimpleType.XsDateTime;\r
360                         case XmlTypeCode.Time:\r
361                                 return XmlSchemaSimpleType.XsTime;\r
362                         case XmlTypeCode.Date:\r
363                                 return XmlSchemaSimpleType.XsDate;\r
364                         case XmlTypeCode.GYearMonth:\r
365                                 return XmlSchemaSimpleType.XsGYearMonth;\r
366                         case XmlTypeCode.GYear:\r
367                                 return XmlSchemaSimpleType.XsGYear;\r
368                         case XmlTypeCode.GMonthDay:\r
369                                 return XmlSchemaSimpleType.XsGMonthDay;\r
370                         case XmlTypeCode.GDay:\r
371                                 return XmlSchemaSimpleType.XsGDay;\r
372                         case XmlTypeCode.GMonth:\r
373                                 return XmlSchemaSimpleType.XsGMonth;\r
374                         case XmlTypeCode.HexBinary:\r
375                                 return XmlSchemaSimpleType.XsHexBinary;\r
376                         case XmlTypeCode.Base64Binary:\r
377                                 return XmlSchemaSimpleType.XsBase64Binary;\r
378                         case XmlTypeCode.AnyUri:\r
379                                 return XmlSchemaSimpleType.XsAnyUri;\r
380                         case XmlTypeCode.QName:\r
381                                 return XmlSchemaSimpleType.XsQName;\r
382                         case XmlTypeCode.Notation:\r
383                                 return XmlSchemaSimpleType.XsNotation;\r
384                         case XmlTypeCode.NormalizedString:\r
385                                 return XmlSchemaSimpleType.XsNormalizedString;\r
386                         case XmlTypeCode.Token:\r
387                                 return XmlSchemaSimpleType.XsToken;\r
388                         case XmlTypeCode.Language:\r
389                                 return XmlSchemaSimpleType.XsLanguage;\r
390                         case XmlTypeCode.NmToken: // NmTokens is not primitive\r
391                                 return XmlSchemaSimpleType.XsNMToken;\r
392                         case XmlTypeCode.Name:\r
393                                 return XmlSchemaSimpleType.XsName;\r
394                         case XmlTypeCode.NCName:\r
395                                 return XmlSchemaSimpleType.XsNCName;\r
396                         case XmlTypeCode.Id:\r
397                                 return XmlSchemaSimpleType.XsID;\r
398                         case XmlTypeCode.Idref: // Idrefs is not primitive\r
399                                 return XmlSchemaSimpleType.XsIDRef;\r
400                         case XmlTypeCode.Entity: // Entities is not primitive\r
401                                 return XmlSchemaSimpleType.XsEntity;\r
402                         case XmlTypeCode.Integer:\r
403                                 return XmlSchemaSimpleType.XsInteger;\r
404                         case XmlTypeCode.NonPositiveInteger:\r
405                                 return XmlSchemaSimpleType.XsNonPositiveInteger;\r
406                         case XmlTypeCode.NegativeInteger:\r
407                                 return XmlSchemaSimpleType.XsNegativeInteger;\r
408                         case XmlTypeCode.Long:\r
409                                 return XmlSchemaSimpleType.XsLong;\r
410                         case XmlTypeCode.Int:\r
411                                 return XmlSchemaSimpleType.XsInt;\r
412                         case XmlTypeCode.Short:\r
413                                 return XmlSchemaSimpleType.XsShort;\r
414                         case XmlTypeCode.Byte:\r
415                                 return XmlSchemaSimpleType.XsByte;\r
416                         case XmlTypeCode.NonNegativeInteger:\r
417                                 return XmlSchemaSimpleType.XsNonNegativeInteger;\r
418                         case XmlTypeCode.UnsignedLong:\r
419                                 return XmlSchemaSimpleType.XsUnsignedLong;\r
420                         case XmlTypeCode.UnsignedInt:\r
421                                 return XmlSchemaSimpleType.XsUnsignedInt;\r
422                         case XmlTypeCode.UnsignedShort:\r
423                                 return XmlSchemaSimpleType.XsUnsignedShort;\r
424                         case XmlTypeCode.UnsignedByte:\r
425                                 return XmlSchemaSimpleType.XsUnsignedByte;\r
426                         case XmlTypeCode.PositiveInteger:\r
427                                 return XmlSchemaSimpleType.XsPositiveInteger;\r
428                         case XmlTypeCode.YearMonthDuration:\r
429                                 return XmlSchemaSimpleType.XdtYearMonthDuration;\r
430                         case XmlTypeCode.DayTimeDuration:\r
431                                 return XmlSchemaSimpleType.XdtDayTimeDuration;\r
432                         }\r
433                         return null;\r
434                 }\r
435 \r
436                 public static bool IsDerivedFrom (XmlSchemaType derivedType, XmlSchemaType baseType, XmlSchemaDerivationMethod except)\r
437                 {\r
438                         if (derivedType.BaseXmlSchemaType == null)\r
439                                 return false;\r
440                         if ((derivedType.DerivedBy & except) != 0)\r
441                                 return false;\r
442                         if (derivedType.BaseXmlSchemaType == baseType)\r
443                                 return true;\r
444                         return IsDerivedFrom (derivedType.BaseXmlSchemaType,\r
445                                 baseType, except);\r
446                 }\r
447 #endif\r
448 \r
449                 internal bool ValidateRecursionCheck ()\r
450                 {\r
451                         if (recursed)\r
452                                 return (this != XmlSchemaComplexType.AnyType);\r
453                         recursed = true;\r
454                         XmlSchemaType baseType = this.BaseXmlSchemaType as XmlSchemaType;\r
455                         bool result = false;\r
456                         if (baseType != null)\r
457                                 result = baseType.ValidateRecursionCheck ();\r
458                         recursed = false;\r
459                         return result;\r
460                 }\r
461         }\r
462 }\r