using System.IO;\r
using System.Web.Services.Description;\r
using System.Xml.Serialization;\r
+using System.Xml;\r
+using System.Xml.Schema;\r
\r
namespace System.Web.Services.Discovery {\r
\r
protected internal override void Resolve (string contentType, Stream stream) \r
{\r
ServiceDescription wsdl = ServiceDescription.Read (stream);\r
- ClientProtocol.Documents.Add (Url, wsdl);\r
+ \r
if (!ClientProtocol.References.Contains (Url))\r
ClientProtocol.References.Add (this);\r
+\r
+ ClientProtocol.Documents.Add (Url, wsdl);\r
+ ResolveInternal (ClientProtocol, wsdl);\r
+ }\r
+ \r
+ internal void ResolveInternal (DiscoveryClientProtocol prot, ServiceDescription wsdl) \r
+ {\r
+ if (wsdl.Imports == null) return;\r
+ \r
+ foreach (Import import in wsdl.Imports)\r
+ {\r
+ if (prot.Documents.Contains (import.Location)) // Already resolved\r
+ continue;\r
+ \r
+ string url = import.Location;\r
+ string contentType = null;\r
+ Stream stream = prot.Download (ref url, ref contentType);\r
+ XmlTextReader reader = new XmlTextReader (stream);\r
+ reader.MoveToContent ();\r
+ \r
+ DiscoveryReference refe;\r
+ if (ServiceDescription.CanRead (reader))\r
+ {\r
+ ServiceDescription refWsdl = ServiceDescription.Read (reader);\r
+ refe = new ContractReference ();\r
+ refe.ClientProtocol = prot;\r
+ refe.Url = url;\r
+ ((ContractReference)refe).ResolveInternal (prot, refWsdl);\r
+ prot.Documents.Add (url, refWsdl);\r
+ }\r
+ else\r
+ {\r
+ XmlSchema schema = XmlSchema.Read (reader, null);\r
+ refe = new SchemaReference ();\r
+ refe.ClientProtocol = prot;\r
+ refe.Url = url;\r
+ prot.Documents.Add (url, schema);\r
+ }\r
+ \r
+ if (!prot.References.Contains (url))\r
+ prot.References.Add (refe);\r
+ \r
+ reader.Close ();\r
+ }\r
}\r
\r
public override void WriteDocument (object document, Stream stream) \r
doc = new DiscoveryDocument ();\r
refe = new ContractReference ();\r
doc.References.Add (refe);\r
+ ((ContractReference)refe).ResolveInternal (this, wsdl);\r
}\r
else\r
{\r
object doc = Documents [re.Url];\r
if (doc == null) continue;\r
\r
- resfile.Results.Add (new DiscoveryClientResult (re.GetType(), re.Url, re.DefaultFilename));\r
+ string fileName = FindValidName (resfile, re.DefaultFilename);\r
+ resfile.Results.Add (new DiscoveryClientResult (re.GetType(), re.Url, fileName));\r
\r
- string filepath = Path.Combine (directory, re.DefaultFilename);\r
+ string filepath = Path.Combine (directory, fileName);\r
FileStream fs = new FileStream (filepath, FileMode.Create, FileAccess.Write);\r
re.WriteDocument (doc, fs);\r
fs.Close ();\r
return resfile.Results;\r
}\r
\r
+ string FindValidName (DiscoveryClientResultsFile resfile, string baseName)\r
+ {\r
+ string name = baseName;\r
+ int id = 0;\r
+ bool found;\r
+ do\r
+ {\r
+ found = false;\r
+ foreach (DiscoveryClientResult res in resfile.Results)\r
+ {\r
+ if (name == res.Filename) {\r
+ found = true; break;\r
+ }\r
+ }\r
+ if (found)\r
+ name = Path.GetFileNameWithoutExtension (baseName) + (++id) + Path.GetExtension (baseName);\r
+ }\r
+ while (found);\r
+ \r
+ return name;\r
+ }\r
+ \r
#endregion // Methods\r
\r
#region Classes\r