Add some more error checking.
authorDuncan Mak <duncan@mono-cvs.ximian.com>
Thu, 20 Mar 2003 07:03:17 +0000 (07:03 -0000)
committerDuncan Mak <duncan@mono-cvs.ximian.com>
Thu, 20 Mar 2003 07:03:17 +0000 (07:03 -0000)
svn path=/trunk/mcs/; revision=12696

mcs/tools/mono-xsd/MonoXSD.cs

index 996ee1a75249957429d28c447ae232c7b49cba5b..bab98f2e6ea13d29de71d2616fcd13274323699a 100755 (executable)
@@ -23,7 +23,7 @@ namespace Mono.Util {
                 static readonly string xs = "http://www.w3.org/2001/XMLSchema";\r
                 static Hashtable generatedSchemaTypes;\r
 \r
-                static void Main (string [] args) \r
+               static void Main (string [] args) \r
                 {\r
                         string assembly = args [0];\r
 \r
@@ -44,7 +44,7 @@ namespace Mono.Util {
                 /// <summary>\r
                 ///     Writes a schema for each type in the assembly\r
                 /// </summary>\r
-                static void WriteSchema (string assembly) \r
+               static void WriteSchema (string assembly) \r
                 {\r
                         Assembly a = Assembly.LoadFrom (assembly);\r
                         generatedSchemaTypes = new Hashtable ();\r
@@ -79,7 +79,7 @@ namespace Mono.Util {
                 ///     Given a Type and its associated schema type, add aa '<xs;element>' node \r
                 ///     to the schema.\r
                 /// </summary>\r
-                static XmlSchemaElement WriteSchemaElement (Type type, XmlSchemaType schemaType) \r
+               static XmlSchemaElement WriteSchemaElement (Type type, XmlSchemaType schemaType) \r
                 {\r
                         XmlSchemaElement schemaElement = new XmlSchemaElement ();\r
                         schemaElement.Name = type.Name;\r
@@ -96,7 +96,7 @@ namespace Mono.Util {
                         return schemaElement;\r
                 }\r
                \r
-                static void OnSchemaValidation (object sender, ValidationEventArgs args) \r
+               static void OnSchemaValidation (object sender, ValidationEventArgs args) \r
                 {\r
                         Console.WriteLine (args.Message);\r
                 }\r
@@ -106,7 +106,7 @@ namespace Mono.Util {
                 ///     From a Type, create a corresponding ComplexType node to\r
                 ///     represent this Type.\r
                 /// </summary>\r
-                static XmlSchemaType WriteSchemaType (Type type) \r
+               static XmlSchemaType WriteSchemaType (Type type) \r
                 {\r
                         if (generatedSchemaTypes.Contains (type.FullName)) // Caching\r
                                 return generatedSchemaTypes [type.FullName] as XmlSchemaType;\r
@@ -148,7 +148,7 @@ namespace Mono.Util {
                         return schemaType;\r
                 }\r
 \r
-                static XmlSchemaType WriteEnum (Type type) \r
+               static XmlSchemaType WriteEnum (Type type) \r
                 {\r
                         if (type.IsEnum == false)\r
                                 throw new Exception (String.Format ("{0} is not an enumeration.", type.Name));\r
@@ -174,7 +174,7 @@ namespace Mono.Util {
                         return simpleType;\r
                 }\r
 \r
-                static XmlSchemaType WriteArray (Type type) \r
+               static XmlSchemaType WriteArray (Type type) \r
                 {\r
                         XmlSchemaComplexType complexType = new XmlSchemaComplexType ();\r
                         string type_name = type.Name.Substring (0, type.Name.Length - 2);\r
@@ -186,9 +186,15 @@ namespace Mono.Util {
                         element.MinOccurs = 0;\r
                         element.MaxOccursString = "unbounded";\r
                         element.IsNillable = true;\r
-                        element.Name = type_name.ToLower ();                   \r
-                        element.SchemaTypeName = GetQualifiedName (\r
-                                type.FullName.Substring (0, type.FullName.Length - 2));\r
+\r
+                       element.Name = type_name.ToLower ();\r
+                       XmlQualifiedName qname = GetQualifiedName (\r
+                               type.FullName.Substring (0, type.FullName.Length - 2));\r
+\r
+                       if (qname == null)\r
+                               return null;\r
+                       \r
+                        element.SchemaTypeName = qname;\r
                         \r
                         sequence.Items.Add (element);\r
                         complexType.Particle = sequence;\r
@@ -203,7 +209,7 @@ namespace Mono.Util {
                 ///     If type is null, it'll create a new complexType \r
                 ///     with an XmlAny node in its sequence child node.\r
                 /// </summary>\r
-                static XmlSchemaType WriteComplexType (Type type) \r
+               static XmlSchemaType WriteComplexType (Type type) \r
                 {\r
                         //\r
                         // Recursively generate schema for all parent types\r
@@ -247,7 +253,7 @@ namespace Mono.Util {
                         return complexType;\r
                 }       \r
 \r
-                static XmlSchemaSequence PopulateSequence (FieldInfo [] fields, PropertyInfo [] properties) \r
+               static XmlSchemaSequence PopulateSequence (FieldInfo [] fields, PropertyInfo [] properties) \r
                 {\r
                         if (fields == null && properties == null)\r
                                 return null;\r
@@ -256,7 +262,7 @@ namespace Mono.Util {
                         \r
                         try {\r
                                 foreach (FieldInfo field in fields)\r
-                                        AddElement (sequence, field, field.FieldType);\r
+                               AddElement (sequence, field, field.FieldType);\r
 \r
                         } catch (Exception e) {\r
                                 throw e;\r
@@ -267,7 +273,7 @@ namespace Mono.Util {
 \r
                         try {\r
                                 foreach (PropertyInfo property in properties)\r
-                                        AddElement (sequence, property, property.PropertyType);\r
+                               AddElement (sequence, property, property.PropertyType);\r
 \r
                         } catch (ArgumentException e) {\r
                                 throw e;\r
@@ -276,7 +282,7 @@ namespace Mono.Util {
                         return sequence;\r
                 }\r
 \r
-                static void AddElement (XmlSchemaSequence sequence, MemberInfo member, Type type) \r
+               static void AddElement (XmlSchemaSequence sequence, MemberInfo member, Type type) \r
                 {\r
                         //\r
                         // Only read/write properties are supported.\r
@@ -302,9 +308,16 @@ namespace Mono.Util {
                         if (!type.IsAbstract && typeof (System.Delegate).IsAssignableFrom (type))\r
                                 return;\r
 \r
+                       //\r
+                       // Handle arrays here\r
+                       //\r
                         if (type.IsArray) {\r
                                 XmlSchemaType arrayType = WriteArray (type);\r
-                                schema.Items.Add (arrayType);\r
+\r
+                               if (arrayType == null)\r
+                                       throw new ArgumentException (String.Format ("The type '{0}' cannot be represented in XML Schema.", type.FullName));\r
+                               \r
+                               schema.Items.Add (arrayType);\r
                         }\r
 \r
                         XmlSchemaElement element = new XmlSchemaElement ();\r
@@ -332,7 +345,7 @@ namespace Mono.Util {
                         sequence.Items.Add (element);\r
                 }\r
 \r
-                static XmlQualifiedName GetQualifiedName (Type type) \r
+               static XmlQualifiedName GetQualifiedName (Type type) \r
                 {\r
                         if (type.Equals (typeof (System.Xml.XmlNode)))\r
                                 return XmlQualifiedName.Empty;\r
@@ -340,9 +353,10 @@ namespace Mono.Util {
                         else if (type.IsSubclassOf (typeof (System.Xml.XmlNode)))\r
                                 return new XmlQualifiedName ("xml");\r
 \r
-                        else if (type.IsArray) {\r
+                        else if (type.IsArray && (GetQualifiedName (type.FullName) != XmlQualifiedName.Empty)) {\r
                                 string array_type = type.Name.Substring (0, type.Name.Length - 2);\r
                                 return new XmlQualifiedName ("ArrayOf" + array_type);\r
+\r
                         } else \r
                                 return GetQualifiedName (type.FullName);\r
                 }\r
@@ -350,59 +364,59 @@ namespace Mono.Util {
                 ///<summary>\r
                 ///    Populates element nodes inside a '<xs:sequence>' node.\r
                 ///</summary>\r
-                static XmlQualifiedName GetQualifiedName (string type) \r
+               static XmlQualifiedName GetQualifiedName (string type) \r
                 {\r
                         string type_name;\r
 \r
                         switch (type) {\r
-                                case "System.Uri":\r
-                                        type_name =  "anyURI";\r
-                                        break;\r
-                                case "System.Boolean":\r
-                                        type_name = "Boolean";\r
-                                        break;\r
-                                case "System.SByte":\r
-                                        type_name = "Byte";\r
-                                        break;\r
-                                case "System.DateTime":\r
-                                        type_name = "dateTime";\r
-                                        break;\r
-                                case "System.Decimal":\r
-                                        type_name = "decimal";\r
-                                        break;\r
-                                case "System.Double":\r
-                                        type_name = "Double";\r
-                                        break;\r
-                                case "System.Int16":\r
-                                        type_name = "short";\r
-                                        break;\r
-                                case "System.Int32":\r
-                                        type_name =  "int";\r
-                                        break;\r
-                                case "System.Int64":\r
-                                        type_name = "long";\r
-                                        break;\r
-                                case "System.Xml.XmlQualifiedName":\r
-                                        type_name = "QName";\r
-                                        break;\r
-                                case "System.TimeSpan":\r
-                                        type_name = "duration";\r
-                                        break;\r
-                                case "System.String":\r
-                                        type_name = "string";\r
-                                        break;\r
-                                case "System.UInt16":\r
-                                        type_name = "unsignedShort";\r
-                                        break;\r
-                                case "System.UInt32":\r
-                                        type_name = "unsignedInt";\r
-                                        break;\r
-                                case "System.UInt64":\r
-                                        type_name = "unsignedLong";            \r
-                                        break;           \r
-                                default:\r
-                                        type_name = null;\r
-                                        break;\r
+                       case "System.Uri":\r
+                               type_name =  "anyURI";\r
+                               break;\r
+                       case "System.Boolean":\r
+                               type_name = "Boolean";\r
+                               break;\r
+                       case "System.SByte":\r
+                               type_name = "Byte";\r
+                               break;\r
+                       case "System.DateTime":\r
+                               type_name = "dateTime";\r
+                               break;\r
+                       case "System.Decimal":\r
+                               type_name = "decimal";\r
+                               break;\r
+                       case "System.Double":\r
+                               type_name = "Double";\r
+                               break;\r
+                       case "System.Int16":\r
+                               type_name = "short";\r
+                               break;\r
+                       case "System.Int32":\r
+                               type_name =  "int";\r
+                               break;\r
+                       case "System.Int64":\r
+                               type_name = "long";\r
+                               break;\r
+                       case "System.Xml.XmlQualifiedName":\r
+                               type_name = "QName";\r
+                               break;\r
+                       case "System.TimeSpan":\r
+                               type_name = "duration";\r
+                               break;\r
+                       case "System.String":\r
+                               type_name = "string";\r
+                               break;\r
+                       case "System.UInt16":\r
+                               type_name = "unsignedShort";\r
+                               break;\r
+                       case "System.UInt32":\r
+                               type_name = "unsignedInt";\r
+                               break;\r
+                       case "System.UInt64":\r
+                               type_name = "unsignedLong";             \r
+                               break;           \r
+                       default:\r
+                               type_name = null;\r
+                               break;\r
                         }       \r
                                 \r
                         if (type_name == null)\r