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