Merge pull request #3389 from lambdageek/bug-43099
[mono.git] / mcs / class / referencesource / System.ServiceModel / System / ServiceModel / EndpointAddress10.cs
1 //-----------------------------------------------------------------------------
2 // Copyright (c) Microsoft Corporation.  All rights reserved.
3 //-----------------------------------------------------------------------------
4 namespace System.ServiceModel
5 {
6     using System;
7     using System.ServiceModel.Channels;
8     using System.Xml;
9     using System.Xml.Schema;
10     using System.Xml.Serialization;
11     using System.Collections;
12     using System.Text;
13     using System.IO;
14
15     [XmlSchemaProvider("GetSchema")]
16     [XmlRoot(AddressingStrings.EndpointReference, Namespace = Addressing10Strings.Namespace)]
17     public class EndpointAddress10 : IXmlSerializable
18     {
19         static XmlQualifiedName eprType;
20
21         EndpointAddress address;
22
23         // for IXmlSerializable
24         EndpointAddress10()
25         {
26             this.address = null;
27         }
28
29         EndpointAddress10(EndpointAddress address)
30         {
31             this.address = address;
32         }
33
34         public static EndpointAddress10 FromEndpointAddress(EndpointAddress address)
35         {
36             if (address == null)
37             {
38                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("address");
39             }
40             return new EndpointAddress10(address);
41         }
42
43         public EndpointAddress ToEndpointAddress()
44         {
45             return this.address;
46         }
47
48         void IXmlSerializable.ReadXml(XmlReader reader)
49         {
50             this.address = EndpointAddress.ReadFrom(AddressingVersion.WSAddressing10, XmlDictionaryReader.CreateDictionaryReader(reader));
51         }
52
53         void IXmlSerializable.WriteXml(XmlWriter writer)
54         {
55             this.address.WriteContentsTo(AddressingVersion.WSAddressing10, XmlDictionaryWriter.CreateDictionaryWriter(writer));
56         }
57
58         static XmlQualifiedName EprType
59         {
60             get
61             {
62                 if (eprType == null)
63                     eprType = new XmlQualifiedName(AddressingStrings.EndpointReferenceType, Addressing10Strings.Namespace);
64                 return eprType;
65             }
66         }
67
68         static XmlSchema GetEprSchema()
69         {
70             using (XmlTextReader reader = new XmlTextReader(new StringReader(Schema)) { DtdProcessing = DtdProcessing.Prohibit })
71             {
72                 return XmlSchema.Read(reader, null);
73             }
74
75         }
76
77         public static XmlQualifiedName GetSchema(XmlSchemaSet xmlSchemaSet)
78         {
79             if (xmlSchemaSet == null)
80                 throw DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("xmlSchemaSet");
81             XmlQualifiedName eprType = EprType;
82             XmlSchema eprSchema = GetEprSchema();
83             ICollection schemas = xmlSchemaSet.Schemas(Addressing10Strings.Namespace);
84             if (schemas == null || schemas.Count == 0)
85                 xmlSchemaSet.Add(eprSchema);
86             else
87             {
88                 XmlSchema schemaToAdd = null;
89                 foreach (XmlSchema xmlSchema in schemas)
90                 {
91                     if (xmlSchema.SchemaTypes.Contains(eprType))
92                     {
93                         schemaToAdd = null;
94                         break;
95                     }
96                     else
97                         schemaToAdd = xmlSchema;
98                 }
99                 if (schemaToAdd != null)
100                 {
101                     foreach (XmlQualifiedName prefixNsPair in eprSchema.Namespaces.ToArray())
102                         schemaToAdd.Namespaces.Add(prefixNsPair.Name, prefixNsPair.Namespace);
103                     foreach (XmlSchemaObject schemaObject in eprSchema.Items)
104                         schemaToAdd.Items.Add(schemaObject);
105                     xmlSchemaSet.Reprocess(schemaToAdd);
106                 }
107             }
108             return eprType;
109         }
110
111         XmlSchema IXmlSerializable.GetSchema()
112         {
113             return null;
114         }
115
116         const string Schema =
117 @"<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' xmlns:wsa='http://www.w3.org/2005/08/addressing' targetNamespace='http://www.w3.org/2005/08/addressing' blockDefault='#all' elementFormDefault='qualified' finalDefault='' attributeFormDefault='unqualified'>
118     
119     <!-- Constructs from the WS-Addressing Core -->
120
121     <xs:element name='EndpointReference' type='wsa:EndpointReferenceType'/>
122     <xs:complexType name='EndpointReferenceType' mixed='false'>
123         <xs:sequence>
124             <xs:element name='Address' type='wsa:AttributedURIType'/>
125             <xs:element name='ReferenceParameters' type='wsa:ReferenceParametersType' minOccurs='0'/>
126             <xs:element ref='wsa:Metadata' minOccurs='0'/>
127             <xs:any namespace='##other' processContents='lax' minOccurs='0' maxOccurs='unbounded'/>
128         </xs:sequence>
129         <xs:anyAttribute namespace='##other' processContents='lax'/>
130     </xs:complexType>
131     
132     <xs:complexType name='ReferenceParametersType' mixed='false'>
133         <xs:sequence>
134             <xs:any namespace='##any' processContents='lax' minOccurs='0' maxOccurs='unbounded'/>
135         </xs:sequence>
136         <xs:anyAttribute namespace='##other' processContents='lax'/>
137     </xs:complexType>
138     
139     <xs:element name='Metadata' type='wsa:MetadataType'/>
140     <xs:complexType name='MetadataType' mixed='false'>
141         <xs:sequence>
142             <xs:any namespace='##any' processContents='lax' minOccurs='0' maxOccurs='unbounded'/>
143         </xs:sequence>
144         <xs:anyAttribute namespace='##other' processContents='lax'/>
145     </xs:complexType>
146     
147     <xs:element name='MessageID' type='wsa:AttributedURIType'/>
148     <xs:element name='RelatesTo' type='wsa:RelatesToType'/>
149     <xs:complexType name='RelatesToType' mixed='false'>
150         <xs:simpleContent>
151             <xs:extension base='xs:anyURI'>
152                 <xs:attribute name='RelationshipType' type='wsa:RelationshipTypeOpenEnum' use='optional' default='http://www.w3.org/2005/08/addressing/reply'/>
153                 <xs:anyAttribute namespace='##other' processContents='lax'/>
154             </xs:extension>
155         </xs:simpleContent>
156     </xs:complexType>
157     
158     <xs:simpleType name='RelationshipTypeOpenEnum'>
159         <xs:union memberTypes='wsa:RelationshipType xs:anyURI'/>
160     </xs:simpleType>
161     
162     <xs:simpleType name='RelationshipType'>
163         <xs:restriction base='xs:anyURI'>
164             <xs:enumeration value='http://www.w3.org/2005/08/addressing/reply'/>
165         </xs:restriction>
166     </xs:simpleType>
167     
168     <xs:element name='ReplyTo' type='wsa:EndpointReferenceType'/>
169     <xs:element name='From' type='wsa:EndpointReferenceType'/>
170     <xs:element name='FaultTo' type='wsa:EndpointReferenceType'/>
171     <xs:element name='To' type='wsa:AttributedURIType'/>
172     <xs:element name='Action' type='wsa:AttributedURIType'/>
173
174     <xs:complexType name='AttributedURIType' mixed='false'>
175         <xs:simpleContent>
176             <xs:extension base='xs:anyURI'>
177                 <xs:anyAttribute namespace='##other' processContents='lax'/>
178             </xs:extension>
179         </xs:simpleContent>
180     </xs:complexType>
181     
182     <!-- Constructs from the WS-Addressing SOAP binding -->
183
184     <xs:attribute name='IsReferenceParameter' type='xs:boolean'/>
185     
186     <xs:simpleType name='FaultCodesOpenEnumType'>
187         <xs:union memberTypes='wsa:FaultCodesType xs:QName'/>
188     </xs:simpleType>
189     
190     <xs:simpleType name='FaultCodesType'>
191         <xs:restriction base='xs:QName'>
192             <xs:enumeration value='wsa:InvalidAddressingHeader'/>
193             <xs:enumeration value='wsa:InvalidAddress'/>
194             <xs:enumeration value='wsa:InvalidEPR'/>
195             <xs:enumeration value='wsa:InvalidCardinality'/>
196             <xs:enumeration value='wsa:MissingAddressInEPR'/>
197             <xs:enumeration value='wsa:DuplicateMessageID'/>
198             <xs:enumeration value='wsa:ActionMismatch'/>
199             <xs:enumeration value='wsa:MessageAddressingHeaderRequired'/>
200             <xs:enumeration value='wsa:DestinationUnreachable'/>
201             <xs:enumeration value='wsa:ActionNotSupported'/>
202             <xs:enumeration value='wsa:EndpointUnavailable'/>
203         </xs:restriction>
204     </xs:simpleType>
205     
206     <xs:element name='RetryAfter' type='wsa:AttributedUnsignedLongType'/>
207     <xs:complexType name='AttributedUnsignedLongType' mixed='false'>
208         <xs:simpleContent>
209             <xs:extension base='xs:unsignedLong'>
210                 <xs:anyAttribute namespace='##other' processContents='lax'/>
211             </xs:extension>
212         </xs:simpleContent>
213     </xs:complexType>
214     
215     <xs:element name='ProblemHeaderQName' type='wsa:AttributedQNameType'/>
216     <xs:complexType name='AttributedQNameType' mixed='false'>
217         <xs:simpleContent>
218             <xs:extension base='xs:QName'>
219                 <xs:anyAttribute namespace='##other' processContents='lax'/>
220             </xs:extension>
221         </xs:simpleContent>
222     </xs:complexType>
223     
224     <xs:element name='ProblemHeader' type='wsa:AttributedAnyType'/>
225     <xs:complexType name='AttributedAnyType' mixed='false'>
226         <xs:sequence>
227             <xs:any namespace='##any' processContents='lax' minOccurs='1' maxOccurs='1'/>
228         </xs:sequence>
229         <xs:anyAttribute namespace='##other' processContents='lax'/>
230     </xs:complexType>
231     
232     <xs:element name='ProblemIRI' type='wsa:AttributedURIType'/>
233     
234     <xs:element name='ProblemAction' type='wsa:ProblemActionType'/>
235     <xs:complexType name='ProblemActionType' mixed='false'>
236         <xs:sequence>
237             <xs:element ref='wsa:Action' minOccurs='0'/>
238             <xs:element name='SoapAction' minOccurs='0' type='xs:anyURI'/>
239         </xs:sequence>
240         <xs:anyAttribute namespace='##other' processContents='lax'/>
241     </xs:complexType>
242     
243 </xs:schema>";
244     }
245 }