2003-08-07 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[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                 public override XmlTokenizedType TokenizedType {\r
289                         get { return XmlTokenizedType.ENTITY; }\r
290                 }\r
291 \r
292                 public override Type ValueType {\r
293                         get { return typeof (string); }\r
294                 }\r
295 \r
296                 // ParseValue () method is as same as that of xs:string\r
297         }\r
298 \r
299 \r
300         // xs:ENTITIES\r
301         public class XsdEntities : XsdName\r
302         {\r
303                 internal XsdEntities ()\r
304                 {\r
305                 }\r
306 \r
307                 public override XmlTokenizedType TokenizedType {\r
308                         get { return XmlTokenizedType.ENTITIES; }\r
309                 }\r
310 \r
311                 public override Type ValueType {\r
312                         get { return typeof (string []); }\r
313                 }\r
314 \r
315                 readonly char [] whitespaceArray = new char [] {' '};\r
316                 public override object ParseValue (string value, XmlNameTable nt, XmlNamespaceManager nsmgr)\r
317                 {\r
318                         return this.Normalize (value).Split (whitespaceArray);\r
319                 }\r
320         }\r
321 \r
322         // xs:NOTATION\r
323         public class XsdNotation : XsdAnySimpleType\r
324         {\r
325                 internal XsdNotation ()\r
326                 {\r
327                 }\r
328 \r
329                 public override XmlTokenizedType TokenizedType {\r
330                         get { return XmlTokenizedType.NOTATION; }\r
331                 }\r
332 \r
333                 public override Type ValueType {\r
334                         get { return typeof (string); }\r
335                 }\r
336 \r
337                 public override object ParseValue (string s,\r
338                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
339                 {\r
340                         throw new NotImplementedException ();\r
341                 }\r
342 \r
343                 // Fundamental Facets\r
344                 public override bool Bounded {\r
345                         get { return false; }\r
346                 }\r
347                 public override bool Finite {\r
348                         get { return false; }\r
349                 }\r
350                 public override bool Numeric {\r
351                         get { return false; }\r
352                 }\r
353                 public override XsdOrderedFacet Ordered {\r
354                         get { return XsdOrderedFacet.False; }\r
355                 }\r
356 \r
357                 // Constraining Facets\r
358                 public bool HasLengthFacet;\r
359                 public bool HasMaxLengthFacet;\r
360                 public bool HasMinLengthFacet;\r
361                 public int Length;\r
362                 public int MaxLength;\r
363                 public int MinLength;\r
364                 public string Pattern;\r
365                 public ICollection Enumeration;\r
366         }\r
367 \r
368         // xs:decimal\r
369         public class XsdDecimal : XsdAnySimpleType\r
370         {\r
371                 internal XsdDecimal ()\r
372                 {\r
373                 }\r
374 \r
375                 public override XmlTokenizedType TokenizedType {\r
376                         get { return XmlTokenizedType.CDATA; }\r
377                 }\r
378 \r
379                 public override Type ValueType {\r
380                         get { return typeof (decimal); }\r
381                 }\r
382 \r
383                 public override object ParseValue (string s,\r
384                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
385                 {\r
386                         return XmlConvert.ToDecimal (this.Normalize (s));\r
387                 }\r
388 \r
389                 // Fundamental Facets\r
390                 public override bool Bounded {\r
391                         get { return false; }\r
392                 }\r
393                 public override bool Finite {\r
394                         get { return false; }\r
395                 }\r
396                 public override bool Numeric {\r
397                         get { return true; }\r
398                 }\r
399                 public override XsdOrderedFacet Ordered {\r
400                         get { return XsdOrderedFacet.Total; }\r
401                 }\r
402 \r
403                 // Constraining Facets\r
404                 public bool HasLengthFacet;\r
405                 public bool HasMaxLengthFacet;\r
406                 public bool HasMinLengthFacet;\r
407                 public int Length;\r
408                 public int MaxLength;\r
409                 public int MinLength;\r
410                 public string Pattern;\r
411                 public ICollection Enumeration;\r
412         }\r
413 \r
414         // xs:integer\r
415         public class XsdInteger : XsdDecimal\r
416         {\r
417                 // Here it may be bigger than int's (or long's) MaxValue.\r
418                 public override Type ValueType {\r
419                         get { return typeof (decimal); }\r
420                 }\r
421 \r
422                 public override object ParseValue (string s,\r
423                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
424                 {\r
425                         return XmlConvert.ToDecimal (Normalize (s));\r
426                 }\r
427         }\r
428 \r
429         // xs:Long\r
430         public class XsdLong : XsdNonNegativeInteger\r
431         {\r
432                 public override Type ValueType {\r
433                         get { return typeof (long); }\r
434                 }\r
435 \r
436                 public override object ParseValue (string s,\r
437                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
438                 {\r
439                         return XmlConvert.ToInt64 (Normalize (s));\r
440                 }\r
441         }\r
442 \r
443         // xs:Int\r
444         public class XsdInt : XsdLong\r
445         {\r
446                 public override Type ValueType {\r
447                         get { return typeof (int); }\r
448                 }\r
449 \r
450                 public override object ParseValue (string s,\r
451                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
452                 {\r
453                         return XmlConvert.ToInt32 (Normalize (s));\r
454                 }\r
455         }\r
456 \r
457 \r
458         // xs:Short\r
459         public class XsdShort : XsdInt\r
460         {\r
461                 public override Type ValueType {\r
462                         get { return typeof (short); }\r
463                 }\r
464 \r
465                 public override object ParseValue (string s,\r
466                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
467                 {\r
468                         return XmlConvert.ToInt16 (Normalize (s));\r
469                 }\r
470         }\r
471 \r
472         // xs:Byte\r
473         public class XsdByte : XsdShort\r
474         {\r
475                 public override Type ValueType {\r
476                         get { return typeof (byte); }\r
477                 }\r
478 \r
479                 public override object ParseValue (string s,\r
480                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
481                 {\r
482                         return XmlConvert.ToByte (Normalize (s));\r
483                 }\r
484         }\r
485 \r
486         // xs:nonNegativeInteger\r
487         [CLSCompliant (false)]\r
488         public class XsdNonNegativeInteger : XsdInteger\r
489         {\r
490                 public override Type ValueType {\r
491                         get { return typeof (decimal); }\r
492                 }\r
493 \r
494                 [CLSCompliant (false)]\r
495                 public override object ParseValue (string s,\r
496                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
497                 {\r
498                         return XmlConvert.ToDecimal (Normalize (s));\r
499                 }\r
500         }\r
501 \r
502         // xs:unsignedLong\r
503         [CLSCompliant (false)]\r
504         public class XsdUnsignedLong : XsdNonNegativeInteger\r
505         {\r
506                 public override Type ValueType {\r
507                         get { return typeof (ulong); }\r
508                 }\r
509 \r
510                 public override object ParseValue (string s,\r
511                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
512                 {\r
513                         return XmlConvert.ToUInt64 (Normalize (s));\r
514                 }\r
515         }\r
516 \r
517         // xs:unsignedInt\r
518         [CLSCompliant (false)]\r
519         public class XsdUnsignedInt : XsdUnsignedLong\r
520         {\r
521                 public override Type ValueType {\r
522                         get { return typeof (uint); }\r
523                 }\r
524 \r
525                 public override object ParseValue (string s,\r
526                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
527                 {\r
528                         return XmlConvert.ToUInt32 (Normalize (s));\r
529                 }\r
530         }\r
531 \r
532 \r
533         // xs:unsignedShort\r
534         [CLSCompliant (false)]\r
535         public class XsdUnsignedShort : XsdUnsignedInt\r
536         {\r
537                 public override Type ValueType {\r
538                         get { return typeof (ushort); }\r
539                 }\r
540 \r
541                 public override object ParseValue (string s,\r
542                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
543                 {\r
544                         return XmlConvert.ToUInt16 (Normalize (s));\r
545                 }\r
546         }\r
547 \r
548         // xs:unsignedByte\r
549         [CLSCompliant (false)]\r
550         public class XsdUnsignedByte : XsdUnsignedShort\r
551         {\r
552                 public override Type ValueType {\r
553                         get { return typeof (byte); }\r
554                 }\r
555 \r
556                 public override object ParseValue (string s,\r
557                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
558                 {\r
559                         return XmlConvert.ToByte(Normalize (s));\r
560                 }\r
561         }\r
562 \r
563         // xs:positiveInteger\r
564         public class XsdPositiveInteger : XsdNonNegativeInteger\r
565         {\r
566                 // It returns decimal, instead of int or long.\r
567                 // Maybe MS developers thought about big integer...\r
568                 public override Type ValueType {\r
569                         get { return typeof (decimal); }\r
570                 }\r
571 \r
572                 public override object ParseValue (string s,\r
573                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
574                 {\r
575                         return XmlConvert.ToDecimal (Normalize (s));\r
576                 }\r
577         }\r
578 \r
579         // xs:nonPositiveInteger\r
580         public class XsdNonPositiveInteger : XsdInteger\r
581         {\r
582                 public override Type ValueType {\r
583                         get { return typeof (decimal); }\r
584                 }\r
585 \r
586                 public override object ParseValue (string s,\r
587                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
588                 {\r
589                         return XmlConvert.ToDecimal (Normalize (s));\r
590                 }\r
591         }\r
592 \r
593         // xs:negativeInteger\r
594         public class XsdNegativeInteger : XsdNonPositiveInteger\r
595         {\r
596                 public override Type ValueType {\r
597 \r
598                         get { return typeof (decimal); }\r
599                 }\r
600 \r
601                 public override object ParseValue (string s,\r
602                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
603                 {\r
604                         return XmlConvert.ToDecimal (Normalize (s));\r
605                 }\r
606         }\r
607 \r
608         // xs:float\r
609         public class XsdFloat : XsdDecimal\r
610         {\r
611                 public override Type ValueType {\r
612                         get { return typeof (float); }\r
613                 }\r
614 \r
615                 public override object ParseValue (string s,\r
616                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
617                 {\r
618                         return XmlConvert.ToSingle (Normalize (s));\r
619                 }\r
620         }\r
621 \r
622 \r
623         // xs:base64Binary\r
624         public class XsdBase64Binary : XsdString\r
625         {\r
626                 internal XsdBase64Binary ()\r
627                 {\r
628                 }\r
629 \r
630                 public override Type ValueType {\r
631                         get { return typeof (byte[]); }\r
632                 }\r
633 \r
634                 public override object ParseValue (string s,\r
635                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
636                 {\r
637                         return Convert.FromBase64String (s);\r
638                 }\r
639         }\r
640 \r
641         // xs:boolean\r
642         public class XsdBoolean : XsdAnySimpleType\r
643         {\r
644                 internal XsdBoolean ()\r
645                 {\r
646                 }\r
647 \r
648                 public override XmlTokenizedType TokenizedType {\r
649                         get { return XmlTokenizedType.CDATA; }\r
650                 }\r
651 \r
652                 public override Type ValueType {\r
653                         get { return typeof (bool); }\r
654                 }\r
655 \r
656                 public override object ParseValue (string s,\r
657                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
658                 {\r
659                         return XmlConvert.ToBoolean (this.Normalize (s));\r
660                 }\r
661 \r
662                 // Fundamental Facets\r
663                 public override bool Bounded {\r
664                         get { return false; }\r
665                 }\r
666                 public override bool Finite {\r
667                         get { return true; }\r
668                 }\r
669                 public override bool Numeric {\r
670                         get { return false; }\r
671                 }\r
672                 public override XsdOrderedFacet Ordered {\r
673                         get { return XsdOrderedFacet.Total; }\r
674                 }\r
675         }\r
676 }\r