2004-07-23 Atsushi Enomoto <atsushi@ximian.com>
[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 #if NET_2_0\r
50                 private XmlTypeCode typeCodeForPredefinedTypes;\r
51 #endif\r
52                 internal XmlQualifiedName BaseSchemaTypeName;\r
53                 internal XmlSchemaType BaseXmlSchemaTypeInternal;\r
54                 internal XmlSchemaDatatype DatatypeInternal;\r
55                 internal XmlSchemaDerivationMethod resolvedDerivedBy;\r
56                 internal XmlSchemaDerivationMethod finalResolved;\r
57                 internal XmlQualifiedName QNameInternal;\r
58 \r
59                 public XmlSchemaType ()\r
60                 {\r
61                         final = XmlSchemaDerivationMethod.None;\r
62                         QNameInternal = XmlQualifiedName.Empty;\r
63                 }\r
64 \r
65                 #region Attributes\r
66                 [System.Xml.Serialization.XmlAttribute("name")]\r
67                 public string Name {\r
68                         get{ return name; }\r
69                         set{ name = value; }\r
70                 }\r
71 \r
72                 [DefaultValue(XmlSchemaDerivationMethod.None)]\r
73                 [System.Xml.Serialization.XmlAttribute("final")]\r
74                 public XmlSchemaDerivationMethod Final {\r
75                         get{ return  final; }\r
76                         set{ final = value; }\r
77                 }\r
78                 #endregion\r
79 \r
80                 #region Post Compilation Schema Information\r
81                 [XmlIgnore]\r
82                 public XmlQualifiedName QualifiedName {\r
83                         get{ return QNameInternal; }\r
84                 }\r
85 \r
86                 [XmlIgnore]\r
87                 public XmlSchemaDerivationMethod FinalResolved {\r
88                         get{ return finalResolved; }\r
89                 }\r
90 \r
91                 [XmlIgnore]\r
92 #if NET_2_0\r
93                 [Obsolete ("This property is going away. Use BaseXmlSchemaType instead")]\r
94 #endif\r
95                 public object BaseSchemaType {\r
96                         get{\r
97                                 if (BaseXmlSchemaType != null)\r
98                                         return BaseXmlSchemaType;\r
99                                 else if (this == XmlSchemaComplexType.AnyType)\r
100                                         return null; // This property is designed so.\r
101                                 else\r
102                                         return Datatype;\r
103                         }\r
104                 }\r
105 \r
106                 [XmlIgnore]\r
107                 [MonoTODO ("This property works as always returning a valid schema type.")]\r
108                 // In .NET 2.0, all schema types used in schema documents must\r
109                 // be XmlSchemaType, even if it is primitive type, in terms of\r
110                 // non-obsolete System.Xml.Schema members.\r
111                 \r
112                 // To modify this property, we have to make sure that it does\r
113                 // not affect to any compilation/validation logic.\r
114 #if NET_2_0\r
115                 public XmlSchemaType BaseXmlSchemaType {\r
116 #else\r
117                 internal XmlSchemaType BaseXmlSchemaType {\r
118 #endif\r
119                         get { return  BaseXmlSchemaTypeInternal; }\r
120                 }\r
121 \r
122                 [XmlIgnore]\r
123                 public XmlSchemaDerivationMethod DerivedBy {\r
124                         get{ return resolvedDerivedBy; }\r
125                 }\r
126 \r
127                 [XmlIgnore]\r
128                 public XmlSchemaDatatype Datatype {\r
129                         get{ return DatatypeInternal; }\r
130                 }\r
131 \r
132                 [XmlIgnore]\r
133                 public virtual bool IsMixed {  \r
134                         get{ return  isMixed; }\r
135                         set{ isMixed = value; } \r
136                 }\r
137 \r
138 #if NET_2_0\r
139                 [MonoTODO]\r
140                 // LAMESPEC: for IDREFS it returns Idref. for ENTITIES \r
141                 // it returns Entity. for NMTOKENS it returns NmToken.\r
142                 public XmlTypeCode TypeCode {\r
143                         get {\r
144                                 if (typeCodeForPredefinedTypes != XmlTypeCode.None) // anySimpleType, anyType etc.\r
145                                         return typeCodeForPredefinedTypes;\r
146                                 if (DatatypeInternal != null)\r
147                                         return DatatypeInternal.TypeCode;\r
148                                 if (this == XmlSchemaComplexType.AnyType)\r
149                                         return XmlTypeCode.None;\r
150                                 return BaseXmlSchemaType.TypeCode;\r
151                         }\r
152                 }\r
153 #endif\r
154                 #endregion\r
155 \r
156 #if NET_2_0\r
157                 public static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)\r
158 #else\r
159                 internal static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)\r
160 #endif\r
161                 {\r
162                         if (qualifiedName == XmlSchemaComplexType.AnyType.QualifiedName)\r
163                                 return XmlSchemaComplexType.AnyType;\r
164 \r
165                         return null;\r
166                 }\r
167 \r
168 #if NET_2_0\r
169                 [MonoTODO]\r
170                 public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlQualifiedName qualifiedName)\r
171                 {\r
172                         // FIXME:\r
173                         if (qualifiedName.Namespace == "http://www.w3.org/2003/11/xpath-datatypes") {\r
174                                 switch (qualifiedName.Name) {\r
175                                 case "untypedAtomic":\r
176                                         return XmlSchemaSimpleType.XdtUntypedAtomic;\r
177                                 case "anyAtomicType":\r
178                                         return XmlSchemaSimpleType.XdtAnyAtomicType;\r
179                                 case "yearMonthDuration":\r
180                                         return XmlSchemaSimpleType.XdtYearMonthDuration;\r
181                                 case "dayTimeDuration":\r
182                                         return XmlSchemaSimpleType.XdtDayTimeDuration;\r
183                                 }\r
184                                 return null;\r
185                         }\r
186                         else if (qualifiedName.Namespace != XmlSchema.Namespace)\r
187                                 return null;\r
188                         switch (qualifiedName.Name) {\r
189                         case "anySimpleType":\r
190                                 return XmlSchemaSimpleType.XsAnySimpleType;\r
191                         case "string":\r
192                                 return XmlSchemaSimpleType.XsString;\r
193                         case "boolean":\r
194                                 return XmlSchemaSimpleType.XsBoolean;\r
195                         case "decimal":\r
196                                 return XmlSchemaSimpleType.XsDecimal;\r
197                         case "float":\r
198                                 return XmlSchemaSimpleType.XsFloat;\r
199                         case "double":\r
200                                 return XmlSchemaSimpleType.XsDouble;\r
201                         case "duration":\r
202                                 return XmlSchemaSimpleType.XsDuration;\r
203                         case "dateTime":\r
204                                 return XmlSchemaSimpleType.XsDateTime;\r
205                         case "time":\r
206                                 return XmlSchemaSimpleType.XsTime;\r
207                         case "date":\r
208                                 return XmlSchemaSimpleType.XsDate;\r
209                         case "gYearMonth":\r
210                                 return XmlSchemaSimpleType.XsGYearMonth;\r
211                         case "gYear":\r
212                                 return XmlSchemaSimpleType.XsGYear;\r
213                         case "gMonthDay":\r
214                                 return XmlSchemaSimpleType.XsGMonthDay;\r
215                         case "gDay":\r
216                                 return XmlSchemaSimpleType.XsGDay;\r
217                         case "gMonth":\r
218                                 return XmlSchemaSimpleType.XsGMonth;\r
219                         case "hexBinary":\r
220                                 return XmlSchemaSimpleType.XsHexBinary;\r
221                         case "base64Binary":\r
222                                 return XmlSchemaSimpleType.XsBase64Binary;\r
223                         case "anyURI":\r
224                                 return XmlSchemaSimpleType.XsAnyUri;\r
225                         case "QName":\r
226                                 return XmlSchemaSimpleType.XsQName;\r
227                         case "NOTATION":\r
228                                 return XmlSchemaSimpleType.XsNotation;\r
229                         case "normalizedString":\r
230                                 return XmlSchemaSimpleType.XsNormalizedString;\r
231                         case "token":\r
232                                 return XmlSchemaSimpleType.XsToken;\r
233                         case "language":\r
234                                 return XmlSchemaSimpleType.XsLanguage;\r
235                         case "NMTOKEN":\r
236                                 return XmlSchemaSimpleType.XsNMToken;\r
237                         case "NMTOKENS":\r
238                                 return XmlSchemaSimpleType.XsNMTokens;\r
239                         case "Name":\r
240                                 return XmlSchemaSimpleType.XsName;\r
241                         case "NCName":\r
242                                 return XmlSchemaSimpleType.XsNCName;\r
243                         case "ID":\r
244                                 return XmlSchemaSimpleType.XsID;\r
245                         case "IDREF":\r
246                                 return XmlSchemaSimpleType.XsIDRef;\r
247                         case "IDREFS":\r
248                                 return XmlSchemaSimpleType.XsIDRefs;\r
249                         case "ENTITY":\r
250                                 return XmlSchemaSimpleType.XsEntity;\r
251                         case "ENTITIES":\r
252                                 return XmlSchemaSimpleType.XsEntities;\r
253                         case "integer":\r
254                                 return XmlSchemaSimpleType.XsInteger;\r
255                         case "nonPositiveInteger":\r
256                                 return XmlSchemaSimpleType.XsNonPositiveInteger;\r
257                         case "negativeInteger":\r
258                                 return XmlSchemaSimpleType.XsNegativeInteger;\r
259                         case "long":\r
260                                 return XmlSchemaSimpleType.XsLong;\r
261                         case "int":\r
262                                 return XmlSchemaSimpleType.XsInt;\r
263                         case "short":\r
264                                 return XmlSchemaSimpleType.XsShort;\r
265                         case "byte":\r
266                                 return XmlSchemaSimpleType.XsByte;\r
267                         case "nonNegativeInteger":\r
268                                 return XmlSchemaSimpleType.XsNonNegativeInteger;\r
269                         case "positiveInteger":\r
270                                 return XmlSchemaSimpleType.XsPositiveInteger;\r
271                         case "unsignedLong":\r
272                                 return XmlSchemaSimpleType.XsUnsignedLong;\r
273                         case "unsignedInt":\r
274                                 return XmlSchemaSimpleType.XsUnsignedInt;\r
275                         case "unsingedShort":\r
276                                 return XmlSchemaSimpleType.XsUnsignedShort;\r
277                         case "unsignedByte":\r
278                                 return XmlSchemaSimpleType.XsUnsignedByte;\r
279                         }\r
280                         return null;\r
281                 }\r
282 \r
283                 internal static XmlSchemaSimpleType GetBuiltInSimpleType (XmlSchemaDatatype type)\r
284                 {\r
285                         if (type is XsdEntities)\r
286                                 return XmlSchemaSimpleType.XsEntities;\r
287                         else if (type is XsdNMTokens)\r
288                                 return XmlSchemaSimpleType.XsNMTokens;\r
289                         else if (type is XsdIDRefs)\r
290                                 return XmlSchemaSimpleType.XsIDRefs;\r
291                         else\r
292                                 return GetBuiltInSimpleType (type.TypeCode);\r
293                 }\r
294 \r
295                 [MonoTODO]\r
296                 // Don't use this method to cover all XML Schema datatypes.\r
297                 public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlTypeCode type)\r
298                 {\r
299                         switch (type) {\r
300                         case XmlTypeCode.None:\r
301                         case XmlTypeCode.Item:\r
302                         case XmlTypeCode.Node:\r
303                         case XmlTypeCode.Document: // node\r
304                         case XmlTypeCode.Element: // node\r
305                         case XmlTypeCode.Attribute: // node\r
306                         case XmlTypeCode.Namespace: // node\r
307                         case XmlTypeCode.ProcessingInstruction: // node\r
308                         case XmlTypeCode.Comment: // node\r
309                         case XmlTypeCode.Text:  // node\r
310                                 return null;\r
311                         case XmlTypeCode.AnyAtomicType:\r
312                                 return XmlSchemaSimpleType.XdtAnyAtomicType;\r
313                         case XmlTypeCode.UntypedAtomic:\r
314                                 return XmlSchemaSimpleType.XdtUntypedAtomic;\r
315                         case XmlTypeCode.String:\r
316                                 return XmlSchemaSimpleType.XsString;\r
317                         case XmlTypeCode.Boolean:\r
318                                 return XmlSchemaSimpleType.XsBoolean;\r
319                         case XmlTypeCode.Decimal:\r
320                                 return XmlSchemaSimpleType.XsDecimal;\r
321                         case XmlTypeCode.Float:\r
322                                 return XmlSchemaSimpleType.XsFloat;\r
323                         case XmlTypeCode.Double:\r
324                                 return XmlSchemaSimpleType.XsDouble;\r
325                         case XmlTypeCode.Duration:\r
326                                 return XmlSchemaSimpleType.XsDuration;\r
327                         case XmlTypeCode.DateTime:\r
328                                 return XmlSchemaSimpleType.XsDateTime;\r
329                         case XmlTypeCode.Time:\r
330                                 return XmlSchemaSimpleType.XsTime;\r
331                         case XmlTypeCode.Date:\r
332                                 return XmlSchemaSimpleType.XsDate;\r
333                         case XmlTypeCode.GYearMonth:\r
334                                 return XmlSchemaSimpleType.XsGYearMonth;\r
335                         case XmlTypeCode.GYear:\r
336                                 return XmlSchemaSimpleType.XsGYear;\r
337                         case XmlTypeCode.GMonthDay:\r
338                                 return XmlSchemaSimpleType.XsGMonthDay;\r
339                         case XmlTypeCode.GDay:\r
340                                 return XmlSchemaSimpleType.XsGDay;\r
341                         case XmlTypeCode.GMonth:\r
342                                 return XmlSchemaSimpleType.XsGMonth;\r
343                         case XmlTypeCode.HexBinary:\r
344                                 return XmlSchemaSimpleType.XsHexBinary;\r
345                         case XmlTypeCode.Base64Binary:\r
346                                 return XmlSchemaSimpleType.XsBase64Binary;\r
347                         case XmlTypeCode.AnyUri:\r
348                                 return XmlSchemaSimpleType.XsAnyUri;\r
349                         case XmlTypeCode.QName:\r
350                                 return XmlSchemaSimpleType.XsQName;\r
351                         case XmlTypeCode.Notation:\r
352                                 return XmlSchemaSimpleType.XsNotation;\r
353                         case XmlTypeCode.NormalizedString:\r
354                                 return XmlSchemaSimpleType.XsNormalizedString;\r
355                         case XmlTypeCode.Token:\r
356                                 return XmlSchemaSimpleType.XsToken;\r
357                         case XmlTypeCode.Language:\r
358                                 return XmlSchemaSimpleType.XsLanguage;\r
359                         case XmlTypeCode.NmToken: // NmTokens is not primitive\r
360                                 return XmlSchemaSimpleType.XsNMToken;\r
361                         case XmlTypeCode.Name:\r
362                                 return XmlSchemaSimpleType.XsName;\r
363                         case XmlTypeCode.NCName:\r
364                                 return XmlSchemaSimpleType.XsNCName;\r
365                         case XmlTypeCode.Id:\r
366                                 return XmlSchemaSimpleType.XsID;\r
367                         case XmlTypeCode.Idref: // Idrefs is not primitive\r
368                                 return XmlSchemaSimpleType.XsIDRef;\r
369                         case XmlTypeCode.Entity: // Entities is not primitive\r
370                                 return XmlSchemaSimpleType.XsEntity;\r
371                         case XmlTypeCode.Integer:\r
372                                 return XmlSchemaSimpleType.XsInteger;\r
373                         case XmlTypeCode.NonPositiveInteger:\r
374                                 return XmlSchemaSimpleType.XsNonPositiveInteger;\r
375                         case XmlTypeCode.NegativeInteger:\r
376                                 return XmlSchemaSimpleType.XsNegativeInteger;\r
377                         case XmlTypeCode.Long:\r
378                                 return XmlSchemaSimpleType.XsLong;\r
379                         case XmlTypeCode.Int:\r
380                                 return XmlSchemaSimpleType.XsInt;\r
381                         case XmlTypeCode.Short:\r
382                                 return XmlSchemaSimpleType.XsShort;\r
383                         case XmlTypeCode.Byte:\r
384                                 return XmlSchemaSimpleType.XsByte;\r
385                         case XmlTypeCode.NonNegativeInteger:\r
386                                 return XmlSchemaSimpleType.XsNonNegativeInteger;\r
387                         case XmlTypeCode.UnsignedLong:\r
388                                 return XmlSchemaSimpleType.XsUnsignedLong;\r
389                         case XmlTypeCode.UnsignedInt:\r
390                                 return XmlSchemaSimpleType.XsUnsignedInt;\r
391                         case XmlTypeCode.UnsignedShort:\r
392                                 return XmlSchemaSimpleType.XsUnsignedShort;\r
393                         case XmlTypeCode.UnsignedByte:\r
394                                 return XmlSchemaSimpleType.XsUnsignedByte;\r
395                         case XmlTypeCode.PositiveInteger:\r
396                                 return XmlSchemaSimpleType.XsPositiveInteger;\r
397                         case XmlTypeCode.YearMonthDuration:\r
398                                 return XmlSchemaSimpleType.XdtYearMonthDuration;\r
399                         case XmlTypeCode.DayTimeDuration:\r
400                                 return XmlSchemaSimpleType.XdtDayTimeDuration;\r
401                         }\r
402                         return null;\r
403                 }\r
404 \r
405                 [MonoTODO]\r
406                 public static bool IsDerivedFrom (XmlSchemaType derivedType, XmlSchemaType baseType, XmlSchemaDerivationMethod except)\r
407                 {\r
408                         throw new NotImplementedException ();\r
409                 }\r
410 #endif\r
411 \r
412                 internal bool ValidateRecursionCheck ()\r
413                 {\r
414                         if (recursed)\r
415                                 return (this != XmlSchemaComplexType.AnyType);\r
416                         recursed = true;\r
417                         XmlSchemaType baseType = this.BaseXmlSchemaType as XmlSchemaType;\r
418                         bool result = false;\r
419                         if (baseType != null)\r
420                                 result = baseType.ValidateRecursionCheck ();\r
421                         recursed = false;\r
422                         return result;\r
423                 }\r
424         }\r
425 }\r