* XmlSchema.cs: Set IsCompiled to true after compiling.
[mono.git] / mcs / class / System.XML / System.Xml.Schema / BuiltInDatatype.cs
1 //\r
2 // System.Xml.Schema.XmlSchemaDatatype.cs\r
3 //\r
4 // Author:\r
5 //      Atsushi Enomoto\r
6 //\r
7 // (C)2003 Atsushi Enomoto\r
8 //\r
9 using System;\r
10 using System.Collections;\r
11 using System.Text;\r
12 using System.Xml;\r
13 using System.Xml.Schema;\r
14 \r
15 namespace Mono.Xml.Schema\r
16 {\r
17         public enum XsdWhitespaceFacet\r
18         {\r
19                 Preserve,\r
20                 Replace,\r
21                 Collapse\r
22         }\r
23 \r
24         public enum XsdOrderedFacet\r
25         {\r
26                 False,\r
27                 Partial,\r
28                 Total\r
29         }\r
30 \r
31         public abstract class XsdAnySimpleType : XmlSchemaDatatype\r
32         {\r
33                 // Fundamental Facets\r
34                 public abstract bool Bounded { get; }\r
35 \r
36                 public abstract bool Finite { get; }\r
37 \r
38                 public abstract bool Numeric { get; }\r
39 \r
40                 public abstract XsdOrderedFacet Ordered { get; }\r
41 \r
42         }\r
43 \r
44         // xs:string\r
45         public class XsdString : XsdAnySimpleType\r
46         {\r
47                 internal XsdString ()\r
48                 {\r
49                 }\r
50 \r
51                 public override XmlTokenizedType TokenizedType {\r
52                         get { return XmlTokenizedType.CDATA; }\r
53                 }\r
54 \r
55                 public override Type ValueType {\r
56                         get { return typeof (string); }\r
57                 }\r
58 \r
59                 public override object ParseValue (string s,\r
60                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
61                 {\r
62                         return Normalize (s);\r
63                 }\r
64 \r
65                 // Fundamental Facets\r
66                 public override bool Bounded {\r
67                         get { return false; }\r
68                 }\r
69                 public override bool Finite {\r
70                         get { return false; }\r
71                 }\r
72                 public override bool Numeric {\r
73                         get { return false; }\r
74                 }\r
75                 public override XsdOrderedFacet Ordered {\r
76                         get { return XsdOrderedFacet.False; }\r
77                 }\r
78 \r
79                 // Constraining Facets\r
80                 public bool HasLengthFacet;\r
81                 public bool HasMaxLengthFacet;\r
82                 public bool HasMinLengthFacet;\r
83                 public int Length;\r
84                 public int MaxLength;\r
85                 public int MinLength;\r
86                 public string Pattern;\r
87                 public ICollection Enumeration;\r
88         }\r
89 \r
90         // xs:normalizedString\r
91         public class XsdNormalizedString : XsdString\r
92         {\r
93                 internal XsdNormalizedString ()\r
94                 {\r
95                         this.WhitespaceValue = XsdWhitespaceFacet.Replace;\r
96                 }\r
97 \r
98                 public override XmlTokenizedType TokenizedType {\r
99 \r
100                         get { return XmlTokenizedType.CDATA; }\r
101                 }\r
102 \r
103                 public override Type ValueType {\r
104                         get { return typeof (string); }\r
105                 }\r
106 \r
107                 // ParseValue () method is as same as that of xs:string\r
108         }\r
109 \r
110         // xs:token\r
111         public class XsdToken : XsdNormalizedString\r
112         {\r
113                 internal XsdToken ()\r
114                 {\r
115                 }\r
116 \r
117                 public override XmlTokenizedType TokenizedType {\r
118                         get { return XmlTokenizedType.CDATA; }\r
119                 }\r
120 \r
121                 public override Type ValueType {\r
122                         get { return typeof (string); }\r
123                 }\r
124 \r
125                 // ParseValue () method is as same as that of xs:string\r
126         }\r
127 \r
128         // xs:language\r
129         public class XsdLanguage : XsdToken\r
130         {\r
131                 internal XsdLanguage ()\r
132                 {\r
133                 }\r
134 \r
135                 public override XmlTokenizedType TokenizedType {\r
136                         get { return XmlTokenizedType.CDATA; }\r
137                 }\r
138 \r
139                 public override Type ValueType {\r
140                         get { return typeof (string); }\r
141                 }\r
142 \r
143                 // ParseValue () method is as same as that of xs:string\r
144         }\r
145 \r
146         // xs;NMTOKEN\r
147         public class XsdNMToken : XsdToken\r
148         {\r
149                 internal XsdNMToken ()\r
150                 {\r
151                 }\r
152 \r
153                 public override XmlTokenizedType TokenizedType {\r
154                         get { return XmlTokenizedType.NMTOKEN; }\r
155                 }\r
156 \r
157                 public override Type ValueType {\r
158                         get { return typeof (string); }\r
159                 }\r
160 \r
161                 // ParseValue () method is as same as that of xs:string\r
162         }\r
163 \r
164         // xs:NMTOKENS\r
165         public class XsdNMTokens : XsdNMToken\r
166         {\r
167                 internal XsdNMTokens ()\r
168                 {\r
169                 }\r
170 \r
171                 public override XmlTokenizedType TokenizedType {\r
172                         get { return XmlTokenizedType.NMTOKENS; }\r
173                 }\r
174 \r
175                 public override Type ValueType {\r
176                         get { return typeof (string []); }\r
177                 }\r
178 \r
179                 // ParseValue () method is as same as that of xs:string\r
180         }\r
181 \r
182         // xs:Name\r
183         public class XsdName : XsdToken\r
184         {\r
185                 internal XsdName ()\r
186                 {\r
187                 }\r
188 \r
189                 public override XmlTokenizedType TokenizedType {\r
190                         get { return XmlTokenizedType.CDATA; }\r
191                 }\r
192 \r
193                 public override Type ValueType {\r
194                         get { return typeof (string); }\r
195                 }\r
196 \r
197                 // ParseValue () method is as same as that of xs:string\r
198         }\r
199 \r
200         // xs:NCName\r
201         public class XsdNCName : XsdName\r
202         {\r
203                 internal XsdNCName ()\r
204                 {\r
205                 }\r
206 \r
207                 public override XmlTokenizedType TokenizedType {\r
208                         get { return XmlTokenizedType.NCName; }\r
209                 }\r
210 \r
211                 public override Type ValueType {\r
212                         get { return typeof (string); }\r
213                 }\r
214 \r
215                 // ParseValue () method is as same as that of xs:string\r
216         }\r
217 \r
218         // xs:ID\r
219         public class XsdID : XsdName\r
220         {\r
221                 internal XsdID ()\r
222                 {\r
223                 }\r
224 \r
225                 public override XmlTokenizedType TokenizedType {\r
226                         get { return XmlTokenizedType.ID; }\r
227                 }\r
228 \r
229                 public override Type ValueType {\r
230                         get { return typeof (string); }\r
231                 }\r
232 \r
233                 // ParseValue () method is as same as that of xs:string\r
234         }\r
235 \r
236         // xs:IDREF\r
237         public class XsdIDRef : XsdName\r
238         {\r
239                 internal XsdIDRef ()\r
240                 {\r
241                 }\r
242 \r
243                 public override XmlTokenizedType TokenizedType {\r
244                         get { return XmlTokenizedType.IDREF; }\r
245                 }\r
246 \r
247                 public override Type ValueType {\r
248                         get { return typeof (string); }\r
249                 }\r
250 \r
251                 // ParseValue () method is as same as that of xs:string\r
252         }\r
253 \r
254         // xs:IDREFS\r
255         public class XsdIDRefs : XsdName\r
256         {\r
257                 internal XsdIDRefs ()\r
258                 {\r
259                 }\r
260 \r
261                 public override XmlTokenizedType TokenizedType {\r
262                         get { return XmlTokenizedType.IDREFS; }\r
263                 }\r
264 \r
265                 public override Type ValueType {\r
266                         get { return typeof (string []); }\r
267                 }\r
268 \r
269                 readonly char [] whitespaceArray = new char [] {' '};\r
270                 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)\r
271                 {\r
272                         return this.Normalize (value).Split (whitespaceArray);\r
273                 }\r
274         }\r
275 \r
276         // xs:ENTITY\r
277         public class XsdEntity : XsdName\r
278         {\r
279                 internal XsdEntity ()\r
280                 {\r
281                 }\r
282 \r
283                 public override XmlTokenizedType TokenizedType {\r
284                         get { return XmlTokenizedType.ENTITY; }\r
285                 }\r
286 \r
287                 public override Type ValueType {\r
288                         get { return typeof (string); }\r
289                 }\r
290 \r
291                 // ParseValue () method is as same as that of xs:string\r
292         }\r
293 \r
294 \r
295         // xs:ENTITIES\r
296         public class XsdEntities : XsdName\r
297         {\r
298                 internal XsdEntities ()\r
299                 {\r
300                 }\r
301 \r
302                 public override XmlTokenizedType TokenizedType {\r
303                         get { return XmlTokenizedType.ENTITIES; }\r
304                 }\r
305 \r
306                 public override Type ValueType {\r
307                         get { return typeof (string []); }\r
308                 }\r
309 \r
310                 // ParseValue () method is as same as that of xs:string\r
311         }\r
312 \r
313         // xs:NOTATION\r
314         public class XsdNotation : XsdAnySimpleType\r
315         {\r
316                 internal XsdNotation ()\r
317                 {\r
318                 }\r
319 \r
320                 public override XmlTokenizedType TokenizedType {\r
321                         get { return XmlTokenizedType.NOTATION; }\r
322                 }\r
323 \r
324                 public override Type ValueType {\r
325                         get { return typeof (string); }\r
326                 }\r
327 \r
328                 public override object ParseValue (string s,\r
329                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
330                 {\r
331                         throw new NotImplementedException ();\r
332                 }\r
333 \r
334                 // Fundamental Facets\r
335                 public override bool Bounded {\r
336                         get { return false; }\r
337                 }\r
338                 public override bool Finite {\r
339                         get { return false; }\r
340                 }\r
341                 public override bool Numeric {\r
342                         get { return false; }\r
343                 }\r
344                 public override XsdOrderedFacet Ordered {\r
345                         get { return XsdOrderedFacet.False; }\r
346                 }\r
347 \r
348                 // Constraining Facets\r
349                 public bool HasLengthFacet;\r
350                 public bool HasMaxLengthFacet;\r
351                 public bool HasMinLengthFacet;\r
352                 public int Length;\r
353                 public int MaxLength;\r
354                 public int MinLength;\r
355                 public string Pattern;\r
356                 public ICollection Enumeration;\r
357         }\r
358 \r
359         // xs:decimal\r
360         public class XsdDecimal : XsdAnySimpleType\r
361         {\r
362                 internal XsdDecimal ()\r
363                 {\r
364                 }\r
365 \r
366                 public override XmlTokenizedType TokenizedType {\r
367                         get { return XmlTokenizedType.CDATA; }\r
368                 }\r
369 \r
370                 public override Type ValueType {\r
371                         get { return typeof (decimal); }\r
372                 }\r
373 \r
374                 public override object ParseValue (string s,\r
375                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
376                 {\r
377                         return XmlConvert.ToDecimal (this.Normalize (s));\r
378                 }\r
379 \r
380                 // Fundamental Facets\r
381                 public override bool Bounded {\r
382                         get { return false; }\r
383                 }\r
384                 public override bool Finite {\r
385                         get { return false; }\r
386                 }\r
387                 public override bool Numeric {\r
388                         get { return true; }\r
389                 }\r
390                 public override XsdOrderedFacet Ordered {\r
391                         get { return XsdOrderedFacet.Total; }\r
392                 }\r
393 \r
394                 // Constraining Facets\r
395                 public bool HasLengthFacet;\r
396                 public bool HasMaxLengthFacet;\r
397                 public bool HasMinLengthFacet;\r
398                 public int Length;\r
399                 public int MaxLength;\r
400                 public int MinLength;\r
401                 public string Pattern;\r
402                 public ICollection Enumeration;\r
403         }\r
404 \r
405         // xs:integer\r
406         public class XsdInteger : XsdDecimal\r
407         {\r
408                 // Here it may be bigger than int's (or long's) MaxValue.\r
409                 public override Type ValueType {\r
410                         get { return typeof (decimal); }\r
411                 }\r
412 \r
413                 public override object ParseValue (string s,\r
414                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
415                 {\r
416                         return XmlConvert.ToDecimal (Normalize (s));\r
417                 }\r
418         }\r
419 \r
420         // xs:Long\r
421         public class XsdLong : XsdNonNegativeInteger\r
422         {\r
423                 public override Type ValueType {\r
424                         get { return typeof (long); }\r
425                 }\r
426 \r
427                 public override object ParseValue (string s,\r
428                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
429                 {\r
430                         return XmlConvert.ToInt64 (Normalize (s));\r
431                 }\r
432         }\r
433 \r
434         // xs:Int\r
435         public class XsdInt : XsdLong\r
436         {\r
437                 public override Type ValueType {\r
438                         get { return typeof (int); }\r
439                 }\r
440 \r
441                 public override object ParseValue (string s,\r
442                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
443                 {\r
444                         return XmlConvert.ToInt32 (Normalize (s));\r
445                 }\r
446         }\r
447 \r
448 \r
449         // xs:Short\r
450         public class XsdShort : XsdInt\r
451         {\r
452                 public override Type ValueType {\r
453                         get { return typeof (short); }\r
454                 }\r
455 \r
456                 public override object ParseValue (string s,\r
457                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
458                 {\r
459                         return XmlConvert.ToInt16 (Normalize (s));\r
460                 }\r
461         }\r
462 \r
463         // xs:Byte\r
464         public class XsdByte : XsdShort\r
465         {\r
466                 public override Type ValueType {\r
467                         get { return typeof (byte); }\r
468                 }\r
469 \r
470                 public override object ParseValue (string s,\r
471                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
472                 {\r
473                         return XmlConvert.ToByte (Normalize (s));\r
474                 }\r
475         }\r
476 \r
477         // xs:nonNegativeInteger\r
478         [CLSCompliant (false)]\r
479         public class XsdNonNegativeInteger : XsdInteger\r
480         {\r
481                 public override Type ValueType {\r
482                         get { return typeof (decimal); }\r
483                 }\r
484 \r
485                 [CLSCompliant (false)]\r
486                 public override object ParseValue (string s,\r
487                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
488                 {\r
489                         return XmlConvert.ToDecimal (Normalize (s));\r
490                 }\r
491         }\r
492 \r
493         // xs:unsignedLong\r
494         [CLSCompliant (false)]\r
495         public class XsdUnsignedLong : XsdNonNegativeInteger\r
496         {\r
497                 public override Type ValueType {\r
498                         get { return typeof (ulong); }\r
499                 }\r
500 \r
501                 public override object ParseValue (string s,\r
502                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
503                 {\r
504                         return XmlConvert.ToUInt64 (Normalize (s));\r
505                 }\r
506         }\r
507 \r
508         // xs:unsignedInt\r
509         [CLSCompliant (false)]\r
510         public class XsdUnsignedInt : XsdUnsignedLong\r
511         {\r
512                 public override Type ValueType {\r
513                         get { return typeof (uint); }\r
514                 }\r
515 \r
516                 public override object ParseValue (string s,\r
517                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
518                 {\r
519                         return XmlConvert.ToUInt32 (Normalize (s));\r
520                 }\r
521         }\r
522 \r
523 \r
524         // xs:unsignedShort\r
525         [CLSCompliant (false)]\r
526         public class XsdUnsignedShort : XsdUnsignedInt\r
527         {\r
528                 public override Type ValueType {\r
529                         get { return typeof (ushort); }\r
530                 }\r
531 \r
532                 public override object ParseValue (string s,\r
533                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
534                 {\r
535                         return XmlConvert.ToUInt16 (Normalize (s));\r
536                 }\r
537         }\r
538 \r
539         // xs:unsignedByte\r
540         [CLSCompliant (false)]\r
541         public class XsdUnsignedByte : XsdUnsignedShort\r
542         {\r
543                 public override Type ValueType {\r
544                         get { return typeof (byte); }\r
545                 }\r
546 \r
547                 public override object ParseValue (string s,\r
548                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
549                 {\r
550                         return XmlConvert.ToByte(Normalize (s));\r
551                 }\r
552         }\r
553 \r
554         // xs:positiveInteger\r
555         public class XsdPositiveInteger : XsdNonNegativeInteger\r
556         {\r
557                 // It returns decimal, instead of int or long.\r
558                 // Maybe MS developers thought about big integer...\r
559                 public override Type ValueType {\r
560                         get { return typeof (decimal); }\r
561                 }\r
562 \r
563                 public override object ParseValue (string s,\r
564                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
565                 {\r
566                         return XmlConvert.ToDecimal (Normalize (s));\r
567                 }\r
568         }\r
569 \r
570         // xs:nonPositiveInteger\r
571         public class XsdNonPositiveInteger : XsdInteger\r
572         {\r
573                 public override Type ValueType {\r
574                         get { return typeof (decimal); }\r
575                 }\r
576 \r
577                 public override object ParseValue (string s,\r
578                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
579                 {\r
580                         return XmlConvert.ToDecimal (Normalize (s));\r
581                 }\r
582         }\r
583 \r
584         // xs:negativeInteger\r
585         public class XsdNegativeInteger : XsdNonPositiveInteger\r
586         {\r
587                 public override Type ValueType {\r
588 \r
589                         get { return typeof (decimal); }\r
590                 }\r
591 \r
592                 public override object ParseValue (string s,\r
593                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
594                 {\r
595                         return XmlConvert.ToDecimal (Normalize (s));\r
596                 }\r
597         }\r
598 \r
599         // xs:float\r
600         public class XsdFloat : XsdDecimal\r
601         {\r
602                 public override Type ValueType {\r
603                         get { return typeof (float); }\r
604                 }\r
605 \r
606                 public override object ParseValue (string s,\r
607                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
608                 {\r
609                         return XmlConvert.ToSingle (Normalize (s));\r
610                 }\r
611         }\r
612 \r
613 \r
614         // xs:base64Binary\r
615         public class XsdBase64Binary : XsdString\r
616         {\r
617                 internal XsdBase64Binary ()\r
618                 {\r
619                 }\r
620 \r
621                 public override Type ValueType {\r
622                         get { return typeof (byte[]); }\r
623                 }\r
624 \r
625                 public override object ParseValue (string s,\r
626                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
627                 {\r
628                         return Convert.FromBase64String (s);\r
629                 }\r
630         }\r
631 \r
632         // xs:boolean\r
633         public class XsdBoolean : XsdAnySimpleType\r
634         {\r
635                 internal XsdBoolean ()\r
636                 {\r
637                 }\r
638 \r
639                 public override XmlTokenizedType TokenizedType {\r
640                         get { return XmlTokenizedType.CDATA; }\r
641                 }\r
642 \r
643                 public override Type ValueType {\r
644                         get { return typeof (bool); }\r
645                 }\r
646 \r
647                 public override object ParseValue (string s,\r
648                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
649                 {\r
650                         return XmlConvert.ToBoolean (this.Normalize (s));\r
651                 }\r
652 \r
653                 // Fundamental Facets\r
654                 public override bool Bounded {\r
655                         get { return false; }\r
656                 }\r
657                 public override bool Finite {\r
658                         get { return true; }\r
659                 }\r
660                 public override bool Numeric {\r
661                         get { return false; }\r
662                 }\r
663                 public override XsdOrderedFacet Ordered {\r
664                         get { return XsdOrderedFacet.Total; }\r
665                 }\r
666         }\r
667 }\r