diff options
author | Lluis Sanchez <lluis@novell.com> | 2008-03-26 14:33:13 +0300 |
---|---|---|
committer | Lluis Sanchez <lluis@novell.com> | 2008-03-26 14:33:13 +0300 |
commit | 3b8d404393d2e9ed0cf09049584164cb45c170e8 (patch) | |
tree | d280291a99bfa4f03638cf8cf23289d6efe3bed3 /mcs/class/System.XML/System.Xml.Serialization | |
parent | 66713ffecc76e20af6387fa5af96f2a79712ed52 (diff) |
* XmlSchemaImporter.cs: Fix problem with primitive types with a forced
base class. It happens for example when a web service declares a
soap header of type bool. The schema exporter needs to generate a
subclass of SoapHeader for that header type. But if bool is used in
the parameters, it must use System.Boolean, not the SoapHeader
subclass. The solution is to store primitive types with a forced
base class in a different table. In this way it is possible to have
two maps for primitive types: one with the forced base class
(returned by ImportDerivedTypeMapping) and one with the regular
primitive map. Fixes bug #336739.
svn path=/trunk/mcs/; revision=99013
Diffstat (limited to 'mcs/class/System.XML/System.Xml.Serialization')
-rw-r--r-- | mcs/class/System.XML/System.Xml.Serialization/ChangeLog | 13 | ||||
-rw-r--r-- | mcs/class/System.XML/System.Xml.Serialization/XmlSchemaImporter.cs | 56 |
2 files changed, 55 insertions, 14 deletions
diff --git a/mcs/class/System.XML/System.Xml.Serialization/ChangeLog b/mcs/class/System.XML/System.Xml.Serialization/ChangeLog index 35af3365154..a4e14c60279 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/ChangeLog +++ b/mcs/class/System.XML/System.Xml.Serialization/ChangeLog @@ -1,3 +1,16 @@ +2008-03-26 Lluis Sanchez Gual <lluis@novell.com> + + * XmlSchemaImporter.cs: Fix problem with primitive types with a forced + base class. It happens for example when a web service declares a + soap header of type bool. The schema exporter needs to generate a + subclass of SoapHeader for that header type. But if bool is used in + the parameters, it must use System.Boolean, not the SoapHeader + subclass. The solution is to store primitive types with a forced + base class in a different table. In this way it is possible to have + two maps for primitive types: one with the forced base class + (returned by ImportDerivedTypeMapping) and one with the regular + primitive map. Fixes bug #336739. + 2008-03-21 Atsushi Enomoto <atsushi@ximian.com> * XmlReflectionImporter.cs : set key for imported type mapping so diff --git a/mcs/class/System.XML/System.Xml.Serialization/XmlSchemaImporter.cs b/mcs/class/System.XML/System.Xml.Serialization/XmlSchemaImporter.cs index 25971d06c03..a4a28896ef3 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/XmlSchemaImporter.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/XmlSchemaImporter.cs @@ -53,6 +53,7 @@ namespace System.Xml.Serialization CodeIdentifiers typeIdentifiers; CodeIdentifiers elemIdentifiers = new CodeIdentifiers (); Hashtable mappedTypes = new Hashtable (); + Hashtable primitiveDerivedMappedTypes = new Hashtable (); Hashtable dataMappedTypes = new Hashtable (); Queue pendingMaps = new Queue (); Hashtable sharedAnonymousTypes = new Hashtable (); @@ -230,7 +231,7 @@ namespace System.Xml.Serialization return null; } - XmlTypeMapping map = GetRegisteredTypeMapping (qname); + XmlTypeMapping map = GetRegisteredTypeMapping (qname, baseType); if (map != null) { // If the type has already been imported, make sure that the map @@ -1546,14 +1547,13 @@ namespace System.Xml.Serialization XmlTypeMapping ImportXmlSerializableMapping (string ns) { XmlQualifiedName qname = new XmlQualifiedName ("System.Data.DataSet",ns); - XmlTypeMapping map = mappedTypes [qname] as XmlTypeMapping; + XmlTypeMapping map = GetRegisteredTypeMapping (qname); if (map != null) return map; TypeData typeData = new TypeData ("System.Data.DataSet", "System.Data.DataSet", "System.Data.DataSet", SchemaTypes.XmlSerializable, null); map = new XmlTypeMapping ("System.Data.DataSet", "", typeData, "System.Data.DataSet", ns); map.IncludeInSchema = true; - mappedTypes [qname] = map; - dataMappedTypes [typeData] = map; + RegisterTypeMapping (qname, typeData, map); return map; } @@ -1607,8 +1607,7 @@ namespace System.Xml.Serialization XmlTypeMapping map = new XmlTypeMapping (rootElem, rootNs, typeData, typeQName.Name, typeQName.Namespace); map.IncludeInSchema = true; - mappedTypes [typeQName] = map; - dataMappedTypes [typeData] = map; + RegisterTypeMapping (typeQName, typeData, map); return map; } @@ -1620,8 +1619,7 @@ namespace System.Xml.Serialization else map = new XmlTypeMapping (arrayTypeData.XmlType, typeQName.Namespace, arrayTypeData, arrayTypeData.XmlType, typeQName.Namespace); map.IncludeInSchema = true; - mappedTypes [typeQName] = map; - dataMappedTypes [arrayTypeData] = map; + RegisterTypeMapping (typeQName, arrayTypeData, map); return map; } @@ -1673,7 +1671,7 @@ namespace System.Xml.Serialization TypeData td; if (!elem.SchemaTypeName.IsEmpty) { td = GetTypeData (elem.SchemaTypeName, root, elem.IsNillable); - map = (XmlTypeMapping) dataMappedTypes [td]; + map = GetRegisteredTypeMapping (td); } else if (elem.SchemaType == null) td = TypeTranslator.GetTypeData (typeof(object)); @@ -1747,7 +1745,7 @@ namespace System.Xml.Serialization if (typeData.Type == typeof(object) && !anyTypeImported) ImportAllObjectTypes (); - XmlTypeMapping map = (XmlTypeMapping) dataMappedTypes [typeData]; + XmlTypeMapping map = GetRegisteredTypeMapping (typeData); if (map != null) return map; if (typeData.IsListType) @@ -1764,8 +1762,7 @@ namespace System.Xml.Serialization listMap.ItemInfo.Add (CreateElementInfo (itemMap.Namespace, null, typeData.ListItemTypeData.XmlType, typeData.ListItemTypeData, false, XmlSchemaForm.None)); map.ObjectMap = listMap; - mappedTypes [new XmlQualifiedName(map.ElementName, map.Namespace)] = map; - dataMappedTypes [typeData] = map; + RegisterTypeMapping (new XmlQualifiedName(map.ElementName, map.Namespace), typeData, map); return map; } else if (typeData.SchemaType == SchemaTypes.Primitive || typeData.Type == typeof(object) || typeof(XmlNode).IsAssignableFrom(typeData.Type)) @@ -1779,7 +1776,7 @@ namespace System.Xml.Serialization void AddObjectDerivedMap (XmlTypeMapping map) { TypeData typeData = TypeTranslator.GetTypeData (typeof(object)); - XmlTypeMapping omap = (XmlTypeMapping) dataMappedTypes [typeData]; + XmlTypeMapping omap = GetRegisteredTypeMapping (typeData); if (omap == null) omap = CreateSystemMap (typeData); omap.DerivedTypes.Add (map); @@ -1810,11 +1807,42 @@ namespace System.Xml.Serialization } } - + XmlTypeMapping GetRegisteredTypeMapping (XmlQualifiedName typeQName, Type baseType) + { + // Primitive types with a forced base class are stored in a different table. + // In this way it is possible to have two maps for primitive types: one with + // the forced base class (returned by ImportDerivedTypeMapping) and one + // with the regular primitive map. + + if (IsPrimitiveTypeNamespace (typeQName.Namespace)) + return (XmlTypeMapping) primitiveDerivedMappedTypes [typeQName]; + else + return (XmlTypeMapping) mappedTypes [typeQName]; + } + XmlTypeMapping GetRegisteredTypeMapping (XmlQualifiedName typeQName) { return (XmlTypeMapping) mappedTypes [typeQName]; } + + XmlTypeMapping GetRegisteredTypeMapping (TypeData typeData) + { + return (XmlTypeMapping) dataMappedTypes [typeData]; + } + + void RegisterTypeMapping (XmlQualifiedName qname, TypeData typeData, XmlTypeMapping map) + { + // Primitive types with a forced base class are stored in a different table. + // In this way it is possible to have two maps for primitive types: one with + // the forced base class (returned by ImportDerivedTypeMapping) and one + // with the regular primitive map. + + dataMappedTypes [typeData] = map; + if (IsPrimitiveTypeNamespace (qname.Namespace) && !map.IsSimpleType) + primitiveDerivedMappedTypes [qname] = map; + else + mappedTypes [qname] = map; + } XmlSchemaParticle GetRefGroupParticle (XmlSchemaGroupRef refGroup) { |