2005-01-13 Atsushi Enomoto <atsushi@ximian.com>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaCollection.cs
index 2f8fbbb2f5a8ae8593eb9d5a98ae043ac496525e..1f360d0723b2adb386e0d500fd4a21ce506a0016 100755 (executable)
@@ -1,10 +1,10 @@
-//\r
-// System.Xml.Schema.XmlSchemaCollection.cs\r
-//\r
-// Authors:\r
-//     Dwivedi, Ajay kumar  Adwiv@Yahoo.com\r
-//     Atsushi Enomoto      ginga@kit.hi-ho.ne.jp\r
-//\r
+//
+// System.Xml.Schema.XmlSchemaCollection.cs
+//
+// Authors:
+//     Dwivedi, Ajay kumar  Adwiv@Yahoo.com
+//     Atsushi Enomoto      ginga@kit.hi-ho.ne.jp
+//
 
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-using System;\r
-using System.Collections;\r
-using System.Xml;\r
-\r
-\r
-namespace System.Xml.Schema\r
-{\r
-       /// <summary>\r
-       /// Summary description for XmlSchemaCollection.\r
-       /// </summary>\r
-       public sealed class XmlSchemaCollection : ICollection, IEnumerable\r
-       {\r
-               //private fields\r
-               private XmlSchemaSet schemaSet;\r
-\r
-               public XmlSchemaCollection ()\r
-                       : this (new NameTable ())\r
-               {\r
-               }\r
-\r
-               public XmlSchemaCollection (XmlNameTable nameTable)\r
-                       : this (new XmlSchemaSet (nameTable))\r
-               {\r
-                       this.schemaSet.SchemaCollection = this;\r
-               }\r
-\r
-               internal XmlSchemaCollection (XmlSchemaSet schemaSet)\r
-               {\r
-                       this.schemaSet = schemaSet;\r
-               }\r
-\r
-               //properties\r
-               internal XmlSchemaSet SchemaSet {\r
-                       get { return schemaSet; }\r
-               }\r
-\r
-               public int Count {\r
-                       get { return schemaSet.Count; }\r
-               }\r
-\r
-               public XmlNameTable NameTable { \r
-                       get { return schemaSet.NameTable; }\r
-               }\r
-\r
-               public XmlSchema this [ string ns ] { \r
-                       get { return schemaSet.Get (ns); }\r
-               }\r
-\r
-               // Events\r
-               public event ValidationEventHandler ValidationEventHandler;\r
-\r
-               // Methods\r
-               public XmlSchema Add (string ns, XmlReader reader)\r
-               {\r
-                       return Add (ns, reader, new XmlUrlResolver ());\r
-               }\r
-\r
-#if NET_1_0\r
-               internal XmlSchema Add (string ns, XmlReader reader, XmlResolver resolver)\r
-#else\r
-               public XmlSchema Add (string ns, XmlReader reader, XmlResolver resolver)\r
-#endif\r
-               {\r
-                       XmlSchema schema = XmlSchema.Read (reader, ValidationEventHandler);\r
-                       schema.Compile (ValidationEventHandler, this, resolver);\r
-                       lock (schemaSet) {\r
-                               return schemaSet.Add (schema);\r
-                       }\r
-               }\r
-\r
-               public XmlSchema Add (string ns, string uri)\r
-               {\r
-                       lock (schemaSet) {\r
-                               return schemaSet.Add (ns, uri);\r
-                       }\r
-               }\r
-\r
-               public XmlSchema Add (XmlSchema schema)\r
-               {\r
-                       return Add (schema, new XmlUrlResolver ());\r
-               }\r
-\r
-               public XmlSchema Add (XmlSchema schema, XmlResolver resolver)\r
-               {\r
-                       if (schema == null)\r
-                               throw new ArgumentNullException ("schema");\r
-\r
-                       // XmlSchemaCollection.Add() compiles, while XmlSchemaSet.Add() does not\r
-                       if (!schema.IsCompiled)\r
-                               schema.Compile (ValidationEventHandler, this, resolver);\r
-\r
-                       string ns = GetSafeNs (schema.TargetNamespace);\r
-                       lock (schemaSet) {\r
-                               if (schemaSet.Contains (ns))\r
-                                       schemaSet.Remove (schemaSet.Get (ns));\r
-                               return schemaSet.Add (schema);\r
-                       }\r
-               }\r
-\r
-               private string GetSafeNs (string ns)\r
-               {\r
-                       return ns != null ? ns : String.Empty;\r
-               }\r
-\r
-               public void Add (XmlSchemaCollection schema)\r
-               {\r
-                       if (schema == null)\r
-                               throw new ArgumentNullException ("schema");\r
-\r
-                       foreach (XmlSchema s in schema) {\r
-                               string ns = GetSafeNs (s.TargetNamespace);\r
-                               lock (schemaSet) {\r
-                                       if (schemaSet.Contains (ns))\r
-                                               schemaSet.Remove (schemaSet.Get (ns));\r
-                                       schemaSet.Add (s);\r
-                               }\r
-                       }\r
-               }\r
-\r
-               public bool Contains (string ns)\r
-               {\r
-                       lock (schemaSet) {\r
-                               return schemaSet.Contains (ns);\r
-                       }\r
-               }\r
-\r
-               public bool Contains (XmlSchema schema)\r
-               {\r
-                       lock (schemaSet) {\r
-                               return schemaSet.Contains (schema);\r
-                       }\r
-               }\r
-\r
-               public void CopyTo (XmlSchema[] array, int index)\r
-               {\r
-                       lock (schemaSet) {\r
-                               schemaSet.CopyTo (array, index);\r
-                       }\r
-               }\r
-\r
-               public XmlSchemaCollectionEnumerator GetEnumerator ()\r
-               {\r
-                       return new XmlSchemaCollectionEnumerator (this);\r
-               }\r
-               \r
-               // interface Methods\r
-               void ICollection.CopyTo (Array array, int index)\r
-               {\r
-                       lock (schemaSet) {\r
-                               schemaSet.CopyTo (array, index);\r
-                       }\r
-               }\r
-\r
-               bool ICollection.IsSynchronized\r
-               {\r
-                       get { return true; } // always\r
-               }\r
-\r
-               IEnumerator IEnumerable.GetEnumerator ()\r
-               {\r
-                       return schemaSet.GetEnumerator ();\r
-               }\r
-\r
-               Object ICollection.SyncRoot\r
-               {\r
-                       get { return this; }\r
-               }\r
-\r
-               // Internal Methods\r
-               internal XmlSchemaAttribute FindAttribute (XmlQualifiedName qname)\r
-               {\r
-                       return (XmlSchemaAttribute) schemaSet.GlobalAttributes [qname];\r
-               }\r
-\r
-               internal XmlSchemaElement FindElement (XmlQualifiedName qname)\r
-               {\r
-                       return (XmlSchemaElement) schemaSet.GlobalElements [qname];\r
-               }\r
-\r
-               internal object FindSchemaType (XmlQualifiedName qname)\r
-               {\r
-                       return schemaSet.GlobalTypes [qname];\r
-               }\r
-\r
+using System;
+using System.Collections;
+using System.Xml;
+
+
+namespace System.Xml.Schema
+{
+       /// <summary>
+       /// Summary description for XmlSchemaCollection.
+       ///
+       /// It is just a wrapper for XmlSchemaSet (unlike MS.NET, our 
+       /// XmlSchemaCollection is originally designed to be conformant to 
+       /// W3C specification).
+       /// </summary>
+#if NET_2_0
+       [Obsolete ("Use XmlSchemaSet.")]
+#endif
+       public sealed class XmlSchemaCollection : ICollection, IEnumerable
+       {
+               //private fields
+               private XmlSchemaSet schemaSet;
+
+               public XmlSchemaCollection ()
+                       : this (new NameTable ())
+               {
+               }
+
+               public XmlSchemaCollection (XmlNameTable nameTable)
+                       : this (new XmlSchemaSet (nameTable))
+               {
+               }
+
+               internal XmlSchemaCollection (XmlSchemaSet schemaSet)
+               {
+                       this.schemaSet = schemaSet;
+               }
+
+               //properties
+               internal XmlSchemaSet SchemaSet {
+                       get { return schemaSet; }
+               }
+
+               public int Count {
+                       get { return schemaSet.Count; }
+               }
+
+               public XmlNameTable NameTable { 
+                       get { return schemaSet.NameTable; }
+               }
+
+               public XmlSchema this [ string ns ] { 
+                       get {
+                               ICollection col = schemaSet.Schemas (ns);
+                               if (col == null)
+                                       return null;
+                               IEnumerator e = col.GetEnumerator ();
+                               if (e.MoveNext ())
+                                       return (XmlSchema) e.Current;
+                               else
+                                       return null;
+                       }
+               }
+
+               // Events
+               public event ValidationEventHandler ValidationEventHandler;
+
+               // Methods
+               public XmlSchema Add (string ns, XmlReader reader)
+               {
+                       return Add (ns, reader, new XmlUrlResolver ());
+               }
+
+#if NET_1_1
+               public XmlSchema Add (string ns, XmlReader reader, XmlResolver resolver)
+#else
+               internal XmlSchema Add (string ns, XmlReader reader, XmlResolver resolver)
+#endif
+               {
+                       XmlSchema schema = XmlSchema.Read (reader, ValidationEventHandler);
+                       schema.Compile (ValidationEventHandler, schemaSet, resolver);
+                       lock (schemaSet) {
+                               return schemaSet.Add (schema);
+                       }
+               }
+
+               public XmlSchema Add (string ns, string uri)
+               {
+                       lock (schemaSet) {
+                               return schemaSet.Add (ns, uri);
+                       }
+               }
+
+               public XmlSchema Add (XmlSchema schema)
+               {
+                       return Add (schema, new XmlUrlResolver ());
+               }
+
+               public XmlSchema Add (XmlSchema schema, XmlResolver resolver)
+               {
+                       if (schema == null)
+                               throw new ArgumentNullException ("schema");
+
+                       // XmlSchemaCollection.Add() compiles, while XmlSchemaSet.Add() does not
+                       if (!schema.IsCompiled)
+                               schema.Compile (ValidationEventHandler, schemaSet, resolver);
+                       // compilation error -> returns null (and don't add to the collection).
+                       if (!schema.IsCompiled)
+                               return null;
+
+                       lock (schemaSet) {
+                               // consider imported schemas.
+                               schemaSet.Add (schema.Schemas);
+                               return schema;
+                       }
+               }
+
+               private string GetSafeNs (string ns)
+               {
+                       return ns != null ? ns : String.Empty;
+               }
+
+               public void Add (XmlSchemaCollection schema)
+               {
+                       if (schema == null)
+                               throw new ArgumentNullException ("schema");
+
+                       lock (schemaSet) {
+                               schemaSet.Add (schema.schemaSet);
+                       }
+               }
+
+               public bool Contains (string ns)
+               {
+                       lock (schemaSet) {
+                               return schemaSet.Contains (ns);
+                       }
+               }
+
+               public bool Contains (XmlSchema schema)
+               {
+                       lock (schemaSet) {
+                               return schemaSet.Contains (schema);
+                       }
+               }
+
+               public void CopyTo (XmlSchema[] array, int index)
+               {
+                       lock (schemaSet) {
+                               schemaSet.CopyTo (array, index);
+                       }
+               }
+
+               public XmlSchemaCollectionEnumerator GetEnumerator ()
+               {
+                       return new XmlSchemaCollectionEnumerator (this);
+               }
+
+               // interface Methods
+               void ICollection.CopyTo (Array array, int index)
+               {
+                       lock (schemaSet) {
+                               schemaSet.CopyTo (array, index);
+                       }
+               }
+
+               bool ICollection.IsSynchronized
+               {
+                       get { return true; } // always
+               }
+
+               IEnumerator IEnumerable.GetEnumerator ()
+               {
+                       return this.GetEnumerator ();
+               }
+
+               Object ICollection.SyncRoot
+               {
+                       get { return this; }
+               }
+
                internal void OnValidationError (object o, ValidationEventArgs e)
                {
                        if (ValidationEventHandler != null)
@@ -218,5 +214,5 @@ namespace System.Xml.Schema
                                throw e.Exception;
                }
 
-       }\r
-}\r
+       }
+}