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