**** Merged from MCS ****
[mono-project.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaDatatype.cs
blob7abd688076ebaa88838f991904510ef5918b4b26
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 //
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.
29 using System;
30 using System.Collections;
31 using System.Text;
32 using System.Xml;
33 using Mono.Xml.Schema;
35 namespace System.Xml.Schema
37 public abstract class XmlSchemaDatatype
39 protected XmlSchemaDatatype()
43 internal XsdWhitespaceFacet WhitespaceValue =
44 XsdWhitespaceFacet.Preserve;
46 // Common Facets
47 internal virtual XsdWhitespaceFacet Whitespace {
48 get { return WhitespaceValue; }
51 #if NET_2_0
52 public abstract XmlTypeCode TypeCode { get; }
54 public virtual XmlSchemaDatatypeVariety Variety {
55 get {
56 return XmlSchemaDatatypeVariety.Atomic;
59 #endif
61 public abstract XmlTokenizedType TokenizedType { get; }
62 public abstract Type ValueType { get; }
64 // Methods
65 #if NET_2_0
66 [MonoTODO]
67 public virtual object ChangeType (object value, Type targetType)
69 return ChangeType (value, targetType, null);
72 [MonoTODO]
73 public virtual object ChangeType (object value, Type targetType, IXmlNamespaceResolver nsResolver)
75 throw new NotImplementedException ();
78 [MonoTODO]
79 public virtual bool IsDerivedFrom (XmlSchemaDatatype datatype)
81 throw new NotImplementedException ();
83 #endif
85 #if NET_2_0
86 public abstract object ParseValue (string s,
87 XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);
89 internal abstract ValueType ParseValueType (string s,
90 XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);
91 #else
92 public abstract object ParseValue (string s,
93 XmlNameTable nameTable, XmlNamespaceManager nsmgr);
95 internal abstract ValueType ParseValueType (string s,
96 XmlNameTable nameTable, XmlNamespaceManager nsmgr);
97 #endif
99 static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};
101 StringBuilder sb = new StringBuilder ();
102 internal string Normalize (string s)
104 return Normalize (s, Whitespace);
107 internal string Normalize (string s, XsdWhitespaceFacet whitespaceFacet)
109 int idx = s.IndexOfAny (wsChars);
110 if (idx < 0)
111 return s;
112 switch (whitespaceFacet) {
113 case XsdWhitespaceFacet.Collapse:
114 string [] arr = s.Trim ().Split (wsChars);
115 for (int i = 0; i < arr.Length; i++) {
116 string one = arr [i];
117 if (one != "") {
118 sb.Append (one);
119 sb.Append (" ");
122 string result = sb.ToString ();
123 sb.Length = 0;
124 return result.Trim ();
125 case XsdWhitespaceFacet.Replace:
126 sb.Length = 0;
127 sb.Append (s);
128 for (int i = 0; i < sb.Length; i++)
129 switch (sb [i]) {
130 case '\r':
131 case '\n':
132 case '\t':
133 sb [i] = ' ';
134 break;
136 result = sb.ToString ();
137 sb.Length = 0;
138 return result;
139 default:
140 return s;
144 internal static XmlSchemaDatatype FromName (XmlQualifiedName qname)
146 return FromName (qname.Name, qname.Namespace);
149 internal static XmlSchemaDatatype FromName (string localName, string ns)
151 switch (ns) {
152 case XmlSchema.Namespace:
153 break;
154 #if NET_2_0
155 case XmlSchema.XdtNamespace:
156 switch (localName) {
157 case "anyAtomicType":
158 return datatypeAnyAtomicType;
159 case "untypedAtomic":
160 return datatypeUntypedAtomic;
161 case "dayTimeDuration":
162 return datatypeDayTimeDuration;
163 case "yearMonthDuration":
164 return datatypeYearMonthDuration;
166 return null;
167 #endif
168 default:
169 // Maybe invalid name was specified. In such cases, let processors handle them.
170 return null;
173 switch (localName) {
174 case "anySimpleType":
175 return datatypeAnySimpleType;
176 case "string":
177 return datatypeString;
178 case "normalizedString":
179 return datatypeNormalizedString;
180 case "token":
181 return datatypeToken;
182 case "language":
183 return datatypeLanguage;
184 case "NMTOKEN":
185 return datatypeNMToken;
186 case "NMTOKENS":
187 return datatypeNMTokens;
188 case "Name":
189 return datatypeName;
190 case "NCName":
191 return datatypeNCName;
192 case "ID":
193 return datatypeID;
194 case "IDREF":
195 return datatypeIDRef;
196 case "IDREFS":
197 return datatypeIDRefs;
198 case "ENTITY":
199 return datatypeEntity;
200 case "ENTITIES":
201 return datatypeEntities;
202 case "NOTATION":
203 return datatypeNotation;
204 case "decimal":
205 return datatypeDecimal;
206 case "integer":
207 return datatypeInteger;
208 case "long":
209 return datatypeLong;
210 case "int":
211 return datatypeInt;
212 case "short":
213 return datatypeShort;
214 case "byte":
215 return datatypeByte;
216 case "nonPositiveInteger":
217 return datatypeNonPositiveInteger;
218 case "negativeInteger":
219 return datatypeNegativeInteger;
220 case "nonNegativeInteger":
221 return datatypeNonNegativeInteger;
222 case "unsignedLong":
223 return datatypeUnsignedLong;
224 case "unsignedInt":
225 return datatypeUnsignedInt;
226 case "unsignedShort":
227 return datatypeUnsignedShort;
228 case "unsignedByte":
229 return datatypeUnsignedByte;
230 case "positiveInteger":
231 return datatypePositiveInteger;
232 case "float":
233 return datatypeFloat;
234 case "double":
235 return datatypeDouble;
236 case "base64Binary":
237 return datatypeBase64Binary;
238 case "boolean":
239 return datatypeBoolean;
240 case "anyURI":
241 return datatypeAnyURI;
242 case "duration":
243 return datatypeDuration;
244 case "dateTime":
245 return datatypeDateTime;
246 case "date":
247 return datatypeDate;
248 case "time":
249 return datatypeTime;
250 case "hexBinary":
251 return datatypeHexBinary;
252 case "QName":
253 return datatypeQName;
254 case "gYearMonth":
255 return datatypeGYearMonth;
256 case "gMonthDay":
257 return datatypeGMonthDay;
258 case "gYear":
259 return datatypeGYear;
260 case "gMonth":
261 return datatypeGMonth;
262 case "gDay":
263 return datatypeGDay;
264 default:
265 // Maybe invalid name was specified. In such cases, let processors handle them.
266 return null;
270 static readonly XsdAnySimpleType datatypeAnySimpleType = new XsdAnySimpleType ();
271 static readonly XsdString datatypeString = new XsdString ();
272 static readonly XsdNormalizedString datatypeNormalizedString = new XsdNormalizedString ();
273 static readonly XsdToken datatypeToken = new XsdToken ();
274 static readonly XsdLanguage datatypeLanguage = new XsdLanguage ();
275 static readonly XsdNMToken datatypeNMToken = new XsdNMToken ();
276 static readonly XsdNMTokens datatypeNMTokens = new XsdNMTokens ();
277 static readonly XsdName datatypeName = new XsdName ();
278 static readonly XsdNCName datatypeNCName = new XsdNCName ();
279 static readonly XsdID datatypeID = new XsdID ();
280 static readonly XsdIDRef datatypeIDRef = new XsdIDRef ();
281 static readonly XsdIDRefs datatypeIDRefs = new XsdIDRefs ();
282 static readonly XsdEntity datatypeEntity = new XsdEntity ();
283 static readonly XsdEntities datatypeEntities = new XsdEntities ();
284 static readonly XsdNotation datatypeNotation = new XsdNotation ();
285 static readonly XsdDecimal datatypeDecimal = new XsdDecimal ();
286 static readonly XsdInteger datatypeInteger = new XsdInteger ();
287 static readonly XsdLong datatypeLong = new XsdLong ();
288 static readonly XsdInt datatypeInt = new XsdInt ();
289 static readonly XsdShort datatypeShort = new XsdShort ();
290 static readonly XsdByte datatypeByte = new XsdByte ();
291 static readonly XsdNonNegativeInteger datatypeNonNegativeInteger = new XsdNonNegativeInteger ();
292 static readonly XsdPositiveInteger datatypePositiveInteger = new XsdPositiveInteger ();
293 static readonly XsdUnsignedLong datatypeUnsignedLong = new XsdUnsignedLong ();
294 static readonly XsdUnsignedInt datatypeUnsignedInt = new XsdUnsignedInt ();
295 static readonly XsdUnsignedShort datatypeUnsignedShort = new XsdUnsignedShort ();
296 static readonly XsdUnsignedByte datatypeUnsignedByte = new XsdUnsignedByte ();
297 static readonly XsdNonPositiveInteger datatypeNonPositiveInteger = new XsdNonPositiveInteger ();
298 static readonly XsdNegativeInteger datatypeNegativeInteger = new XsdNegativeInteger ();
299 static readonly XsdFloat datatypeFloat = new XsdFloat ();
300 static readonly XsdDouble datatypeDouble = new XsdDouble ();
301 static readonly XsdBase64Binary datatypeBase64Binary = new XsdBase64Binary ();
302 static readonly XsdBoolean datatypeBoolean = new XsdBoolean ();
303 static readonly XsdAnyURI datatypeAnyURI = new XsdAnyURI ();
304 static readonly XsdDuration datatypeDuration = new XsdDuration ();
305 static readonly XsdDateTime datatypeDateTime = new XsdDateTime ();
306 static readonly XsdDate datatypeDate = new XsdDate ();
307 static readonly XsdTime datatypeTime = new XsdTime ();
308 static readonly XsdHexBinary datatypeHexBinary = new XsdHexBinary ();
309 static readonly XsdQName datatypeQName = new XsdQName ();
310 static readonly XsdGYearMonth datatypeGYearMonth = new XsdGYearMonth ();
311 static readonly XsdGMonthDay datatypeGMonthDay = new XsdGMonthDay ();
312 static readonly XsdGYear datatypeGYear = new XsdGYear ();
313 static readonly XsdGMonth datatypeGMonth = new XsdGMonth ();
314 static readonly XsdGDay datatypeGDay = new XsdGDay ();
315 #if NET_2_0
316 static readonly XdtAnyAtomicType datatypeAnyAtomicType
317 = new XdtAnyAtomicType ();
318 static readonly XdtUntypedAtomic datatypeUntypedAtomic
319 = new XdtUntypedAtomic ();
320 static readonly XdtDayTimeDuration datatypeDayTimeDuration
321 = new XdtDayTimeDuration ();
322 static readonly XdtYearMonthDuration datatypeYearMonthDuration
323 = new XdtYearMonthDuration ();
324 #endif