Merge pull request #2832 from razzfazz/handle_eintr
[mono.git] / mcs / class / System.Web.Services / System.Web.Services.Description / BasicProfileChecker.cs
index 63c78c2cc849f8a7cfccc59880137160b14f86e3..c0cdcf4c1b8900b9f65d53a877c6b3439bfe0bf3 100644 (file)
@@ -3,6 +3,7 @@
 //
 // Author:
 //   Lluis Sanchez (lluis@novell.com)
+//   Atsushi Enomoto (atsushi@ximian.com)
 //
 // Copyright (C) Novell, Inc., 2004
 //
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_2_0
 
+using System.IO;
 using System.Xml.Schema;
+using System.Xml.Serialization;
 using System.Xml;
 using System.Collections;
 
@@ -40,10 +42,19 @@ namespace System.Web.Services.Description
        {
                public static BasicProfileChecker Instance = new BasicProfileChecker ();
                
-               public override WsiClaims Claims { 
-                       get { return WsiClaims.BP10; }
+               public override WsiProfiles Claims { 
+                       get { return WsiProfiles.BasicProfile1_1; }
                }
                
+               /*
+               private string GetAbsoluteUri (string baseUri, string relativeUri)
+               {
+                       string actualBaseUri = baseUri ?? Path.GetFullPath (".") + Path.DirectorySeparatorChar;
+                       Uri uri = new Uri (new Uri (actualBaseUri), relativeUri);
+                       return uri.ToString ();
+               }
+               */
+
                public override void Check (ConformanceCheckContext ctx, Import value) 
                {
                        if (value.Location == "" || value.Location == null) {
@@ -51,8 +62,15 @@ namespace System.Web.Services.Description
                                return;
                        }
                        
-                       object doc = ctx.GetDocument (value.Location);
-                       if (doc == null) ctx.ReportError (value, "Document '" + value.Location + "' not found");
+                       if (!new Uri (value.Namespace, UriKind.RelativeOrAbsolute).IsAbsoluteUri)
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2803);
+
+                       // LAMESPEC: RetrievalUrl does not seem to help here (in .NET)
+                       //ServiceDescription importer = value.ServiceDescription;
+                       //string absUri = GetAbsoluteUri (importer != null ? importer.RetrievalUrl : null, value.Location);
+                       object doc = ctx.GetDocument (/*absUri*/value.Location, value.Namespace);
+                       if (doc == null) // and looks like .net ignores non-resolvable documentation... I dunno if it makes sense. I don't care :/
+                               return; //ctx.ReportError (value, "Document '" + value.Location + "' not found");
                        
                        if (doc is XmlSchema)
                                ctx.ReportRuleViolation (value, BasicProfileRules.R2002);
@@ -63,17 +81,37 @@ namespace System.Web.Services.Description
                                return;
                        }
                                
-                       // TODO: rule R2003
-                       
                        if (imported.TargetNamespace != value.Namespace)
                                ctx.ReportRuleViolation (value, BasicProfileRules.R2005);
                }
                
                public override void Check (ConformanceCheckContext ctx, ServiceDescription value)
                {
-                       
+                       // R4005 (and R1034, which turned out to be redundant)
+                       if (value.Namespaces != null)
+                               foreach (XmlQualifiedName qname in value.Namespaces.ToArray ())
+                                       if (qname.Namespace == "http://www.w3.org/XML/1998/namespace")
+                                               ctx.ReportRuleViolation (value, BasicProfileRules.R4005);
+
+                       CheckDuplicateSoapAddressBinding (ctx, value);
                }
                
+               void CheckDuplicateSoapAddressBinding (ConformanceCheckContext ctx, ServiceDescription value)
+               {
+                       ArrayList locations = new ArrayList ();
+                       foreach (PortType p in value.PortTypes) {
+                               SoapAddressBinding b = (SoapAddressBinding) p.Extensions.Find (typeof (SoapAddressBinding));
+                               if (b == null || b.Location == null || b.Location.Length == 0)
+                                       continue;
+                               if (locations.Contains (b.Location)) {
+                                       ctx.ReportRuleViolation (value, BasicProfileRules.R2711);
+                                       // One report for one ServiceDescription should be enough.
+                                       return;
+                               }
+                               locations.Add (b.Location);
+                       }
+               }
+
                public override void Check (ConformanceCheckContext ctx, ServiceDescriptionFormatExtension value)
                {
                        if (value.Required)
@@ -87,6 +125,10 @@ namespace System.Web.Services.Description
                        
                        if (value.DefinedByElement && value.Element.Namespace == XmlSchema.Namespace)
                                ctx.ReportRuleViolation (value, BasicProfileRules.R2206);
+
+                       if (value.Type != null && value.Type != XmlQualifiedName.Empty &&
+                           value.Element != null && value.Element != XmlQualifiedName.Empty)
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2306);
                }
                
                public override void Check (ConformanceCheckContext ctx, Types value)
