Prechádzať zdrojové kódy

2004-01-14 Atsushi Enomoto <[email protected]>

	* Added SchemaDataValueType.cs.
	* BuiltInDatatype.cs, XmlSchemaDatatype.cs : Adde ParseValueType() on
	  all derived datatype classes.
	* XmlSchemaComplexType.cs : Fixed ContentType value for simple types.
	  Errata-considered simple content derivation check and simple content
	  restriction should check this too.

svn path=/trunk/mcs/; revision=22050
Atsushi Eno 22 rokov pred
rodič
commit
d7ef514f4f

+ 194 - 4
mcs/class/System.XML/System.Xml.Schema/BuiltInDatatype.cs

@@ -84,6 +84,12 @@ namespace Mono.Xml.Schema
 			return Normalize (s);
 		}
 
+		internal override ValueType ParseValueType (string s,
+			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return new StringValueType (Normalize (s));
+		}
+
 		internal string [] ParseListValue (string s, XmlNameTable nameTable)
 		{
 			return this.Normalize (s, XsdWhitespaceFacet.Collapse).Split (whitespaceArray);
@@ -272,6 +278,10 @@ namespace Mono.Xml.Schema
 			return s;
 		}
 
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+		}
 	}
 
 	// xs:NMTOKENS
@@ -293,6 +303,11 @@ namespace Mono.Xml.Schema
 		{
 			return ParseListValue (value, nt);
 		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new StringArrayValueType (ParseListValue (s, nameTable));
+		}
 	}
 
 	// xs:Name
@@ -317,6 +332,11 @@ namespace Mono.Xml.Schema
 				throw new ArgumentException ("'" + s + "' is an invalid name.");
 			return s;
 		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+		}
 	}
 
 	// xs:NCName
@@ -342,6 +362,10 @@ namespace Mono.Xml.Schema
 			return s;
 		}
 
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+		}
 	}
 
 	// xs:ID
@@ -399,6 +423,11 @@ namespace Mono.Xml.Schema
 		{
 			return ParseListValue (value, nt);
 		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new StringArrayValueType (ParseListValue (s, nameTable));
+		}
 	}
 
 	// xs:ENTITY
@@ -439,6 +468,11 @@ namespace Mono.Xml.Schema
 		{
 			return ParseListValue (value, nt);
 		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new StringArrayValueType (ParseListValue (s, nameTable));
+		}
 	}
 
 	// xs:NOTATION
@@ -518,9 +552,13 @@ namespace Mono.Xml.Schema
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
 		{
-			return XmlConvert.ToDecimal (this.Normalize (s));
+			return ParseValueType (s, nameTable, nsmgr);
 		}
 
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return XmlConvert.ToDecimal (this.Normalize (s));
+		}
 	 
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is Decimal) && (y is Decimal)) {
@@ -581,6 +619,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			decimal d = XmlConvert.ToDecimal (Normalize (s));
 			if (Decimal.Floor (d) != d)
@@ -601,6 +644,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToInt64 (Normalize (s));
 		}
