Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez <lluis@novell.com>2008-03-26 14:33:13 +0300
committerLluis Sanchez <lluis@novell.com>2008-03-26 14:33:13 +0300
commit3b8d404393d2e9ed0cf09049584164cb45c170e8 (patch)
treed280291a99bfa4f03638cf8cf23289d6efe3bed3 /mcs/class/System.XML/System.Xml.Serialization
parent66713ffecc76e20af6387fa5af96f2a79712ed52 (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/ChangeLog13
-rw-r--r--mcs/class/System.XML/System.Xml.Serialization/XmlSchemaImporter.cs56
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)
{