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