2 // XmlTypeMapping.cs:
\r
5 // John Donagher (john@webmeta.com)
\r
6 // Lluis Sanchez Gual (lluis@ximian.com)
\r
8 // (C) 2002 John Donagher
\r
13 using System.Collections;
\r
15 namespace System.Xml.Serialization
\r
17 public class XmlTypeMapping : XmlMapping
\r
19 private string elementName;
\r
21 private string xmlType;
\r
24 ArrayList _derivedTypes = new ArrayList();
\r
26 internal XmlTypeMapping(string elementName, string ns, TypeData typeData, string xmlType)
\r
28 this.elementName = elementName;
\r
30 this.type = typeData;
\r
31 this.xmlType = xmlType;
\r
34 public string ElementName
\r
36 get { return elementName; }
\r
39 public string Namespace
\r
44 public string TypeFullName
\r
46 get { return type.FullTypeName; }
\r
49 public string TypeName
\r
51 get { return type.TypeName; }
\r
54 internal TypeData TypeData
\r
56 get { return type; }
\r
59 internal string XmlType
\r
61 get { return xmlType; }
\r
64 internal ArrayList DerivedTypes
\r
66 get { return _derivedTypes; }
\r
67 set { _derivedTypes = value; }
\r
70 internal XmlTypeMapping GetRealTypeMap (string objectFullTypeName)
\r
72 // Returns the map for a subtype of this map's type
\r
74 if (TypeFullName == objectFullTypeName) return this;
\r
75 foreach (XmlTypeMapping map in _derivedTypes)
\r
76 if (map.TypeFullName == objectFullTypeName) return map;
\r
81 internal XmlTypeMapping GetRealElementMap (string name, string ens)
\r
83 if (xmlType == name && ns == ens) return this;
\r
84 foreach (XmlTypeMapping map in _derivedTypes)
\r
85 if (map.xmlType == name && map.ns == ens) return map;
\r
90 // Mapping info for classes and structs
\r
92 internal class ClassMap: ObjectMap
\r
94 Hashtable _elements;
\r
95 ArrayList _elementMembers;
\r
96 Hashtable _attributeMembers;
\r
97 ArrayList _flatLists;
\r
98 XmlTypeMapMemberAnyElement _defaultAnyElement;
\r
99 XmlTypeMapMemberAnyAttribute _defaultAnyAttribute;
\r
101 public void AddMember (XmlTypeMapMember member)
\r
103 if (member is XmlTypeMapMemberAttribute)
\r
105 XmlTypeMapMemberAttribute atm = (XmlTypeMapMemberAttribute)member;
\r
106 if (_attributeMembers == null) _attributeMembers = new Hashtable();
\r
107 _attributeMembers.Add (atm.AttributeName + "/" + atm.Namespace, member);
\r
110 else if (member is XmlTypeMapMemberFlatList)
\r
112 RegisterFlatList ((XmlTypeMapMemberFlatList)member);
\r
114 else if (member is XmlTypeMapMemberAnyElement)
\r
116 XmlTypeMapMemberAnyElement mem = (XmlTypeMapMemberAnyElement) member;
\r
117 if (mem.IsDefaultAny) _defaultAnyElement = mem;
\r
118 if (mem.TypeData.IsListType) RegisterFlatList (mem);
\r
120 else if (member is XmlTypeMapMemberAnyAttribute)
\r
122 _defaultAnyAttribute = (XmlTypeMapMemberAnyAttribute) member;
\r
126 if (_elementMembers == null) {
\r
127 _elementMembers = new ArrayList();
\r
128 _elements = new Hashtable();
\r
131 member.Index = _elementMembers.Count;
\r
132 _elementMembers.Add (member);
\r
134 ICollection elemsInfo = ((XmlTypeMapMemberElement)member).ElementInfo;
\r
135 foreach (XmlTypeMapElementInfo elem in elemsInfo)
\r
137 string key = elem.ElementName+"/"+elem.Namespace;
\r
138 if (_elements.ContainsKey (key))
\r
139 throw new InvalidOperationException ("The XML element named '" + elem.ElementName + "' from namespace '" + elem.Namespace + "' already present in the current scope. Use XML attributes to specify another XML name or namespace for the element.");
\r
140 _elements.Add (key, elem);
\r
144 void RegisterFlatList (XmlTypeMapMemberExpandable member)
\r
146 if (_flatLists == null) _flatLists = new ArrayList ();
\r
147 member.FlatArrayIndex = _flatLists.Count;
\r
148 _flatLists.Add (member);
\r
151 public XmlTypeMapMemberAttribute GetAttribute (string name, string ns)
\r
153 if (_attributeMembers == null) return null;
\r
154 return (XmlTypeMapMemberAttribute)_attributeMembers[name + "/" + ns];
\r
157 public XmlTypeMapElementInfo GetElement (string name, string ns)
\r
159 if (_elements == null) return null;
\r
160 return (XmlTypeMapElementInfo)_elements[name + "/" + ns];
\r
163 public XmlTypeMapMemberAnyElement DefaultAnyElementMember
\r
165 get { return _defaultAnyElement; }
\r
168 public XmlTypeMapMemberAnyAttribute DefaultAnyAttributeMember
\r
170 get { return _defaultAnyAttribute; }
\r
173 public ICollection AttributeMembers
\r
175 get { return (_attributeMembers != null) ? _attributeMembers.Values : null; }
\r
178 public ICollection ElementMembers
\r
180 get { return _elementMembers; }
\r
183 public ICollection FlatLists
\r
185 get { return _flatLists; }
\r
189 // Mapping info for arrays and lists
\r
191 internal class ListMap: ObjectMap
\r
193 XmlTypeMapElementInfoList _itemInfo;
\r
195 public XmlTypeMapElementInfoList ItemInfo
\r
197 get { return _itemInfo; }
\r
198 set { _itemInfo = value; }
\r
201 public XmlTypeMapElementInfo FindElement (object memberValue)
\r
203 if (_itemInfo.Count == 1)
\r
204 return (XmlTypeMapElementInfo) _itemInfo[0];
\r
207 if (memberValue == null) return null;
\r
208 Type type = memberValue.GetType();
\r
209 foreach (XmlTypeMapElementInfo elem in _itemInfo)
\r
210 if (elem.TypeData.Type == type) return elem;
\r
215 public XmlTypeMapElementInfo FindElement (string elementName, string ns)
\r
217 foreach (XmlTypeMapElementInfo elem in _itemInfo)
\r
218 if (elem.ElementName == elementName && elem.Namespace == ns) return elem;
\r
222 public override bool Equals (object other)
\r
224 ListMap lmap = other as ListMap;
\r
225 if (lmap == null) return false;
\r
227 if (_itemInfo.Count != lmap._itemInfo.Count) return false;
\r
228 for (int n=0; n<_itemInfo.Count; n++)
\r
229 if (!_itemInfo[n].Equals (lmap._itemInfo[n])) return false;
\r
233 public override int GetHashCode ()
\r
235 return base.GetHashCode ();
\r
239 internal class EnumMap: ObjectMap
\r
241 EnumMapMember[] _members;
\r
243 public class EnumMapMember
\r
248 public EnumMapMember (string xmlName, string enumName)
\r
250 _xmlName = xmlName;
\r
251 _enumName = enumName;
\r
254 public string XmlName
\r
256 get { return _xmlName; }
\r
259 public string EnumName
\r
261 get { return _enumName; }
\r
265 public EnumMap (EnumMapMember[] members)
\r
267 _members = members;
\r
270 public EnumMapMember[] Members
\r
272 get { return _members; }
\r
275 public string GetXmlName (string enumName)
\r
277 foreach (EnumMapMember mem in _members)
\r
278 if (mem.EnumName == enumName) return mem.XmlName;
\r
279 throw new InvalidOperationException ("Invalid enumeration value: " + enumName);
\r
282 public string GetEnumName (string xmlName)
\r
284 foreach (EnumMapMember mem in _members)
\r
285 if (mem.XmlName == xmlName) return mem.EnumName;
\r
286 throw new InvalidOperationException ("Invalid enumeration value: " + xmlName);
\r