2006-01-10 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 virtual XmlTypeCode TypeCode {\r
53                         // Actually no way to verify default value, since\r
54                         // in .NET 2.0 it cannot be derived externally anymore.\r
55                         get { return XmlTypeCode.None; }\r
56                 }\r
57 \r
58                 public virtual XmlSchemaDatatypeVariety Variety {\r
59                         get {\r
60                                 return XmlSchemaDatatypeVariety.Atomic;\r
61                         }\r
62                 }\r
63 #endif\r
64 \r
65                 public abstract XmlTokenizedType TokenizedType {  get; }\r
66                 public abstract Type ValueType {  get; }\r
67 \r
68                 // Methods\r
69 #if NET_2_0\r
70                 [MonoTODO]\r
71                 public virtual object ChangeType (object value, Type targetType)\r
72                 {\r
73                         return ChangeType (value, targetType, null);\r
74                 }\r
75 \r
76                 [MonoTODO]\r
77                 public virtual object ChangeType (object value, Type targetType, IXmlNamespaceResolver nsResolver)\r
78                 {\r
79                         throw new NotImplementedException ();\r
80                 }\r
81 \r
82                 public virtual bool IsDerivedFrom (XmlSchemaDatatype datatype)\r
83                 {\r
84                         // It is documented to return always false, but\r
85                         // actually returns true when the argument is for\r
86                         // the same type (and it does not check null argument).\r
87                         return this == datatype;\r
88                 }\r
89 #endif\r
90 \r
91 #if NET_2_0\r
92                 public abstract object ParseValue (string s, \r
93                         XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);\r
94 \r
95                 internal virtual ValueType ParseValueType (string s,\r
96                         XmlNameTable nameTable, IXmlNamespaceResolver nsmgr)\r
97                 {\r
98                         return null;\r
99                 }\r
100 #else\r
101                 public abstract object ParseValue (string s, \r
102                         XmlNameTable nameTable, XmlNamespaceManager nsmgr);\r
103 \r
104                 internal virtual ValueType ParseValueType (string s,\r
105                         XmlNameTable nameTable, XmlNamespaceManager nsmgr)\r
106                 {\r
107                         return null;\r
108                 }\r
109 #endif\r
110 \r
111                 static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};\r
112 \r
113                 StringBuilder sb = new StringBuilder ();\r
114                 internal string Normalize (string s)\r
115                 {\r
116                         return Normalize (s, Whitespace);\r
117                 }\r
118 \r
119                 internal string Normalize (string s, XsdWhitespaceFacet whitespaceFacet)\r
120                 {\r
121                         int idx = s.IndexOfAny (wsChars);\r
122                         if (idx < 0)\r
123                                 return s;\r
124                         switch (whitespaceFacet) {\r
125                         case XsdWhitespaceFacet.Collapse:\r
126                                 string [] arr = s.Trim ().Split (wsChars);\r
127                                 for (int i = 0; i < arr.Length; i++) {\r
128                                         string one = arr [i];\r
129                                         if (one != "") {\r
130                                                 sb.Append (one);\r
131                                                 sb.Append (" ");\r
132                                         }\r
133                                 }\r
134                                 string result = sb.ToString ();\r
135                                 sb.Length = 0;\r
136                                 return result.Trim ();\r
137                         case XsdWhitespaceFacet.Replace:\r
138                                 sb.Length = 0;\r
139                                 sb.Append (s);\r
140                                 for (int i = 0; i < sb.Length; i++)\r
141                                         switch (sb [i]) {\r
142                                         case '\r':\r
143                                         case '\n':\r
144                                         case '\t':\r
145                                                 sb [i] = ' ';\r
146                                                 break;\r
147                                         }\r
148                                 result = sb.ToString ();\r
149                                 sb.Length = 0;\r
150                                 return result;\r
151                         default:\r
152                                 return s;\r
153                         }\r
154                 }\r
155 \r
156                 internal static XmlSchemaDatatype FromName (XmlQualifiedName qname)\r
157                 {\r
158                         return FromName (qname.Name, qname.Namespace);\r
159                 }\r
160 \r
161                 internal static XmlSchemaDatatype FromName (string localName, string ns)\r
162                 {\r
163                         switch (ns) {\r
164                         case XmlSchema.Namespace:\r
165                                 break;\r
166 #if NET_2_0\r
167                         case XmlSchema.XdtNamespace:\r
168                                 switch (localName) {\r
169                                 case "anyAtomicType":\r
170                                         return datatypeAnyAtomicType;\r
171                                 case "untypedAtomic":\r
172                                         return datatypeUntypedAtomic;\r
173                                 case "dayTimeDuration":\r
174                                         return datatypeDayTimeDuration;\r
175                                 case "yearMonthDuration":\r
176                                         return datatypeYearMonthDuration;\r
177                                 }\r
178                                 return null;\r
179 #endif\r
180                         default:\r
181                                 // Maybe invalid name was specified. In such cases, let processors handle them.\r
182                                 return null;\r
183                         }\r
184 \r
185                         switch (localName) {\r
186                         case "anySimpleType":\r
187                                 return datatypeAnySimpleType;\r
188                         case "string":\r
189                                 return datatypeString;\r
190                         case "normalizedString":\r
191                                 return datatypeNormalizedString;\r
192                         case "token":\r
193                                 return datatypeToken;\r
194                         case "language":\r
195                                 return datatypeLanguage;\r
196                         case "NMTOKEN":\r
197                                 return datatypeNMToken;\r
198                         case "NMTOKENS":\r
199                                 return datatypeNMTokens;\r
200                         case "Name":\r
201                                 return datatypeName;\r
202                         case "NCName":\r
203                                 return datatypeNCName;\r
204                         case "ID":\r
205                                 return datatypeID;\r
206                         case "IDREF":\r
207                                 return datatypeIDRef;\r
208                         case "IDREFS":\r
209                                 return datatypeIDRefs;\r
210                         case "ENTITY":\r
211                                 return datatypeEntity;\r
212                         case "ENTITIES":\r
213                                 return datatypeEntities;\r
214                         case "NOTATION":\r
215                                 return datatypeNotation;\r
216                         case "decimal":\r
217                                 return datatypeDecimal;\r
218                         case "integer":\r
219                                 return datatypeInteger;\r
220                         case "long":\r
221                                 return datatypeLong;\r
222                         case "int":\r
223                                 return datatypeInt;\r
224                         case "short":\r
225                                 return datatypeShort;\r
226                         case "byte":\r
227                                 return datatypeByte;\r
228                         case "nonPositiveInteger":\r
229                                 return datatypeNonPositiveInteger;\r
230                         case "negativeInteger":\r
231                                 return datatypeNegativeInteger;\r
232                         case "nonNegativeInteger":\r
233                                 return datatypeNonNegativeInteger;\r
234                         case "unsignedLong":\r
235                                 return datatypeUnsignedLong;\r
236                         case "unsignedInt":\r
237                                 return datatypeUnsignedInt;\r
238                         case "unsignedShort":\r
239                                 return datatypeUnsignedShort;\r
240                         case "unsignedByte":\r
241                                 return datatypeUnsignedByte;\r
242                         case "positiveInteger":\r
243                                 return datatypePositiveInteger;\r
244                         case "float":\r
245                                 return datatypeFloat;\r
246                         case "double":\r
247                                 return datatypeDouble;\r
248                         case "base64Binary":\r
249                                 return datatypeBase64Binary;\r
250                         case "boolean":\r
251                                 return datatypeBoolean;\r
252                         case "anyURI":\r
253                                 return datatypeAnyURI;\r
254                         case "duration":\r
255                                 return datatypeDuration;\r
256                         case "dateTime":\r
257                                 return datatypeDateTime;\r
258                         case "date":\r
259                                 return datatypeDate;\r
260                         case "time":\r
261                                 return datatypeTime;\r
262                         case "hexBinary":\r
263                                 return datatypeHexBinary;\r
264                         case "QName":\r
265                                 return datatypeQName;\r
266                         case "gYearMonth":\r
267                                 return datatypeGYearMonth;\r
268                         case "gMonthDay":\r
269                                 return datatypeGMonthDay;\r
270                         case "gYear":\r
271                                 return datatypeGYear;\r
272                         case "gMonth":\r
273                                 return datatypeGMonth;\r
274                         case "gDay":\r
275                                 return datatypeGDay;\r
276                         default:\r
277                                 // Maybe invalid name was specified. In such cases, let processors handle them.\r
278                                 return null;\r
279                         }\r
280                 }\r
281 \r
282                 static readonly XsdAnySimpleType datatypeAnySimpleType = new XsdAnySimpleType ();\r
283                 static readonly XsdString datatypeString = new XsdString ();\r
284                 static readonly XsdNormalizedString datatypeNormalizedString = new XsdNormalizedString ();\r
285                 static readonly XsdToken datatypeToken = new XsdToken ();\r
286                 static readonly XsdLanguage datatypeLanguage = new XsdLanguage ();\r
287                 static readonly XsdNMToken datatypeNMToken = new XsdNMToken ();\r
288                 static readonly XsdNMTokens datatypeNMTokens = new XsdNMTokens ();\r
289                 static readonly XsdName datatypeName = new XsdName ();\r
290                 static readonly XsdNCName datatypeNCName = new XsdNCName ();\r
291                 static readonly XsdID datatypeID = new XsdID ();\r
292                 static readonly XsdIDRef datatypeIDRef = new XsdIDRef ();\r
293                 static readonly XsdIDRefs datatypeIDRefs = new XsdIDRefs ();\r
294                 static readonly XsdEntity datatypeEntity = new XsdEntity ();\r
295                 static readonly XsdEntities datatypeEntities = new XsdEntities ();\r
296                 static readonly XsdNotation datatypeNotation = new XsdNotation ();\r
297                 static readonly XsdDecimal datatypeDecimal = new XsdDecimal ();\r
298                 static readonly XsdInteger datatypeInteger = new XsdInteger ();\r
299                 static readonly XsdLong datatypeLong = new XsdLong ();\r
300                 static readonly XsdInt datatypeInt = new XsdInt ();\r
301                 static readonly XsdShort datatypeShort = new XsdShort ();\r
302                 static readonly XsdByte datatypeByte = new XsdByte ();\r
303                 static readonly XsdNonNegativeInteger datatypeNonNegativeInteger = new XsdNonNegativeInteger ();\r
304                 static readonly XsdPositiveInteger datatypePositiveInteger = new XsdPositiveInteger ();\r
305                 static readonly XsdUnsignedLong datatypeUnsignedLong = new XsdUnsignedLong ();\r
306                 static readonly XsdUnsignedInt datatypeUnsignedInt = new XsdUnsignedInt ();\r
307                 static readonly XsdUnsignedShort datatypeUnsignedShort = new XsdUnsignedShort ();\r
308                 static readonly XsdUnsignedByte datatypeUnsignedByte = new XsdUnsignedByte ();\r
309                 static readonly XsdNonPositiveInteger datatypeNonPositiveInteger = new XsdNonPositiveInteger ();\r
310                 static readonly XsdNegativeInteger datatypeNegativeInteger = new XsdNegativeInteger ();\r
311                 static readonly XsdFloat datatypeFloat = new XsdFloat ();\r
312                 static readonly XsdDouble datatypeDouble = new XsdDouble ();\r
313                 static readonly XsdBase64Binary datatypeBase64Binary = new XsdBase64Binary ();\r
314                 static readonly XsdBoolean datatypeBoolean = new XsdBoolean ();\r
315                 static readonly XsdAnyURI datatypeAnyURI = new XsdAnyURI ();\r
316                 static readonly XsdDuration datatypeDuration = new XsdDuration ();\r
317                 static readonly XsdDateTime datatypeDateTime = new XsdDateTime ();\r
318                 static readonly XsdDate datatypeDate = new XsdDate ();\r
319                 static readonly XsdTime datatypeTime = new XsdTime ();\r
320                 static readonly XsdHexBinary datatypeHexBinary = new XsdHexBinary ();\r
321                 static readonly XsdQName datatypeQName = new XsdQName ();\r
322                 static readonly XsdGYearMonth datatypeGYearMonth = new XsdGYearMonth ();\r
323                 static readonly XsdGMonthDay datatypeGMonthDay = new XsdGMonthDay ();\r
324                 static readonly XsdGYear datatypeGYear = new XsdGYear ();\r
325                 static readonly XsdGMonth datatypeGMonth = new XsdGMonth ();\r
326                 static readonly XsdGDay datatypeGDay = new XsdGDay ();\r
327 #if NET_2_0\r
328                 static readonly XdtAnyAtomicType datatypeAnyAtomicType\r
329                         = new XdtAnyAtomicType ();\r
330                 static readonly XdtUntypedAtomic datatypeUntypedAtomic\r
331                         = new XdtUntypedAtomic ();\r
332                 static readonly XdtDayTimeDuration datatypeDayTimeDuration\r
333                         = new XdtDayTimeDuration ();\r
334                 static readonly XdtYearMonthDuration datatypeYearMonthDuration\r
335                         = new XdtYearMonthDuration ();\r
336 #endif\r
337 \r
338         }\r
339 }