@@ -95,13 +137,24 @@ namespace System.Web.Services.Description
                
                public override void Check (ConformanceCheckContext ctx, Message value)
                {
-                       // TODO: R2113
                }
-               
+
+               public override void Check (ConformanceCheckContext ctx, BindingCollection value) {
+                       foreach (Binding b in value)
+                               foreach (object ext in b.Extensions)
+                                       if (ext.GetType () == typeof (SoapBinding))
+                                               return;
+
+                       ctx.ReportRuleViolation (value, BasicProfileRules.R2401);
+               }
+
                public override void Check (ConformanceCheckContext ctx, Binding value)
                {
                        SoapBinding sb = (SoapBinding) value.Extensions.Find (typeof(SoapBinding));
-                       if (sb == null || sb.Transport == null || sb.Transport == "") {
+                       if (sb == null)
+                               return;
+
+                       if (sb.Transport == null || sb.Transport == "") {
                                ctx.ReportRuleViolation (value, BasicProfileRules.R2701);
                                return;
                        }
@@ -123,7 +176,7 @@ namespace System.Web.Services.Description
                                foreach (OperationMessage om in op.Messages) {
                                        Message msg = ctx.Services.GetMessage (om.Message);
                                        foreach (MessagePart part in msg.Parts)
-                                               parts.Add (part,part);
+                                               parts [part] = part; // do not use Add() - there could be the same MessagePart instance.
                                }
                        }
                        
@@ -136,10 +189,130 @@ namespace System.Web.Services.Description
                        
                        if (parts.Count > 0)
                                ctx.ReportRuleViolation (value, BasicProfileRules.R2209);
+
+                       // check existence of corresponding operation in portType for each binding operation
+                       if (CheckCorrespondingOperationsForBinding (ctx, value, port))
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2718);
+
+                       // check duplicate operation signature.
+                       ArrayList sigs = new ArrayList ();
+                       foreach (OperationBinding ob in value.Operations) {
+                               if (sigs.Contains (ob.Name))
+                                       ctx.ReportRuleViolation (value, BasicProfileRules.R2710);
+                               sigs.Add (ob.Name);
+                       }
+
+                       // check namespace declarations.
+                       switch (type) {
+                       case LiteralType.Document:
+                       case LiteralType.Rpc:
+                               CheckSoapBindingExtensions (ctx, value, type);
+                               break;
+                       }
+               }
+               
+               bool CheckCorrespondingOperationsForBinding (ConformanceCheckContext ctx, Binding value, PortType port)
+               {
+                       if (value.Operations.Count != port.Operations.Count)
+                               return true;
+                       foreach (OperationBinding b in value.Operations) {
+                               Operation op = port.Operations.Find (b.Name);
+                               if (op == null)
+                                       return true;
+
+                               bool msg, bind;
+                               // input
+                               msg = op.Messages.Input != null;
+                               bind = b.Input != null;
+                               if (msg != bind)
+                                       return true;
+                               // output
+                               msg = op.Messages.Output != null;
+                               bind = b.Output != null;
+                               if (msg != bind)
+                                       return true;
+                               // faults
+                               foreach (FaultBinding fb in b.Faults)
+                                       if (op.Messages.Find (fb.Name) == null)
+                                               return true;
+                       }
+                       return false;
+               }
+               
+               void CheckSoapBindingExtensions (ConformanceCheckContext ctx, Binding value, LiteralType type)
+               {
+                       bool violationNS = false;
+                       bool violation2717 = false;
+                       bool violation2720 = false;
+                       bool violation2721 = false;
+
+                       foreach (OperationBinding op in value.Operations) {
+                               SoapBodyBinding sbb = op.Extensions.Find (typeof (SoapBodyBinding)) as SoapBodyBinding;
+                               if (sbb != null) {
+                                       if (type == LiteralType.Document && sbb.Namespace != null)
+                                               violationNS = true;
+                                       if (type == LiteralType.Rpc && sbb.Namespace == null)
+                                               violation2717 = true;
+                               }
+
+                               SoapHeaderBinding shb = op.Extensions.Find (typeof (SoapHeaderBinding)) as SoapHeaderBinding;
+                               if (shb != null) {
+                                       violationNS |= shb.Namespace != null;
+                                       violation2720 |= !IsValidPart (shb.Part);
+                               }
+
+                               SoapHeaderFaultBinding sfhb = op.Extensions.Find (typeof (SoapHeaderFaultBinding)) as SoapHeaderFaultBinding;
+                               if (sfhb != null) {
+                                       violationNS |= sfhb.Namespace != null;
+                                       violation2720 |= !IsValidPart (sfhb.Part);
+                               }
+
+                               SoapFaultBinding sfb = op.Extensions.Find (typeof (SoapFaultBinding)) as SoapFaultBinding;
+                               if (sfb != null) {
+                                       violation2721 |= sfb.Name == null;
+                                       violationNS |= sfb.Namespace != null;
+                               }
+                       }
+                       if (violationNS)
+                               ctx.ReportRuleViolation (value,
+                                       type == LiteralType.Document ?
+                                       BasicProfileRules.R2716 :
+                                       BasicProfileRules.R2726);
+                       if (violation2717)
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2717);
+                       if (violation2720)
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2720);
+                       if (violation2721)
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2721);
                }
                
