2003-09-30 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaUnique.cs
1 // Author: Dwivedi, Ajay kumar\r
2 //            Adwiv@Yahoo.com\r
3 using System;\r
4 using System.Xml;\r
5 \r
6 namespace System.Xml.Schema\r
7 {\r
8         /// <summary>\r
9         /// Summary description for XmlSchemaUnique.\r
10         /// </summary>\r
11         public class XmlSchemaUnique : XmlSchemaIdentityConstraint\r
12         {\r
13                 private static string xmlname = "unique";\r
14 \r
15                 public XmlSchemaUnique()\r
16                 {\r
17                 }\r
18                 /// <remarks>\r
19                 /// 1. name must be present\r
20                 /// 2. selector and field must be present\r
21                 /// </remarks>\r
22                 [MonoTODO]\r
23                 internal override int Compile(ValidationEventHandler h, XmlSchema schema)\r
24                 {\r
25                         return base.Compile(h,schema);\r
26                 }\r
27                 \r
28                 [MonoTODO]\r
29                 internal override int Validate(ValidationEventHandler h, XmlSchema schema)\r
30                 {\r
31                         return errorCount;\r
32                 }\r
33 \r
34                 /*\r
35                 internal new void error(ValidationEventHandler handle, string message)\r
36                 {\r
37                         errorCount++;\r
38                         ValidationHandler.RaiseValidationError(handle, this, message);\r
39                 }\r
40                 */\r
41                 //<unique \r
42                 //  id = ID \r
43                 //  name = NCName \r
44                 //  {any attributes with non-schema namespace . . .}>\r
45                 //  Content: (annotation?, (selector, field+))\r
46                 //</unique>\r
47                 internal static XmlSchemaUnique Read(XmlSchemaReader reader, ValidationEventHandler h)\r
48                 {\r
49                         XmlSchemaUnique unique = new XmlSchemaUnique();\r
50                         reader.MoveToElement();\r
51 \r
52                         if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
53                         {\r
54                                 error(h,"Should not happen :1: XmlSchemaUnique.Read, name="+reader.Name,null);\r
55                                 reader.Skip();\r
56                                 return null;\r
57                         }\r
58 \r
59                         unique.LineNumber = reader.LineNumber;\r
60                         unique.LinePosition = reader.LinePosition;\r
61                         unique.SourceUri = reader.BaseURI;\r
62 \r
63                         while(reader.MoveToNextAttribute())\r
64                         {\r
65                                 if(reader.Name == "id")\r
66                                 {\r
67                                         unique.Id = reader.Value;\r
68                                 }\r
69                                 else if(reader.Name == "name")\r
70                                 {\r
71                                         unique.Name = reader.Value;\r
72                                 }\r
73                                 else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)\r
74                                 {\r
75                                         error(h,reader.Name + " is not a valid attribute for unique",null);\r
76                                 }\r
77                                 else\r
78                                 {\r
79                                         XmlSchemaUtil.ReadUnhandledAttribute(reader,unique);\r
80                                 }\r
81                         }\r
82                         \r
83                         reader.MoveToElement();\r
84                         if(reader.IsEmptyElement)\r
85                                 return unique;\r
86 \r
87                         //  Content: annotation?, selector, field+\r
88                         int level = 1;\r
89                         while(reader.ReadNextElement())\r
90                         {\r
91                                 if(reader.NodeType == XmlNodeType.EndElement)\r
92                                 {\r
93                                         if(reader.LocalName != xmlname)\r
94                                                 error(h,"Should not happen :2: XmlSchemaUnion.Read, name="+reader.Name,null);\r
95                                         break;\r
96                                 }\r
97                                 if(level <= 1 && reader.LocalName == "annotation")\r
98                                 {\r
99                                         level = 2; //Only one annotation\r
100                                         XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);\r
101                                         if(annotation != null)\r
102                                                 unique.Annotation = annotation;\r
103                                         continue;\r
104                                 }\r
105                                 if(level <= 2 && reader.LocalName == "selector")\r
106                                 {\r
107                                         level = 3;\r
108                                         XmlSchemaXPath selector = XmlSchemaXPath.Read(reader,h,"selector");\r
109                                         if(selector != null)\r
110                                                 unique.Selector = selector;\r
111                                         continue;\r
112                                 }\r
113                                 if(level <= 3 && reader.LocalName == "field")\r
114                                 {\r
115                                         level = 3;\r
116                                         if(unique.Selector == null)\r
117                                                 error(h,"selector must be defined before field declarations",null);\r
118                                         XmlSchemaXPath field = XmlSchemaXPath.Read(reader,h,"field");\r
119                                         if(field != null)\r
120                                                 unique.Fields.Add(field);\r
121                                         continue;\r
122                                 }\r
123                                 reader.RaiseInvalidElementError();\r
124                         }\r
125                         return unique;\r
126                 }\r
127         }\r
128 }\r