5 // Dwivedi, Ajay kumar Adwiv@Yahoo.com
\r
6 // Atsushi Enomoto atsushi@ximian.com
\r
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:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
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.
31 using System.ComponentModel;
\r
32 using Mono.Xml.Schema;
\r
33 using System.Xml.Serialization;
\r
34 #if NET_2_0_in_the_future
\r
35 using MS.Internal.Xml;
\r
38 namespace System.Xml.Schema
\r
41 /// Summary description for XmlSchemaType.
\r
43 public class XmlSchemaType : XmlSchemaAnnotated
\r
46 static XmlValueConverter defaultConverter =
\r
47 new XsdStringConverter (XmlTypeCode.None);
\r
50 private XmlSchemaDerivationMethod final;
\r
51 private bool isMixed;
\r
52 private string name;
\r
56 private XmlValueConverter converter;
\r
59 internal XmlQualifiedName BaseSchemaTypeName;
\r
60 internal XmlSchemaType BaseXmlSchemaTypeInternal;
\r
61 internal XmlSchemaDatatype DatatypeInternal;
\r
62 internal XmlSchemaDerivationMethod resolvedDerivedBy;
\r
63 internal XmlSchemaDerivationMethod finalResolved;
\r
64 internal XmlQualifiedName QNameInternal;
\r
66 public XmlSchemaType ()
\r
68 final = XmlSchemaDerivationMethod.None;
\r
69 QNameInternal = XmlQualifiedName.Empty;
\r
73 [System.Xml.Serialization.XmlAttribute("name")]
\r
74 public string Name {
\r
76 set{ name = value; }
\r
79 [DefaultValue(XmlSchemaDerivationMethod.None)]
\r
80 [System.Xml.Serialization.XmlAttribute("final")]
\r
81 public XmlSchemaDerivationMethod Final {
\r
82 get{ return final; }
\r
83 set{ final = value; }
\r
87 #region Post Compilation Schema Information
\r
89 public XmlQualifiedName QualifiedName {
\r
90 get{ return QNameInternal; }
\r
94 public XmlSchemaDerivationMethod FinalResolved {
\r
95 get{ return finalResolved; }
\r
100 [Obsolete ("This property is going away. Use BaseXmlSchemaType instead")]
\r
102 public object BaseSchemaType {
\r
104 if (BaseXmlSchemaType != null)
\r
105 return BaseXmlSchemaType;
\r
106 else if (this == XmlSchemaComplexType.AnyType)
\r
107 return null; // This property is designed so.
\r
114 [MonoTODO ("This property works as always returning a valid schema type.")]
\r
115 // In .NET 2.0, all schema types used in schema documents must
\r
116 // be XmlSchemaType, even if it is primitive type, in terms of
\r
117 // non-obsolete System.Xml.Schema members.
\r
119 // To modify this property, we have to make sure that it does
\r
120 // not affect to any compilation/validation logic.
\r
122 public XmlSchemaType BaseXmlSchemaType {
\r
124 internal XmlSchemaType BaseXmlSchemaType {
\r
126 get { return BaseXmlSchemaTypeInternal; }
\r
130 public XmlSchemaDerivationMethod DerivedBy {
\r
131 get{ return resolvedDerivedBy; }
\r
135 public XmlSchemaDatatype Datatype {
\r
136 get{ return DatatypeInternal; }
\r
140 public virtual bool IsMixed {
\r
141 get{ return isMixed; }
\r
142 set{ isMixed = value; }
\r
147 // LAMESPEC: for IDREFS it returns Idref. for ENTITIES
\r
148 // it returns Entity. for NMTOKENS it returns NmToken.
\r
150 public XmlTypeCode TypeCode {
\r
152 if (this == XmlSchemaComplexType.AnyType)
\r
153 return XmlTypeCode.Item;
\r
154 if (DatatypeInternal == XmlSchemaSimpleType.AnySimpleType)
\r
155 return XmlTypeCode.AnyAtomicType;
\r
156 if (this == XmlSchemaSimpleType.XsIDRefs)
\r
157 return XmlTypeCode.Idref;
\r
158 if (this == XmlSchemaSimpleType.XsEntities)
\r
159 return XmlTypeCode.Entity;
\r
160 if (this == XmlSchemaSimpleType.XsNMTokens)
\r
161 return XmlTypeCode.NmToken;
\r
162 if (DatatypeInternal != null)
\r
163 return DatatypeInternal.TypeCode;
\r
164 return BaseXmlSchemaType.TypeCode;
\r
170 [CLSCompliant(false)]
171 public XmlValueConverter ValueConverter {
\r
173 return converter != null ?
\r
175 BaseXmlSchemaTypeInternal != null ?
\r
176 BaseXmlSchemaTypeInternal.ValueConverter :
\r
179 internal set { converter = value; }
\r
185 internal static XmlSchemaType GetBuiltInType (XmlQualifiedName qualifiedName)
\r
187 XmlSchemaType t = GetBuiltInSimpleType (qualifiedName);
\r
189 t = GetBuiltInComplexType (qualifiedName);
\r
193 internal static XmlSchemaType GetBuiltInType (XmlTypeCode typecode)
\r
195 if (typecode == XmlTypeCode.Item)
\r
196 return XmlSchemaComplexType.AnyType;
\r
197 return GetBuiltInSimpleType (typecode);
\r
200 internal static XmlValueConverter BuildConverter (
\r
204 case XmlTypeCode.AnyAtomicType:
\r
205 return new XsdAnyTypeConverter (code);
\r
206 case XmlTypeCode.UntypedAtomic:
\r
207 case XmlTypeCode.String:
\r
208 return new XsdStringConverter (code);
\r
209 case XmlTypeCode.Float:
\r
210 case XmlTypeCode.Double:
\r
211 case XmlTypeCode.Decimal:
\r
212 case XmlTypeCode.Integer:
\r
213 return new XsdNumericConverter (code);
\r
214 case XmlTypeCode.Boolean:
\r
215 return new XsdBooleanConverter (code);
\r
216 case XmlTypeCode.QName:
\r
217 case XmlTypeCode.Notation:
\r
218 case XmlTypeCode.Duration:
\r
219 case XmlTypeCode.DayTimeDuration:
\r
220 case XmlTypeCode.YearMonthDuration:
\r
221 return new XsdNonPermissiveConverter (code);
\r
222 case XmlTypeCode.DateTime:
\r
223 case XmlTypeCode.Date:
\r
224 case XmlTypeCode.Time:
\r
225 case XmlTypeCode.GYearMonth:
\r
226 case XmlTypeCode.GYear:
\r
227 case XmlTypeCode.GMonth:
\r
228 case XmlTypeCode.GMonthDay:
\r
229 case XmlTypeCode.GDay:
\r
230 return new XsdDateTimeConverter (code);
\r
231 case XmlTypeCode.AnyUri:
\r
232 case XmlTypeCode.Base64Binary:
\r
233 case XmlTypeCode.HexBinary:
\r
234 return new XsdMiscBaseConverter (code);
\r
241 public static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)
\r
243 internal static XmlSchemaComplexType GetBuiltInComplexType (XmlQualifiedName qualifiedName)
\r
246 if (qualifiedName.Name == "anyType" && qualifiedName.Namespace == XmlSchema.Namespace)
\r
247 return XmlSchemaComplexType.AnyType;
\r
253 public static XmlSchemaComplexType GetBuiltInComplexType (XmlTypeCode type)
\r
256 case XmlTypeCode.Item:
\r
257 return XmlSchemaComplexType.AnyType;
\r
265 public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlQualifiedName qualifiedName)
\r
267 if (qualifiedName.Namespace == "http://www.w3.org/2003/11/xpath-datatypes") {
\r
268 switch (qualifiedName.Name) {
\r
269 case "untypedAtomic":
\r
270 return XmlSchemaSimpleType.XdtUntypedAtomic;
\r
271 case "anyAtomicType":
\r
272 return XmlSchemaSimpleType.XdtAnyAtomicType;
\r
273 case "yearMonthDuration":
\r
274 return XmlSchemaSimpleType.XdtYearMonthDuration;
\r
275 case "dayTimeDuration":
\r
276 return XmlSchemaSimpleType.XdtDayTimeDuration;
\r
280 else if (qualifiedName.Namespace != XmlSchema.Namespace)
\r
282 switch (qualifiedName.Name) {
\r
283 case "anySimpleType":
\r
284 return XmlSchemaSimpleType.XsAnySimpleType;
\r
286 return XmlSchemaSimpleType.XsString;
\r
288 return XmlSchemaSimpleType.XsBoolean;
\r
290 return XmlSchemaSimpleType.XsDecimal;
\r
292 return XmlSchemaSimpleType.XsFloat;
\r
294 return XmlSchemaSimpleType.XsDouble;
\r
296 return XmlSchemaSimpleType.XsDuration;
\r
298 return XmlSchemaSimpleType.XsDateTime;
\r
300 return XmlSchemaSimpleType.XsTime;
\r
302 return XmlSchemaSimpleType.XsDate;
\r
304 return XmlSchemaSimpleType.XsGYearMonth;
\r
306 return XmlSchemaSimpleType.XsGYear;
\r
308 return XmlSchemaSimpleType.XsGMonthDay;
\r
310 return XmlSchemaSimpleType.XsGDay;
\r
312 return XmlSchemaSimpleType.XsGMonth;
\r
314 return XmlSchemaSimpleType.XsHexBinary;
\r
315 case "base64Binary":
\r
316 return XmlSchemaSimpleType.XsBase64Binary;
\r
318 return XmlSchemaSimpleType.XsAnyUri;
\r
320 return XmlSchemaSimpleType.XsQName;
\r
322 return XmlSchemaSimpleType.XsNotation;
\r
323 case "normalizedString":
\r
324 return XmlSchemaSimpleType.XsNormalizedString;
\r
326 return XmlSchemaSimpleType.XsToken;
\r
328 return XmlSchemaSimpleType.XsLanguage;
\r
330 return XmlSchemaSimpleType.XsNMToken;
\r
332 return XmlSchemaSimpleType.XsNMTokens;
\r
334 return XmlSchemaSimpleType.XsName;
\r
336 return XmlSchemaSimpleType.XsNCName;
\r
338 return XmlSchemaSimpleType.XsID;
\r
340 return XmlSchemaSimpleType.XsIDRef;
\r
342 return XmlSchemaSimpleType.XsIDRefs;
\r
344 return XmlSchemaSimpleType.XsEntity;
\r
346 return XmlSchemaSimpleType.XsEntities;
\r
348 return XmlSchemaSimpleType.XsInteger;
\r
349 case "nonPositiveInteger":
\r
350 return XmlSchemaSimpleType.XsNonPositiveInteger;
\r
351 case "negativeInteger":
\r
352 return XmlSchemaSimpleType.XsNegativeInteger;
\r
354 return XmlSchemaSimpleType.XsLong;
\r
356 return XmlSchemaSimpleType.XsInt;
\r
358 return XmlSchemaSimpleType.XsShort;
\r
360 return XmlSchemaSimpleType.XsByte;
\r
361 case "nonNegativeInteger":
\r
362 return XmlSchemaSimpleType.XsNonNegativeInteger;
\r
363 case "positiveInteger":
\r
364 return XmlSchemaSimpleType.XsPositiveInteger;
\r
365 case "unsignedLong":
\r
366 return XmlSchemaSimpleType.XsUnsignedLong;
\r
367 case "unsignedInt":
\r
368 return XmlSchemaSimpleType.XsUnsignedInt;
\r
369 case "unsignedShort":
\r
370 return XmlSchemaSimpleType.XsUnsignedShort;
\r
371 case "unsignedByte":
\r
372 return XmlSchemaSimpleType.XsUnsignedByte;
\r
377 internal static XmlSchemaSimpleType GetBuiltInSimpleType (XmlSchemaDatatype type)
\r
379 if (type is XsdEntities)
\r
380 return XmlSchemaSimpleType.XsEntities;
\r
381 else if (type is XsdNMTokens)
\r
382 return XmlSchemaSimpleType.XsNMTokens;
\r
383 else if (type is XsdIDRefs)
\r
384 return XmlSchemaSimpleType.XsIDRefs;
\r
386 return GetBuiltInSimpleType (type.TypeCode);
\r
390 // Don't use this method to cover all XML Schema datatypes.
\r
391 public static XmlSchemaSimpleType GetBuiltInSimpleType (XmlTypeCode type)
\r
394 case XmlTypeCode.None:
\r
395 case XmlTypeCode.Item:
\r
396 case XmlTypeCode.Node:
\r
397 case XmlTypeCode.Document: // node
\r
398 case XmlTypeCode.Element: // node
\r
399 case XmlTypeCode.Attribute: // node
\r
400 case XmlTypeCode.Namespace: // node
\r
401 case XmlTypeCode.ProcessingInstruction: // node
\r
402 case XmlTypeCode.Comment: // node
\r
403 case XmlTypeCode.Text: // node
\r
405 case XmlTypeCode.AnyAtomicType:
\r
406 return XmlSchemaSimpleType.XdtAnyAtomicType;
\r
407 case XmlTypeCode.UntypedAtomic:
\r
408 return XmlSchemaSimpleType.XdtUntypedAtomic;
\r
409 case XmlTypeCode.String:
\r
410 return XmlSchemaSimpleType.XsString;
\r
411 case XmlTypeCode.Boolean:
\r
412 return XmlSchemaSimpleType.XsBoolean;
\r
413 case XmlTypeCode.Decimal:
\r
414 return XmlSchemaSimpleType.XsDecimal;
\r
415 case XmlTypeCode.Float:
\r
416 return XmlSchemaSimpleType.XsFloat;
\r
417 case XmlTypeCode.Double:
\r
418 return XmlSchemaSimpleType.XsDouble;
\r
419 case XmlTypeCode.Duration:
\r
420 return XmlSchemaSimpleType.XsDuration;
\r
421 case XmlTypeCode.DateTime:
\r
422 return XmlSchemaSimpleType.XsDateTime;
\r
423 case XmlTypeCode.Time:
\r
424 return XmlSchemaSimpleType.XsTime;
\r
425 case XmlTypeCode.Date:
\r
426 return XmlSchemaSimpleType.XsDate;
\r
427 case XmlTypeCode.GYearMonth:
\r
428 return XmlSchemaSimpleType.XsGYearMonth;
\r
429 case XmlTypeCode.GYear:
\r
430 return XmlSchemaSimpleType.XsGYear;
\r
431 case XmlTypeCode.GMonthDay:
\r
432 return XmlSchemaSimpleType.XsGMonthDay;
\r
433 case XmlTypeCode.GDay:
\r
434 return XmlSchemaSimpleType.XsGDay;
\r
435 case XmlTypeCode.GMonth:
\r
436 return XmlSchemaSimpleType.XsGMonth;
\r
437 case XmlTypeCode.HexBinary:
\r
438 return XmlSchemaSimpleType.XsHexBinary;
\r
439 case XmlTypeCode.Base64Binary:
\r
440 return XmlSchemaSimpleType.XsBase64Binary;
\r
441 case XmlTypeCode.AnyUri:
\r
442 return XmlSchemaSimpleType.XsAnyUri;
\r
443 case XmlTypeCode.QName:
\r
444 return XmlSchemaSimpleType.XsQName;
\r
445 case XmlTypeCode.Notation:
\r
446 return XmlSchemaSimpleType.XsNotation;
\r
447 case XmlTypeCode.NormalizedString:
\r
448 return XmlSchemaSimpleType.XsNormalizedString;
\r
449 case XmlTypeCode.Token:
\r
450 return XmlSchemaSimpleType.XsToken;
\r
451 case XmlTypeCode.Language:
\r
452 return XmlSchemaSimpleType.XsLanguage;
\r
453 case XmlTypeCode.NmToken: // NmTokens is not primitive
\r
454 return XmlSchemaSimpleType.XsNMToken;
\r
455 case XmlTypeCode.Name:
\r
456 return XmlSchemaSimpleType.XsName;
\r
457 case XmlTypeCode.NCName:
\r
458 return XmlSchemaSimpleType.XsNCName;
\r
459 case XmlTypeCode.Id:
\r
460 return XmlSchemaSimpleType.XsID;
\r
461 case XmlTypeCode.Idref: // Idrefs is not primitive
\r
462 return XmlSchemaSimpleType.XsIDRef;
\r
463 case XmlTypeCode.Entity: // Entities is not primitive
\r
464 return XmlSchemaSimpleType.XsEntity;
\r
465 case XmlTypeCode.Integer:
\r
466 return XmlSchemaSimpleType.XsInteger;
\r
467 case XmlTypeCode.NonPositiveInteger:
\r
468 return XmlSchemaSimpleType.XsNonPositiveInteger;
\r
469 case XmlTypeCode.NegativeInteger:
\r
470 return XmlSchemaSimpleType.XsNegativeInteger;
\r
471 case XmlTypeCode.Long:
\r
472 return XmlSchemaSimpleType.XsLong;
\r
473 case XmlTypeCode.Int:
\r
474 return XmlSchemaSimpleType.XsInt;
\r
475 case XmlTypeCode.Short:
\r
476 return XmlSchemaSimpleType.XsShort;
\r
477 case XmlTypeCode.Byte:
\r
478 return XmlSchemaSimpleType.XsByte;
\r
479 case XmlTypeCode.NonNegativeInteger:
\r
480 return XmlSchemaSimpleType.XsNonNegativeInteger;
\r
481 case XmlTypeCode.UnsignedLong:
\r
482 return XmlSchemaSimpleType.XsUnsignedLong;
\r
483 case XmlTypeCode.UnsignedInt:
\r
484 return XmlSchemaSimpleType.XsUnsignedInt;
\r
485 case XmlTypeCode.UnsignedShort:
\r
486 return XmlSchemaSimpleType.XsUnsignedShort;
\r
487 case XmlTypeCode.UnsignedByte:
\r
488 return XmlSchemaSimpleType.XsUnsignedByte;
\r
489 case XmlTypeCode.PositiveInteger:
\r
490 return XmlSchemaSimpleType.XsPositiveInteger;
\r
491 case XmlTypeCode.YearMonthDuration:
\r
492 return XmlSchemaSimpleType.XdtYearMonthDuration;
\r
493 case XmlTypeCode.DayTimeDuration:
\r
494 return XmlSchemaSimpleType.XdtDayTimeDuration;
\r
499 public static bool IsDerivedFrom (XmlSchemaType derivedType, XmlSchemaType baseType, XmlSchemaDerivationMethod except)
\r
501 if (derivedType.BaseXmlSchemaType == null)
\r
503 if ((derivedType.DerivedBy & except) != 0)
\r
505 if (derivedType.BaseXmlSchemaType == baseType)
\r
507 return IsDerivedFrom (derivedType.BaseXmlSchemaType,
\r
512 internal bool ValidateRecursionCheck ()
\r
515 return (this != XmlSchemaComplexType.AnyType);
\r
517 XmlSchemaType baseType = this.BaseXmlSchemaType as XmlSchemaType;
\r
518 bool result = false;
\r
519 if (baseType != null)
\r
520 result = baseType.ValidateRecursionCheck ();
\r