@@ -630,9 +678,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToInt32 (Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is int) && (y is int)) {
 				if ((int)x==(int)y) {
@@ -659,9 +713,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToInt16 (Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is short) && (y is short)) {
 				if ((short)x==(short)y) {
@@ -687,9 +747,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToSByte (Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is sbyte) && (y is sbyte)) {
 				if ((sbyte)x==(sbyte)y) {
@@ -717,6 +783,11 @@ namespace Mono.Xml.Schema
 		[CLSCompliant (false)]
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToDecimal (Normalize (s));
 		}
@@ -732,9 +803,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToUInt64 (Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is ulong) && (y is ulong)) {
 				if ((ulong)x==(ulong)y) {
@@ -761,9 +838,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToUInt32 (Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is uint) && (y is uint)) {
 				if ((uint)x==(uint)y) {
@@ -791,9 +874,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToUInt16 (Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is ushort) && (y is ushort)) {
 				if ((ushort)x==(ushort)y) {
@@ -820,9 +909,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToByte(Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is byte) && (y is byte)) {
 				if ((byte)x==(byte)y) {
@@ -852,6 +947,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToDecimal (Normalize (s));
 		}
@@ -866,6 +966,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToDecimal (Normalize (s));
 		}
@@ -881,6 +986,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToDecimal (Normalize (s));
 		}
@@ -918,9 +1028,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToSingle (Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is float) && (y is float)) {
 				if ((float)x==(float)y) {
@@ -970,9 +1086,15 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToDouble (Normalize (s));
 		}
+
 		internal override XsdOrdering Compare(object x, object y) {
 			if ((x is double) && (y is double)) {
 				if ((double)x==(double)y) {
@@ -1006,6 +1128,11 @@ namespace Mono.Xml.Schema
 		{
 			return Convert.FromBase64String (Normalize (s));
 		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+		}
 	}
 
 	// xs:hexBinary
@@ -1033,7 +1160,11 @@ namespace Mono.Xml.Schema
 		{
 			return XmlConvert.FromBinHexString (Normalize (s));
 		}
-		
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+		}
 
 		// Fundamental Facets ... no need to override
 	}
@@ -1069,7 +1200,11 @@ namespace Mono.Xml.Schema
 			return new XmlQualifiedName (localName, nsmgr.LookupNamespace (
 				colonAt < 0 ? "" : s.Substring (0, colonAt - 1)));
 		}
-		
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new QNameValueType (ParseValue (s, nameTable, nsmgr) as XmlQualifiedName);
+		}
 	}
 
 	// xs:boolean
@@ -1094,6 +1229,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToBoolean (this.Normalize (s));
 		}
@@ -1130,7 +1270,12 @@ namespace Mono.Xml.Schema
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
 		{
-			return new Uri (Normalize (s));
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
+		{
+			return new UriValueType (Normalize (s));
 		}
 	}
 	
@@ -1156,6 +1301,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToTimeSpan (Normalize (s));
 		}
@@ -1221,6 +1371,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return XmlConvert.ToDateTime (Normalize (s));
 		}
@@ -1280,6 +1435,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return DateTime.ParseExact (Normalize (s), "yyyy-MM-dd", null);
 		}
@@ -1356,6 +1516,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return DateTime.ParseExact (Normalize (s), timeFormats, null, DateTimeStyles.None);
 		}
@@ -1401,6 +1566,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return DateTime.ParseExact (Normalize (s), "yyyy-MM", null);
 		}
@@ -1441,6 +1611,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return DateTime.ParseExact (Normalize (s), "--MM-dd", null);
 		}
@@ -1483,6 +1658,11 @@ namespace Mono.Xml.Schema
 		// but CLR DateTime does not allow such expression.
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return DateTime.ParseExact (Normalize(s), "yyyy", null);
 		}
@@ -1523,6 +1703,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return DateTime.ParseExact (Normalize(s), "--MM--", null);
 		}
@@ -1563,6 +1748,11 @@ namespace Mono.Xml.Schema
 
 		public override object ParseValue (string s,
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr)
+		{
+			return ParseValueType (s, nameTable, nsmgr);
+		}
+
+		internal override ValueType ParseValueType (string s, XmlNameTable nameTable, XmlNamespaceManager nsmgr) 
 		{
 			return DateTime.ParseExact (Normalize(s), "---dd", null);
 		}

+ 9 - 0
mcs/class/System.XML/System.Xml.Schema/ChangeLog

@@ -1,3 +1,12 @@
+2004-01-14  Atsushi Enomoto <[email protected]>
+
+	* Added SchemaDataValueType.cs.
+	* BuiltInDatatype.cs, XmlSchemaDatatype.cs : Adde ParseValueType() on
+	  all derived datatype classes.
+	* XmlSchemaComplexType.cs : Fixed ContentType value for simple types.
+	  Errata-considered simple content derivation check and simple content
+	  restriction should check this too.
+
 2004-01-13  Jackson Harper <[email protected]>
 
 	* XmlSchemaComplexType.cs: Comment out line that was breaking the build.

