* BuiltInDatatypes.cs, XmlSchemaDatatype.cs: Added double type.
[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                         this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
116                 }\r
117 \r
118                 public override XmlTokenizedType TokenizedType {\r
119                         get { return XmlTokenizedType.CDATA; }\r
120                 }\r
121 \r
122                 public override Type ValueType {\r
123                         get { return typeof (string); }\r
124                 }\r
125 \r
126                 // ParseValue () method is as same as that of xs:string\r
127         }\r
128 \r
129         // xs:language\r
130         public class XsdLanguage : XsdToken\r
131         {\r
132                 internal XsdLanguage ()\r
133                 {\r
134                 }\r
135 \r
136                 public override XmlTokenizedType TokenizedType {\r
137                         get { return XmlTokenizedType.CDATA; }\r
138                 }\r
139 \r
140                 public override Type ValueType {\r
141                         get { return typeof (string); }\r
142                 }\r
143 \r
144                 // ParseValue () method is as same as that of xs:string\r
145         }\r
146 \r
147         // xs;NMTOKEN\r
148         public class XsdNMToken : XsdToken\r
149         {\r
150                 internal XsdNMToken ()\r
151                 {\r
152                 }\r
153 \r
154                 public override XmlTokenizedType TokenizedType {\r
155                         get { return XmlTokenizedType.NMTOKEN; }\r
156                 }\r
157 \r
158                 public override Type ValueType {\r
159                         get { return typeof (string); }\r
160                 }\r
161 \r
162                 // ParseValue () method is as same as that of xs:string\r
163         }\r
164 \r
165         // xs:NMTOKENS\r
166         public class XsdNMTokens : XsdNMToken\r
167         {\r
168                 internal XsdNMTokens ()\r
169                 {\r
170                 }\r
171 \r
172                 public override XmlTokenizedType TokenizedType {\r
173                         get { return XmlTokenizedType.NMTOKENS; }\r
174                 }\r
175 \r
176                 public override Type ValueType {\r
177                         get { return typeof (string []); }\r
178                 }\r
179 \r
180                 readonly char [] whitespaceArray = new char [] {' '};\r
181                 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)\r
182                 {\r
183                         return this.Normalize (value).Split (whitespaceArray);\r
184                 }\r
185         }\r
186 \r
187         // xs:Name\r
188         public class XsdName : XsdToken\r
189         {\r
190                 internal XsdName ()\r
191                 {\r
192                 }\r
193 \r
194                 public override XmlTokenizedType TokenizedType {\r
195                         get { return XmlTokenizedType.CDATA; }\r
196                 }\r
197 \r
198                 public override Type ValueType {\r
199                         get { return typeof (string); }\r
200                 }\r
201 \r
202                 // ParseValue () method is as same as that of xs:string\r
203         }\r
204 \r
205         // xs:NCName\r
206         public class XsdNCName : XsdName\r
207         {\r
208                 internal XsdNCName ()\r
209                 {\r
210                 }\r
211 \r
212                 public override XmlTokenizedType TokenizedType {\r
213                         get { return XmlTokenizedType.NCName; }\r
214                 }\r
215 \r
216                 public override Type ValueType {\r
217                         get { return typeof (string); }\r
218                 }\r
219 \r
220                 // ParseValue () method is as same as that of xs:string\r
221         }\r
222 \r
223         // xs:ID\r
224         public class XsdID : XsdName\r
225         {\r
226                 internal XsdID ()\r
227                 {\r
228                 }\r
229 \r
230                 public override XmlTokenizedType TokenizedType {\r
231                         get { return XmlTokenizedType.ID; }\r
232                 }\r
233 \r
234                 public override Type ValueType {\r
235                         get { return typeof (string); }\r
236                 }\r
237 \r
238                 // ParseValue () method is as same as that of xs:string\r
239         }\r
240 \r
241         // xs:IDREF\r
242         public class XsdIDRef : XsdName\r
243         {\r
244                 internal XsdIDRef ()\r
245                 {\r
246                 }\r
247 \r
248                 public override XmlTokenizedType TokenizedType {\r
249                         get { return XmlTokenizedType.IDREF; }\r
250                 }\r
251 \r
252                 public override Type ValueType {\r
253                         get { return typeof (string); }\r
254                 }\r
255 \r
256                 // ParseValue () method is as same as that of xs:string\r
257         }\r
258 \r
259         // xs:IDREFS\r
260         public class XsdIDRefs : XsdName\r
261         {\r
262                 internal XsdIDRefs ()\r
263                 {\r
264                 }\r
265 \r
266                 public override XmlTokenizedType TokenizedType {\r
267                         get { return XmlTokenizedType.IDREFS; }\r
268                 }\r
269 \r
270                 public override Type ValueType {\r
271                         get { return typeof (string []); }\r
272                 }\r
273 \r
274                 readonly char [] whitespaceArray = new char [] {' '};\r
275                 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)\r
276                 {\r
277                         return this.Normalize (value).Split (whitespaceArray);\r
278                 }\r
279         }\r
280 \r
281         // xs:ENTITY\r
282         public class XsdEntity : XsdName\r
283         {\r
284                 internal XsdEntity ()\r
285 \r
286                 {\r
287                 }\r
288 \r
289                 public override XmlTokenizedType TokenizedType {\r
290                         get { return XmlTokenizedType.ENTITY; }\r
291                 }\r
292 \r
293                 public override Type ValueType {\r
294                         get { return typeof (string); }\r
295                 }\r
296 \r
297                 // ParseValue () method is as same as that of xs:string\r
298         }\r
299 \r
300 \r
301         // xs:ENTITIES\r
302         public class XsdEntities : XsdName\r
303         {\r
304                 internal XsdEntities ()\r
305                 {\r
306                 }\r
307 \r
308                 public override XmlTokenizedType TokenizedType {\r
309                         get { return XmlTokenizedType.ENTITIES; }\r
310                 }\r
311 \r
312                 public override Type ValueType {\r
313                         get { return typeof (string []); }\r
314                 }\r
315 \r
316                 readonly char [] whitespaceArray = new char [] {' '};\r
317                 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)\r
318                 {\r
319                         return this.Normalize (value).Split (whitespaceArray);\r
320                 }\r
321         }\r
322 \r
323         // xs:NOTATION\r
324         public class XsdNotation : XsdAnySimpleType\r
325         {\r
326                 internal XsdNotation ()\r
327                 {\r
328                 }\r
329 \r
330                 public override XmlTokenizedType TokenizedType {\r
331                         get { return XmlTokenizedType.NOTATION; }\r
332                 }\r
333 \r
334                 public override Type ValueType {\r
335                         get { return typeof (string); }\r
336                 }\r
337 \r
338                 public override object ParseValue (string s,\r
339                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
340                 {\r
341                         throw new NotImplementedException ();\r
342                 }\r
343 \r
344                 // Fundamental Facets\r
345                 public override bool Bounded {\r
346                         get { return false; }\r
347                 }\r
348                 public override bool Finite {\r
349                         get { return false; }\r
350                 }\r
351                 public override bool Numeric {\r
352                         get { return false; }\r
353                 }\r
354                 public override XsdOrderedFacet Ordered {\r
355                         get { return XsdOrderedFacet.False; }\r
356                 }\r
357 \r
358                 // Constraining Facets\r
359                 public bool HasLengthFacet;\r
360                 public bool HasMaxLengthFacet;\r
361                 public bool HasMinLengthFacet;\r
362                 public int Length;\r
363                 public int MaxLength;\r
364                 public int MinLength;\r
365                 public string Pattern;\r
366                 public ICollection Enumeration;\r
367         }\r
368 \r
369         // xs:decimal\r
370         public class XsdDecimal : XsdAnySimpleType\r
371         {\r
372                 internal XsdDecimal ()\r
373                 {\r
374                 }\r
375 \r
376                 public override XmlTokenizedType TokenizedType {\r
377                         get { return XmlTokenizedType.CDATA; }\r
378                 }\r
379 \r
380                 public override Type ValueType {\r
381                         get { return typeof (decimal); }\r
382                 }\r
383 \r
384                 public override object ParseValue (string s,\r
385                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
386                 {\r
387                         return XmlConvert.ToDecimal (this.Normalize (s));\r
388                 }\r
389 \r
390                 // Fundamental Facets\r
391                 public override bool Bounded {\r
392                         get { return false; }\r
393                 }\r
394                 public override bool Finite {\r
395                         get { return false; }\r
396                 }\r
397                 public override bool Numeric {\r
398                         get { return true; }\r
399                 }\r
400                 public override XsdOrderedFacet Ordered {\r
401                         get { return XsdOrderedFacet.Total; }\r
402                 }\r
403 \r
404                 // Constraining Facets\r
405                 public bool HasLengthFacet;\r
406                 public bool HasMaxLengthFacet;\r
407                 public bool HasMinLengthFacet;\r
408                 public int Length;\r
409                 public int MaxLength;\r
410                 public int MinLength;\r
411                 public string Pattern;\r
412                 public ICollection Enumeration;\r
413         }\r
414 \r
415         // xs:integer\r
416         public class XsdInteger : XsdDecimal\r
417         {\r
418                 // Here it may be bigger than int's (or long's) MaxValue.\r
419                 public override Type ValueType {\r
420                         get { return typeof (decimal); }\r
421                 }\r
422 \r
423                 public override object ParseValue (string s,\r
424                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
425                 {\r
426                         return XmlConvert.ToDecimal (Normalize (s));\r
427                 }\r
428         }\r
429 \r
430         // xs:Long\r
431         public class XsdLong : XsdNonNegativeInteger\r
432         {\r
433                 public override Type ValueType {\r
434                         get { return typeof (long); }\r
435                 }\r
436 \r
437                 public override object ParseValue (string s,\r
438                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
439                 {\r
440                         return XmlConvert.ToInt64 (Normalize (s));\r
441                 }\r
442         }\r
443 \r
444         // xs:Int\r
445         public class XsdInt : XsdLong\r
446         {\r
447                 public override Type ValueType {\r
448                         get { return typeof (int); }\r
449                 }\r
450 \r
451                 public override object ParseValue (string s,\r
452                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
453                 {\r
454                         return XmlConvert.ToInt32 (Normalize (s));\r
455                 }\r
456         }\r
457 \r
458 \r
459         // xs:Short\r
460         public class XsdShort : XsdInt\r
461         {\r
462                 public override Type ValueType {\r
463                         get { return typeof (short); }\r
464                 }\r
465 \r
466                 public override object ParseValue (string s,\r
467                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
468                 {\r
469                         return XmlConvert.ToInt16 (Normalize (s));\r
470                 }\r
471         }\r
472 \r
473         // xs:Byte\r
474         public class XsdByte : XsdShort\r
475         {\r
476                 public override Type ValueType {\r
477                         get { return typeof (byte); }\r
478                 }\r
479 \r
480                 public override object ParseValue (string s,\r
481                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
482                 {\r
483                         return XmlConvert.ToByte (Normalize (s));\r
484                 }\r
485         }\r
486 \r
487         // xs:nonNegativeInteger\r
488         [CLSCompliant (false)]\r
489         public class XsdNonNegativeInteger : XsdInteger\r
490         {\r
491                 public override Type ValueType {\r
492                         get { return typeof (decimal); }\r
493                 }\r
494 \r
495                 [CLSCompliant (false)]\r
496                 public override object ParseValue (string s,\r
497                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
498                 {\r
499                         return XmlConvert.ToDecimal (Normalize (s));\r
500                 }\r
501         }\r
502 \r
503         // xs:unsignedLong\r
504         [CLSCompliant (false)]\r
505         public class XsdUnsignedLong : XsdNonNegativeInteger\r
506         {\r
507                 public override Type ValueType {\r
508                         get { return typeof (ulong); }\r
509                 }\r
510 \r
511                 public override object ParseValue (string s,\r
512                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
513                 {\r
514                         return XmlConvert.ToUInt64 (Normalize (s));\r
515                 }\r
516         }\r
517 \r
518         // xs:unsignedInt\r
519         [CLSCompliant (false)]\r
520         public class XsdUnsignedInt : XsdUnsignedLong\r
521         {\r
522                 public override Type ValueType {\r
523                         get { return typeof (uint); }\r
524                 }\r
525 \r
526                 public override object ParseValue (string s,\r
527                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
528                 {\r
529                         return XmlConvert.ToUInt32 (Normalize (s));\r
530                 }\r
531         }\r
532 \r
533 \r
534         // xs:unsignedShort\r
535         [CLSCompliant (false)]\r
536         public class XsdUnsignedShort : XsdUnsignedInt\r
537         {\r
538                 public override Type ValueType {\r
539                         get { return typeof (ushort); }\r
540                 }\r
541 \r
542                 public override object ParseValue (string s,\r
543                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
544                 {\r
545                         return XmlConvert.ToUInt16 (Normalize (s));\r
546                 }\r
547         }\r
548 \r
549         // xs:unsignedByte\r
550         [CLSCompliant (false)]\r
551         public class XsdUnsignedByte : XsdUnsignedShort\r
552         {\r
553                 public override Type ValueType {\r
554                         get { return typeof (byte); }\r
555                 }\r
556 \r
557                 public override object ParseValue (string s,\r
558                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
559                 {\r
560                         return XmlConvert.ToByte(Normalize (s));\r
561                 }\r
562         }\r
563 \r
564 \r
565         // xs:positiveInteger\r
566         public class XsdPositiveInteger : XsdNonNegativeInteger\r
567         {\r
568                 // It returns decimal, instead of int or long.\r
569                 // Maybe MS developers thought about big integer...\r
570                 public override Type ValueType {\r
571                         get { return typeof (decimal); }\r
572                 }\r
573 \r
574                 public override object ParseValue (string s,\r
575                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
576                 {\r
577                         return XmlConvert.ToDecimal (Normalize (s));\r
578                 }\r
579         }\r
580 \r
581         // xs:nonPositiveInteger\r
582         public class XsdNonPositiveInteger : XsdInteger\r
583         {\r
584                 public override Type ValueType {\r
585                         get { return typeof (decimal); }\r
586                 }\r
587 \r
588                 public override object ParseValue (string s,\r
589                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
590                 {\r
591                         return XmlConvert.ToDecimal (Normalize (s));\r
592                 }\r
593         }\r
594 \r
595         // xs:negativeInteger\r
596         public class XsdNegativeInteger : XsdNonPositiveInteger\r
597         {\r
598                 public override Type ValueType {\r
599 \r
600                         get { return typeof (decimal); }\r
601                 }\r
602 \r
603                 public override object ParseValue (string s,\r
604                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
605                 {\r
606                         return XmlConvert.ToDecimal (Normalize (s));\r
607                 }\r
608         }\r
609 \r
610         // xs:float\r
611         public class XsdFloat : XsdDecimal\r
612         {\r
613                 public override Type ValueType {\r
614                         get { return typeof (float); }\r
615                 }\r
616 \r
617                 public override object ParseValue (string s,\r
618                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
619                 {\r
620                         return XmlConvert.ToSingle (Normalize (s));\r
621                 }\r
622         }\r
623 \r
624         // xs:double\r
625         public class XsdDouble : XsdDecimal\r
626         {\r
627                 public override Type ValueType {\r
628                         get { return typeof (double); }\r
629                 }\r
630 \r
631                 public override object ParseValue (string s,\r
632                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
633                 {\r
634                         return XmlConvert.ToDouble (Normalize (s));\r
635                 }\r
636         }\r
637 \r
638         // xs:base64Binary\r
639         public class XsdBase64Binary : XsdString\r
640         {\r
641                 internal XsdBase64Binary ()\r
642                 {\r
643                 }\r
644 \r
645                 public override Type ValueType {\r
646                         get { return typeof (byte[]); }\r
647                 }\r
648 \r
649                 public override object ParseValue (string s,\r
650                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
651                 {\r
652                         return Convert.FromBase64String (s);\r
653                 }\r
654         }\r
655 \r
656         // xs:boolean\r
657         public class XsdBoolean : XsdAnySimpleType\r
658         {\r
659                 internal XsdBoolean ()\r
660                 {\r
661                 }\r
662 \r
663                 public override XmlTokenizedType TokenizedType {\r
664                         get { return XmlTokenizedType.CDATA; }\r
665                 }\r
666 \r
667                 public override Type ValueType {\r
668                         get { return typeof (bool); }\r
669                 }\r
670 \r
671                 public override object ParseValue (string s,\r
672                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
673                 {\r
674                         return XmlConvert.ToBoolean (this.Normalize (s));\r
675                 }\r
676 \r
677                 // Fundamental Facets\r
678                 public override bool Bounded {\r
679                         get { return false; }\r
680                 }\r
681                 public override bool Finite {\r
682                         get { return true; }\r
683                 }\r
684                 public override bool Numeric {\r
685                         get { return false; }\r
686                 }\r
687                 public override XsdOrderedFacet Ordered {\r
688                         get { return XsdOrderedFacet.Total; }\r
689                 }\r
690         }\r
691 \r
692         // xs:anyURI\r
693         public class XsdAnyURI : XsdString\r
694         {\r
695                 public override XmlTokenizedType TokenizedType {\r
696 \r
697                         get { return XmlTokenizedType.CDATA; }\r
698                 }\r
699 \r
700                 public override Type ValueType {\r
701                         get { return typeof (Uri); }\r
702                 }\r
703 \r
704                 public override object ParseValue (string s,\r
705                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
706                 {\r
707                         return new Uri (s);\r
708                 }\r
709         }\r
710         \r
711         // xs:dateTime\r
712         public class XsdDateTime : XsdAnySimpleType\r
713         {\r
714                 internal XsdDateTime ()\r
715                 {\r
716                 }\r
717 \r
718                 public override XmlTokenizedType TokenizedType {\r
719                         get { return XmlTokenizedType.CDATA; }\r
720                 }\r
721 \r
722                 public override Type ValueType {\r
723                         get { return typeof (DateTime); }\r
724                 }\r
725 \r
726                 public override object ParseValue (string s,\r
727                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
728                 {\r
729                         return XmlConvert.ToDateTime (s);\r
730                 }\r
731 \r
732                 // Fundamental Facets\r
733                 public override bool Bounded {\r
734                         get { return false; }\r
735                 }\r
736                 public override bool Finite {\r
737                         get { return true; }\r
738                 }\r
739                 public override bool Numeric {\r
740                         get { return false; }\r
741                 }\r
742                 public override XsdOrderedFacet Ordered {\r
743                         get { return XsdOrderedFacet.Total; }\r
744                 }\r
745         }\r
746 \r
747         // xs:date\r
748         public class XsdDate : XsdDateTime\r
749         {\r
750                 public override object ParseValue (string s,\r
751                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
752                 {\r
753                         return DateTime.ParseExact (s, "yyyy-MM-dd", null);\r
754                 }\r
755         }\r
756 \r
757         // xs:time\r
758         public class XsdTime : XsdDateTime\r
759         {\r
760                 public override object ParseValue (string s,\r
761                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
762                 {\r
763                         return DateTime.ParseExact (s, "HH:mm:ss.fffffffzzz", null);\r
764                 }\r
765         }\r
766 }