/mcs/class/System.XML/System.Xml.Schema/XmlSchemaDatatype.cs

http://github.com/mono/mono · C# · 363 lines · 297 code · 29 blank · 37 comment · 23 complexity · 5745c8e1aabd04bd83c1dde675b284e6 MD5 · raw file

  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. // Wojciech Kotlarski <wojciech.kotlarski@7digital.com>
  8. // Andres G. Aragoneses <andres.aragoneses@7digital.com>
  9. //
  10. //
  11. // Permission is hereby granted, free of charge, to any person obtaining
  12. // a copy of this software and associated documentation files (the
  13. // "Software"), to deal in the Software without restriction, including
  14. // without limitation the rights to use, copy, modify, merge, publish,
  15. // distribute, sublicense, and/or sell copies of the Software, and to
  16. // permit persons to whom the Software is furnished to do so, subject to
  17. // the following conditions:
  18. //
  19. // The above copyright notice and this permission notice shall be
  20. // included in all copies or substantial portions of the Software.
  21. //
  22. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29. //
  30. using System;
  31. using System.Collections;
  32. using System.Text;
  33. using System.Xml;
  34. using Mono.Xml.Schema;
  35. namespace System.Xml.Schema
  36. {
  37. public abstract class XmlSchemaDatatype
  38. {
  39. protected XmlSchemaDatatype()
  40. {
  41. }
  42. internal XsdWhitespaceFacet WhitespaceValue =
  43. XsdWhitespaceFacet.Preserve;
  44. // Common Facets
  45. internal virtual XsdWhitespaceFacet Whitespace {
  46. get { return WhitespaceValue; }
  47. }
  48. public virtual XmlTypeCode TypeCode {
  49. // Actually no way to verify default value, since
  50. // in .NET 2.0 it cannot be derived externally anymore.
  51. get { return XmlTypeCode.None; }
  52. }
  53. XmlValueConverter value_converter;
  54. internal XmlValueConverter ValueConverter {
  55. get { return (value_converter = value_converter ?? new XsdAnyTypeConverter (TypeCode)); }
  56. }
  57. public virtual XmlSchemaDatatypeVariety Variety {
  58. get {
  59. return XmlSchemaDatatypeVariety.Atomic;
  60. }
  61. }
  62. public abstract XmlTokenizedType TokenizedType { get; }
  63. public abstract Type ValueType { get; }
  64. public virtual object ChangeType (object value, Type targetType)
  65. {
  66. if (value == null)
  67. throw new ArgumentNullException ("value");
  68. if (targetType == null)
  69. throw new ArgumentNullException ("targetType");
  70. if (targetType == typeof (string))
  71. return ConvertType (value, targetType);
  72. else
  73. return ConvertType (value.ToString (), targetType);
  74. }
  75. private object ConvertType (object value, Type targetType)
  76. {
  77. if (targetType.IsAssignableFrom (value.GetType ()))
  78. return value;
  79. object[] args = null;
  80. args = (targetType == typeof (DateTime) || (value.GetType () == typeof (DateTime)))
  81. ? new object [] { value, XmlDateTimeSerializationMode.RoundtripKind }
  82. : new object [] { value };
  83. try
  84. {
  85. return typeof (XmlConvert).InvokeMember("To" + targetType.Name,
  86. System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Static,
  87. null, null, args);
  88. }
  89. catch(MissingMethodException e)
  90. {
  91. throw new InvalidCastException (string.Format ("Cast from {0}.{1} to {2}.{3} is not supported.",
  92. value.GetType ().Namespace, value.GetType ().Name,
  93. targetType.Namespace, targetType.Name), e);
  94. }
  95. }
  96. [MonoTODO ("namespaceResolver not used yet")]
  97. public virtual object ChangeType (object value, Type targetType, IXmlNamespaceResolver namespaceResolver)
  98. {
  99. if (namespaceResolver == null)
  100. throw new ArgumentNullException ("namespaceResolver");
  101. return ChangeType (value, targetType);
  102. }
  103. public virtual bool IsDerivedFrom (XmlSchemaDatatype datatype)
  104. {
  105. // It is documented to return always false, but
  106. // actually returns true when the argument is for
  107. // the same type (and it does not check null argument).
  108. return this == datatype;
  109. }
  110. public abstract object ParseValue (string s,
  111. XmlNameTable nameTable, IXmlNamespaceResolver nsmgr);
  112. internal virtual ValueType ParseValueType (string s,
  113. XmlNameTable nameTable, IXmlNamespaceResolver nsmgr)
  114. {
  115. return null;
  116. }
  117. static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};
  118. StringBuilder sb = new StringBuilder ();
  119. internal string Normalize (string s)
  120. {
  121. return Normalize (s, Whitespace);
  122. }
  123. internal string Normalize (string s, XsdWhitespaceFacet whitespaceFacet)
  124. {
  125. int idx = s.IndexOfAny (wsChars);
  126. if (idx < 0)
  127. return s;
  128. switch (whitespaceFacet) {
  129. case XsdWhitespaceFacet.Collapse:
  130. string [] arr = s.Trim ().Split (wsChars);
  131. for (int i = 0; i < arr.Length; i++) {
  132. string one = arr [i];
  133. if (one != "") {
  134. sb.Append (one);
  135. sb.Append (" ");
  136. }
  137. }
  138. string result = sb.ToString ();
  139. sb.Length = 0;
  140. return result.Trim ();
  141. case XsdWhitespaceFacet.Replace:
  142. sb.Length = 0;
  143. sb.Append (s);
  144. for (int i = 0; i < sb.Length; i++)
  145. switch (sb [i]) {
  146. case '\r':
  147. case '\n':
  148. case '\t':
  149. sb [i] = ' ';
  150. break;
  151. }
  152. result = sb.ToString ();
  153. sb.Length = 0;
  154. return result;
  155. default:
  156. return s;
  157. }
  158. }
  159. internal static XmlSchemaDatatype FromName (XmlQualifiedName qname)
  160. {
  161. return FromName (qname.Name, qname.Namespace);
  162. }
  163. internal static XmlSchemaDatatype FromName (string localName, string ns)
  164. {
  165. switch (ns) {
  166. case XmlSchema.Namespace:
  167. break;
  168. case XmlSchema.XdtNamespace:
  169. switch (localName) {
  170. case "anyAtomicType":
  171. return datatypeAnyAtomicType;
  172. case "untypedAtomic":
  173. return datatypeUntypedAtomic;
  174. case "dayTimeDuration":
  175. return datatypeDayTimeDuration;
  176. case "yearMonthDuration":
  177. return datatypeYearMonthDuration;
  178. }
  179. return null;
  180. default:
  181. // Maybe invalid name was specified. In such cases, let processors handle them.
  182. return null;
  183. }
  184. switch (localName) {
  185. case "anySimpleType":
  186. return datatypeAnySimpleType;
  187. case "string":
  188. return datatypeString;
  189. case "normalizedString":
  190. return datatypeNormalizedString;
  191. case "token":
  192. return datatypeToken;
  193. case "language":
  194. return datatypeLanguage;
  195. case "NMTOKEN":
  196. return datatypeNMToken;
  197. case "NMTOKENS":
  198. return datatypeNMTokens;
  199. case "Name":
  200. return datatypeName;
  201. case "NCName":
  202. return datatypeNCName;
  203. case "ID":
  204. return datatypeID;
  205. case "IDREF":
  206. return datatypeIDRef;
  207. case "IDREFS":
  208. return datatypeIDRefs;
  209. case "ENTITY":
  210. return datatypeEntity;
  211. case "ENTITIES":
  212. return datatypeEntities;
  213. case "NOTATION":
  214. return datatypeNotation;
  215. case "decimal":
  216. return datatypeDecimal;
  217. case "integer":
  218. return datatypeInteger;
  219. case "long":
  220. return datatypeLong;
  221. case "int":
  222. return datatypeInt;
  223. case "short":
  224. return datatypeShort;
  225. case "byte":
  226. return datatypeByte;
  227. case "nonPositiveInteger":
  228. return datatypeNonPositiveInteger;
  229. case "negativeInteger":
  230. return datatypeNegativeInteger;
  231. case "nonNegativeInteger":
  232. return datatypeNonNegativeInteger;
  233. case "unsignedLong":
  234. return datatypeUnsignedLong;
  235. case "unsignedInt":
  236. return datatypeUnsignedInt;
  237. case "unsignedShort":
  238. return datatypeUnsignedShort;
  239. case "unsignedByte":
  240. return datatypeUnsignedByte;
  241. case "positiveInteger":
  242. return datatypePositiveInteger;
  243. case "float":
  244. return datatypeFloat;
  245. case "double":
  246. return datatypeDouble;
  247. case "base64Binary":
  248. return datatypeBase64Binary;
  249. case "boolean":
  250. return datatypeBoolean;
  251. case "anyURI":
  252. return datatypeAnyURI;
  253. case "duration":
  254. return datatypeDuration;
  255. case "dateTime":
  256. return datatypeDateTime;
  257. case "date":
  258. return datatypeDate;
  259. case "time":
  260. return datatypeTime;
  261. case "hexBinary":
  262. return datatypeHexBinary;
  263. case "QName":
  264. return datatypeQName;
  265. case "gYearMonth":
  266. return datatypeGYearMonth;
  267. case "gMonthDay":
  268. return datatypeGMonthDay;
  269. case "gYear":
  270. return datatypeGYear;
  271. case "gMonth":
  272. return datatypeGMonth;
  273. case "gDay":
  274. return datatypeGDay;
  275. default:
  276. // Maybe invalid name was specified. In such cases, let processors handle them.
  277. return null;
  278. }
  279. }
  280. static readonly XsdAnySimpleType datatypeAnySimpleType =XsdAnySimpleType.Instance;
  281. static readonly XsdString datatypeString = new XsdString ();
  282. static readonly XsdNormalizedString datatypeNormalizedString = new XsdNormalizedString ();
  283. static readonly XsdToken datatypeToken = new XsdToken ();
  284. static readonly XsdLanguage datatypeLanguage = new XsdLanguage ();
  285. static readonly XsdNMToken datatypeNMToken = new XsdNMToken ();
  286. static readonly XsdNMTokens datatypeNMTokens = new XsdNMTokens ();
  287. static readonly XsdName datatypeName = new XsdName ();
  288. static readonly XsdNCName datatypeNCName = new XsdNCName ();
  289. static readonly XsdID datatypeID = new XsdID ();
  290. static readonly XsdIDRef datatypeIDRef = new XsdIDRef ();
  291. static readonly XsdIDRefs datatypeIDRefs = new XsdIDRefs ();
  292. static readonly XsdEntity datatypeEntity = new XsdEntity ();
  293. static readonly XsdEntities datatypeEntities = new XsdEntities ();
  294. static readonly XsdNotation datatypeNotation = new XsdNotation ();
  295. static readonly XsdDecimal datatypeDecimal = new XsdDecimal ();
  296. static readonly XsdInteger datatypeInteger = new XsdInteger ();
  297. static readonly XsdLong datatypeLong = new XsdLong ();
  298. static readonly XsdInt datatypeInt = new XsdInt ();
  299. static readonly XsdShort datatypeShort = new XsdShort ();
  300. static readonly XsdByte datatypeByte = new XsdByte ();
  301. static readonly XsdNonNegativeInteger datatypeNonNegativeInteger = new XsdNonNegativeInteger ();
  302. static readonly XsdPositiveInteger datatypePositiveInteger = new XsdPositiveInteger ();
  303. static readonly XsdUnsignedLong datatypeUnsignedLong = new XsdUnsignedLong ();
  304. static readonly XsdUnsignedInt datatypeUnsignedInt = new XsdUnsignedInt ();
  305. static readonly XsdUnsignedShort datatypeUnsignedShort = new XsdUnsignedShort ();
  306. static readonly XsdUnsignedByte datatypeUnsignedByte = new XsdUnsignedByte ();
  307. static readonly XsdNonPositiveInteger datatypeNonPositiveInteger = new XsdNonPositiveInteger ();
  308. static readonly XsdNegativeInteger datatypeNegativeInteger = new XsdNegativeInteger ();
  309. static readonly XsdFloat datatypeFloat = new XsdFloat ();
  310. static readonly XsdDouble datatypeDouble = new XsdDouble ();
  311. static readonly XsdBase64Binary datatypeBase64Binary = new XsdBase64Binary ();
  312. static readonly XsdBoolean datatypeBoolean = new XsdBoolean ();
  313. static readonly XsdAnyURI datatypeAnyURI = new XsdAnyURI ();
  314. static readonly XsdDuration datatypeDuration = new XsdDuration ();
  315. static readonly XsdDateTime datatypeDateTime = new XsdDateTime ();
  316. static readonly XsdDate datatypeDate = new XsdDate ();
  317. static readonly XsdTime datatypeTime = new XsdTime ();
  318. static readonly XsdHexBinary datatypeHexBinary = new XsdHexBinary ();
  319. static readonly XsdQName datatypeQName = new XsdQName ();
  320. static readonly XsdGYearMonth datatypeGYearMonth = new XsdGYearMonth ();
  321. static readonly XsdGMonthDay datatypeGMonthDay = new XsdGMonthDay ();
  322. static readonly XsdGYear datatypeGYear = new XsdGYear ();
  323. static readonly XsdGMonth datatypeGMonth = new XsdGMonth ();
  324. static readonly XsdGDay datatypeGDay = new XsdGDay ();
  325. static readonly XdtAnyAtomicType datatypeAnyAtomicType
  326. = new XdtAnyAtomicType ();
  327. static readonly XdtUntypedAtomic datatypeUntypedAtomic
  328. = new XdtUntypedAtomic ();
  329. static readonly XdtDayTimeDuration datatypeDayTimeDuration
  330. = new XdtDayTimeDuration ();
  331. static readonly XdtYearMonthDuration datatypeYearMonthDuration
  332. = new XdtYearMonthDuration ();
  333. }
  334. }