+ 150 - 0
mcs/class/System.XML/System.Xml.Schema/SchemaDataValueType.cs

@@ -0,0 +1,150 @@
+namespace System.Xml.Schema
+{
+	internal struct QNameValueType
+	{
+		XmlQualifiedName value;
+
+		public QNameValueType (XmlQualifiedName value)
+		{
+			this.value = value;
+		}
+
+		public XmlQualifiedName Value {
+			get { return value; }
+		}
+
+		public static bool operator == (QNameValueType v1, QNameValueType v2)
+		{
+			return v1.Value == v2.Value;
+		}
+
+		public static bool operator != (QNameValueType v1, QNameValueType v2)
+		{
+			return v1.Value != v2.Value;
+		}
+
+		public override bool Equals (object obj)
+		{
+			if (obj is QNameValueType)
+				return (QNameValueType) obj == this;
+			else
+				return false;
+		}
+
+		public override int GetHashCode () 
+		{
+			return value.GetHashCode ();
+		}
+	}
+
+	internal struct StringValueType
+	{
+		string value;
+
+		public StringValueType (string value)
+		{
+			this.value = value;
+		}
+
+		public string Value {
+			get { return value; }
+		}
+
+		public static bool operator == (StringValueType v1, StringValueType v2)
+		{
+			return v1.Value == v2.Value;
+		}
+
+		public static bool operator != (StringValueType v1, StringValueType v2)
+		{
+			return v1.Value != v2.Value;
+		}
+
+		public override bool Equals (object obj)
+		{
+			if (obj is StringValueType)
+				return (StringValueType) obj == this;
+			else
+				return false;
+		}
+
+		public override int GetHashCode () 
+		{
+			return value.GetHashCode ();
+		}
+	}
+
+	internal struct UriValueType
+	{
+		string value;
+
+		public UriValueType (string value)
+		{
+			this.value = value;
+		}
+
+		public string Value {
+			get { return value; }
+		}
+
+		public static bool operator == (UriValueType v1, UriValueType v2)
+		{
+			return v1.Value == v2.Value;
+		}
+
+		public static bool operator != (UriValueType v1, UriValueType v2)
+		{
+			return v1.Value != v2.Value;
+		}
+
+		public override bool Equals (object obj)
+		{
+			if (obj is UriValueType)
+				return (UriValueType) obj == this;
+			else
+				return false;
+		}
+
+		public override int GetHashCode () 
+		{
+			return value.GetHashCode ();
+		}
+	}
+
+	internal struct StringArrayValueType
+	{
+		string [] value;
+
+		public StringArrayValueType (string [] value)
+		{
+			this.value = value;
+		}
+
+		public string [] Value {
+			get { return value; }
+		}
+
+		public static bool operator == (StringArrayValueType v1, StringArrayValueType v2)
+		{
+			return v1.Value == v2.Value;
+		}
+
+		public static bool operator != (StringArrayValueType v1, StringArrayValueType v2)
+		{
+			return v1.Value != v2.Value;
+		}
+
+		public override bool Equals (object obj)
+		{
+			if (obj is StringArrayValueType)
+				return (StringArrayValueType) obj == this;
+			else
+				return false;
+		}
+
+		public override int GetHashCode () 
+		{
+			return value.GetHashCode ();
+		}
+	}
+}

+ 3 - 0
mcs/class/System.XML/System.Xml.Schema/XmlSchemaDatatype.cs

@@ -34,6 +34,9 @@ namespace System.Xml.Schema
 		public abstract object ParseValue (string s, 
 			XmlNameTable nameTable, XmlNamespaceManager nsmgr);
 
+		internal abstract ValueType ParseValueType (string s,
+			XmlNameTable nameTable, XmlNamespaceManager nsmgr);
+
 		static char [] wsChars = new char [] {' ', '\t', '\n', '\r'};
 
 		StringBuilder sb = new StringBuilder ();