2003-07-19 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                 }\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                 // ParseValue () method is as same as that of xs:string\r
270         }\r
271 \r
272         // xs:ENTITY\r
273         public class XsdEntity : XsdName\r
274         {\r
275                 internal XsdEntity ()\r
276                 {\r
277                 }\r
278 \r
279                 public override XmlTokenizedType TokenizedType {\r
280                         get { return XmlTokenizedType.ENTITY; }\r
281                 }\r
282 \r
283                 public override Type ValueType {\r
284                         get { return typeof (string); }\r
285                 }\r
286 \r
287                 // ParseValue () method is as same as that of xs:string\r
288         }\r
289 \r
290 \r
291         // xs:ENTITIES\r
292         public class XsdEntities : XsdName\r
293         {\r
294                 internal XsdEntities ()\r
295                 {\r
296                 }\r
297 \r
298                 public override XmlTokenizedType TokenizedType {\r
299                         get { return XmlTokenizedType.ENTITIES; }\r
300                 }\r
301 \r
302                 public override Type ValueType {\r
303                         get { return typeof (string []); }\r
304                 }\r
305 \r
306                 // ParseValue () method is as same as that of xs:string\r
307         }\r
308 \r
309         // xs:NOTATION\r
310         public class XsdNotation : XsdAnySimpleType\r
311         {\r
312                 internal XsdNotation ()\r
313                 {\r
314                 }\r
315 \r
316                 public override XmlTokenizedType TokenizedType {\r
317                         get { return XmlTokenizedType.NOTATION; }\r
318                 }\r
319 \r
320                 public override Type ValueType {\r
321                         get { return typeof (string); }\r
322                 }\r
323 \r
324                 public override object ParseValue (string s,\r
325                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
326                 {\r
327                         throw new NotImplementedException ();\r
328                 }\r
329 \r
330                 // Fundamental Facets\r
331                 public override bool Bounded {\r
332                         get { return false; }\r
333                 }\r
334                 public override bool Finite {\r
335                         get { return false; }\r
336                 }\r
337                 public override bool Numeric {\r
338                         get { return false; }\r
339                 }\r
340                 public override XsdOrderedFacet Ordered {\r
341                         get { return XsdOrderedFacet.False; }\r
342                 }\r
343 \r
344                 // Constraining Facets\r
345                 public bool HasLengthFacet;\r
346                 public bool HasMaxLengthFacet;\r
347                 public bool HasMinLengthFacet;\r
348                 public int Length;\r
349                 public int MaxLength;\r
350                 public int MinLength;\r
351                 public string Pattern;\r
352                 public ICollection Enumeration;\r
353         }\r
354 \r
355         // xs:decimal\r
356         public class XsdDecimal : XsdAnySimpleType\r
357         {\r
358                 internal XsdDecimal ()\r
359                 {\r
360                 }\r
361 \r
362                 public override XmlTokenizedType TokenizedType {\r
363                         get { return XmlTokenizedType.CDATA; }\r
364                 }\r
365 \r
366                 public override Type ValueType {\r
367                         get { return typeof (decimal); }\r
368                 }\r
369 \r
370                 public override object ParseValue (string s,\r
371                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
372                 {\r
373                         return XmlConvert.ToDecimal (this.Normalize (s));\r
374                 }\r
375 \r
376                 // Fundamental Facets\r
377                 public override bool Bounded {\r
378                         get { return false; }\r
379                 }\r
380                 public override bool Finite {\r
381                         get { return false; }\r
382                 }\r
383                 public override bool Numeric {\r
384                         get { return true; }\r
385                 }\r
386                 public override XsdOrderedFacet Ordered {\r
387                         get { return XsdOrderedFacet.Total; }\r
388                 }\r
389 \r
390                 // Constraining Facets\r
391                 public bool HasLengthFacet;\r
392                 public bool HasMaxLengthFacet;\r
393                 public bool HasMinLengthFacet;\r
394                 public int Length;\r
395                 public int MaxLength;\r
396                 public int MinLength;\r
397                 public string Pattern;\r
398                 public ICollection Enumeration;\r
399         }\r
400 \r
401         // xs:integer\r
402         public class XsdInteger : XsdDecimal\r
403         {\r
404                 // Here it may be bigger than int's (or long's) MaxValue.\r
405                 public override Type ValueType {\r
406                         get { return typeof (decimal); }\r
407                 }\r
408 \r
409                 public override object ParseValue (string s,\r
410                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
411                 {\r
412                         return XmlConvert.ToDecimal (Normalize (s));\r
413                 }\r
414         }\r
415 \r
416         // xs:Long\r
417         public class XsdLong : XsdNonNegativeInteger\r
418         {\r
419                 public override Type ValueType {\r
420                         get { return typeof (long); }\r
421                 }\r
422 \r
423                 public override object ParseValue (string s,\r
424                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
425                 {\r
426                         return XmlConvert.ToInt64 (Normalize (s));\r
427                 }\r
428         }\r
429 \r
430         // xs:Int\r
431         public class XsdInt : XsdLong\r
432         {\r
433                 public override Type ValueType {\r
434                         get { return typeof (int); }\r
435                 }\r
436 \r
437                 public override object ParseValue (string s,\r
438                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
439                 {\r
440                         return XmlConvert.ToInt32 (Normalize (s));\r
441                 }\r
442         }\r
443 \r
444 \r
445         // xs:Short\r
446         public class XsdShort : XsdInt\r
447         {\r
448                 public override Type ValueType {\r
449                         get { return typeof (short); }\r
450                 }\r
451 \r
452                 public override object ParseValue (string s,\r
453                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
454                 {\r
455                         return XmlConvert.ToInt16 (Normalize (s));\r
456                 }\r
457         }\r
458 \r
459         // xs:Byte\r
460         public class XsdByte : XsdShort\r
461         {\r
462                 public override Type ValueType {\r
463                         get { return typeof (byte); }\r
464                 }\r
465 \r
466                 public override object ParseValue (string s,\r
467                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
468                 {\r
469                         return XmlConvert.ToByte (Normalize (s));\r
470                 }\r
471         }\r
472 \r
473         // xs:nonNegativeInteger\r
474         [CLSCompliant (false)]\r
475         public class XsdNonNegativeInteger : XsdInteger\r
476         {\r
477                 public override Type ValueType {\r
478                         get { return typeof (decimal); }\r
479                 }\r
480 \r
481                 [CLSCompliant (false)]\r
482                 public override object ParseValue (string s,\r
483                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
484                 {\r
485                         return XmlConvert.ToDecimal (Normalize (s));\r
486                 }\r
487         }\r
488 \r
489         // xs:unsignedLong\r
490         [CLSCompliant (false)]\r
491         public class XsdUnsignedLong : XsdNonNegativeInteger\r
492         {\r
493                 public override Type ValueType {\r
494                         get { return typeof (ulong); }\r
495                 }\r
496 \r
497                 public override object ParseValue (string s,\r
498                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
499                 {\r
500                         return XmlConvert.ToUInt64 (Normalize (s));\r
501                 }\r
502         }\r
503 \r
504         // xs:unsignedInt\r
505         [CLSCompliant (false)]\r
506         public class XsdUnsignedInt : XsdUnsignedLong\r
507         {\r
508                 public override Type ValueType {\r
509                         get { return typeof (uint); }\r
510                 }\r
511 \r
512                 public override object ParseValue (string s,\r
513                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
514                 {\r
515                         return XmlConvert.ToUInt32 (Normalize (s));\r
516                 }\r
517         }\r
518 \r
519 \r
520         // xs:unsignedShort\r
521         [CLSCompliant (false)]\r
522         public class XsdUnsignedShort : XsdUnsignedInt\r
523         {\r
524                 public override Type ValueType {\r
525                         get { return typeof (ushort); }\r
526                 }\r
527 \r
528                 public override object ParseValue (string s,\r
529                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
530                 {\r
531                         return XmlConvert.ToUInt16 (Normalize (s));\r
532                 }\r
533         }\r
534 \r
535         // xs:unsignedByte\r
536         [CLSCompliant (false)]\r
537         public class XsdUnsignedByte : XsdUnsignedShort\r
538         {\r
539                 public override Type ValueType {\r
540                         get { return typeof (byte); }\r
541                 }\r
542 \r
543                 public override object ParseValue (string s,\r
544                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
545                 {\r
546                         return XmlConvert.ToByte(Normalize (s));\r
547                 }\r
548         }\r
549 \r
550         // xs:positiveInteger\r
551         public class XsdPositiveInteger : XsdNonNegativeInteger\r
552         {\r
553                 // It returns decimal, instead of int or long.\r
554                 // Maybe MS developers thought about big integer...\r
555                 public override Type ValueType {\r
556                         get { return typeof (decimal); }\r
557                 }\r
558 \r
559                 public override object ParseValue (string s,\r
560                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
561                 {\r
562                         return XmlConvert.ToDecimal (Normalize (s));\r
563                 }\r
564         }\r
565 \r
566         // xs:nonPositiveInteger\r
567         public class XsdNonPositiveInteger : XsdInteger\r
568         {\r
569                 public override Type ValueType {\r
570                         get { return typeof (decimal); }\r
571                 }\r
572 \r
573                 public override object ParseValue (string s,\r
574                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
575                 {\r
576                         return XmlConvert.ToDecimal (Normalize (s));\r
577                 }\r
578         }\r
579 \r
580         // xs:negativeInteger\r
581         public class XsdNegativeInteger : XsdNonPositiveInteger\r
582         {\r
583                 public override Type ValueType {\r
584                         get { return typeof (decimal); }\r
585                 }\r
586 \r
587                 public override object ParseValue (string s,\r
588                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
589                 {\r
590                         return XmlConvert.ToDecimal (Normalize (s));\r
591                 }\r
592         }\r
593 \r
594 }\r