Add MIT license to System.XML.DLL
[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                 public abstract XmlTokenizedType TokenizedType {  get; }\r
52                 public abstract Type ValueType {  get; }\r
53 \r
54                 // Methods\r
55                 public abstract object ParseValue (string s, \r
56                         XmlNameTable nameTable, XmlNamespaceManager nsmgr);\r
57 \r
58                 internal abstract ValueType ParseValueType (string s,\r
59                         XmlNameTable nameTable, XmlNamespaceManager nsmgr);\r
60 \r
61                 static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};\r
62 \r
63                 StringBuilder sb = new StringBuilder ();\r
64                 internal string Normalize (string s)\r
65                 {\r
66                         return Normalize (s, Whitespace);\r
67                 }\r
68 \r
69                 internal string Normalize (string s, XsdWhitespaceFacet whitespaceFacet)\r
70                 {\r
71                         int idx = s.IndexOfAny (wsChars);\r
72                         if (idx < 0)\r
73                                 return s;\r
74                         switch (whitespaceFacet) {\r
75                         case XsdWhitespaceFacet.Collapse:\r
76                                 string [] arr = s.Trim ().Split (wsChars);\r
77                                 for (int i = 0; i < arr.Length; i++) {\r
78                                         string one = arr [i];\r
79                                         if (one != "") {\r
80                                                 sb.Append (one);\r
81                                                 sb.Append (" ");\r
82                                         }\r
83                                 }\r
84                                 string result = sb.ToString ();\r
85                                 sb.Length = 0;\r
86                                 return result.Trim ();\r
87                         case XsdWhitespaceFacet.Replace:\r
88                                 sb.Length = 0;\r
89                                 sb.Append (s);\r
90                                 for (int i = 0; i < sb.Length; i++)\r
91                                         switch (sb [i]) {\r
92                                         case '\r':\r
93                                         case '\n':\r
94                                         case '\t':\r
95                                                 sb [i] = ' ';\r
96                                                 break;\r
97                                         }\r
98                                 result = sb.ToString ();\r
99                                 sb.Length = 0;\r
100                                 return result;\r
101                         default:\r
102                                 return s;\r
103                         }\r
104                 }\r
105 \r
106                 internal static XmlSchemaDatatype FromName (XmlQualifiedName qname)\r
107                 {\r
108                         if (qname.Namespace != XmlSchema.Namespace)\r
109                                 throw new InvalidOperationException ("Namespace " + XmlSchema.Namespace + " is required.");\r
110                         return FromName (qname.Name);\r
111                 }\r
112 \r
113                 internal static XmlSchemaDatatype FromName (string localName)\r
114                 {\r
115                         switch (localName) {\r
116                         case "anySimpleType":\r
117                                 return datatypeAnySimpleType;\r
118                         case "string":\r
119                                 return datatypeString;\r
120                         case "normalizedString":\r
121                                 return datatypeNormalizedString;\r
122                         case "token":\r
123                                 return datatypeToken;\r
124                         case "language":\r
125                                 return datatypeLanguage;\r
126                         case "NMTOKEN":\r
127                                 return datatypeNMToken;\r
128                         case "NMTOKENS":\r
129                                 return datatypeNMTokens;\r
130                         case "Name":\r
131                                 return datatypeName;\r
132                         case "NCName":\r
133                                 return datatypeNCName;\r
134                         case "ID":\r
135                                 return datatypeID;\r
136                         case "IDREF":\r
137                                 return datatypeIDRef;\r
138                         case "IDREFS":\r
139                                 return datatypeIDRefs;\r
140                         case "ENTITY":\r
141                                 return datatypeEntity;\r
142                         case "ENTITIES":\r
143                                 return datatypeEntities;\r
144                         case "NOTATION":\r
145                                 return datatypeNotation;\r
146                         case "decimal":\r
147                                 return datatypeDecimal;\r
148                         case "integer":\r
149                                 return datatypeInteger;\r
150                         case "long":\r
151                                 return datatypeLong;\r
152                         case "int":\r
153                                 return datatypeInt;\r
154                         case "short":\r
155                                 return datatypeShort;\r
156                         case "byte":\r
157                                 return datatypeByte;\r
158                         case "nonPositiveInteger":\r
159                                 return datatypeNonPositiveInteger;\r
160                         case "negativeInteger":\r
161                                 return datatypeNegativeInteger;\r
162                         case "nonNegativeInteger":\r
163                                 return datatypeNonNegativeInteger;\r
164                         case "unsignedLong":\r
165                                 return datatypeUnsignedLong;\r
166                         case "unsignedInt":\r
167                                 return datatypeUnsignedInt;\r
168                         case "unsignedShort":\r
169                                 return datatypeUnsignedShort;\r
170                         case "unsignedByte":\r
171                                 return datatypeUnsignedByte;\r
172                         case "positiveInteger":\r
173                                 return datatypePositiveInteger;\r
174                         case "float":\r
175                                 return datatypeFloat;\r
176                         case "double":\r
177                                 return datatypeDouble;\r
178                         case "base64Binary":\r
179                                 return datatypeBase64Binary;\r
180                         case "boolean":\r
181                                 return datatypeBoolean;\r
182                         case "anyURI":\r
183                                 return datatypeAnyURI;\r
184                         case "duration":\r
185                                 return datatypeDuration;\r
186                         case "dateTime":\r
187                                 return datatypeDateTime;\r
188                         case "date":\r
189                                 return datatypeDate;\r
190                         case "time":\r
191                                 return datatypeTime;\r
192                         case "hexBinary":\r
193                                 return datatypeHexBinary;\r
194                         case "QName":\r
195                                 return datatypeQName;\r
196                         case "gYearMonth":\r
197                                 return datatypeGYearMonth;\r
198                         case "gMonthDay":\r
199                                 return datatypeGMonthDay;\r
200                         case "gYear":\r
201                                 return datatypeGYear;\r
202                         case "gMonth":\r
203                                 return datatypeGMonth;\r
204                         case "gDay":\r
205                                 return datatypeGDay;\r
206                         default:\r
207                                 // Maybe invalid name was specified. In such cases, let processors handle them.\r
208                                 return null;\r
209                         }\r
210                 }\r
211 \r
212                 static readonly XsdAnySimpleType datatypeAnySimpleType = new XsdAnySimpleType ();\r
213                 static readonly XsdString datatypeString = new XsdString ();\r
214                 static readonly XsdNormalizedString datatypeNormalizedString = new XsdNormalizedString ();\r
215                 static readonly XsdToken datatypeToken = new XsdToken ();\r
216                 static readonly XsdLanguage datatypeLanguage = new XsdLanguage ();\r
217                 static readonly XsdNMToken datatypeNMToken = new XsdNMToken ();\r
218                 static readonly XsdNMTokens datatypeNMTokens = new XsdNMTokens ();\r
219                 static readonly XsdName datatypeName = new XsdName ();\r
220                 static readonly XsdNCName datatypeNCName = new XsdNCName ();\r
221                 static readonly XsdID datatypeID = new XsdID ();\r
222                 static readonly XsdIDRef datatypeIDRef = new XsdIDRef ();\r
223                 static readonly XsdIDRefs datatypeIDRefs = new XsdIDRefs ();\r
224                 static readonly XsdEntity datatypeEntity = new XsdEntity ();\r
225                 static readonly XsdEntities datatypeEntities = new XsdEntities ();\r
226                 static readonly XsdNotation datatypeNotation = new XsdNotation ();\r
227                 static readonly XsdDecimal datatypeDecimal = new XsdDecimal ();\r
228                 static readonly XsdInteger datatypeInteger = new XsdInteger ();\r
229                 static readonly XsdLong datatypeLong = new XsdLong ();\r
230                 static readonly XsdInt datatypeInt = new XsdInt ();\r
231                 static readonly XsdShort datatypeShort = new XsdShort ();\r
232                 static readonly XsdByte datatypeByte = new XsdByte ();\r
233                 static readonly XsdNonNegativeInteger datatypeNonNegativeInteger = new XsdNonNegativeInteger ();\r
234                 static readonly XsdPositiveInteger datatypePositiveInteger = new XsdPositiveInteger ();\r
235                 static readonly XsdUnsignedLong datatypeUnsignedLong = new XsdUnsignedLong ();\r
236                 static readonly XsdUnsignedInt datatypeUnsignedInt = new XsdUnsignedInt ();\r
237                 static readonly XsdUnsignedShort datatypeUnsignedShort = new XsdUnsignedShort ();\r
238                 static readonly XsdUnsignedByte datatypeUnsignedByte = new XsdUnsignedByte ();\r
239                 static readonly XsdNonPositiveInteger datatypeNonPositiveInteger = new XsdNonPositiveInteger ();\r
240                 static readonly XsdNegativeInteger datatypeNegativeInteger = new XsdNegativeInteger ();\r
241                 static readonly XsdFloat datatypeFloat = new XsdFloat ();\r
242                 static readonly XsdDouble datatypeDouble = new XsdDouble ();\r
243                 static readonly XsdBase64Binary datatypeBase64Binary = new XsdBase64Binary ();\r
244                 static readonly XsdBoolean datatypeBoolean = new XsdBoolean ();\r
245                 static readonly XsdAnyURI datatypeAnyURI = new XsdAnyURI ();\r
246                 static readonly XsdDuration datatypeDuration = new XsdDuration ();\r
247                 static readonly XsdDateTime datatypeDateTime = new XsdDateTime ();\r
248                 static readonly XsdDate datatypeDate = new XsdDate ();\r
249                 static readonly XsdTime datatypeTime = new XsdTime ();\r
250                 static readonly XsdHexBinary datatypeHexBinary = new XsdHexBinary ();\r
251                 static readonly XsdQName datatypeQName = new XsdQName ();\r
252                 static readonly XsdGYearMonth datatypeGYearMonth = new XsdGYearMonth ();\r
253                 static readonly XsdGMonthDay datatypeGMonthDay = new XsdGMonthDay ();\r
254                 static readonly XsdGYear datatypeGYear = new XsdGYear ();\r
255                 static readonly XsdGMonth datatypeGMonth = new XsdGMonth ();\r
256                 static readonly XsdGDay datatypeGDay = new XsdGDay ();\r
257         }\r
258 }