* ContractReference.cs, DiscoveryClientProtocol.cs,
authorLluis Sanchez <lluis@novell.com>
Sat, 24 Jan 2004 01:56:33 +0000 (01:56 -0000)
committerLluis Sanchez <lluis@novell.com>
Sat, 24 Jan 2004 01:56:33 +0000 (01:56 -0000)
  DiscoveryDocumentReference.cs: When resolving a wsdl document, recursively
  resolve the documents it imports.

svn path=/trunk/mcs/; revision=22456

mcs/class/System.Web.Services/System.Web.Services.Discovery/ChangeLog
mcs/class/System.Web.Services/System.Web.Services.Discovery/ContractReference.cs
mcs/class/System.Web.Services/System.Web.Services.Discovery/DiscoveryClientProtocol.cs
mcs/class/System.Web.Services/System.Web.Services.Discovery/DiscoveryDocumentReference.cs

index 33b002c0d54d9baa85d7fe0b8c4478409365f867..10af1119e9ecebf2f8040ab3424993872f976685 100755 (executable)
@@ -1,3 +1,9 @@
+2004-01-24  Lluis Sanchez Gual <lluis@ximian.com>
+
+       * ContractReference.cs, DiscoveryClientProtocol.cs, 
+         DiscoveryDocumentReference.cs: When resolving a wsdl document, recursively
+         resolve the documents it imports.
+
 2003-12-19  Lluis Sanchez Gual <lluis@ximian.com>
 
        * DiscoveryDocument.cs: Set namespace for ContractReference references.
index 22455a8a6ebbb5d7988ec5e7e08b4f79567d0025..c4543c739c2847f0a32457621d639a090af6b9c4 100755 (executable)
@@ -11,6 +11,8 @@
 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
@@ -98,9 +100,53 @@ namespace System.Web.Services.Discovery {
                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
index 15168bc53529a341986a1aa80c6a5a79b5bfbb1d..960cd5ec89c09955d913cdfba282c58ed502d83b 100755 (executable)
@@ -105,6 +105,7 @@ namespace System.Web.Services.Discovery {
                                doc = new DiscoveryDocument ();\r
                                refe = new ContractReference ();\r
                                doc.References.Add (refe);\r
+                               ((ContractReference)refe).ResolveInternal (this, wsdl);\r
                        }\r
                        else\r
                        {\r
@@ -185,9 +186,10 @@ namespace System.Web.Services.Discovery {
                                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
@@ -200,6 +202,28 @@ namespace System.Web.Services.Discovery {
                        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
index e2dfd65b17ed3ca7c76125f16b16d00868c4f4e9..8db4834cbc575b5f552faf0f345843ebac608b06 100755 (executable)
@@ -91,7 +91,10 @@ namespace System.Web.Services.Discovery {
                                ClientProtocol.References.Add (this);\r
                                \r
                        foreach (DiscoveryReference re in doc.References)\r
+                       {\r
+                               re.ClientProtocol = ClientProtocol;\r
                                ClientProtocol.References.Add (re.Url, re);\r
+                       }\r
                }\r
 \r
                public void ResolveAll () \r