Merge pull request #1296 from directhex/master
[mono.git] / mcs / tools / wsdl / MonoWSDL.cs
index 2ba36ca02d2c229d221015bc32bbf5cafde6dd9d..430b225329d1e6d533d9fd206a04752b82574306 100644 (file)
@@ -7,7 +7,10 @@
 /// Copyright (C) 2003, Erik LeBel,\r
 ///\r
 \r
+#if !NET_2_0\r
+\r
 using System;\r
+using System.Collections.Specialized;\r
 using System.Xml;\r
 using System.Xml.Schema;\r
 using System.Collections;\r
@@ -17,9 +20,9 @@ using System.IO;
 using System.Net;\r
 using System.Web.Services.Description;\r
 using System.Web.Services.Discovery;\r
-using System.Reflection;
-
-using Microsoft.CSharp;
+using System.Reflection;\r
+\r
+using Microsoft.CSharp;\r
 \r
 namespace Mono.WebServices\r
 {\r
@@ -153,14 +156,14 @@ namespace Mono.WebServices
                        \r
                        string fileName = null;\r
                        bool hasBindings = false;\r
-                       
+                       \r
                        foreach (ServiceDescription desc in descriptions)\r
-                       {
-                               if (fileName == null && desc.Services.Count > 0)
+                       {\r
+                               if (fileName == null && desc.Services.Count > 0)\r
                                        fileName = desc.Services[0].Name;\r
-
+\r
                                if (desc.Bindings.Count > 0 || desc.Services.Count > 0)\r
-                                       hasBindings = true;
+                                       hasBindings = true;\r
                        }\r
                        \r
                        if (fileName == null)\r
@@ -217,23 +220,31 @@ namespace Mono.WebServices
                ///\r
                private CodeDomProvider GetProvider()\r
                {\r
-                       CodeDomProvider provider;
-                                   
-                       switch (language.ToUpper ()) {
-                       case "CS":
-                               provider = new CSharpCodeProvider ();
-                               break;
-                       case "VB":
-                               provider = new Microsoft.VisualBasic.VBCodeProvider ();
-                               break;
-                       default:
-                               Type type = Type.GetType(language);
-                               if (type != null) {
-                                       return (CodeDomProvider) Activator.CreateInstance (type);
-                               }       
-                               throw new Exception ("Unknown language");
-                       }
-                       return provider;
+                       CodeDomProvider provider;\r
+                       Type type;\r
+                       \r
+                       switch (language.ToUpper ()) {\r
+                       case "CS":\r
+                               provider = new CSharpCodeProvider ();\r
+                               break;\r
+                       case "VB":\r
+                               provider = new Microsoft.VisualBasic.VBCodeProvider ();\r
+                               break;\r
+                       case "BOO":\r
+                               type = Type.GetType("Boo.Lang.CodeDom.BooCodeProvider, Boo.Lang.CodeDom, Version=1.0.0.0, Culture=neutral, PublicKeyToken=32c39770e9a21a67");\r
+                               if (type != null){\r
+                                       return (CodeDomProvider) Activator.CreateInstance (type);\r
+                               }\r
+                               throw new Exception ("Boo.Lang.CodeDom.BooCodeProvider not available");\r
+                                                        \r
+                       default:\r
+                               type = Type.GetType(language);\r
+                               if (type != null) {\r
+                                       return (CodeDomProvider) Activator.CreateInstance (type);\r
+                               }       \r
+                               throw new Exception ("Unknown language");\r
+                       }\r
+                       return provider;\r
                }\r
        }\r
        \r
@@ -250,8 +261,8 @@ namespace Mono.WebServices
                        "wsdl [options] {path | URL} \n\n"\r
                        + "   -d, -domain:domain           Domain of username for server authentication.\n"\r
                        + "   -l, -language:language       Language of generated code. Allowed CS (default)\n"\r
-                       + "                                and VB. You can also specify the fully qualified\n"
-                       + "                                name of a class that implements the\n"
+                       + "                                and VB. You can also specify the fully qualified\n"\r
+                       + "                                name of a class that implements the\n"\r
                        + "                                System.CodeDom.Compiler.CodeDomProvider Class.\n"\r
                        + "   -n, -namespace:ns            The namespace of the generated code, default\n"\r
                        + "                                namespace if none.\n"\r
@@ -296,7 +307,7 @@ namespace Mono.WebServices
                string password;\r
                string domain;\r
                \r
-               string url;\r
+               StringCollection urls = new StringCollection ();\r
                string className;\r
 \r
                ///\r
@@ -330,7 +341,7 @@ namespace Mono.WebServices
                        else\r
                        {\r
                                hasURL = true;\r
-                               url = argument;\r
+                               urls.Add (argument);\r
                                return;\r
                        }\r
                        \r
@@ -438,7 +449,7 @@ namespace Mono.WebServices
                                default:\r
                                        if (argument.StartsWith ("/") && argument.IndexOfAny (Path.InvalidPathChars) == -1) {\r
                                                hasURL = true;\r
-                                               url = argument;\r
+                                               urls.Add (argument);\r
                                                break;\r
                                        }\r
                                        else\r
@@ -517,29 +528,31 @@ namespace Mono.WebServices
                                        return 0;\r
                                }\r
                                \r
