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