2002-12-24 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / System.Xml.Schema / XmlSchemaGroupRef.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 XmlSchemaGroupRef.\r
11         /// </summary>\r
12         public class XmlSchemaGroupRef : XmlSchemaParticle\r
13         {\r
14                 private XmlSchemaGroupBase particle;\r
15                 private XmlQualifiedName refName;\r
16                 private static string xmlname = "group";\r
17 \r
18                 public XmlSchemaGroupRef()\r
19                 {\r
20                         refName = XmlQualifiedName.Empty;\r
21                 }\r
22                 [System.Xml.Serialization.XmlAttribute("ref")]\r
23                 public XmlQualifiedName RefName \r
24                 {\r
25                         get{ return  refName; } \r
26                         set{ refName = value; }\r
27                 }\r
28                 [XmlIgnore]\r
29                 public XmlSchemaGroupBase Particle \r
30                 {\r
31                         get{ return particle; }\r
32                 }\r
33                 /// <remarks>\r
34                 /// 1. RefName must be present\r
35                 /// </remarks>\r
36                 [MonoTODO]\r
37                 internal int Compile(ValidationEventHandler h, XmlSchemaInfo info)\r
38                 {\r
39                         //FIXME: Should we reset the values\r
40                         if(MinOccurs > MaxOccurs)\r
41                                 error(h,"minOccurs must be less than or equal to maxOccurs");\r
42 \r
43                         XmlSchemaUtil.CompileID(Id,this,info.IDCollection,h);\r
44 \r
45                         if(refName == null || refName.IsEmpty)\r
46                         {\r
47                                 error(h,"ref must be present");\r
48                         }\r
49                         else if(!XmlSchemaUtil.CheckQName(RefName))\r
50                                 error(h, "RefName must be a valid XmlQualifiedName");\r
51 \r
52                         return errorCount;\r
53                 }\r
54                 \r
55                 [MonoTODO]\r
56                 internal int Validate(ValidationEventHandler h)\r
57                 {\r
58                         return errorCount;\r
59                 }\r
60 \r
61                 //      <group \r
62                 //               id = ID \r
63                 //               ref = QName\r
64                 //               minOccurs = ? : 1\r
65                 //               maxOccurs = ? : 1>\r
66                 //               Content: (annotation?)\r
67                 //      </group>\r
68                 internal static XmlSchemaGroupRef Read(XmlSchemaReader reader, ValidationEventHandler h)\r
69                 {\r
70                         XmlSchemaGroupRef groupref = new XmlSchemaGroupRef();\r
71                         reader.MoveToElement();\r
72 \r
73                         if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)\r
74                         {\r
75                                 error(h,"Should not happen :1: XmlSchemaGroup.Read, name="+reader.Name,null);\r
76                                 reader.Skip();\r
77                                 return null;\r
78                         }\r
79 \r
80                         groupref.LineNumber = reader.LineNumber;\r
81                         groupref.LinePosition = reader.LinePosition;\r
82                         groupref.SourceUri = reader.BaseURI;\r
83 \r
84                         while(reader.MoveToNextAttribute())\r
85                         {\r
86                                 if(reader.Name == "id")\r
87                                 {\r
88                                         groupref.Id = reader.Value;\r
89                                 }\r
90                                 else if(reader.Name == "ref")\r
91                                 {\r
92                                         Exception innerex;\r
93                                         groupref.refName = XmlSchemaUtil.ReadQNameAttribute(reader,out innerex);\r
94                                         if(innerex != null)\r
95                                                 error(h, reader.Value + " is not a valid value for ref attribute",innerex);\r
96                                 }\r
97                                 else if(reader.Name == "maxOccurs")\r
98                                 {\r
99                                         try\r
100                                         {\r
101                                                 groupref.MaxOccursString = reader.Value;\r
102                                         }\r
103                                         catch(Exception e)\r
104                                         {\r
105                                                 error(h,reader.Value + " is an invalid value for maxOccurs",e);\r
106                                         }\r
107                                 }\r
108                                 else if(reader.Name == "minOccurs")\r
109                                 {\r
110                                         try\r
111                                         {\r
112                                                 groupref.MinOccursString = reader.Value;\r
113                                         }\r
114                                         catch(Exception e)\r
115                                         {\r
116                                                 error(h,reader.Value + " is an invalid value for minOccurs", e);\r
117                                         }\r
118                                 }\r
119                                 else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)\r
120                                 {\r
121                                         error(h,reader.Name + " is not a valid attribute for group",null);\r
122                                 }\r
123                                 else\r
124                                 {\r
125                                         XmlSchemaUtil.ReadUnhandledAttribute(reader,groupref);\r
126                                 }\r
127                         }\r
128                         \r
129                         reader.MoveToElement();\r
130                         if(reader.IsEmptyElement)\r
131                                 return groupref;\r
132 \r
133                         //  Content: (annotation?)\r
134                         int level = 1;\r
135                         while(reader.ReadNextElement())\r
136                         {\r
137                                 if(reader.NodeType == XmlNodeType.EndElement)\r
138                                 {\r
139                                         if(reader.LocalName != xmlname)\r
140                                                 error(h,"Should not happen :2: XmlSchemaGroupRef.Read, name="+reader.Name,null);\r
141                                         break;\r
142                                 }\r
143                                 if(level <= 1 && reader.LocalName == "annotation")\r
144                                 {\r
145                                         level = 2;      //Only one annotation\r
146                                         XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);\r
147                                         if(annotation != null)\r
148                                                 groupref.Annotation = annotation;\r
149                                         continue;\r
150                                 }\r
151                                 reader.RaiseInvalidElementError();\r
152                         }                       \r
153                         return groupref;\r
154                 }\r
155         }\r
156 }\r