-                               if (className == null)\r
-                               {\r
+                               if (className == null) {\r
                                        DiscoveryClientProtocol dcc = CreateClient ();\r
-                                                                       \r
-                                       if (!url.StartsWith ("http://") && !url.StartsWith ("https://") && !url.StartsWith ("file://"))\r
-                                               url = "file://" + Path.GetFullPath (url);\r
-                                               \r
-                                       dcc.DiscoverAny (url);\r
-                                       dcc.ResolveAll ();\r
-                                       \r
-                                       foreach (object doc in dcc.Documents.Values)\r
-                                       {\r
+\r
+                                       foreach (string urlEntry in urls) {\r
+                                               string url = urlEntry;\r
+                                               dcc.AllowAutoRedirect = true;\r
+                                               if (!url.StartsWith ("http://") && !url.StartsWith ("https://") && !url.StartsWith ("file://"))\r
+                                                       url = new Uri (Path.GetFullPath (url)).ToString ();\r
+                                                       \r
+                                               dcc.DiscoverAny (url);\r
+                                               dcc.ResolveAll ();\r
+                                       }\r
+\r
+                                       foreach (object doc in dcc.Documents.Values) {\r
                                                if (doc is ServiceDescription)\r
-                                                       descriptions.Add ((ServiceDescription)doc);\r
+                                                       descriptions.Add ((ServiceDescription) doc);\r
                                                else if (doc is XmlSchema)\r
-                                                       schemas.Add ((XmlSchema)doc);\r
+                                                       schemas.Add ((XmlSchema) doc);\r
                                        }\r
-                                       \r
-                                       if (descriptions.Count == 0)\r
-                                               throw new Exception ("No WSDL document was found at the url " + url);\r
-                               }\r
-                               else\r
-                               {\r
+\r
+                                       if (descriptions.Count == 0) {\r
+                                               Console.WriteLine ("Warning: no classes were generated.");\r
+                                               return 0;\r
+                                       }\r
+                               } else {\r
                                        string[] names = className.Split (',');\r
                                        if (names.Length != 2) throw new Exception ("Invalid parameter value for 'type'");\r
                                        string cls = names[0].Trim ();\r
@@ -549,7 +562,8 @@ namespace Mono.WebServices
                                        Type t = asm.GetType (cls);\r
                                        if (t == null) throw new Exception ("Type '" + cls + "' not found in assembly " + assembly);\r
                                        ServiceDescriptionReflector reflector = new ServiceDescriptionReflector ();\r
-                                       reflector.Reflect (t, url);\r
+                                       foreach (string url in urls)\r
+                                               reflector.Reflect (t, url);\r
                                        foreach (XmlSchema s in reflector.Schemas)\r
                                                schemas.Add (s);\r
                                                \r
@@ -564,16 +578,19 @@ namespace Mono.WebServices
                                }\r
                                \r
                                // generate the code\r
-                               if (generator.GenerateCode (descriptions, schemas))\r
-                                       return 1;\r
-                               else\r
-                                       return 0;\r
+                               generator.GenerateCode (descriptions, schemas);\r
+                               return 0;\r
                        }\r
                        catch (NullReferenceException e)\r
                        {\r
                                Console.WriteLine (e);\r
                                return 2;\r
                        }\r
+                       catch (InvalidCastException e)\r
+                       {\r
+                               Console.WriteLine (e);\r
+                               return 2;\r
+                       }\r
                        catch (Exception exception)\r
                        {\r
                                Console.WriteLine("Error: {0}", exception.Message);\r
@@ -594,4 +611,6 @@ namespace Mono.WebServices
                        return d.Run(args);\r
                }\r
        }\r
-}
+}\r
+\r
+#endif\r