-               public override void Check (ConformanceCheckContext ctx, OperationBinding ob) 
+               bool IsValidPart (string part)
                {
+                       if (part == null)
+                               return false;
+                       try {
+                               XmlConvert.VerifyNMTOKEN (part);
+                               return true;
+                       } catch (XmlException) {
+                               return false;
+                       }
+               }
+               
+               public override void Check (ConformanceCheckContext ctx, OperationBinding value) 
+               {
+                       bool r2754 = false;
+                       bool r2723 = false;
+                       foreach (FaultBinding fb in value.Faults) {
+                               SoapFaultBinding sfb = (SoapFaultBinding) value.Extensions.Find (typeof (SoapFaultBinding));
+                               if (sfb == null)
+                                       continue;
+                               r2754 |= sfb.Name != fb.Name;
+                               r2723 |= sfb.Use == SoapBindingUse.Encoded;
+                       }
+                       if (r2754)
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2754);
+                       if (r2723)
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2723);
                }
                
                void CheckMessageBinding (ConformanceCheckContext ctx, Hashtable portParts, MessageBinding value)
@@ -226,10 +399,56 @@ namespace System.Web.Services.Description
                        return null;
                }
                
-               public override void Check (ConformanceCheckContext ctx, Operation value) { }
+               public override void Check (ConformanceCheckContext ctx, Operation value)
+               {
+                       switch (value.Messages.Flow) {
+                       case OperationFlow.SolicitResponse:
+                       case OperationFlow.Notification:
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2303);
+                               break;
+                       }
+
+                       CheckR2305 (ctx, value);
+               }
+
+               void CheckR2305 (ConformanceCheckContext ctx, Operation value)
+               {
+                       string [] order = value.ParameterOrder;
+                       ServiceDescription sd = value.PortType.ServiceDescription;
+                       Message omitted = null;
+                       foreach (OperationMessage m in value.Messages) {
+                               if (m.Name == null)
+                                       continue; // it is doubtful, but R2305 is not to check such cases anyways.
+                               Message msg = sd.Messages [m.Name];
+                               if (msg == null)
+                                       continue; // it is doubtful, but R2305 is not to check such cases anyways.
+                               foreach (MessagePart p in msg.Parts) {
+                                       if (order != null && Array.IndexOf (order, p.Name) >= 0)
+                                               continue;
+                                       if (omitted == null) {
+                                               omitted = msg;
+                                               continue;
+                                       }
+                                       ctx.ReportRuleViolation (value, BasicProfileRules.R2305);
+                                       return;
+                               }
+                       }
+               }
+
                public override void Check (ConformanceCheckContext ctx, OperationMessage value) { }
                public override void Check (ConformanceCheckContext ctx, Port value) { }
