2004-05-05 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
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29 using System;\r
30 using System.Collections;\r
31 using System.Text;\r
32 using System.Xml;\r
33 using Mono.Xml.Schema;\r
34 \r
35 namespace System.Xml.Schema\r
36 {\r
37         public abstract class XmlSchemaDatatype\r
38         {\r
39                 protected XmlSchemaDatatype()\r
40                 {\r
41                 }\r
42                 \r
43                 internal XsdWhitespaceFacet WhitespaceValue =\r
44                         XsdWhitespaceFacet.Preserve;\r
45 \r
46                 // Common Facets\r
47                 internal virtual XsdWhitespaceFacet Whitespace {\r
48                         get { return WhitespaceValue; }\r
49                 }\r
50 \r
51 #if NET_2_0\r
52                 public abstract XmlTypeCode TypeCode { get; }\r
53 \r
54                 public virtual XmlSchemaDatatypeVariety Variety {\r
55                         get {\r
56                                 return XmlSchemaDatatypeVariety.Atomic;\r
57                         }\r
58                 }\r
59 #endif\r
60 \r
61                 public abstract XmlTokenizedType TokenizedType {  get; }\r
62                 public abstract Type ValueType {  get; }\r
63 \r
64                 // Methods\r
65 #if NET_2_0\r
66                 [MonoTODO]\r
67                 public virtual object ChangeType (object value, Type targetType)\r
68                 {\r
69                         return ChangeType (value, targetType, null);\r
70                 }\r
71 \r
72                 [MonoTODO]\r
73                 public virtual object ChangeType (object value, Type targetType, IXmlNamespaceResolver nsResolver)\r
74                 {\r
75                         throw new NotImplementedException ();\r
76                 }\r
77 \r
78                 [MonoTODO]\r
79                 public virtual bool IsDerivedFrom (XmlSchemaDatatype datatype)\r
80                 {\r
81                         throw new NotImplementedException ();\r
82                 }\r
83 #endif\r
84 \r
85 #if NET_2_0\r
86                 public abstract object ParseValue (string s, \r
87                         XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);\r
88 \r
89                 internal abstract ValueType ParseValueType (string s,\r
90                         XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);\r
91 #else\r
92                 public abstract object ParseValue (string s, \r
93                         XmlNameTable nameTable, XmlNamespaceManager nsmgr);\r
94 \r
95                 internal abstract ValueType ParseValueType (string s,\r
96                         XmlNameTable nameTable, XmlNamespaceManager nsmgr);\r
97 #endif\r
98 \r
99                 static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};\r
100 \r
101                 StringBuilder sb = new StringBuilder ();\r
102                 internal string Normalize (string s)\r
103                 {\r
104                         return Normalize (s, Whitespace);\r
105                 }\r
106 \r
107                 internal string Normalize (string s, XsdWhitespaceFacet whitespaceFacet)\r
108                 {\r
109                         int idx = s.IndexOfAny (wsChars);\r
110                         if (idx < 0)\r
111                                 return s;\r
112                         switch (whitespaceFacet) {\r
113                         case XsdWhitespaceFacet.Collapse:\r
114                                 string [] arr = s.Trim ().Split (wsChars);\r
115                                 for (int i = 0; i < arr.Length; i++) {\r
116                                         string one = arr [i];\r
117                                         if (one != "") {\r
118                                                 sb.Append (one);\r
119                                                 sb.Append (" ");\r
120                                         }\r
121                                 }\r
122                                 string result = sb.ToString ();\r
123                                 sb.Length = 0;\r
124                                 return result.Trim ();\r
125                         case XsdWhitespaceFacet.Replace:\r
126                                 sb.Length = 0;\r
127                                 sb.Append (s);\r
128                                 for (int i = 0; i < sb.Length; i++)\r
129                                         switch (sb [i]) {\r
130                                         case '\r':\r
131                                         case '\n':\r
132                                         case '\t':\r
133                                                 sb [i] = ' ';\r
134                                                 break;\r
135                                         }\r
136                                 result = sb.ToString ();\r
137                                 sb.Length = 0;\r
138                                 return result;\r
139                         default:\r
140                                 return s;\r
141                         }\r
142                 }\r
143 \r
144                 internal static XmlSchemaDatatype FromName (XmlQualifiedName qname)\r
145                 {\r
146                         return FromName (qname.Name, qname.Namespace);\r
147                 }\r
148 \r
149                 internal static XmlSchemaDatatype FromName (string localName, string ns)\r
150                 {\r
151                         switch (ns) {\r
152                         case XmlSchema.Namespace:\r
153                                 break;\r
154 #if NET_2_0\r
155                         case XmlSchema.XdtNamespace:\r
156                                 switch (localName) {\r
157                                 case "anyAtomicType":\r
158                                         return datatypeAnyAtomicType;\r
159                                 case "untypedAtomic":\r
160                                         return datatypeUntypedAtomic;\r
161                                 case "dayTimeDuration":\r
162                                         return datatypeDayTimeDuration;\r
163                                 case "yearMonthDuration":\r
164                                         return datatypeYearMonthDuration;\r
165                                 }\r
166                                 return null;\r
167 #endif\r
168                         default:\r
169                                 // Maybe invalid name was specified. In such cases, let processors handle them.\r
170                                 return null;\r
171                         }\r
172 \r
173                         switch (localName) {\r
174                         case "anySimpleType":\r
175                                 return datatypeAnySimpleType;\r
176                         case "string":\r
177                                 return datatypeString;\r
178                         case "normalizedString":\r
179                                 return datatypeNormalizedString;\r
180                         case "token":\r
181                                 return datatypeToken;\r
182                         case "language":\r
183                                 return datatypeLanguage;\r
184                         case "NMTOKEN":\r
185                                 return datatypeNMToken;\r
186                         case "NMTOKENS":\r
187                                 return datatypeNMTokens;\r
188                         case "Name":\r
189                                 return datatypeName;\r
190                         case "NCName":\r
191                                 return datatypeNCName;\r
192                         case "ID":\r
193                                 return datatypeID;\r
194                         case "IDREF":\r
195                                 return datatypeIDRef;\r
196                         case "IDREFS":\r
197                                 return datatypeIDRefs;\r
198                         case "ENTITY":\r
199                                 return datatypeEntity;\r
200                         case "ENTITIES":\r
201                                 return datatypeEntities;\r
202                         case "NOTATION":\r
203                                 return datatypeNotation;\r
204                         case "decimal":\r
205                                 return datatypeDecimal;\r
206                         case "integer":\r
207                                 return datatypeInteger;\r
208                         case "long":\r
209                                 return datatypeLong;\r
210                         case "int":\r
211                                 return datatypeInt;\r
212                         case "short":\r
213                                 return datatypeShort;\r
214                         case "byte":\r
215                                 return datatypeByte;\r
216                         case "nonPositiveInteger":\r
217                                 return datatypeNonPositiveInteger;\r
218                         case "negativeInteger":\r
219                                 return datatypeNegativeInteger;\r
220                         case "nonNegativeInteger":\r
221                                 return datatypeNonNegativeInteger;\r
222                         case "unsignedLong":\r
223                                 return datatypeUnsignedLong;\r
224                         case "unsignedInt":\r
225                                 return datatypeUnsignedInt;\r
226                         case "unsignedShort":\r
227                                 return datatypeUnsignedShort;\r
228                         case "unsignedByte":\r
229                                 return datatypeUnsignedByte;\r
230                         case "positiveInteger":\r
231                                 return datatypePositiveInteger;\r
232                         case "float":\r
233                                 return datatypeFloat;\r
234                         case "double":\r
235                                 return datatypeDouble;\r
236                         case "base64Binary":\r
237                                 return datatypeBase64Binary;\r
238                         case "boolean":\r
239                                 return datatypeBoolean;\r
240                         case "anyURI":\r
241                                 return datatypeAnyURI;\r
242                         case "duration":\r
243                                 return datatypeDuration;\r
244                         case "dateTime":\r
245                                 return datatypeDateTime;\r
246                         case "date":\r
247                                 return datatypeDate;\r
248                         case "time":\r
249                                 return datatypeTime;\r
250                         case "hexBinary":\r
251                                 return datatypeHexBinary;\r
252                         case "QName":\r
253                                 return datatypeQName;\r
254                         case "gYearMonth":\r
255                                 return datatypeGYearMonth;\r
256                         case "gMonthDay":\r
257                                 return datatypeGMonthDay;\r
258                         case "gYear":\r
259                                 return datatypeGYear;\r
260                         case "gMonth":\r
261                                 return datatypeGMonth;\r
262                         case "gDay":\r
263                                 return datatypeGDay;\r
264                         default:\r
265                                 // Maybe invalid name was specified. In such cases, let processors handle them.\r
266                                 return null;\r
267                         }\r
268                 }\r
269 \r
270                 static readonly XsdAnySimpleType datatypeAnySimpleType = new XsdAnySimpleType ();\r
271                 static readonly XsdString datatypeString = new XsdString ();\r
272                 static readonly XsdNormalizedString datatypeNormalizedString = new XsdNormalizedString ();\r
273                 static readonly XsdToken datatypeToken = new XsdToken ();\r
274                 static readonly XsdLanguage datatypeLanguage = new XsdLanguage ();\r
275                 static readonly XsdNMToken datatypeNMToken = new XsdNMToken ();\r
276                 static readonly XsdNMTokens datatypeNMTokens = new XsdNMTokens ();\r
277                 static readonly XsdName datatypeName = new XsdName ();\r
278                 static readonly XsdNCName datatypeNCName = new XsdNCName ();\r
279                 static readonly XsdID datatypeID = new XsdID ();\r
280                 static readonly XsdIDRef datatypeIDRef = new XsdIDRef ();\r
281                 static readonly XsdIDRefs datatypeIDRefs = new XsdIDRefs ();\r
282                 static readonly XsdEntity datatypeEntity = new XsdEntity ();\r
283                 static readonly XsdEntities datatypeEntities = new XsdEntities ();\r
284                 static readonly XsdNotation datatypeNotation = new XsdNotation ();\r
285                 static readonly XsdDecimal datatypeDecimal = new XsdDecimal ();\r
286                 static readonly XsdInteger datatypeInteger = new XsdInteger ();\r
287                 static readonly XsdLong datatypeLong = new XsdLong ();\r
288                 static readonly XsdInt datatypeInt = new XsdInt ();\r
289                 static readonly XsdShort datatypeShort = new XsdShort ();\r
290                 static readonly XsdByte datatypeByte = new XsdByte ();\r
291                 static readonly XsdNonNegativeInteger datatypeNonNegativeInteger = new XsdNonNegativeInteger ();\r
292                 static readonly XsdPositiveInteger datatypePositiveInteger = new XsdPositiveInteger ();\r
293                 static readonly XsdUnsignedLong datatypeUnsignedLong = new XsdUnsignedLong ();\r
294                 static readonly XsdUnsignedInt datatypeUnsignedInt = new XsdUnsignedInt ();\r
295                 static readonly XsdUnsignedShort datatypeUnsignedShort = new XsdUnsignedShort ();\r
296                 static readonly XsdUnsignedByte datatypeUnsignedByte = new XsdUnsignedByte ();\r
297                 static readonly XsdNonPositiveInteger datatypeNonPositiveInteger = new XsdNonPositiveInteger ();\r
298                 static readonly XsdNegativeInteger datatypeNegativeInteger = new XsdNegativeInteger ();\r
299                 static readonly XsdFloat datatypeFloat = new XsdFloat ();\r
300                 static readonly XsdDouble datatypeDouble = new XsdDouble ();\r
301                 static readonly XsdBase64Binary datatypeBase64Binary = new XsdBase64Binary ();\r
302                 static readonly XsdBoolean datatypeBoolean = new XsdBoolean ();\r
303                 static readonly XsdAnyURI datatypeAnyURI = new XsdAnyURI ();\r
304                 static readonly XsdDuration datatypeDuration = new XsdDuration ();\r
305                 static readonly XsdDateTime datatypeDateTime = new XsdDateTime ();\r
306                 static readonly XsdDate datatypeDate = new XsdDate ();\r
307                 static readonly XsdTime datatypeTime = new XsdTime ();\r
308                 static readonly XsdHexBinary datatypeHexBinary = new XsdHexBinary ();\r
309                 static readonly XsdQName datatypeQName = new XsdQName ();\r
310                 static readonly XsdGYearMonth datatypeGYearMonth = new XsdGYearMonth ();\r
311                 static readonly XsdGMonthDay datatypeGMonthDay = new XsdGMonthDay ();\r
312                 static readonly XsdGYear datatypeGYear = new XsdGYear ();\r
313                 static readonly XsdGMonth datatypeGMonth = new XsdGMonth ();\r
314                 static readonly XsdGDay datatypeGDay = new XsdGDay ();\r
315 #if NET_2_0\r
316                 static readonly XdtAnyAtomicType datatypeAnyAtomicType\r
317                         = new XdtAnyAtomicType ();\r
318                 static readonly XdtUntypedAtomic datatypeUntypedAtomic\r
319                         = new XdtUntypedAtomic ();\r
320                 static readonly XdtDayTimeDuration datatypeDayTimeDuration\r
321                         = new XdtDayTimeDuration ();\r
322                 static readonly XdtYearMonthDuration datatypeYearMonthDuration\r
323                         = new XdtYearMonthDuration ();\r
324 #endif\r
325 \r
326         }\r
327 }