1 // Author: Dwivedi, Ajay kumar
\r
4 using System.Collections;
\r
6 using System.Xml.Serialization;
\r
8 namespace System.Xml.Schema
\r
11 /// Summary description for XmlSchemaSimpleTypeUnion.
\r
13 public class XmlSchemaSimpleTypeUnion : XmlSchemaSimpleTypeContent
\r
15 private XmlSchemaObjectCollection baseTypes;
\r
16 private XmlQualifiedName[] memberTypes;
\r
17 private static string xmlname = "union";
\r
18 private object [] validatedTypes;
\r
20 public XmlSchemaSimpleTypeUnion()
\r
22 baseTypes = new XmlSchemaObjectCollection();
\r
25 [XmlElement("simpleType",typeof(XmlSchemaSimpleType),Namespace=XmlSchema.Namespace)]
\r
26 public XmlSchemaObjectCollection BaseTypes
\r
28 get{ return baseTypes; }
\r
31 [System.Xml.Serialization.XmlAttribute("memberTypes")]
\r
32 public XmlQualifiedName[] MemberTypes
\r
34 get{ return memberTypes; }
\r
35 set{ memberTypes = value; }
\r
38 internal object [] ValidatedTypes
\r
40 get { return validatedTypes; }
\r
44 /// 1. Circular union type definition is disallowed. (WTH is this?)
\r
45 /// 2. id must be a valid ID
\r
47 internal override int Compile(ValidationEventHandler h, XmlSchema schema)
\r
49 // If this is already compiled this time, simply skip.
\r
50 if (this.IsComplied (schema.CompilationId))
\r
55 int count = BaseTypes.Count;
\r
57 foreach(XmlSchemaObject obj in baseTypes)
\r
59 if(obj != null && obj is XmlSchemaSimpleType)
\r
61 XmlSchemaSimpleType stype = (XmlSchemaSimpleType) obj;
\r
62 errorCount += stype.Compile(h, schema);
\r
66 error(h, "baseTypes can't have objects other than a simpletype");
\r
70 if(memberTypes!=null)
\r
72 for(int i=0; i< memberTypes.Length; i++)
\r
74 if(memberTypes[i] == null || !XmlSchemaUtil.CheckQName(MemberTypes[i]))
\r
76 error (h,"Invalid membertype");
\r
77 memberTypes[i] = XmlQualifiedName.Empty;
\r
81 count += MemberTypes.Length;
\r
87 error(h, "Atleast one simpletype or membertype must be present");
\r
89 XmlSchemaUtil.CompileID(Id,this,schema.IDCollection,h);
\r
91 this.CompilationId = schema.CompilationId;
\r
95 internal override int Validate(ValidationEventHandler h, XmlSchema schema)
\r
97 if (IsValidated (schema.ValidationId))
\r
100 ArrayList al = new ArrayList ();
\r
101 // Validate MemberTypes
\r
102 if (MemberTypes != null) {
\r
103 foreach (XmlQualifiedName memberTypeName in MemberTypes) {
\r
104 object type = null;
\r
105 XmlSchemaType xstype = schema.SchemaTypes [memberTypeName] as XmlSchemaSimpleType;
\r
106 if (xstype != null) {
\r
107 errorCount += xstype.Validate (h, schema);
\r
109 } else if (memberTypeName == XmlSchemaComplexType.AnyTypeName) {
\r
110 type = XmlSchemaSimpleType.AnySimpleType;
111 } else if (memberTypeName.Namespace == XmlSchema.Namespace) {
\r
112 type = XmlSchemaDatatype.FromName (memberTypeName);
\r
114 error (h, "Invalid schema type name was specified: " + memberTypeName);
\r
116 // otherwise, it might be missing sub components.
\r
117 else if (!schema.IsNamespaceAbsent (memberTypeName.Namespace))
\r
118 error (h, "Referenced base schema type " + memberTypeName + " was not found in the corresponding schema.");
\r
123 if (BaseTypes != null) {
\r
124 foreach (XmlSchemaSimpleType st in BaseTypes) {
\r
125 st.Validate (h, schema);
\r
129 this.validatedTypes = al.ToArray ();
\r
131 ValidationId = schema.ValidationId;
\r
137 // memberTypes = List of QName
\r
138 // {any attributes with non-schema namespace . . .}>
\r
139 // Content: (annotation?, (simpleType*))
\r
141 internal static XmlSchemaSimpleTypeUnion Read(XmlSchemaReader reader, ValidationEventHandler h)
\r
143 XmlSchemaSimpleTypeUnion union = new XmlSchemaSimpleTypeUnion();
\r
144 reader.MoveToElement();
\r
146 if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)
\r
148 error(h,"Should not happen :1: XmlSchemaSimpleTypeUnion.Read, name="+reader.Name,null);
\r
153 union.LineNumber = reader.LineNumber;
\r
154 union.LinePosition = reader.LinePosition;
\r
155 union.SourceUri = reader.BaseURI;
\r
158 while(reader.MoveToNextAttribute())
\r
160 if(reader.Name == "id")
\r
162 union.Id = reader.Value;
\r
164 else if(reader.Name == "memberTypes")
\r
167 string[] names = XmlSchemaUtil.SplitList(reader.Value);
\r
168 union.memberTypes = new XmlQualifiedName[names.Length];
\r
169 for(int i=0;i<names.Length;i++)
\r
171 union.memberTypes[i] = XmlSchemaUtil.ToQName(reader,names[i],out innerEx);
\r
172 if(innerEx != null)
\r
173 error(h,"'"+names[i] + "' is not a valid memberType",innerEx);
\r
176 else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)
\r
178 error(h,reader.Name + " is not a valid attribute for union",null);
\r
182 XmlSchemaUtil.ReadUnhandledAttribute(reader,union);
\r
186 reader.MoveToElement();
\r
187 if(reader.IsEmptyElement)
\r
190 // Content: annotation?, simpleType*
\r
192 while(reader.ReadNextElement())
\r
194 if(reader.NodeType == XmlNodeType.EndElement)
\r
196 if(reader.LocalName != xmlname)
\r
197 error(h,"Should not happen :2: XmlSchemaSimpleTypeUnion.Read, name="+reader.Name,null);
\r
200 if(level <= 1 && reader.LocalName == "annotation")
\r
202 level = 2; //Only one annotation
\r
203 XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);
\r
204 if(annotation != null)
\r
205 union.Annotation = annotation;
\r
208 if(level <=2 && reader.LocalName == "simpleType")
\r
211 XmlSchemaSimpleType stype = XmlSchemaSimpleType.Read(reader,h);
\r
213 union.baseTypes.Add(stype);
\r
216 reader.RaiseInvalidElementError();
\r