Skip to content

Commit

Permalink
2009-01-21 Atsushi Enomoto <atsushi@ximian.com>
Browse files Browse the repository at this point in the history
	* DataContractSerializerMessageContractImporter.cs :
	  some refactoring. Process all schemas, including those in WSDLs.


svn path=/trunk/mcs/; revision=124026
  • Loading branch information
atsushieno committed Jan 21, 2009
1 parent 060d976 commit 10fa718
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 14 deletions.
@@ -1,3 +1,8 @@
2009-01-21 Atsushi Enomoto <atsushi@ximian.com>

* DataContractSerializerMessageContractImporter.cs :
some refactoring. Process all schemas, including those in WSDLs.

2009-01-07 Atsushi Enomoto <atsushi@ximian.com>

* ContractDescription.cs : fix by corcompare.
Expand Down
Expand Up @@ -36,6 +36,7 @@
using System.Xml.Serialization;

using QName = System.Xml.XmlQualifiedName;
using WSDL = System.Web.Services.Description.ServiceDescription;

namespace System.ServiceModel.Description
{
Expand Down Expand Up @@ -63,6 +64,57 @@ public class DataContractSerializerMessageContractImporter
if (!enabled)
return;

if (importer == null)
throw new ArgumentNullException ("importer");
if (context == null)
throw new ArgumentNullException ("context");
if (this.importer != null || this.context != null)
throw new SystemException ("INTERNAL ERROR: unexpected recursion of ImportContract method call");

this.importer = importer;
this.context = context;
try {
DoImportContract ();
} finally {
this.importer = null;
this.context = null;
}
}

WsdlImporter importer;
WsdlContractConversionContext context;
XmlSchemaImporter schema_importer_;
XmlSchemaImporter schema_importer {
get {
if (schema_importer_ != null)
return schema_importer_;
schema_importer_ = new XmlSchemaImporter (xml_schemas);
return schema_importer_;
}
}

XmlSchemas xml_schemas_;
XmlSchemas xml_schemas {
get {
if (xml_schemas_ != null)
return xml_schemas_;
xml_schemas_ = new XmlSchemas ();

foreach (WSDL wsdl in importer.WsdlDocuments)
foreach (XmlSchema schema in wsdl.Types.Schemas)
xml_schemas_.Add (schema);

foreach (XmlSchema schema in importer.XmlSchemas.Schemas ())
xml_schemas_.Add (schema);

xml_schemas_.Compile (null, true);

return xml_schemas_;
}
}

void DoImportContract ()
{
PortType port_type = context.WsdlPortType;
ContractDescription contract = context.Contract;
int i, j;
Expand All @@ -86,7 +138,7 @@ public class DataContractSerializerMessageContractImporter
//ReturnValue
msg = port_type.ServiceDescription.Messages [opmsg.Message.Name];

resolveMessage (msg, msgdescr.Body, parts, importer);
resolveMessage (msg, msgdescr.Body, parts);
if (parts.Count > 0) {
msgdescr.Body.ReturnValue = parts [0];
parts.Clear ();
Expand All @@ -97,7 +149,7 @@ public class DataContractSerializerMessageContractImporter
/* OperationInput */

/* Parts, MessagePartDescription */
resolveMessage (msg, msgdescr.Body, parts, importer);
resolveMessage (msg, msgdescr.Body, parts);
foreach (MessagePartDescription p in parts)
msgdescr.Body.Parts.Add (p);
parts.Clear ();
Expand All @@ -111,39 +163,33 @@ public class DataContractSerializerMessageContractImporter

}

void resolveMessage (Message msg, MessageBodyDescription body, List<MessagePartDescription> parts, WsdlImporter importer)
void resolveMessage (Message msg, MessageBodyDescription body, List<MessagePartDescription> parts)
{
foreach (MessagePart part in msg.Parts) {
if (part.Name == "parameters") {
if (!part.Element.IsEmpty) {
body.WrapperName = part.Element.Name;
resolveElement (part.Element, parts, importer, body.WrapperNamespace);
resolveElement (part.Element, parts, body.WrapperNamespace);
} else {
body.WrapperName = part.Type.Name;
resolveType (part.Type, parts, importer, body.WrapperNamespace);
resolveType (part.Type, parts, body.WrapperNamespace);
}
}
//FIXME: non-parameters?
}
}

void resolveElement (QName qname, List<MessagePartDescription> parts, WsdlImporter importer, string ns)
void resolveElement (QName qname, List<MessagePartDescription> parts, string ns)
{
XmlSchemas xss = new XmlSchemas ();
foreach (XmlSchema schema in importer.XmlSchemas.Schemas ())
xss.Add (schema);
XmlSchemaImporter schema_importer = new XmlSchemaImporter (xss);

importer.XmlSchemas.Compile ();
XmlSchemaElement element = (XmlSchemaElement) importer.XmlSchemas.GlobalElements [qname];
XmlSchemaElement element = (XmlSchemaElement) xml_schemas.Find (qname, typeof (XmlSchemaElement));
if (element == null)
//FIXME: What to do here?
throw new Exception ("Could not resolve : " + qname.ToString ());

resolveParticle (schema_importer, element, parts, ns, 2);
}

void resolveType (QName qname, List<MessagePartDescription> parts, WsdlImporter importer, string ns)
void resolveType (QName qname, List<MessagePartDescription> parts, string ns)
{
/*foreach (XmlSchema xs in importer.Schemas)
if (xs.Types [qname] != null)
Expand Down

0 comments on commit 10fa718

Please sign in to comment.