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