New test.
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / SoapCodeExporter.cs
1 // \r
2 // System.Xml.Serialization.SoapCodeExporter \r
3 //\r
4 // Author:\r
5 //   Tim Coleman (tim@timcoleman.com)\r
6 //   Lluis Sanchez Gual (lluis@ximian.com)\r
7 //\r
8 // Copyright (C) Tim Coleman, 2002\r
9 //\r
10 \r
11 //\r
12 // Permission is hereby granted, free of charge, to any person obtaining\r
13 // a copy of this software and associated documentation files (the\r
14 // "Software"), to deal in the Software without restriction, including\r
15 // without limitation the rights to use, copy, modify, merge, publish,\r
16 // distribute, sublicense, and/or sell copies of the Software, and to\r
17 // permit persons to whom the Software is furnished to do so, subject to\r
18 // the following conditions:\r
19 // \r
20 // The above copyright notice and this permission notice shall be\r
21 // included in all copies or substantial portions of the Software.\r
22 // \r
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
30 //\r
31 \r
32 using System.CodeDom;\r
33 using System.CodeDom.Compiler;\r
34 using System.Collections;\r
35 \r
36 namespace System.Xml.Serialization \r
37 {\r
38         public class SoapCodeExporter\r
39 #if NET_2_0\r
40                 : CodeExporter\r
41 #endif\r
42         {\r
43                 #region Fields\r
44 \r
45 #if !NET_2_0\r
46                 SoapMapCodeGenerator codeGenerator;\r
47 #endif\r
48 \r
49                 #endregion\r
50 \r
51                 #region Constructors\r
52 \r
53                 public SoapCodeExporter (CodeNamespace codeNamespace): this (codeNamespace, null)\r
54                 {\r
55                 }\r
56 \r
57                 public SoapCodeExporter (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
58                 {\r
59                         codeGenerator = new SoapMapCodeGenerator (codeNamespace, codeCompileUnit);\r
60                 }\r
61 \r
62 #if NET_2_0\r
63 \r
64                 public SoapCodeExporter (CodeNamespace codeNamespace, \r
65                                                                 CodeCompileUnit codeCompileUnit, \r
66                                                                 CodeGenerationOptions options)\r
67                 : this (codeNamespace, codeCompileUnit, null, options, null)\r
68                 {\r
69                 }\r
70                 \r
71                 public SoapCodeExporter (CodeNamespace codeNamespace, \r
72                                                                 CodeCompileUnit codeCompileUnit, \r
73                                                                 CodeGenerationOptions options, \r
74                                                                 Hashtable mappings)\r
75                 : this (codeNamespace, codeCompileUnit, null, options, mappings)\r
76                 {\r
77                         \r
78                 }\r
79                 \r
80                 [MonoTODO ("mappings?")]\r
81                 public SoapCodeExporter (CodeNamespace codeNamespace, \r
82                                                                 CodeCompileUnit codeCompileUnit, \r
83                                                                 CodeDomProvider codeProvider, \r
84                                                                 CodeGenerationOptions options, \r
85                                                                 Hashtable mappings)\r
86                 {\r
87                         codeGenerator = new SoapMapCodeGenerator (codeNamespace, codeCompileUnit, codeProvider, options, mappings);\r
88                 }\r
89 \r
90 #endif\r
91 \r
92 #endregion // Constructors\r
93 \r
94                 #region Properties\r
95 \r
96 #if !NET_2_0\r
97                 public CodeAttributeDeclarationCollection IncludeMetadata {\r
98                         get { return codeGenerator.IncludeMetadata; }\r
99                 }\r
100 #endif\r
101                 \r
102                 #endregion // Properties\r
103 \r
104                 #region Methods\r
105 \r
106                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member)\r
107                 {\r
108                         AddMappingMetadata (metadata, member, false);\r
109                 }\r
110 \r
111                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member, bool forceUseMemberName)\r
112                 {\r
113                         TypeData memType = member.TypeMapMember.TypeData;\r
114                         \r
115                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
116                         if (forceUseMemberName || (member.ElementName != member.MemberName))\r
117                                 att.Arguments.Add (new CodeAttributeArgument (new CodePrimitiveExpression(member.ElementName)));\r
118                         if (!TypeTranslator.IsDefaultPrimitiveTpeData (memType))\r
119                                 att.Arguments.Add (new CodeAttributeArgument ("DataType", new CodePrimitiveExpression(member.TypeName)));\r
120                                 \r
121                         if (att.Arguments.Count > 0) \r
122                                 metadata.Add (att);\r
123                 }\r
124 \r
125                 public void ExportMembersMapping (XmlMembersMapping xmlMembersMapping)\r
126                 {\r
127                         codeGenerator.ExportMembersMapping (xmlMembersMapping);\r
128                 }\r
129 \r
130                 public void ExportTypeMapping (XmlTypeMapping xmlTypeMapping)\r
131                 {\r
132                         codeGenerator.ExportTypeMapping (xmlTypeMapping, true);\r
133                 }\r
134 \r
135 \r
136                 #endregion // Methods\r
137         }\r
138 \r
139         class SoapMapCodeGenerator : MapCodeGenerator\r
140         {\r
141                 public SoapMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
142                 : base (codeNamespace, codeCompileUnit, CodeGenerationOptions.None)\r
143                 {\r
144                         includeArrayTypes = true;\r
145                 }\r
146 \r
147                 public SoapMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit, CodeDomProvider codeProvider, CodeGenerationOptions options, Hashtable mappings)\r
148                 : base (codeNamespace, codeCompileUnit, codeProvider, options, mappings)\r
149                 {\r
150                 }\r
151 \r
152                 protected override void GenerateClass (XmlTypeMapping map, CodeTypeDeclaration codeClass, bool isTopLevel)\r
153                 {\r
154                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
155                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
156                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
157                         AddCustomAttribute (codeClass, att, false);\r
158                 }\r
159                 \r
160                 protected override void GenerateClassInclude (CodeAttributeDeclarationCollection attributes, XmlTypeMapping map)\r
161                 {\r
162                         CodeAttributeDeclaration iatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapInclude");\r
163                         iatt.Arguments.Add (new CodeAttributeArgument (new CodeTypeOfExpression(map.TypeData.FullTypeName)));\r
164                         attributes.Add (iatt);\r
165                 }\r
166         \r
167                 protected override void GenerateAttributeMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberAttribute attinfo, string defaultNamespace, bool forceUseMemberName)\r
168                 {\r
169                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapAttribute");\r
170                         if (attinfo.Name != attinfo.AttributeName) att.Arguments.Add (GetArg (attinfo.AttributeName));\r
171                         if (attinfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", attinfo.Namespace));\r
172                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(attinfo.TypeData)) att.Arguments.Add (GetArg ("DataType",attinfo.TypeData.XmlType));\r
173                         attributes.Add (att);\r
174                 }\r
175                 \r
176                 protected override void GenerateElementInfoMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberElement member, XmlTypeMapElementInfo einfo, TypeData defaultType, string defaultNamespace, bool addAlwaysAttr, bool forceUseMemberName)\r
177                 {\r
178                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
179                         if (forceUseMemberName || einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));\r
180 //                      if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));  MS seems to ignore this\r
181                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));\r
182                         if (addAlwaysAttr || att.Arguments.Count > 0) attributes.Add (att);\r
183                 }\r
184 \r
185                 protected override void GenerateEnum (XmlTypeMapping map, CodeTypeDeclaration codeEnum, bool isTopLevel)\r
186                 {\r
187                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
188                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
189                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
190                         AddCustomAttribute (codeEnum, att, false);\r
191                 }               \r
192                 \r
193                 protected override void GenerateEnumItem (CodeMemberField codeField, EnumMap.EnumMapMember emem)\r
194                 {\r
195                         if (emem.EnumName != emem.XmlName)\r
196                         {\r
197                                 CodeAttributeDeclaration xatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapEnum");\r
198                                 xatt.Arguments.Add (GetArg ("Name", emem.XmlName));\r
199                                 AddCustomAttribute (codeField, xatt, true);\r
200                         }\r
201                 }               \r
202                 \r
203                 protected override void GenerateSpecifierMember (CodeTypeMember codeField)\r
204                 {\r
205                         AddCustomAttribute (codeField, "System.Xml.Serialization.SoapIgnore");\r
206                 }\r
207         }\r
208 }\r