2004-04-06 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaDatatype.cs
1 //\r
2 // System.Xml.Schema.XmlSchemaDatatype.cs\r
3 //\r
4 // Authors:\r
5 //      Dwivedi, Ajay kumar <Adwiv@Yahoo.com>\r
6 //      Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>\r
7 //\r
8 using System;\r
9 using System.Collections;\r
10 using System.Text;\r
11 using System.Xml;\r
12 using Mono.Xml.Schema;\r
13 \r
14 namespace System.Xml.Schema\r
15 {\r
16         public abstract class XmlSchemaDatatype\r
17         {\r
18                 protected XmlSchemaDatatype()\r
19                 {\r
20                 }\r
21                 \r
22                 internal XsdWhitespaceFacet WhitespaceValue =\r
23                         XsdWhitespaceFacet.Preserve;\r
24 \r
25                 // Common Facets\r
26                 internal virtual XsdWhitespaceFacet Whitespace {\r
27                         get { return WhitespaceValue; }\r
28                 }\r
29 \r
30                 public abstract XmlTokenizedType TokenizedType {  get; }\r
31                 public abstract Type ValueType {  get; }\r
32 \r
33                 // Methods\r
34                 public abstract object ParseValue (string s, \r
35                         XmlNameTable nameTable, XmlNamespaceManager nsmgr);\r
36 \r
37                 internal abstract ValueType ParseValueType (string s,\r
38                         XmlNameTable nameTable, XmlNamespaceManager nsmgr);\r
39 \r
40                 static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};\r
41 \r
42                 StringBuilder sb = new StringBuilder ();\r
43                 internal string Normalize (string s)\r
44                 {\r
45                         return Normalize (s, Whitespace);\r
46                 }\r
47 \r
48                 internal string Normalize (string s, XsdWhitespaceFacet whitespaceFacet)\r
49                 {\r
50                         int idx = s.IndexOfAny (wsChars);\r
51                         if (idx < 0)\r
52                                 return s;\r
53                         switch (whitespaceFacet) {\r
54                         case XsdWhitespaceFacet.Collapse:\r
55                                 string [] arr = s.Trim ().Split (wsChars);\r
56                                 for (int i = 0; i < arr.Length; i++) {\r
57                                         string one = arr [i];\r
58                                         if (one != "") {\r
59                                                 sb.Append (one);\r
60                                                 sb.Append (" ");\r
61                                         }\r
62                                 }\r
63                                 string result = sb.ToString ();\r
64                                 sb.Length = 0;\r
65                                 return result.Trim ();\r
66                         case XsdWhitespaceFacet.Replace:\r
67                                 sb.Length = 0;\r
68                                 sb.Append (s);\r
69                                 for (int i = 0; i < sb.Length; i++)\r
70                                         switch (sb [i]) {\r
71                                         case '\r':\r
72                                         case '\n':\r
73                                         case '\t':\r
74                                                 sb [i] = ' ';\r
75                                                 break;\r
76                                         }\r
77                                 result = sb.ToString ();\r
78                                 sb.Length = 0;\r
79                                 return result;\r
80                         default:\r
81                                 return s;\r
82                         }\r
83                 }\r
84 \r
85                 internal static XmlSchemaDatatype FromName (XmlQualifiedName qname)\r
86                 {\r
87                         if (qname.Namespace != XmlSchema.Namespace)\r
88                                 throw new InvalidOperationException ("Namespace " + XmlSchema.Namespace + " is required.");\r
89                         return FromName (qname.Name);\r
90                 }\r
91 \r
92                 internal static XmlSchemaDatatype FromName (string localName)\r
93                 {\r
94                         switch (localName) {\r
95                         case "anySimpleType":\r
96                                 return datatypeAnySimpleType;\r
97                         case "string":\r
98                                 return datatypeString;\r
99                         case "normalizedString":\r
100                                 return datatypeNormalizedString;\r
101                         case "token":\r
102                                 return datatypeToken;\r
103                         case "language":\r
104                                 return datatypeLanguage;\r
105                         case "NMTOKEN":\r
106                                 return datatypeNMToken;\r
107                         case "NMTOKENS":\r
108                                 return datatypeNMTokens;\r
109                         case "Name":\r
110                                 return datatypeName;\r
111                         case "NCName":\r
112                                 return datatypeNCName;\r
113                         case "ID":\r
114                                 return datatypeID;\r
115                         case "IDREF":\r
116                                 return datatypeIDRef;\r
117                         case "IDREFS":\r
118                                 return datatypeIDRefs;\r
119                         case "ENTITY":\r
120                                 return datatypeEntity;\r
121                         case "ENTITIES":\r
122                                 return datatypeEntities;\r
123                         case "NOTATION":\r
124                                 return datatypeNotation;\r
125                         case "decimal":\r
126                                 return datatypeDecimal;\r
127                         case "integer":\r
128                                 return datatypeInteger;\r
129                         case "long":\r
130                                 return datatypeLong;\r
131                         case "int":\r
132                                 return datatypeInt;\r
133                         case "short":\r
134                                 return datatypeShort;\r
135                         case "byte":\r
136                                 return datatypeByte;\r
137                         case "nonPositiveInteger":\r
138                                 return datatypeNonPositiveInteger;\r
139                         case "negativeInteger":\r
140                                 return datatypeNegativeInteger;\r
141                         case "nonNegativeInteger":\r
142                                 return datatypeNonNegativeInteger;\r
143                         case "unsignedLong":\r
144                                 return datatypeUnsignedLong;\r
145                         case "unsignedInt":\r
146                                 return datatypeUnsignedInt;\r
147                         case "unsignedShort":\r
148                                 return datatypeUnsignedShort;\r
149                         case "unsignedByte":\r
150                                 return datatypeUnsignedByte;\r
151                         case "positiveInteger":\r
152                                 return datatypePositiveInteger;\r
153                         case "float":\r
154                                 return datatypeFloat;\r
155                         case "double":\r
156                                 return datatypeDouble;\r
157                         case "base64Binary":\r
158                                 return datatypeBase64Binary;\r
159                         case "boolean":\r
160                                 return datatypeBoolean;\r
161                         case "anyURI":\r
162                                 return datatypeAnyURI;\r
163                         case "duration":\r
164                                 return datatypeDuration;\r
165                         case "dateTime":\r
166                                 return datatypeDateTime;\r
167                         case "date":\r
168                                 return datatypeDate;\r
169                         case "time":\r
170                                 return datatypeTime;\r
171                         case "hexBinary":\r
172                                 return datatypeHexBinary;\r
173                         case "QName":\r
174                                 return datatypeQName;\r
175                         case "gYearMonth":\r
176                                 return datatypeGYearMonth;\r
177                         case "gMonthDay":\r
178                                 return datatypeGMonthDay;\r
179                         case "gYear":\r
180                                 return datatypeGYear;\r
181                         case "gMonth":\r
182                                 return datatypeGMonth;\r
183                         case "gDay":\r
184                                 return datatypeGDay;\r
185                         default:\r
186                                 // Maybe invalid name was specified. In such cases, let processors handle them.\r
187                                 return null;\r
188                         }\r
189                 }\r
190 \r
191                 private static XsdAnySimpleType datatypeAnySimpleType = new XsdAnySimpleType ();\r
192                 private static XsdString datatypeString = new XsdString ();\r
193                 private static XsdNormalizedString datatypeNormalizedString = new XsdNormalizedString ();\r
194                 private static XsdToken datatypeToken = new XsdToken ();\r
195                 private static XsdLanguage datatypeLanguage = new XsdLanguage ();\r
196                 private static XsdNMToken datatypeNMToken = new XsdNMToken ();\r
197                 private static XsdNMTokens datatypeNMTokens = new XsdNMTokens ();\r
198                 private static XsdName datatypeName = new XsdName ();\r
199                 private static XsdNCName datatypeNCName = new XsdNCName ();\r
200                 private static XsdID datatypeID = new XsdID ();\r
201                 private static XsdIDRef datatypeIDRef = new XsdIDRef ();\r
202                 private static XsdIDRefs datatypeIDRefs = new XsdIDRefs ();\r
203                 private static XsdEntity datatypeEntity = new XsdEntity ();\r
204                 private static XsdEntities datatypeEntities = new XsdEntities ();\r
205                 private static XsdNotation datatypeNotation = new XsdNotation ();\r
206                 private static XsdDecimal datatypeDecimal = new XsdDecimal ();\r
207                 private static XsdInteger datatypeInteger = new XsdInteger ();\r
208                 private static XsdLong datatypeLong = new XsdLong ();\r
209                 private static XsdInt datatypeInt = new XsdInt ();\r
210                 private static XsdShort datatypeShort = new XsdShort ();\r
211                 private static XsdByte datatypeByte = new XsdByte ();\r
212                 private static XsdNonNegativeInteger datatypeNonNegativeInteger = new XsdNonNegativeInteger ();\r
213                 private static XsdPositiveInteger datatypePositiveInteger = new XsdPositiveInteger ();\r
214                 private static XsdUnsignedLong datatypeUnsignedLong = new XsdUnsignedLong ();\r
215                 private static XsdUnsignedInt datatypeUnsignedInt = new XsdUnsignedInt ();\r
216                 private static XsdUnsignedShort datatypeUnsignedShort = new XsdUnsignedShort ();\r
217                 private static XsdUnsignedByte datatypeUnsignedByte = new XsdUnsignedByte ();\r
218                 private static XsdNonPositiveInteger datatypeNonPositiveInteger = new XsdNonPositiveInteger ();\r
219                 private static XsdNegativeInteger datatypeNegativeInteger = new XsdNegativeInteger ();\r
220                 private static XsdFloat datatypeFloat = new XsdFloat ();\r
221                 private static XsdDouble datatypeDouble = new XsdDouble ();\r
222                 private static XsdBase64Binary datatypeBase64Binary = new XsdBase64Binary ();\r
223                 private static XsdBoolean datatypeBoolean = new XsdBoolean ();\r
224                 private static XsdAnyURI datatypeAnyURI = new XsdAnyURI ();\r
225                 private static XsdDuration datatypeDuration = new XsdDuration ();\r
226                 private static XsdDateTime datatypeDateTime = new XsdDateTime ();\r
227                 private static XsdDate datatypeDate = new XsdDate ();\r
228                 private static XsdTime datatypeTime = new XsdTime ();\r
229                 private static XsdHexBinary datatypeHexBinary = new XsdHexBinary ();\r
230                 private static XsdQName datatypeQName = new XsdQName ();\r
231                 private static XsdGYearMonth datatypeGYearMonth = new XsdGYearMonth ();\r
232                 private static XsdGMonthDay datatypeGMonthDay = new XsdGMonthDay ();\r
233                 private static XsdGYear datatypeGYear = new XsdGYear ();\r
234                 private static XsdGMonth datatypeGMonth = new XsdGMonth ();\r
235                 private static XsdGDay datatypeGDay = new XsdGDay ();\r
236         }\r
237 }