-               public override void Check (ConformanceCheckContext ctx, PortType value) { }
+
+               public override void Check (ConformanceCheckContext ctx, PortType value)
+               {
+                       ArrayList names = new ArrayList ();
+                       foreach (Operation o in value.Operations) {
+                               if (names.Contains (o.Name))
+                                       ctx.ReportRuleViolation (value, BasicProfileRules.R2304);
+                               else
+                                       names.Add (o.Name);
+                       }
+               }
+
                public override void Check (ConformanceCheckContext ctx, Service value) { }
                
                public override void Check (ConformanceCheckContext ctx, XmlSchema s)
@@ -245,7 +464,8 @@ namespace System.Web.Services.Description
                
                public override void Check (ConformanceCheckContext ctx, XmlSchemaImport value)
                {
-                       XmlSchema doc = ctx.GetDocument (value.SchemaLocation) as XmlSchema;
+                       // LAMESPEC: same here to Check() for Import.
+                       XmlSchema doc = ctx.GetDocument (value.SchemaLocation, value.Namespace) as XmlSchema;
                        if (doc == null) ctx.ReportError (value, "Schema '" + value.SchemaLocation + "' not found");
                }
                
@@ -286,6 +506,8 @@ namespace System.Web.Services.Description
                        CheckSchemaQName (ctx, value, value.RefName);
                        CheckSchemaQName (ctx, value, value.SubstitutionGroup);
                        CheckSchemaQName (ctx, value, value.SchemaTypeName);
+                       if (value.Name != null && value.Name.StartsWith ("ArrayOf", StringComparison.Ordinal))
+                               ctx.ReportRuleViolation (value, BasicProfileRules.R2112);
                }
                
                public override void Check (ConformanceCheckContext ctx, XmlSchemaGroupRef value)
