1cf936e33SAndre Fischer /**************************************************************
2cf936e33SAndre Fischer *
3cf936e33SAndre Fischer * Licensed to the Apache Software Foundation (ASF) under one
4cf936e33SAndre Fischer * or more contributor license agreements.  See the NOTICE file
5cf936e33SAndre Fischer * distributed with this work for additional information
6cf936e33SAndre Fischer * regarding copyright ownership.  The ASF licenses this file
7cf936e33SAndre Fischer * to you under the Apache License, Version 2.0 (the
8cf936e33SAndre Fischer * "License"); you may not use this file except in compliance
9cf936e33SAndre Fischer * with the License.  You may obtain a copy of the License at
10cf936e33SAndre Fischer *
11cf936e33SAndre Fischer *   http://www.apache.org/licenses/LICENSE-2.0
12cf936e33SAndre Fischer *
13cf936e33SAndre Fischer * Unless required by applicable law or agreed to in writing,
14cf936e33SAndre Fischer * software distributed under the License is distributed on an
15cf936e33SAndre Fischer * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16cf936e33SAndre Fischer * KIND, either express or implied.  See the License for the
17cf936e33SAndre Fischer * specific language governing permissions and limitations
18cf936e33SAndre Fischer * under the License.
19cf936e33SAndre Fischer *
20cf936e33SAndre Fischer *************************************************************/
21cf936e33SAndre Fischer 
22cf936e33SAndre Fischer package org.apache.openoffice.ooxml.schema.parser;
23cf936e33SAndre Fischer 
24cf936e33SAndre Fischer import java.io.File;
25cf936e33SAndre Fischer import java.io.FileInputStream;
26cf936e33SAndre Fischer import java.util.HashMap;
27cf936e33SAndre Fischer import java.util.Map;
28cf936e33SAndre Fischer import java.util.Vector;
29cf936e33SAndre Fischer 
30cf936e33SAndre Fischer import javax.xml.stream.XMLInputFactory;
31cf936e33SAndre Fischer import javax.xml.stream.XMLStreamException;
32cf936e33SAndre Fischer import javax.xml.stream.XMLStreamReader;
33cf936e33SAndre Fischer 
34cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.attribute.Attribute;
35cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.attribute.AttributeGroup;
36cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.attribute.AttributeGroupReference;
37cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.attribute.AttributeReference;
38cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.base.INode;
39cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.base.Location;
40cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.base.Node;
41cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.base.QualifiedName;
42cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.All;
43cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.Any;
44cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.Choice;
45cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.ComplexContent;
46cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.ComplexType;
47cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.Element;
48cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.ElementReference;
49cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.Extension;
50cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.Group;
51cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.GroupReference;
52cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.OccurrenceIndicator;
53cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.complex.Sequence;
54cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.schema.Schema;
556cde7e4aSAndre Fischer import org.apache.openoffice.ooxml.schema.model.schema.SchemaBase;
56cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.simple.List;
57cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.simple.Restriction;
58cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.simple.SimpleContent;
59cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.simple.SimpleType;
60cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.simple.SimpleTypeReference;
61cf936e33SAndre Fischer import org.apache.openoffice.ooxml.schema.model.simple.Union;
62cf936e33SAndre Fischer 
63cf936e33SAndre Fischer 
64cf936e33SAndre Fischer /** Parser for single schema file.
65cf936e33SAndre Fischer  *  Imports and includes of other schema files are stored and can be retrieved
66cf936e33SAndre Fischer  *  by calling GetImportedSchemas().
67cf936e33SAndre Fischer  *
68cf936e33SAndre Fischer  *  Typical usage:
69cf936e33SAndre Fischer  *  1) Create SchemaParser for top-level schema file.
70cf936e33SAndre Fischer  *  2) Call Parse().
71cf936e33SAndre Fischer  *  3) Repeat the same recursively for all imported schemas (as returned by
72cf936e33SAndre Fischer  *     GetImportedSchemas()).
73cf936e33SAndre Fischer  *
74cf936e33SAndre Fischer  *  All top level types (complex types, simple types, elements, etc.) are
75cf936e33SAndre Fischer  *  stored in the given Schema object.
76cf936e33SAndre Fischer  */
77cf936e33SAndre Fischer public class SchemaParser
78cf936e33SAndre Fischer {
SchemaParser( final File aSchemaFile, final Schema aSchema, final SchemaBase aSchemaBase)79cf936e33SAndre Fischer     public SchemaParser (
80cf936e33SAndre Fischer         final File aSchemaFile,
816cde7e4aSAndre Fischer         final Schema aSchema,
826cde7e4aSAndre Fischer         final SchemaBase aSchemaBase)
83cf936e33SAndre Fischer     {
84cf936e33SAndre Fischer         maSchema = aSchema;
856cde7e4aSAndre Fischer         maSchemaBase = aSchemaBase;
86cf936e33SAndre Fischer         maReader = GetStreamReader(aSchemaFile);
87cf936e33SAndre Fischer         msBasename = aSchemaFile.getName();
88cf936e33SAndre Fischer         maDirectory = aSchemaFile.getParentFile();
89cf936e33SAndre Fischer         maLocalNamespaceMap = new HashMap<>();
90cf936e33SAndre Fischer         maImportedSchemas = new Vector<>();
91cf936e33SAndre Fischer         maLastLocation = null;
92cf936e33SAndre Fischer     }
93cf936e33SAndre Fischer 
94cf936e33SAndre Fischer 
95cf936e33SAndre Fischer 
96cf936e33SAndre Fischer 
97cf936e33SAndre Fischer     /** Parse the schema file.
98cf936e33SAndre Fischer      *  @return
99cf936e33SAndre Fischer      *      Return false if there is any error.
100cf936e33SAndre Fischer      * @throws XMLStreamException
101cf936e33SAndre Fischer      */
Parse()102cf936e33SAndre Fischer     public void Parse ()
103cf936e33SAndre Fischer         throws XMLStreamException
104cf936e33SAndre Fischer     {
105cf936e33SAndre Fischer         if (maReader == null)
106cf936e33SAndre Fischer             return;
107cf936e33SAndre Fischer 
108cf936e33SAndre Fischer         while (maReader.hasNext())
109cf936e33SAndre Fischer         {
110cf936e33SAndre Fischer             final int nCode = maReader.next();
111cf936e33SAndre Fischer             switch (nCode)
112cf936e33SAndre Fischer             {
113cf936e33SAndre Fischer                 case XMLStreamReader.START_ELEMENT:
114cf936e33SAndre Fischer                     if (maReader.getLocalName().equals("schema"))
115cf936e33SAndre Fischer                     {
11662886075SAndre Fischer                         ProcessSchemaTag();
117cf936e33SAndre Fischer                         ParseSchema();
118cf936e33SAndre Fischer 
119cf936e33SAndre Fischer                         maLastLocation = maReader.getLocation();
120cf936e33SAndre Fischer                     }
121cf936e33SAndre Fischer                     else
122cf936e33SAndre Fischer                     {
123cf936e33SAndre Fischer                         throw CreateErrorException("expecting top level element to be 'schema'");
124cf936e33SAndre Fischer                     }
125cf936e33SAndre Fischer                     break;
126cf936e33SAndre Fischer 
127cf936e33SAndre Fischer                 case XMLStreamReader.END_DOCUMENT:
128cf936e33SAndre Fischer                     return;
129cf936e33SAndre Fischer 
130cf936e33SAndre Fischer                 default:
131cf936e33SAndre Fischer                     throw CreateErrorException("unexpected XML event %d", nCode);
132cf936e33SAndre Fischer             }
133cf936e33SAndre Fischer         }
134cf936e33SAndre Fischer     }
135cf936e33SAndre Fischer 
136cf936e33SAndre Fischer 
137cf936e33SAndre Fischer 
138cf936e33SAndre Fischer 
GetImportedSchemaFilenames()139cf936e33SAndre Fischer     public Iterable<File> GetImportedSchemaFilenames ()
140cf936e33SAndre Fischer     {
141cf936e33SAndre Fischer         return maImportedSchemas;
142cf936e33SAndre Fischer     }
143cf936e33SAndre Fischer 
144cf936e33SAndre Fischer 
145cf936e33SAndre Fischer 
146cf936e33SAndre Fischer 
GetLineCount()147cf936e33SAndre Fischer     public int GetLineCount ()
148cf936e33SAndre Fischer     {
149cf936e33SAndre Fischer         if (maLastLocation != null)
150cf936e33SAndre Fischer             return maLastLocation.getLineNumber();
151cf936e33SAndre Fischer         else
152cf936e33SAndre Fischer             return 0;
153cf936e33SAndre Fischer     }
154cf936e33SAndre Fischer 
155cf936e33SAndre Fischer 
156cf936e33SAndre Fischer 
157cf936e33SAndre Fischer 
GetByteCount()158cf936e33SAndre Fischer     public int GetByteCount ()
159cf936e33SAndre Fischer     {
160cf936e33SAndre Fischer         if (maLastLocation != null)
161cf936e33SAndre Fischer             return maLastLocation.getCharacterOffset();
162cf936e33SAndre Fischer         else
163cf936e33SAndre Fischer             return 0;
164cf936e33SAndre Fischer     }
165cf936e33SAndre Fischer 
166cf936e33SAndre Fischer 
167cf936e33SAndre Fischer 
168cf936e33SAndre Fischer 
169cf936e33SAndre Fischer     /** Process the namespace definitions in the outer 'schema' element.
170cf936e33SAndre Fischer      */
ProcessSchemaTag()17162886075SAndre Fischer     private void ProcessSchemaTag ()
172cf936e33SAndre Fischer     {
17362886075SAndre Fischer         GetOptionalAttributeValue("id", null);
17462886075SAndre Fischer         meAttributeFormDefault = FormDefault.valueOf(
17562886075SAndre Fischer             GetOptionalAttributeValue("attributeFormDefault", "unqualified"));
17662886075SAndre Fischer         meElementFormDefault = FormDefault.valueOf(
17762886075SAndre Fischer             GetOptionalAttributeValue("elementFormDefault", "unqualified"));
17862886075SAndre Fischer         GetOptionalAttributeValue("blockDefault", null);//=(#all|list of (extension|restriction|substitution))
17962886075SAndre Fischer         GetOptionalAttributeValue("finalDefault", null);//=(#all|list of (extension|restriction|list|union))
18062886075SAndre Fischer         msTargetNamespace = GetOptionalAttributeValue("targetNamespace", null);
18162886075SAndre Fischer         GetOptionalAttributeValue("version", null);
18262886075SAndre Fischer 
183cf936e33SAndre Fischer         for (int nIndex=0; nIndex<maReader.getNamespaceCount(); ++nIndex)
184cf936e33SAndre Fischer         {
185cf936e33SAndre Fischer             final String sPrefix = maReader.getNamespacePrefix(nIndex);
186cf936e33SAndre Fischer             final String sURI = maReader.getNamespaceURI(nIndex);
187cf936e33SAndre Fischer             maLocalNamespaceMap.put(sPrefix, sURI);
1886cde7e4aSAndre Fischer             maSchemaBase.Namespaces.ProvideNamespace(sURI, sPrefix);
189cf936e33SAndre Fischer         }
19062886075SAndre Fischer 
191cf936e33SAndre Fischer         maLocalNamespaceMap.put(null, msTargetNamespace);
1926cde7e4aSAndre Fischer         maSchemaBase.Namespaces.ProvideNamespace(msTargetNamespace, null);
193cf936e33SAndre Fischer     }
194cf936e33SAndre Fischer 
195cf936e33SAndre Fischer 
196cf936e33SAndre Fischer 
197cf936e33SAndre Fischer 
ParseSchema()198cf936e33SAndre Fischer     private void ParseSchema ()
199cf936e33SAndre Fischer         throws XMLStreamException
200cf936e33SAndre Fischer     {
201cf936e33SAndre Fischer         while (true)
202cf936e33SAndre Fischer         {
203cf936e33SAndre Fischer             switch (Next())
204cf936e33SAndre Fischer             {
205cf936e33SAndre Fischer                 case XMLStreamReader.START_ELEMENT:
206cf936e33SAndre Fischer                     ProcessTopLevelStartElement();
207cf936e33SAndre Fischer                     break;
208cf936e33SAndre Fischer 
209cf936e33SAndre Fischer                 case XMLStreamReader.END_ELEMENT:
210cf936e33SAndre Fischer                     return;
211cf936e33SAndre Fischer 
212cf936e33SAndre Fischer                 default:
213cf936e33SAndre Fischer                     throw CreateErrorException("unexpected event (expteced START_ELEMENT): %d", maReader.getEventType());
214cf936e33SAndre Fischer             }
215cf936e33SAndre Fischer         }
216cf936e33SAndre Fischer     }
217cf936e33SAndre Fischer 
218cf936e33SAndre Fischer 
219cf936e33SAndre Fischer 
220cf936e33SAndre Fischer 
ProcessTopLevelStartElement()221cf936e33SAndre Fischer     private void ProcessTopLevelStartElement ()
222cf936e33SAndre Fischer         throws XMLStreamException
223cf936e33SAndre Fischer     {
224cf936e33SAndre Fischer         assert(GetAttributeValue("minOccurs") == null);
225cf936e33SAndre Fischer         assert(GetAttributeValue("maxOccurs") == null);
226cf936e33SAndre Fischer 
227cf936e33SAndre Fischer         switch (maReader.getLocalName())
228cf936e33SAndre Fischer         {
229cf936e33SAndre Fischer             case "attribute":
2306cde7e4aSAndre Fischer                 maSchemaBase.Attributes.Add(ParseAttribute());
231cf936e33SAndre Fischer                 break;
232cf936e33SAndre Fischer 
233cf936e33SAndre Fischer             case "attributeGroup":
2346cde7e4aSAndre Fischer                 maSchemaBase.AttributeGroups.Add(ParseAttributeGroup());
235cf936e33SAndre Fischer                 break;
236cf936e33SAndre Fischer 
237cf936e33SAndre Fischer             case "complexType":
2386cde7e4aSAndre Fischer                 maSchemaBase.ComplexTypes.Add(ParseComplexType());
239cf936e33SAndre Fischer                 break;
240cf936e33SAndre Fischer 
241cf936e33SAndre Fischer             case "element":
2426cde7e4aSAndre Fischer             	final Element aElement = ParseElement(null);
2436cde7e4aSAndre Fischer             	if (maSchema != null)
2446cde7e4aSAndre Fischer             		maSchema.TopLevelElements.Add(aElement);
2456cde7e4aSAndre Fischer                 maSchemaBase.TopLevelElements.Add(aElement);
246cf936e33SAndre Fischer                 break;
247cf936e33SAndre Fischer 
248cf936e33SAndre Fischer             case "group":
2496cde7e4aSAndre Fischer                 maSchemaBase.Groups.Add(ParseGroup(null));
250cf936e33SAndre Fischer                 break;
251cf936e33SAndre Fischer 
252cf936e33SAndre Fischer             case "import":
253cf936e33SAndre Fischer                 ParseImport();
254cf936e33SAndre Fischer                 break;
255cf936e33SAndre Fischer 
256cf936e33SAndre Fischer             case "include":
257cf936e33SAndre Fischer                 ParseInclude();
258cf936e33SAndre Fischer                 break;
259cf936e33SAndre Fischer 
260cf936e33SAndre Fischer             case "simpleType":
2616cde7e4aSAndre Fischer                 maSchemaBase.SimpleTypes.Add(ParseSimpleType(null));
262cf936e33SAndre Fischer                 break;
263cf936e33SAndre Fischer 
264cf936e33SAndre Fischer             default:
265cf936e33SAndre Fischer                 throw CreateErrorException("unexpected top level element %s", maReader.getLocalName());
266cf936e33SAndre Fischer         }
267cf936e33SAndre Fischer     }
268cf936e33SAndre Fischer 
269cf936e33SAndre Fischer 
270cf936e33SAndre Fischer 
271cf936e33SAndre Fischer 
ProcessStartElement(final Node aParent)272cf936e33SAndre Fischer     private void ProcessStartElement (final Node aParent)
273cf936e33SAndre Fischer         throws XMLStreamException
274cf936e33SAndre Fischer     {
275cf936e33SAndre Fischer         final String sMinimumOccurrence = GetOptionalAttributeValue("minOccurs", "1");
276cf936e33SAndre Fischer         final String sMaximumOccurrence = GetOptionalAttributeValue("maxOccurs", "1");
277cf936e33SAndre Fischer 
278cf936e33SAndre Fischer         final Node aLocalParent;
279cf936e33SAndre Fischer         if ( ! (sMinimumOccurrence.equals("1") && sMaximumOccurrence.equals("1")))
280cf936e33SAndre Fischer         {
281cf936e33SAndre Fischer             // Occurrence does not only have default values (min=max=1).
282cf936e33SAndre Fischer             // Have to create an intermediate node for the occurrence indicator.
283cf936e33SAndre Fischer             final OccurrenceIndicator aIndicator = new OccurrenceIndicator(
284cf936e33SAndre Fischer                 aParent,
285cf936e33SAndre Fischer                 sMinimumOccurrence,
286cf936e33SAndre Fischer                 sMaximumOccurrence,
287cf936e33SAndre Fischer                 GetLocation());
288cf936e33SAndre Fischer             aParent.AddChild(aIndicator);
289cf936e33SAndre Fischer             aLocalParent = aIndicator;
290cf936e33SAndre Fischer         }
291cf936e33SAndre Fischer         else
292cf936e33SAndre Fischer             aLocalParent = aParent;
293cf936e33SAndre Fischer 
294cf936e33SAndre Fischer         switch (maReader.getLocalName())
295cf936e33SAndre Fischer         {
296cf936e33SAndre Fischer             case "all":
297cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseAll(aLocalParent));
298cf936e33SAndre Fischer                 break;
299cf936e33SAndre Fischer 
300cf936e33SAndre Fischer             case "any":
301cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseAny(aLocalParent));
302cf936e33SAndre Fischer                 break;
303cf936e33SAndre Fischer 
304cf936e33SAndre Fischer             case "attribute":
305cf936e33SAndre Fischer                 aLocalParent.AddAttribute(ParseAttributeOrReference());
306cf936e33SAndre Fischer                 break;
307cf936e33SAndre Fischer 
308cf936e33SAndre Fischer             case "attributeGroup":
309cf936e33SAndre Fischer                 aLocalParent.AddAttribute(ParseAttributeGroupOrReference());
310cf936e33SAndre Fischer                 break;
311cf936e33SAndre Fischer 
312cf936e33SAndre Fischer             case "choice":
313cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseChoice(aLocalParent));
314cf936e33SAndre Fischer                 break;
315cf936e33SAndre Fischer 
316cf936e33SAndre Fischer             case "complexContent":
317cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseComplexContent(aLocalParent));
318cf936e33SAndre Fischer                 break;
319cf936e33SAndre Fischer 
320cf936e33SAndre Fischer             case "element":
321cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseElementOrReference(aLocalParent));
322cf936e33SAndre Fischer                 break;
323cf936e33SAndre Fischer 
324cf936e33SAndre Fischer             case "extension":
325cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseExtension(aLocalParent));
326cf936e33SAndre Fischer                 break;
327cf936e33SAndre Fischer 
328cf936e33SAndre Fischer             case "group":
329cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseGroupOrReference(aLocalParent));
330cf936e33SAndre Fischer                 break;
331cf936e33SAndre Fischer 
332cf936e33SAndre Fischer             case "list":
333cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseList(aLocalParent));
334cf936e33SAndre Fischer                 break;
335cf936e33SAndre Fischer 
336cf936e33SAndre Fischer             case "sequence":
337cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseSequence(aLocalParent));
338cf936e33SAndre Fischer                 break;
339cf936e33SAndre Fischer 
340cf936e33SAndre Fischer             case "simpleContent":
341cf936e33SAndre Fischer                 aLocalParent.AddChild(ParseSimpleContent(aLocalParent));
342cf936e33SAndre Fischer                 break;
343cf936e33SAndre Fischer 
344cf936e33SAndre Fischer             default:
345cf936e33SAndre Fischer                 throw CreateErrorException("unsupported content type %s", maReader.getLocalName());
346cf936e33SAndre Fischer         }
347cf936e33SAndre Fischer     }
348cf936e33SAndre Fischer 
349cf936e33SAndre Fischer 
350cf936e33SAndre Fischer 
351cf936e33SAndre Fischer 
IgnoreAnnotation()352cf936e33SAndre Fischer     private void IgnoreAnnotation ()
353cf936e33SAndre Fischer         throws XMLStreamException
354cf936e33SAndre Fischer     {
355cf936e33SAndre Fischer         IgnoreContent();
356cf936e33SAndre Fischer     }
357cf936e33SAndre Fischer 
358cf936e33SAndre Fischer 
359cf936e33SAndre Fischer 
360cf936e33SAndre Fischer 
IgnoreContent()361cf936e33SAndre Fischer     private void IgnoreContent ()
362cf936e33SAndre Fischer         throws XMLStreamException
363cf936e33SAndre Fischer     {
364cf936e33SAndre Fischer         while(true)
365cf936e33SAndre Fischer         {
366cf936e33SAndre Fischer             switch(maReader.next())
367cf936e33SAndre Fischer             {
368cf936e33SAndre Fischer                 case XMLStreamReader.START_ELEMENT:
369cf936e33SAndre Fischer                     IgnoreContent();
370cf936e33SAndre Fischer                     break;
371cf936e33SAndre Fischer 
372cf936e33SAndre Fischer                 case XMLStreamReader.END_ELEMENT:
373cf936e33SAndre Fischer                     return;
374cf936e33SAndre Fischer 
375cf936e33SAndre Fischer                 case XMLStreamReader.COMMENT:
376cf936e33SAndre Fischer                 case XMLStreamReader.CHARACTERS:
377cf936e33SAndre Fischer                     break;
378cf936e33SAndre Fischer 
379cf936e33SAndre Fischer                 default:
380cf936e33SAndre Fischer                     throw CreateErrorException(
381cf936e33SAndre Fischer                         "unexpected XML event %d while ignoring content",
382cf936e33SAndre Fischer                         maReader.getEventType());
383cf936e33SAndre Fischer             }
384cf936e33SAndre Fischer         }
385cf936e33SAndre Fischer     }
386cf936e33SAndre Fischer 
387cf936e33SAndre Fischer 
388cf936e33SAndre Fischer 
389cf936e33SAndre Fischer 
ParseAll(final Node aParent)390cf936e33SAndre Fischer     private All ParseAll (final Node aParent)
391cf936e33SAndre Fischer         throws XMLStreamException
392cf936e33SAndre Fischer     {
393cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs"));
394cf936e33SAndre Fischer 
395cf936e33SAndre Fischer         final All aAll = new All(aParent, GetLocation());
396cf936e33SAndre Fischer         ParseContent(aAll);
397cf936e33SAndre Fischer         return aAll;
398cf936e33SAndre Fischer     }
399cf936e33SAndre Fischer 
400cf936e33SAndre Fischer 
401cf936e33SAndre Fischer 
402cf936e33SAndre Fischer 
ParseAny(final Node aParent)403cf936e33SAndre Fischer     private Any ParseAny (final Node aParent)
404cf936e33SAndre Fischer         throws XMLStreamException
405cf936e33SAndre Fischer     {
406cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs", "namespace", "processContents"));
407cf936e33SAndre Fischer 
4086cde7e4aSAndre Fischer         final Any aAny = new Any(
4096cde7e4aSAndre Fischer             aParent,
4106cde7e4aSAndre Fischer             GetLocation(),
4116cde7e4aSAndre Fischer             GetOptionalAttributeValue("processContents", "strict"),
4126cde7e4aSAndre Fischer             GetOptionalAttributeValue("namespace", "##any"));
413cf936e33SAndre Fischer         ExpectEndElement("ParseAny");
414cf936e33SAndre Fischer         return aAny;
415cf936e33SAndre Fischer     }
416cf936e33SAndre Fischer 
417cf936e33SAndre Fischer 
418cf936e33SAndre Fischer 
419cf936e33SAndre Fischer 
ParseAttributeGroup()420cf936e33SAndre Fischer     private AttributeGroup ParseAttributeGroup ()
421cf936e33SAndre Fischer         throws XMLStreamException
422cf936e33SAndre Fischer     {
423cf936e33SAndre Fischer         assert(HasOnlyAttributes("name"));
424cf936e33SAndre Fischer 
425cf936e33SAndre Fischer         final AttributeGroup aGroup = new AttributeGroup(GetOptionalQualifiedName("name"), GetLocation());
426cf936e33SAndre Fischer 
427cf936e33SAndre Fischer         while (true)
428cf936e33SAndre Fischer         {
429cf936e33SAndre Fischer             switch (Next())
430cf936e33SAndre Fischer             {
431cf936e33SAndre Fischer                 case XMLStreamReader.START_ELEMENT:
432cf936e33SAndre Fischer                     if ( ! maReader.getLocalName().equals("attribute"))
433cf936e33SAndre Fischer                         throw CreateErrorException(
434cf936e33SAndre Fischer                             "attributeGroup expects element 'attribute' but got %s",
435cf936e33SAndre Fischer                             maReader.getLocalName());
436cf936e33SAndre Fischer                     else
437cf936e33SAndre Fischer                         aGroup.AddAttribute(ParseAttributeOrReference());
438cf936e33SAndre Fischer                     break;
439cf936e33SAndre Fischer 
440cf936e33SAndre Fischer                 case XMLStreamReader.END_ELEMENT:
441cf936e33SAndre Fischer                     return aGroup;
442cf936e33SAndre Fischer 
443cf936e33SAndre Fischer                 default:
444cf936e33SAndre Fischer                     throw CreateErrorException(
445cf936e33SAndre Fischer                         "unexpected event when parsing attributeGroup: %d",
446cf936e33SAndre Fischer                         maReader.getEventType());
447cf936e33SAndre Fischer             }
448cf936e33SAndre Fischer         }
449cf936e33SAndre Fischer     }
450cf936e33SAndre Fischer 
451cf936e33SAndre Fischer 
452cf936e33SAndre Fischer 
453cf936e33SAndre Fischer 
ParseAttributeGroupOrReference()454cf936e33SAndre Fischer     private INode ParseAttributeGroupOrReference ()
455cf936e33SAndre Fischer         throws XMLStreamException
456cf936e33SAndre Fischer     {
457cf936e33SAndre Fischer         assert(HasOnlyAttributes("ref"));
458cf936e33SAndre Fischer 
459cf936e33SAndre Fischer         final INode aGroup;
460cf936e33SAndre Fischer         if (GetAttributeValue("schemaLocation") != null)
461cf936e33SAndre Fischer         {
462cf936e33SAndre Fischer             aGroup = ParseAttributeGroup();
463cf936e33SAndre Fischer         }
464cf936e33SAndre Fischer         else
465cf936e33SAndre Fischer         {
466cf936e33SAndre Fischer             aGroup = new AttributeGroupReference(
467cf936e33SAndre Fischer                 CreateQualifiedName(
468cf936e33SAndre Fischer                     GetAttributeValue("ref")),
469cf936e33SAndre Fischer                 GetLocation());
470cf936e33SAndre Fischer             ExpectEndElement("attribute group or reference");
471cf936e33SAndre Fischer         }
472cf936e33SAndre Fischer         return aGroup;
473cf936e33SAndre Fischer     }
474cf936e33SAndre Fischer 
475cf936e33SAndre Fischer 
476cf936e33SAndre Fischer 
477cf936e33SAndre Fischer 
ParseAttributeOrReference()478cf936e33SAndre Fischer     private INode ParseAttributeOrReference ()
479cf936e33SAndre Fischer         throws XMLStreamException
480cf936e33SAndre Fischer     {
481cf936e33SAndre Fischer         final INode aAttribute;
482cf936e33SAndre Fischer         if (GetAttributeValue("name") != null)
483cf936e33SAndre Fischer         {
484cf936e33SAndre Fischer             aAttribute = ParseAttribute();
485cf936e33SAndre Fischer         }
486cf936e33SAndre Fischer         else
487cf936e33SAndre Fischer         {
488cf936e33SAndre Fischer             assert(HasOnlyAttributes("default", "fixed", "ref", "use"));
489cf936e33SAndre Fischer 
490cf936e33SAndre Fischer             aAttribute = new AttributeReference(
491cf936e33SAndre Fischer                 GetQualifiedName("ref"),
492cf936e33SAndre Fischer                 GetOptionalAttributeValue("use", "optional"),
493cf936e33SAndre Fischer                 GetOptionalAttributeValue("default", null),
494cf936e33SAndre Fischer                 GetOptionalAttributeValue("fixed", null),
49562886075SAndre Fischer                 meAttributeFormDefault,
496cf936e33SAndre Fischer                 GetLocation());
497cf936e33SAndre Fischer             ExpectEndElement("attribute reference");
498cf936e33SAndre Fischer         }
499cf936e33SAndre Fischer         return aAttribute;
500cf936e33SAndre Fischer     }
501cf936e33SAndre Fischer 
502cf936e33SAndre Fischer 
503cf936e33SAndre Fischer 
504cf936e33SAndre Fischer 
ParseAttribute()505cf936e33SAndre Fischer     private Attribute ParseAttribute ()
506cf936e33SAndre Fischer         throws XMLStreamException
507cf936e33SAndre Fischer     {
508cf936e33SAndre Fischer         assert(HasOnlyAttributes("default", "fixed", "name", "type", "use"));
509cf936e33SAndre Fischer 
510cf936e33SAndre Fischer         final Attribute aAttribute = new Attribute(
511cf936e33SAndre Fischer             GetQualifiedName("name"),
512cf936e33SAndre Fischer             GetQualifiedName("type"),
513cf936e33SAndre Fischer             GetOptionalAttributeValue("use", "optional"),
514cf936e33SAndre Fischer             GetOptionalAttributeValue("default", null),
515cf936e33SAndre Fischer             GetOptionalAttributeValue("fixed", null),
51662886075SAndre Fischer             meAttributeFormDefault,
517cf936e33SAndre Fischer             GetLocation());
518cf936e33SAndre Fischer         ExpectEndElement("attribute");
519cf936e33SAndre Fischer 
520cf936e33SAndre Fischer         return aAttribute;
521cf936e33SAndre Fischer     }
522cf936e33SAndre Fischer 
523cf936e33SAndre Fischer 
524cf936e33SAndre Fischer 
ParseChoice(final Node aParent)525cf936e33SAndre Fischer     private Choice ParseChoice (final Node aParent)
526cf936e33SAndre Fischer         throws XMLStreamException
527cf936e33SAndre Fischer     {
528cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs"));
529cf936e33SAndre Fischer 
530cf936e33SAndre Fischer         final Choice aChoice = new Choice(aParent, GetLocation());
531cf936e33SAndre Fischer         ParseContent(aChoice);
532cf936e33SAndre Fischer         return aChoice;
533cf936e33SAndre Fischer     }
534cf936e33SAndre Fischer 
535cf936e33SAndre Fischer 
536cf936e33SAndre Fischer 
537cf936e33SAndre Fischer 
ParseComplexContent(final Node aParent)538cf936e33SAndre Fischer     private ComplexContent ParseComplexContent (final Node aParent)
539cf936e33SAndre Fischer         throws XMLStreamException
540cf936e33SAndre Fischer     {
541cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs"));
542cf936e33SAndre Fischer 
543cf936e33SAndre Fischer         final ComplexContent aNode = new ComplexContent(aParent, GetLocation());
544cf936e33SAndre Fischer         ParseContent(aNode);
545cf936e33SAndre Fischer         return aNode;
546cf936e33SAndre Fischer     }
547cf936e33SAndre Fischer 
548cf936e33SAndre Fischer 
549cf936e33SAndre Fischer 
550cf936e33SAndre Fischer 
ParseComplexType()551cf936e33SAndre Fischer     private ComplexType ParseComplexType ()
552cf936e33SAndre Fischer         throws XMLStreamException
553cf936e33SAndre Fischer     {
554cf936e33SAndre Fischer         assert(HasOnlyAttributes("mixed", "name"));
555cf936e33SAndre Fischer 
556cf936e33SAndre Fischer         final ComplexType aComplexType = new ComplexType(
557cf936e33SAndre Fischer             null,
558cf936e33SAndre Fischer             GetQualifiedName("name"),
559cf936e33SAndre Fischer             GetLocation());
560cf936e33SAndre Fischer 
561cf936e33SAndre Fischer         ParseContent(aComplexType);
562cf936e33SAndre Fischer 
563cf936e33SAndre Fischer         return aComplexType;
564cf936e33SAndre Fischer     }
565cf936e33SAndre Fischer 
566cf936e33SAndre Fischer 
567cf936e33SAndre Fischer 
568cf936e33SAndre Fischer 
ParseElement(final Node aParent)569cf936e33SAndre Fischer     private Element ParseElement (final Node aParent)
570cf936e33SAndre Fischer         throws XMLStreamException
571cf936e33SAndre Fischer     {
572cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs", "name", "type"));
573cf936e33SAndre Fischer 
574cf936e33SAndre Fischer         final Element aElement = new Element(
575cf936e33SAndre Fischer             aParent,
576cf936e33SAndre Fischer             GetQualifiedName("name"),
577cf936e33SAndre Fischer             GetQualifiedName("type"),
578cf936e33SAndre Fischer             GetLocation());
579cf936e33SAndre Fischer 
580cf936e33SAndre Fischer         ExpectEndElement("element");
581cf936e33SAndre Fischer 
582cf936e33SAndre Fischer         return aElement;
583cf936e33SAndre Fischer     }
584cf936e33SAndre Fischer 
585cf936e33SAndre Fischer 
586cf936e33SAndre Fischer 
587cf936e33SAndre Fischer 
ParseElementOrReference(final Node aParent)588cf936e33SAndre Fischer     private Element ParseElementOrReference (final Node aParent)
589cf936e33SAndre Fischer         throws XMLStreamException
590cf936e33SAndre Fischer     {
591cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs", "name", "ref", "type"));
592cf936e33SAndre Fischer 
593cf936e33SAndre Fischer         final Element aElement;
594cf936e33SAndre Fischer         final String sName = GetOptionalAttributeValue("name", null);
595cf936e33SAndre Fischer         if (sName != null)
596cf936e33SAndre Fischer         {
597cf936e33SAndre Fischer             aElement = ParseElement(aParent);
598cf936e33SAndre Fischer         }
599cf936e33SAndre Fischer         else
600cf936e33SAndre Fischer         {
601cf936e33SAndre Fischer             final String sElementReference = GetOptionalAttributeValue("ref",  null);
602cf936e33SAndre Fischer             if (sElementReference != null)
603cf936e33SAndre Fischer             {
604cf936e33SAndre Fischer                 ExpectEndElement("element reference");
605cf936e33SAndre Fischer                 aElement = new ElementReference(
606cf936e33SAndre Fischer                     aParent,
607cf936e33SAndre Fischer                     CreateQualifiedName(sElementReference),
608cf936e33SAndre Fischer                     GetLocation());
609cf936e33SAndre Fischer             }
610cf936e33SAndre Fischer             else
611cf936e33SAndre Fischer             {
612cf936e33SAndre Fischer                 throw CreateErrorException("element has no name and no ref");
613cf936e33SAndre Fischer             }
614cf936e33SAndre Fischer         }
615cf936e33SAndre Fischer         return aElement;
616cf936e33SAndre Fischer     }
617cf936e33SAndre Fischer 
618cf936e33SAndre Fischer 
619cf936e33SAndre Fischer 
620cf936e33SAndre Fischer 
ParseExtension(final Node aParent)621cf936e33SAndre Fischer     private Extension ParseExtension (final Node aParent)
622cf936e33SAndre Fischer         throws XMLStreamException
623cf936e33SAndre Fischer     {
624cf936e33SAndre Fischer         assert(HasOnlyAttributes("base", "minOccurs", "maxOccurs"));
625cf936e33SAndre Fischer 
626cf936e33SAndre Fischer         final Extension aNode = new Extension(
627cf936e33SAndre Fischer             aParent,
628cf936e33SAndre Fischer             CreateQualifiedName(GetAttributeValue("base")),
629cf936e33SAndre Fischer             GetLocation());
630cf936e33SAndre Fischer         ParseContent(aNode);
631cf936e33SAndre Fischer         return aNode;
632cf936e33SAndre Fischer     }
633cf936e33SAndre Fischer 
634cf936e33SAndre Fischer 
635cf936e33SAndre Fischer 
636cf936e33SAndre Fischer 
ParseGroup(final Node aParent)637cf936e33SAndre Fischer     private Group ParseGroup (final Node aParent)
638cf936e33SAndre Fischer         throws XMLStreamException
639cf936e33SAndre Fischer     {
640cf936e33SAndre Fischer         assert(HasOnlyAttributes("name"));
641cf936e33SAndre Fischer 
642cf936e33SAndre Fischer         final Group aGroup = new Group(
643cf936e33SAndre Fischer             aParent,
644cf936e33SAndre Fischer             GetQualifiedName("name"),
645cf936e33SAndre Fischer             GetLocation());
646cf936e33SAndre Fischer         ParseContent(aGroup);
647cf936e33SAndre Fischer         return aGroup;
648cf936e33SAndre Fischer     }
649cf936e33SAndre Fischer 
650cf936e33SAndre Fischer 
651cf936e33SAndre Fischer 
652cf936e33SAndre Fischer 
ParseGroupOrReference(final Node aParent)653cf936e33SAndre Fischer     private Node ParseGroupOrReference (final Node aParent)
654cf936e33SAndre Fischer         throws XMLStreamException
655cf936e33SAndre Fischer     {
656cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs", "name", "ref"));
657cf936e33SAndre Fischer 
658cf936e33SAndre Fischer         final Node aGroup;
659cf936e33SAndre Fischer         final String sName = GetOptionalAttributeValue("name", null);
660cf936e33SAndre Fischer         if (sName != null)
661cf936e33SAndre Fischer         {
662cf936e33SAndre Fischer             aGroup = ParseGroup(aParent);
663cf936e33SAndre Fischer         }
664cf936e33SAndre Fischer         else
665cf936e33SAndre Fischer         {
666cf936e33SAndre Fischer             final String sGroupReference = GetOptionalAttributeValue("ref",  null);
667cf936e33SAndre Fischer             if (sGroupReference != null)
668cf936e33SAndre Fischer             {
669cf936e33SAndre Fischer                 ExpectEndElement("group reference");
670cf936e33SAndre Fischer                 aGroup = new GroupReference(
671cf936e33SAndre Fischer                     aParent,
672cf936e33SAndre Fischer                     CreateQualifiedName(sGroupReference),
673cf936e33SAndre Fischer                     GetLocation());
674cf936e33SAndre Fischer             }
675cf936e33SAndre Fischer             else
676cf936e33SAndre Fischer             {
677cf936e33SAndre Fischer                 throw CreateErrorException("group has no name and no ref");
678cf936e33SAndre Fischer             }
679cf936e33SAndre Fischer         }
680cf936e33SAndre Fischer         return aGroup;
681cf936e33SAndre Fischer     }
682cf936e33SAndre Fischer 
683cf936e33SAndre Fischer 
684cf936e33SAndre Fischer 
685cf936e33SAndre Fischer 
ParseRestriction(final Node aParent)686cf936e33SAndre Fischer     private Restriction ParseRestriction (final Node aParent)
687cf936e33SAndre Fischer         throws XMLStreamException
688cf936e33SAndre Fischer     {
689cf936e33SAndre Fischer         assert(HasOnlyAttributes("base", "value"));
690cf936e33SAndre Fischer 
691*7d97ce35SAndre Fischer         final String sBaseType = GetAttributeValue("base");
692cf936e33SAndre Fischer         final Restriction aRestriction = new Restriction(
693cf936e33SAndre Fischer             aParent,
694*7d97ce35SAndre Fischer             CreateQualifiedName(sBaseType),
695cf936e33SAndre Fischer             GetLocation());
696cf936e33SAndre Fischer 
697cf936e33SAndre Fischer         while (true)
698cf936e33SAndre Fischer         {
699cf936e33SAndre Fischer             switch (Next())
700cf936e33SAndre Fischer             {
701cf936e33SAndre Fischer                 case XMLStreamReader.START_ELEMENT:
702cf936e33SAndre Fischer                     final String sValue = GetAttributeValue("value");
703cf936e33SAndre Fischer                     switch (maReader.getLocalName())
704cf936e33SAndre Fischer                     {
705cf936e33SAndre Fischer                         case "enumeration":
706cf936e33SAndre Fischer                             aRestriction.AddEnumeration(sValue);
707cf936e33SAndre Fischer                             break;
708cf936e33SAndre Fischer 
709cf936e33SAndre Fischer                         case "minInclusive":
710cf936e33SAndre Fischer                             aRestriction.SetMinInclusive(sValue);
711cf936e33SAndre Fischer                             break;
712cf936e33SAndre Fischer 
713cf936e33SAndre Fischer                         case "minExclusive":
714cf936e33SAndre Fischer                             aRestriction.SetMinExclusive(sValue);
715cf936e33SAndre Fischer                             break;
716cf936e33SAndre Fischer 
717cf936e33SAndre Fischer                         case "maxInclusive":
718cf936e33SAndre Fischer                             aRestriction.SetMaxInclusive(sValue);
719cf936e33SAndre Fischer                             break;
720cf936e33SAndre Fischer 
721cf936e33SAndre Fischer                         case "maxExclusive":
722cf936e33SAndre Fischer                             aRestriction.SetMaxExclusive(sValue);
723cf936e33SAndre Fischer                             break;
724cf936e33SAndre Fischer 
725cf936e33SAndre Fischer                         case "length":
726cf936e33SAndre Fischer                             aRestriction.SetLength(sValue);
727cf936e33SAndre Fischer                             break;
728cf936e33SAndre Fischer 
729cf936e33SAndre Fischer                         case "minLength":
730cf936e33SAndre Fischer                             aRestriction.SetMinLength(sValue);
731cf936e33SAndre Fischer                             break;
732cf936e33SAndre Fischer 
733cf936e33SAndre Fischer                         case "maxLength":
734cf936e33SAndre Fischer                             aRestriction.SetMaxLength(sValue);
735cf936e33SAndre Fischer                             break;
736cf936e33SAndre Fischer 
737cf936e33SAndre Fischer                         case "pattern":
738cf936e33SAndre Fischer                             aRestriction.SetPattern(sValue);
739cf936e33SAndre Fischer                             break;
740cf936e33SAndre Fischer 
741cf936e33SAndre Fischer                         default:
742cf936e33SAndre Fischer                             throw CreateErrorException("unsupported restriction type "+maReader.getLocalName());
743cf936e33SAndre Fischer                     }
744cf936e33SAndre Fischer                     ExpectEndElement("restriction");
745cf936e33SAndre Fischer                     break;
746cf936e33SAndre Fischer 
747cf936e33SAndre Fischer                 case XMLStreamReader.END_ELEMENT:
748cf936e33SAndre Fischer                     return aRestriction;
749cf936e33SAndre Fischer 
750cf936e33SAndre Fischer                 default:
751cf936e33SAndre Fischer                     throw CreateErrorException("unexpected XML event while parsing restrictions: %d", maReader.getEventType());
752cf936e33SAndre Fischer             }
753cf936e33SAndre Fischer         }
754cf936e33SAndre Fischer     }
755cf936e33SAndre Fischer 
756cf936e33SAndre Fischer 
757cf936e33SAndre Fischer 
758cf936e33SAndre Fischer 
ParseList(final Node aParent)759cf936e33SAndre Fischer     private List ParseList (final Node aParent)
760cf936e33SAndre Fischer         throws XMLStreamException
761cf936e33SAndre Fischer     {
762cf936e33SAndre Fischer         assert(HasOnlyAttributes("itemType"));
763cf936e33SAndre Fischer 
764cf936e33SAndre Fischer         final List aList = new List(
765cf936e33SAndre Fischer             aParent,
766cf936e33SAndre Fischer             GetQualifiedName("itemType"),
767cf936e33SAndre Fischer             GetLocation());
768cf936e33SAndre Fischer         ExpectEndElement("list");
769cf936e33SAndre Fischer         return aList;
770cf936e33SAndre Fischer     }
771cf936e33SAndre Fischer 
772cf936e33SAndre Fischer 
773cf936e33SAndre Fischer 
774cf936e33SAndre Fischer 
ParseSequence(final Node aParent)775cf936e33SAndre Fischer     private Sequence ParseSequence (final Node aParent)
776cf936e33SAndre Fischer         throws XMLStreamException
777cf936e33SAndre Fischer     {
778cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs", "name"));
779cf936e33SAndre Fischer 
780cf936e33SAndre Fischer         final Sequence aSequence = new Sequence(
781cf936e33SAndre Fischer             aParent,
782cf936e33SAndre Fischer             GetOptionalQualifiedName("name"),
783cf936e33SAndre Fischer             GetLocation());
784cf936e33SAndre Fischer         ParseContent(aSequence);
785cf936e33SAndre Fischer         return aSequence;
786cf936e33SAndre Fischer     }
787cf936e33SAndre Fischer 
788cf936e33SAndre Fischer 
789cf936e33SAndre Fischer 
790cf936e33SAndre Fischer 
ParseSimpleContent(final Node aParent)791cf936e33SAndre Fischer     private SimpleContent ParseSimpleContent (final Node aParent)
792cf936e33SAndre Fischer         throws XMLStreamException
793cf936e33SAndre Fischer     {
794cf936e33SAndre Fischer         assert(HasOnlyAttributes("minOccurs", "maxOccurs"));
795cf936e33SAndre Fischer 
796cf936e33SAndre Fischer         final SimpleContent aSimpleContent = new SimpleContent(
797cf936e33SAndre Fischer             aParent,
798cf936e33SAndre Fischer             GetLocation());
799cf936e33SAndre Fischer         ParseContent(aSimpleContent);
800cf936e33SAndre Fischer         return aSimpleContent;
801cf936e33SAndre Fischer     }
802cf936e33SAndre Fischer 
803cf936e33SAndre Fischer 
804cf936e33SAndre Fischer 
805cf936e33SAndre Fischer 
ParseSimpleType(final Node aParent)806cf936e33SAndre Fischer     private SimpleType ParseSimpleType (final Node aParent)
807cf936e33SAndre Fischer         throws XMLStreamException
808cf936e33SAndre Fischer     {
809cf936e33SAndre Fischer         assert(HasOnlyAttributes("final", "name"));
810cf936e33SAndre Fischer 
811cf936e33SAndre Fischer         final SimpleType aType = new SimpleType(
812cf936e33SAndre Fischer             aParent,
813cf936e33SAndre Fischer             GetQualifiedName("name"),
814cf936e33SAndre Fischer             GetLocation());
815cf936e33SAndre Fischer         final String sFinalValue = GetOptionalAttributeValue("final", null);
816cf936e33SAndre Fischer         if (sFinalValue != null)
817cf936e33SAndre Fischer             aType.SetFinal(sFinalValue.split("\\s+"));
818cf936e33SAndre Fischer 
819cf936e33SAndre Fischer         while (true)
820cf936e33SAndre Fischer         {
821cf936e33SAndre Fischer             switch (Next())
822cf936e33SAndre Fischer             {
823cf936e33SAndre Fischer                 case XMLStreamReader.START_ELEMENT:
824cf936e33SAndre Fischer                     switch(maReader.getLocalName())
825cf936e33SAndre Fischer                     {
826cf936e33SAndre Fischer                         case "list":
827cf936e33SAndre Fischer                             aType.AddChild(ParseList(aType));
828cf936e33SAndre Fischer                             break;
829cf936e33SAndre Fischer 
830cf936e33SAndre Fischer                         case "restriction":
831*7d97ce35SAndre Fischer                             aType.AddChild(ParseRestriction(aType));
832cf936e33SAndre Fischer                             break;
833cf936e33SAndre Fischer 
834cf936e33SAndre Fischer                         case "union":
835cf936e33SAndre Fischer                             aType.AddChild(ParseUnion(aType));
836cf936e33SAndre Fischer                             break;
837cf936e33SAndre Fischer 
838cf936e33SAndre Fischer                         default:
839cf936e33SAndre Fischer                             throw CreateErrorException("unsupported simple type part %s", maReader.getLocalName());
840cf936e33SAndre Fischer                     }
841cf936e33SAndre Fischer                     break;
842cf936e33SAndre Fischer 
843cf936e33SAndre Fischer                 case XMLStreamReader.END_ELEMENT:
844cf936e33SAndre Fischer                     return aType;
845cf936e33SAndre Fischer 
846cf936e33SAndre Fischer                 default:
847cf936e33SAndre Fischer                     throw CreateErrorException("unexpected XML event in ParseSimpleType: %s", maReader.getEventType());
848cf936e33SAndre Fischer             }
849cf936e33SAndre Fischer         }
850cf936e33SAndre Fischer     }
851cf936e33SAndre Fischer 
852cf936e33SAndre Fischer 
853cf936e33SAndre Fischer 
854cf936e33SAndre Fischer 
ParseUnion(final Node aParent)855cf936e33SAndre Fischer     private Union ParseUnion (final Node aParent)
856cf936e33SAndre Fischer         throws XMLStreamException
857cf936e33SAndre Fischer     {
858cf936e33SAndre Fischer         assert(HasOnlyAttributes("memberTypes"));
859cf936e33SAndre Fischer 
860cf936e33SAndre Fischer         final Union aUnion = new Union(
861cf936e33SAndre Fischer             aParent,
862cf936e33SAndre Fischer             GetLocation());
863cf936e33SAndre Fischer         final String[] aMemberTypes = GetAttributeValue("memberTypes").split("\\s+");
864cf936e33SAndre Fischer         for (int nIndex=0; nIndex<aMemberTypes.length; ++nIndex)
865cf936e33SAndre Fischer             aUnion.AddChild(
866cf936e33SAndre Fischer                 new SimpleTypeReference(
867cf936e33SAndre Fischer                     aUnion,
868cf936e33SAndre Fischer                     CreateQualifiedName(aMemberTypes[nIndex]),
869cf936e33SAndre Fischer                     GetLocation()));
870cf936e33SAndre Fischer 
871cf936e33SAndre Fischer         ParseContent(aUnion);
872cf936e33SAndre Fischer 
873cf936e33SAndre Fischer         return aUnion;
874cf936e33SAndre Fischer     }
875cf936e33SAndre Fischer 
876cf936e33SAndre Fischer 
ParseContent(final Node aParent)877cf936e33SAndre Fischer     private void ParseContent (final Node aParent)
878cf936e33SAndre Fischer         throws XMLStreamException
879cf936e33SAndre Fischer     {
880cf936e33SAndre Fischer         while(true)
881cf936e33SAndre Fischer         {
882cf936e33SAndre Fischer             switch(Next())
883cf936e33SAndre Fischer             {
884cf936e33SAndre Fischer                 case XMLStreamReader.START_ELEMENT:
885cf936e33SAndre Fischer                     ProcessStartElement(aParent);
886cf936e33SAndre Fischer                     break;
887cf936e33SAndre Fischer 
888cf936e33SAndre Fischer                 case XMLStreamReader.END_ELEMENT:
889cf936e33SAndre Fischer                     return;
890cf936e33SAndre Fischer 
891cf936e33SAndre Fischer                 default:
892cf936e33SAndre Fischer                     throw CreateErrorException(
893cf936e33SAndre Fischer                         "unexpected XML event %d while parsing content of %s",
894cf936e33SAndre Fischer                         maReader.getEventType(),
895cf936e33SAndre Fischer                         aParent.toString());
896cf936e33SAndre Fischer             }
897cf936e33SAndre Fischer         }
898cf936e33SAndre Fischer     }
899cf936e33SAndre Fischer 
900cf936e33SAndre Fischer 
901cf936e33SAndre Fischer 
902cf936e33SAndre Fischer 
ParseImport()903cf936e33SAndre Fischer     private void ParseImport ()
904cf936e33SAndre Fischer         throws XMLStreamException
905cf936e33SAndre Fischer     {
906cf936e33SAndre Fischer         assert(HasOnlyAttributes("id", "namespace", "schemaLocation"));
907cf936e33SAndre Fischer 
908cf936e33SAndre Fischer         final String sFilename = GetOptionalAttributeValue("schemaLocation", null);
909cf936e33SAndre Fischer         if (sFilename == null)
910cf936e33SAndre Fischer         {
911cf936e33SAndre Fischer             final String sNamespaceName = GetAttributeValue("namespace");
912*7d97ce35SAndre Fischer             if (sNamespaceName.equals(XmlNamespace.URI))
913cf936e33SAndre Fischer             {
9146cde7e4aSAndre Fischer                 XmlNamespace.Apply(maSchemaBase);
915*7d97ce35SAndre Fischer                 maLocalNamespaceMap.put(XmlNamespace.Prefix, XmlNamespace.URI);
916cf936e33SAndre Fischer             }
917cf936e33SAndre Fischer             else
918cf936e33SAndre Fischer                 throw CreateErrorException("invalid import");
919cf936e33SAndre Fischer         }
920cf936e33SAndre Fischer         else
921cf936e33SAndre Fischer         {
922cf936e33SAndre Fischer             maImportedSchemas.add(new File(maDirectory, sFilename));
923cf936e33SAndre Fischer         }
924cf936e33SAndre Fischer 
925cf936e33SAndre Fischer         ExpectEndElement("import");
926cf936e33SAndre Fischer     }
927cf936e33SAndre Fischer 
928cf936e33SAndre Fischer 
929cf936e33SAndre Fischer 
930cf936e33SAndre Fischer 
ParseInclude()931cf936e33SAndre Fischer     private void ParseInclude ()
932cf936e33SAndre Fischer         throws XMLStreamException
933cf936e33SAndre Fischer     {
934cf936e33SAndre Fischer         assert(HasOnlyAttributes("id", "schemaLocation"));
935cf936e33SAndre Fischer 
936cf936e33SAndre Fischer         final String sFilename = GetOptionalAttributeValue("schemaLocation", null);
937cf936e33SAndre Fischer         if (sFilename == null)
938cf936e33SAndre Fischer         {
939cf936e33SAndre Fischer             throw CreateErrorException("invalid include");
940cf936e33SAndre Fischer         }
941cf936e33SAndre Fischer         else
942cf936e33SAndre Fischer         {
943cf936e33SAndre Fischer             maImportedSchemas.add(new File(maDirectory, sFilename));
944cf936e33SAndre Fischer         }
945cf936e33SAndre Fischer 
946cf936e33SAndre Fischer         ExpectEndElement("include");
947cf936e33SAndre Fischer     }
948cf936e33SAndre Fischer 
949cf936e33SAndre Fischer 
950cf936e33SAndre Fischer 
951cf936e33SAndre Fischer 
ExpectEndElement(final String sCaller)952cf936e33SAndre Fischer     private void ExpectEndElement (final String sCaller)
953cf936e33SAndre Fischer         throws XMLStreamException
954cf936e33SAndre Fischer     {
955cf936e33SAndre Fischer         final int nNextEvent = Next();
956cf936e33SAndre Fischer         if (nNextEvent != XMLStreamReader.END_ELEMENT)
957cf936e33SAndre Fischer             throw CreateErrorException("expected END_ELEMENT of %s but got %s",
958cf936e33SAndre Fischer                 sCaller,
959cf936e33SAndre Fischer                 nNextEvent);
960cf936e33SAndre Fischer     }
961cf936e33SAndre Fischer 
962cf936e33SAndre Fischer 
963cf936e33SAndre Fischer 
964cf936e33SAndre Fischer 
965cf936e33SAndre Fischer     /** Return the next relevant token from the XML stream.
966cf936e33SAndre Fischer      *  Ignores comments.
967cf936e33SAndre Fischer      *  @return
968cf936e33SAndre Fischer      *      Returns the event code of the next relevant XML event or END_DOCUMENT when the end of the file has been reached.
969cf936e33SAndre Fischer      */
Next()970cf936e33SAndre Fischer     private int Next ()
971cf936e33SAndre Fischer         throws XMLStreamException
972cf936e33SAndre Fischer     {
973cf936e33SAndre Fischer         while (maReader.hasNext())
974cf936e33SAndre Fischer         {
975cf936e33SAndre Fischer             switch (maReader.next())
976cf936e33SAndre Fischer             {
977cf936e33SAndre Fischer                 case XMLStreamReader.COMMENT:
978cf936e33SAndre Fischer                     // Ignore comments.
979cf936e33SAndre Fischer                     break;
980cf936e33SAndre Fischer 
981cf936e33SAndre Fischer                 case XMLStreamReader.CHARACTERS:
982cf936e33SAndre Fischer                     // Ignore whitespace.
983cf936e33SAndre Fischer                     if (maReader.getText().matches("^\\s+$"))
984cf936e33SAndre Fischer                         break;
985cf936e33SAndre Fischer                     else
986cf936e33SAndre Fischer                     {
987cf936e33SAndre Fischer                         // Character events are not expected in schema files
988cf936e33SAndre Fischer                         // and therefore not supported.
989cf936e33SAndre Fischer                         // Alternatively, they could easily be ignored.
990cf936e33SAndre Fischer                         throw CreateErrorException("unexpected CHARACTERS event with text [%s]", maReader.getText());
991cf936e33SAndre Fischer                     }
992cf936e33SAndre Fischer 
993cf936e33SAndre Fischer                 case XMLStreamReader.START_ELEMENT:
994cf936e33SAndre Fischer                     switch (maReader.getLocalName())
995cf936e33SAndre Fischer                     {
996cf936e33SAndre Fischer                         case "annotation":
997cf936e33SAndre Fischer                             IgnoreAnnotation();
998cf936e33SAndre Fischer                             break;
999cf936e33SAndre Fischer                         case "unique":
1000cf936e33SAndre Fischer                             // Not supported.
1001cf936e33SAndre Fischer                             IgnoreContent();
1002cf936e33SAndre Fischer                             break;
1003cf936e33SAndre Fischer                         default:
1004cf936e33SAndre Fischer                             return XMLStreamReader.START_ELEMENT;
1005cf936e33SAndre Fischer                     }
1006cf936e33SAndre Fischer                     break;
1007cf936e33SAndre Fischer 
1008cf936e33SAndre Fischer                 default:
1009cf936e33SAndre Fischer                     return maReader.getEventType();
1010cf936e33SAndre Fischer             }
1011cf936e33SAndre Fischer         }
1012cf936e33SAndre Fischer         return XMLStreamReader.END_DOCUMENT;
1013cf936e33SAndre Fischer     }
1014cf936e33SAndre Fischer 
1015cf936e33SAndre Fischer 
1016cf936e33SAndre Fischer 
1017cf936e33SAndre Fischer 
GetAttributeValue(final String sAttributeLocalName)1018cf936e33SAndre Fischer     private String GetAttributeValue (final String sAttributeLocalName)
1019cf936e33SAndre Fischer     {
1020cf936e33SAndre Fischer         return maReader.getAttributeValue(null, sAttributeLocalName);
1021cf936e33SAndre Fischer     }
1022cf936e33SAndre Fischer 
1023cf936e33SAndre Fischer 
1024cf936e33SAndre Fischer 
1025cf936e33SAndre Fischer 
GetOptionalAttributeValue( final String sAttributeLocalName, final String sDefaultValue)1026cf936e33SAndre Fischer     private String GetOptionalAttributeValue (
1027cf936e33SAndre Fischer         final String sAttributeLocalName,
1028cf936e33SAndre Fischer         final String sDefaultValue)
1029cf936e33SAndre Fischer     {
1030cf936e33SAndre Fischer         final String sValue = maReader.getAttributeValue(null, sAttributeLocalName);
1031cf936e33SAndre Fischer         if (sValue == null)
1032cf936e33SAndre Fischer             return sDefaultValue;
1033cf936e33SAndre Fischer         else
1034cf936e33SAndre Fischer             return sValue;
1035cf936e33SAndre Fischer     }
1036cf936e33SAndre Fischer 
1037cf936e33SAndre Fischer 
1038cf936e33SAndre Fischer 
1039cf936e33SAndre Fischer 
1040cf936e33SAndre Fischer     /** Read the specified attribute and return its value as QualifiedName object.
1041cf936e33SAndre Fischer      */
GetQualifiedName(final String sAttributeLocalName)1042cf936e33SAndre Fischer     private QualifiedName GetQualifiedName (final String sAttributeLocalName)
1043cf936e33SAndre Fischer     {
1044cf936e33SAndre Fischer         final String sName = maReader.getAttributeValue(null, sAttributeLocalName);
1045cf936e33SAndre Fischer         if (sName == null)
1046cf936e33SAndre Fischer             throw CreateErrorException(
1047cf936e33SAndre Fischer                 "did not find a qualified name as value of attribute '%s' at %s:%s",
1048cf936e33SAndre Fischer                 sAttributeLocalName,
1049cf936e33SAndre Fischer                 msBasename,
1050cf936e33SAndre Fischer                 maReader.getLocation());
1051cf936e33SAndre Fischer         else
1052cf936e33SAndre Fischer             return CreateQualifiedName(sName);
1053cf936e33SAndre Fischer     }
1054cf936e33SAndre Fischer 
1055cf936e33SAndre Fischer 
1056cf936e33SAndre Fischer 
1057cf936e33SAndre Fischer 
GetOptionalQualifiedName(final String sAttributeLocalName)1058cf936e33SAndre Fischer     private QualifiedName GetOptionalQualifiedName (final String sAttributeLocalName)
1059cf936e33SAndre Fischer     {
1060cf936e33SAndre Fischer         final String sName = maReader.getAttributeValue(null, sAttributeLocalName);
1061cf936e33SAndre Fischer         if (sName == null)
1062cf936e33SAndre Fischer             return null;
1063cf936e33SAndre Fischer         else
1064cf936e33SAndre Fischer             return CreateQualifiedName(sName);
1065cf936e33SAndre Fischer     }
1066cf936e33SAndre Fischer 
1067cf936e33SAndre Fischer 
1068cf936e33SAndre Fischer 
1069cf936e33SAndre Fischer 
1070cf936e33SAndre Fischer     /** Create a QualifiedName object from the given string.
1071cf936e33SAndre Fischer      * @param sName
1072cf936e33SAndre Fischer      *     May or may not contain a namespace prefix (separated from the name
1073cf936e33SAndre Fischer      *     by a colon).
1074cf936e33SAndre Fischer      */
CreateQualifiedName(final String sName)1075cf936e33SAndre Fischer     private QualifiedName CreateQualifiedName (final String sName)
1076cf936e33SAndre Fischer     {
1077cf936e33SAndre Fischer         final String[] aParts = sName.split(":");
1078cf936e33SAndre Fischer         final String sNamespaceURL;
1079cf936e33SAndre Fischer         final String sLocalPart;
1080cf936e33SAndre Fischer         switch (aParts.length)
1081cf936e33SAndre Fischer         {
1082cf936e33SAndre Fischer             case 1:
1083cf936e33SAndre Fischer                 // sName only consists of a local part.
10846cde7e4aSAndre Fischer                 // Use the target namespace as namespace.
10856cde7e4aSAndre Fischer                 sNamespaceURL = msTargetNamespace;
1086cf936e33SAndre Fischer                 sLocalPart = aParts[0];
1087cf936e33SAndre Fischer                 break;
1088cf936e33SAndre Fischer 
1089cf936e33SAndre Fischer             case 2:
1090cf936e33SAndre Fischer                 // sName is of the form prefix:local.
1091cf936e33SAndre Fischer                 sNamespaceURL = maLocalNamespaceMap.get(aParts[0]);
1092cf936e33SAndre Fischer                 sLocalPart = aParts[1];
1093cf936e33SAndre Fischer                 break;
1094cf936e33SAndre Fischer 
1095cf936e33SAndre Fischer             default:
1096cf936e33SAndre Fischer                 throw new RuntimeException(
1097cf936e33SAndre Fischer                     "the string '"+sName+"' can not be transformed into a qualified name");
1098cf936e33SAndre Fischer         }
1099cf936e33SAndre Fischer         if (sNamespaceURL == null)
1100cf936e33SAndre Fischer             throw CreateErrorException("can not determine namespace for '%s'", sName);
1101cf936e33SAndre Fischer         // Transform the local namespace prefix into a global namespace prefix
1102cf936e33SAndre Fischer         // (different schema files can use different prefixes for the same
1103cf936e33SAndre Fischer         // namespace URI).
11046cde7e4aSAndre Fischer         final String sGlobalNamespacePrefix = maSchemaBase.Namespaces.GetNamespacePrefix(sNamespaceURL);
1105cf936e33SAndre Fischer         return new QualifiedName(
1106cf936e33SAndre Fischer             sNamespaceURL,
1107cf936e33SAndre Fischer             sGlobalNamespacePrefix,
1108cf936e33SAndre Fischer             sLocalPart);
1109cf936e33SAndre Fischer     }
1110cf936e33SAndre Fischer 
1111cf936e33SAndre Fischer 
1112cf936e33SAndre Fischer 
1113cf936e33SAndre Fischer 
1114cf936e33SAndre Fischer     /** Create an XMLStreamReader for the given file.
1115cf936e33SAndre Fischer      *  Returns null when there is an error.
1116cf936e33SAndre Fischer      */
GetStreamReader(final File aSchemaFile)1117cf936e33SAndre Fischer     private static XMLStreamReader GetStreamReader (final File aSchemaFile)
1118cf936e33SAndre Fischer     {
1119cf936e33SAndre Fischer         final XMLInputFactory aFactory = (XMLInputFactory)XMLInputFactory.newInstance();
1120cf936e33SAndre Fischer         aFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
1121cf936e33SAndre Fischer         aFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
1122cf936e33SAndre Fischer         aFactory.setProperty(XMLInputFactory.IS_COALESCING, false);
1123cf936e33SAndre Fischer 
1124cf936e33SAndre Fischer         try
1125cf936e33SAndre Fischer         {
1126cf936e33SAndre Fischer             return aFactory.createXMLStreamReader(
1127cf936e33SAndre Fischer                 aSchemaFile.getName(),
1128cf936e33SAndre Fischer                 new FileInputStream(aSchemaFile));
1129cf936e33SAndre Fischer         }
1130cf936e33SAndre Fischer         catch (Exception aException)
1131cf936e33SAndre Fischer         {
1132cf936e33SAndre Fischer             aException.printStackTrace();
1133cf936e33SAndre Fischer             return null;
1134cf936e33SAndre Fischer         }
1135cf936e33SAndre Fischer     }
1136cf936e33SAndre Fischer 
1137cf936e33SAndre Fischer 
1138cf936e33SAndre Fischer 
1139cf936e33SAndre Fischer 
CreateErrorException( final String sFormat, final Object ... aArgumentList)1140cf936e33SAndre Fischer     private RuntimeException CreateErrorException (
1141cf936e33SAndre Fischer         final String sFormat,
1142cf936e33SAndre Fischer         final Object ... aArgumentList)
1143cf936e33SAndre Fischer     {
1144cf936e33SAndre Fischer         return new RuntimeException(String.format(sFormat, aArgumentList)
1145cf936e33SAndre Fischer             + String.format(" in %s at L%dC%dP%d",
1146cf936e33SAndre Fischer                 msBasename,
1147cf936e33SAndre Fischer                 maReader.getLocation().getLineNumber(),
1148cf936e33SAndre Fischer                 maReader.getLocation().getColumnNumber(),
1149cf936e33SAndre Fischer                 maReader.getLocation().getCharacterOffset()));
1150cf936e33SAndre Fischer     }
1151cf936e33SAndre Fischer 
1152cf936e33SAndre Fischer 
1153cf936e33SAndre Fischer 
1154cf936e33SAndre Fischer 
1155cf936e33SAndre Fischer     /** This predicate is only used for debugging to assert
1156cf936e33SAndre Fischer      *  that no unsupported attributes are present.
1157cf936e33SAndre Fischer      *  If there where then the parser has to be extended.
1158cf936e33SAndre Fischer      */
HasOnlyAttributes(final String ... aAttributeNameList)1159cf936e33SAndre Fischer     private boolean HasOnlyAttributes (final String ... aAttributeNameList)
1160cf936e33SAndre Fischer     {
1161cf936e33SAndre Fischer         for (int nIndex=0,nCount=maReader.getAttributeCount(); nIndex<nCount; ++nIndex)
1162cf936e33SAndre Fischer         {
1163cf936e33SAndre Fischer             final String sAttributeName = maReader.getAttributeLocalName(nIndex);
1164cf936e33SAndre Fischer             boolean bFound = false;
1165cf936e33SAndre Fischer             for (final String sName : aAttributeNameList)
1166cf936e33SAndre Fischer                 if (sAttributeName.equals(sName))
1167cf936e33SAndre Fischer                 {
1168cf936e33SAndre Fischer                     bFound = true;
1169cf936e33SAndre Fischer                     break;
1170cf936e33SAndre Fischer                 }
1171cf936e33SAndre Fischer             if ( ! bFound)
1172cf936e33SAndre Fischer             {
1173cf936e33SAndre Fischer                 // Attribute name was not found in the given list.
1174cf936e33SAndre Fischer                 System.err.printf("attribute '%s' is not handled\n", sAttributeName);
1175cf936e33SAndre Fischer                 return false;
1176cf936e33SAndre Fischer             }
1177cf936e33SAndre Fischer         }
1178cf936e33SAndre Fischer         return true;
1179cf936e33SAndre Fischer     }
1180cf936e33SAndre Fischer 
1181cf936e33SAndre Fischer 
1182cf936e33SAndre Fischer 
1183cf936e33SAndre Fischer 
GetLocation()1184cf936e33SAndre Fischer     private Location GetLocation ()
1185cf936e33SAndre Fischer     {
1186cf936e33SAndre Fischer         final javax.xml.stream.Location aLocation = maReader.getLocation();
1187cf936e33SAndre Fischer         return new Location(
1188cf936e33SAndre Fischer             msBasename,
1189cf936e33SAndre Fischer             aLocation.getLineNumber(),
1190cf936e33SAndre Fischer             aLocation.getColumnNumber(),
1191cf936e33SAndre Fischer             aLocation.getCharacterOffset());
1192cf936e33SAndre Fischer     }
1193cf936e33SAndre Fischer 
1194cf936e33SAndre Fischer 
1195cf936e33SAndre Fischer 
1196cf936e33SAndre Fischer 
1197cf936e33SAndre Fischer     private final Schema maSchema;
11986cde7e4aSAndre Fischer     private final SchemaBase maSchemaBase;
1199cf936e33SAndre Fischer     private final XMLStreamReader maReader;
1200cf936e33SAndre Fischer     private final String msBasename;
1201cf936e33SAndre Fischer     private final File maDirectory;
1202cf936e33SAndre Fischer     private String msTargetNamespace;
1203cf936e33SAndre Fischer     /// Map of namespace prefix to URI, local to the currently read schema file.
1204cf936e33SAndre Fischer     private final Map<String,String> maLocalNamespaceMap;
1205cf936e33SAndre Fischer     /// The names of other schema files referenced by import elements.
1206cf936e33SAndre Fischer     private final Vector<File> maImportedSchemas;
1207cf936e33SAndre Fischer     /// Some values for tracking the number of read bytes and lines.
1208cf936e33SAndre Fischer     private javax.xml.stream.Location maLastLocation;
120962886075SAndre Fischer     private FormDefault meAttributeFormDefault;
121062886075SAndre Fischer     private FormDefault meElementFormDefault;
1211cf936e33SAndre Fischer }
1212