Handle more type conversion.
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaIdentityConstraint.cs
old mode 100755 (executable)
new mode 100644 (file)
index f370d62..9db41b2
-// Author: Dwivedi, Ajay kumar\r
-//            Adwiv@Yahoo.com\r
-using System;\r
-using System.Xml;\r
-using System.Xml.Serialization;\r
-\r
-namespace System.Xml.Schema\r
-{\r
-       /// <summary>\r
-       /// Summary description for XmlSchemaIdentityConstraint.\r
-       /// </summary>\r
-       public class XmlSchemaIdentityConstraint : XmlSchemaAnnotated\r
-       {\r
-               private XmlSchemaObjectCollection fields;\r
-               private string name;\r
-               private XmlQualifiedName qName;\r
-               private XmlSchemaXPath selector;\r
-\r
-               public XmlSchemaIdentityConstraint()\r
-               {\r
-                       fields = new XmlSchemaObjectCollection();\r
-                       qName = XmlQualifiedName.Empty;\r
-               }\r
-               \r
-               [System.Xml.Serialization.XmlAttribute("name")]\r
-               public string Name \r
-               {\r
-                       get{ return  name; } \r
-                       set{ name = value; }\r
-               }\r
-\r
-               [XmlElement("selector",typeof(XmlSchemaXPath),Namespace="http://www.w3.org/2001/XMLSchema")]\r
-               public XmlSchemaXPath Selector \r
-               {\r
-                       get{ return  selector; } \r
-                       set{ selector = value; }\r
-               }\r
-\r
-               [XmlElement("field",typeof(XmlSchemaXPath),Namespace="http://www.w3.org/2001/XMLSchema")]\r
-               public XmlSchemaObjectCollection Fields \r
-               {\r
-                       get{ return fields; }\r
-               }\r
-               \r
-               [XmlIgnore]\r
-               public XmlQualifiedName QualifiedName \r
-               {\r
-                       get{ return  qName; }\r
-               }\r
-               /// <remarks>\r
-               /// 1. name must be present\r
-               /// 2. selector and field must be present\r
-               /// </remarks>\r
-               [MonoTODO]\r
-               internal int Compile(ValidationEventHandler h, XmlSchemaInfo info)\r
-               {\r
-                       if(Name == null)\r
-                               error(h,"Required attribute name must be present");\r
-                       else if(!XmlSchemaUtil.CheckNCName(this.name)) \r
-                               error(h,"attribute name must be NCName");\r
-                       else\r
-                               this.qName = new XmlQualifiedName(Name,info.TargetNamespace);\r
-\r
-                       //TODO: Compile Xpath. \r
-                       if(Selector == null)\r
-                               error(h,"selector must be present");\r
-                       else\r
-                       {\r
-                               errorCount += Selector.Compile(h,info);\r
-                       }\r
-\r
-                       if(Fields.Count == 0)\r
-                               error(h,"atleast one field value must be present");\r
-                       else\r
-                       {\r
-                               foreach(XmlSchemaObject obj in Fields)\r
-                               {\r
-                                       if(obj is XmlSchemaXPath)\r
-                                       {\r
-                                               XmlSchemaXPath field = (XmlSchemaXPath)obj;\r
-                                               errorCount += field.Compile(h,info);\r
-                                       }\r
-                                       else\r
-                                               error(h,"Object of type "+obj.GetType()+" is invalid in the Fields Collection");\r
-                               }\r
-                       }\r
-                       XmlSchemaUtil.CompileID(Id,this,info.IDCollection,h);\r
-\r
-                       return errorCount;\r
-               }\r
-       }\r
-}\r
+// Author: Dwivedi, Ajay kumar
+//            Adwiv@Yahoo.com
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// 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;
+using System.Collections;
+using System.Xml;
+using System.Xml.Serialization;
+using Mono.Xml.Schema;
+
+namespace System.Xml.Schema
+{
+       /// <summary>
+       /// Summary description for XmlSchemaIdentityConstraint.
+       /// </summary>
+       public class XmlSchemaIdentityConstraint : XmlSchemaAnnotated
+       {
+               private XmlSchemaObjectCollection fields;
+               private string name;
+               private XmlQualifiedName qName;
+               private XmlSchemaXPath selector;
+
+               private XsdIdentitySelector compiledSelector;
+//             ArrayList compiledFields;
+
+               public XmlSchemaIdentityConstraint()
+               {
+                       fields = new XmlSchemaObjectCollection();
+                       qName = XmlQualifiedName.Empty;
+               }
+               
+               [System.Xml.Serialization.XmlAttribute("name")]
+               public string Name 
+               {
+                       get{ return  name; } 
+                       set{ name = value; }
+               }
+
+               [XmlElement("selector",typeof(XmlSchemaXPath))]
+               public XmlSchemaXPath Selector 
+               {
+                       get{ return  selector; } 
+                       set{ selector = value; }
+               }
+
+               [XmlElement("field",typeof(XmlSchemaXPath))]
+               public XmlSchemaObjectCollection Fields 
+               {
+                       get{ return fields; }
+               }
+               
+               [XmlIgnore]
+               public XmlQualifiedName QualifiedName 
+               {
+                       get{ return  qName; }
+               }
+
+               internal XsdIdentitySelector CompiledSelector {
+                       get { return compiledSelector; }
+               }
+
+               internal override void SetParent (XmlSchemaObject parent)
+               {
+                       base.SetParent (parent);
+                       if (Selector != null)
+                               Selector.SetParent (this);
+                       foreach (XmlSchemaObject obj in Fields)
+                               obj.SetParent (this);
+               }
+
+               /// <remarks>
+               /// 1. name must be present
+               /// 2. selector and field must be present
+               /// </remarks>
+               internal override int Compile(ValidationEventHandler h, XmlSchema schema)
+               {
+                       // If this is already compiled this time, simply skip.
+                       if (CompilationId == schema.CompilationId)
+                               return 0;
+
+                       if(Name == null)
+                               error(h,"Required attribute name must be present");
+                       else if(!XmlSchemaUtil.CheckNCName(this.name)) 
+                               error(h,"attribute name must be NCName");
+                       else {
+                               this.qName = new XmlQualifiedName(Name, AncestorSchema.TargetNamespace);
+                               if (schema.NamedIdentities.Contains (qName)) {
+                                       XmlSchemaIdentityConstraint existing =
+                                               schema.NamedIdentities [qName] as XmlSchemaIdentityConstraint;
+                                       error(h, String.Format ("There is already same named identity constraint in this namespace. Existing item is at {0}({1},{2})", existing.SourceUri, existing.LineNumber, existing.LinePosition));
+                               }
+                               else
+                                       schema.NamedIdentities.Add (qName, this);
+                       }
+
+                       if(Selector == null)
+                               error(h,"selector must be present");
+                       else
+                       {
+                               Selector.isSelector = true;
+                               errorCount += Selector.Compile(h,schema);
+                               if (selector.errorCount == 0)
+                                       compiledSelector = new XsdIdentitySelector (Selector);
+                       }
+                       if (errorCount > 0)
+                               return errorCount; // fatal
+
+                       if(Fields.Count == 0)
+                               error(h,"atleast one field value must be present");
+                       else
+                       {
+                               for (int i = 0; i < Fields.Count; i++)
+                               {
+                                       XmlSchemaXPath field = Fields [i] as XmlSchemaXPath;
+                                       if(field != null)
+                                       {
+                                               errorCount += field.Compile(h,schema);
+                                               if (field.errorCount == 0)
+                                                       this.compiledSelector.AddField (new XsdIdentityField (field, i));
+                                       }
+                                       else
+                                               error (h, "Object of type " + Fields [i].GetType() + " is invalid in the Fields Collection");
+                               }
+                       }
+                       XmlSchemaUtil.CompileID(Id,this,schema.IDCollection,h);
+
+                       this.CompilationId = schema.CompilationId;
+                       return errorCount;
+               }
+       }
+}