@@ -402,64 +624,74 @@ namespace System.Web.Services.Description
        
        internal class BasicProfileRules
        {
-       
-       // 3.2 Conformance of Services, Consumers and Registries
-       
+               #region "Basic Profile 1.1 Section 4 (Service Description)"
+
+               // (BTW R1034 turned out to be a spec bug.)
+
+       // 4.1 Required Description
                // Can't check: R0001
-               
-       // 3.3 Conformance Annotation in Descriptions
-       
-               // Can't check: R0002, R0003
-       
-       // 3.4 Conformance Annotation in Messages
-       
-               // Can't check: R0004, R0005, R0006, R0007
-               
-       // 3.5 Conformance Annotation in Registry Data
-       
-               // UDDI related: R3020, R3030, R3021, R3005, R3004.
-               
-       // 4.1 XML Representation of SOAP Messages
-               
-               // Rules not related to service description
-               
-       // 4.2 SOAP Processing Model
-       
-               // Rules not related to service description
-               
-       // 4.3 Use of SOAP in HTTP
-       
-               // Rules not related to service description
-               
-       // 5.1 Document structure
-       
+
+       // 4.2 Document Structure
+
+               // R2028, R2029: schema conformance, depends on underlying XML
+
                public static readonly ConformanceRule R2001 = new ConformanceRule (
                        "R2001", 
                        "A DESCRIPTION MUST only use the WSDL \"import\" statement to import another WSDL description",
                        "");
-                       
+
+               public static readonly ConformanceRule R2803 = new ConformanceRule (
+                       "R2803", 
+                       "In a DESCRIPTION, the namespace attribute of the wsdl:import MUST NOT be a relative URI.",
+                       "");
+
                public static readonly ConformanceRule R2002 = new ConformanceRule (
                        "R2002", 
                        "To import XML Schema Definitions, a DESCRIPTION MUST use the XML Schema \"import\" statement",
                        "");
-                       
+
+               // R2003: depends on ServiceDescription raw XML.
+               // R2004, R2009, R2010, R2011: requires schema resolution
+               // which depends on XmlResolver, while 1) XmlUrlResolver
+               // might not always be proper (e.g. network resolution) and
+               // 2) custom XmlResolver might resolve non-XML.
+
                public static readonly ConformanceRule R2007 = new ConformanceRule (
                        "R2007", 
                        "A DESCRIPTION MUST specify a non-empty location attribute on the wsdl:import element",
                        "");
-                       
+
+               // R2008: denotes a possibility that cannot be verified.
+
+               // R2022, R2023, R4004: depends on underlying XML, which 
+               // is impossible when ServiceDescription is already read
+               // (WebServiceInteroperability.CheckConformance() is the case).
+
+               public static readonly ConformanceRule R4005 = new ConformanceRule (
+                       "R4005",
+                       "A DESCRIPTION SHOULD NOT contain the namespace declaration xmlns:xml=\"http://www.w3.org/XML/1998/namespace\"",
+                       "");
+
+               // R4002, R4003: depends on underlying XML
+
                public static readonly ConformanceRule R2005 = new ConformanceRule (
                        "R2005", 
                        "The targetNamespace attribute on the wsdl:definitions element of a description that is being imported MUST have same the value as the namespace attribute on the wsdl:import element in the importing DESCRIPTION",
                        "");
 
+               // R2030: is satisfied by API nature (DocumentableItem).
+
+               // R2025: cannot be checked.
+
                public static readonly ConformanceRule R2026 = new ConformanceRule (
                        "R2026", 
                        "A DESCRIPTION SHOULD NOT include extension elements with a wsdl:required attribute value of \"true\" on any WSDL construct (wsdl:binding,  wsdl:portType, wsdl:message, wsdl:types or wsdl:import) that claims conformance to the Profile",
                        "");
-                       
-       // 5.2 Types
-       
+
+               // R2027: is about the CONSUMER, cannot be checked.
+
+       // 4.3 Types
+
                public static readonly ConformanceRule R2101 = new ConformanceRule (
                        "R2101", 
                        "A DESCRIPTION MUST NOT use QName references to elements in namespaces that have been neither imported, nor defined in the referring WSDL document",
@@ -485,61 +717,94 @@ namespace System.Web.Services.Description
                        "In a DESCRIPTION, array declarations MUST NOT use wsdl:arrayType attribute in the type declaration",
                        "");
                        
-               // R2112: Suggestion.
-               // R2113: Not related to servide description
-               // R2114: Suggestion.
-               
-       // 5.3 Messages
+               public static readonly ConformanceRule R2112 = new ConformanceRule (
+                       "R2112", 
+                       "In a DESCRIPTION, elements SHOULD NOT be named using the convention ArrayOfXXX.",
+                       "");
+
+               // R2113: is about ENVELOPE.
+
+               // R2114: is satisfied by our processor.
+
+       // 4.4 Messages
        
                public static readonly ConformanceRule R2201 = new ConformanceRule (
                        "R2201", 
                        "A document-literal binding in a DESCRIPTION MUST, in each of its soapbind:body element(s), have at most one part listed in the parts attribute, if the parts attribute is specified",
                        "");
+
+               public static readonly ConformanceRule R2209 = new ConformanceRule (
+                       "R2209", 
+                       "A wsdl:binding in a DESCRIPTION SHOULD bind every wsdl:part of a wsdl:message in the wsdl:portType to which it refers to one of soapbind:body, soapbind:header, soapbind:fault  or soapbind:headerfault",
+                       "");
                
                public static readonly ConformanceRule R2210 = new ConformanceRule (
                        "R2210", 
                        "If a document-literal binding in a DESCRIPTION does not specify the parts attribute on a soapbind:body element, the corresponding abstract wsdl:message MUST define zero or one wsdl:parts",
                        "");
-               
+
+               // R2202: Suggestion.
+
                public static readonly ConformanceRule R2203 = new ConformanceRule (
                        "R2203", 
                        "An rpc-literal binding in a DESCRIPTION MUST refer, in its soapbind:body element(s), only to wsdl:part element(s) that have been defined using the type attribute",
                        "");
-               
+
+               // R2211: Related to ENVELOPE
+               // R2207: is about allowed condition (MAY).
+
                public static readonly ConformanceRule R2204 = new ConformanceRule (
                        "R2204", 
                        "A document-literal binding in a DESCRIPTION MUST refer, in each of its soapbind:body element(s), only to wsdl:part element(s) that have been defined using the element attribute",
                        "");
-               
+
+               // R2208: is about allowed condition (MAY).
+               // R2212, R2213, R2214: related to ENVELOPE
+
                public static readonly ConformanceRule R2205 = new ConformanceRule (
                        "R2205", 
                        "A wsdl:binding in a DESCRIPTION MUST refer, in each of its soapbind:header, soapbind:headerfault and soapbind:fault elements, only to wsdl:part element(s) that have been defined using the element attribute",
                        "");
-               
-               public static readonly ConformanceRule R2209 = new ConformanceRule (
-                       "R2209", 
-                       "A wsdl:binding in a DESCRIPTION SHOULD bind every wsdl:part of a wsdl:message in the wsdl:portType to which it refers to one of soapbind:body, soapbind:header, soapbind:fault  or soapbind:headerfault",
-                       "");
-               
+
                public static readonly ConformanceRule R2206 = new ConformanceRule (
                        "R2206", 
                        "A wsdl:message in a DESCRIPTION containing a wsdl:part that uses the element attribute MUST refer, in that attribute, to a global element declaration",
                        "");
-               
-               // R2211: Related to message structure
-               // R2202: Suggestion.
-               // R2207: Optional
-               // R2208: Optional
-               
-       // 5.4 Port Types
-       
-               // TODO
-       
-       // 5.5 Bindings
-       
-               // TODO
-                       
-       // 5.6 SOAP Binding
+
+       // 4.5 Port Types
+
+               // R2301: Related to ENVELOPE.
+               // R2302: Optional
+
+               // btw it's not on Basic Profile TAD
+               public static readonly ConformanceRule R2303 = new ConformanceRule (
+                       "R2303", 
+                       "A DESCRIPTION MUST NOT use Solicit-Response and Notification type operations in a wsdl:portType definition.",
+                       "");
+
+               public static readonly ConformanceRule R2304 = new ConformanceRule (
+                       "R2304", 
+                       "A wsdl:portType in a DESCRIPTION MUST have operations with distinct values for their name attributes.",
+                       "");
+
+               public static readonly ConformanceRule R2305 = new ConformanceRule (
+                       "R2305", 
+                       "A wsdl:operation element child of a wsdl:portType element in a DESCRIPTION MUST be constructed so that the parameterOrder attribute, if present, omits at most 1 wsdl:part from the output message.",
+                       "");
+
+               public static readonly ConformanceRule R2306 = new ConformanceRule (
+                       "R2306", 
+                       "A wsdl:message in a DESCRIPTION MUST NOT specify both type and element attributes on the same wsdl:part.",
+                       "");
+
+       // 4.6 Bindings
+
+               public static readonly ConformanceRule R2401 = new ConformanceRule (
+                       "R2401", 
+                       "A wsdl:binding element in a DESCRIPTION MUST use WSDL SOAP Binding as defined in WSDL 1.1 Section 3.",
+                       "");
+
+       // 4.7 SOAP Binding
                
                public static readonly ConformanceRule R2701 = new ConformanceRule (
                        "R2701", 
@@ -561,31 +826,132 @@ namespace System.Web.Services.Description
                        "A wsdl:binding in a DESCRIPTION MUST use the value of \"literal\" for the use attribute in all soapbind:body, soapbind:fault, soapbind:header and soapbind:headerfault elements",
                        "");
                        
-               // R2707: Interpretation rule: A wsdl:binding in a DESCRIPTION that contains one or more  soapbind:body, soapbind:fault, soapbind:header or  soapbind:headerfault elements that do not specify the use attribute MUST be interpreted as though the value "literal" had been specified in each case
                // R2709: Suggestion.
-               
-               // TODO
-       }
-       
-       /* 
-               The following rules cannot be checked:
-               R2002, R2003, R4004, R4003, R2022, R2023, R2004, R2010, R2011
-                       There is no access to the unerlying xml 
+
+               public static readonly ConformanceRule R2710 = new ConformanceRule (
+                       "R2710", 
+                       "The operations in a wsdl:binding in a DESCRIPTION MUST result in operation signatures that are different from one another.",
+                       "");
                        
-               The following are suggestions:
-               R2008, R2112
-               
-               The following are optional
-               R4002, R2020, R2021, R2024, R2114
-               
-               Can't be checked:
-               R2025
-               
-               Process related
-               R2027
-               
-               TODO: section 5.3
-       */
+               public static readonly ConformanceRule R2711 = new ConformanceRule (
+                       "R2711", 
+                       "A DESCRIPTION SHOULD NOT have more than one wsdl:port with the same value for the location attribute of the soapbind:address element.",
+                       "");
+                       
+               // R2712: related to ENVELOPE.
+               // R2714: related to INSTANCE.
+               // R2750, R2727: related to CONSUMER.
+
+               public static readonly ConformanceRule R2716 = new ConformanceRule (
+                       "R2716", 
+                       "A document-literal binding in a DESCRIPTION MUST NOT have the namespace attribute specified on contained soapbind:body, soapbind:header, soapbind:headerfault and soapbind:fault elements.",
+                       "");
+                       
+               public static readonly ConformanceRule R2717 = new ConformanceRule (
+                       "R2717", 
+                       "An rpc-literal binding in a DESCRIPTION MUST have the namespace attribute specified, the value of which MUST be an absolute URI, on contained  soapbind:body elements.",
+                       "");
+                       
+               public static readonly ConformanceRule R2726 = new ConformanceRule (
+                       "R2726", 
+                       "An rpc-literal binding in a DESCRIPTION MUST NOT have the namespace attribute specified on contained soapbind:header,  soapbind:headerfault and soapbind:fault elements.",
+                       "");
+                       
+
+               public static readonly ConformanceRule R2718 = new ConformanceRule (
+                       "R2718", 
+                       "A wsdl:binding in a DESCRIPTION MUST have the same set of wsdl:operations as the wsdl:portType to which it refers.",
+                       "");
+                       
+
+               // R2719: is about allowed condition (MAY).
+               // R2740, R2741: no way to detect known faults here.
+               // R2742, R2743: related to ENVELOPE.
+
+               public static readonly ConformanceRule R2720 = new ConformanceRule (
+                       "R2720", 
+                       "A wsdl:binding in a DESCRIPTION MUST use the part attribute with a schema type of \"NMTOKEN\" on all contained soapbind:header and soapbind:headerfault elements.",
+                       "");
+                       
+
+               // R2749: is satisfied by API nature.
+
+               public static readonly ConformanceRule R2721 = new ConformanceRule (
+                       "R2721", 
+                       "A wsdl:binding in a DESCRIPTION MUST have the name  attribute specified on all contained soapbind:fault elements.",
+                       "");
+
+               public static readonly ConformanceRule R2754 = new ConformanceRule (
+                       "R2754", 
+                       "In a DESCRIPTION, the value of the name attribute on a soapbind:fault element MUST match the value of the name attribute on its parent wsdl:fault element.",
+                       "");
+
+               // R2722: is about allowed condition (MAY).
+
+               public static readonly ConformanceRule R2723 = new ConformanceRule (
+                       "R2723", 
+                       "f in a wsdl:binding in a DESCRIPTION the use attribute on a contained soapbind:fault element is present, its value MUST be \"literal\".",
+                       "");
+
+               // R2707: is satisfied by our implementation.
+               // R2724, R2725: related to INSTANCE.
+               // R2729, R2735: related to ENVELOPE.
+               // R2755: related to MESSAGE.
+               // R2737, R2738, R2739, R2753: related to ENVELOPE.
+               // R2751, R2752: related to ENVELOPE.
+               // R2744, R2745: related to MESSAGE.
+               // R2747, R2748: related to CONSUMER.
+
+       // 4.8 Use of XML Schema
+
+               // R2800: satisfied by API nature.
+               // R2801: ditto.
+
+               #endregion
+
+               /*
+
+               Below are the combination of these documents:
+               http://www.ws-i.org/Profiles/BasicProfile-1.1-2004-08-24.html
+               http://www.ws-i.org/Testing/Tools/2005/01/BP11_TAD_1-1.htm
+
+               TAD No. component       recomm. WS-I Req.
+               BP2010  portType                R2304   
+               BP2011  types                   R2011   
+               BP2012  binding                 R2204   
+               BP2013  binding                 R2203   
+               BP2014  operation               R2305   
+               BP2017  binding                 R2705,R2706
+               BP2018  definitions             R2023,R2030
+               BP2019  binding                 R2716   
+               BP2020  binding                 R2717   
+               BP2021  binding                 R2720,R2749
+               BP2022  binding                 R2721   
+               BP2032  binding                 R2754   
+               BP2034  definitions     rec.    R1034,R4005
+               BP2098  import                  R2007   
+               BP2101  definitions             R2001   
+               BP2103  definitions             R2003   
+               BP2104  definitions             R2005   
+               BP2105  definitions             R2022,R2030
+               BP2107  types                   R2105   
+               BP2108  types                   R2110,R2111
+               BP2110  types           rec.    R2112   
+               BP2111  binding                 R2201   
+               BP2112  binding                 R2207   
+               BP2113  binding                 R2205   
+               BP2114  binding         rec.    R2209   
+               BP2115  message                 R2206   
+               BP2116  message                 R2306   
+               BP2117  binding                 R2726   
+               BP2118  binding                 R2718   
+               BP2119  binding                 R2210   
+               BP2120  binding                 R2710   
+               BP2122  types                   R2801   
+               BP2123  definitions     rec.    R2026   
+               BP2803  import                  R2803   
+
+               */
+       }
 }
 
-#endif