blob: 4b5ae449d0ea199d4e9d5ae9839830361f40e804 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 1997, 2021 Oracle and/or its affiliates. All rights reserved.
This program and the accompanying materials are made available under the
terms of the Eclipse Distribution License v. 1.0, which is available at
http://www.eclipse.org/org/documents/edl-v10.php.
SPDX-License-Identifier: BSD-3-Clause
-->
<grammar
ns="http://www.w3.org/2001/XMLSchema"
xmlns:cc="http://www.xml.gr.jp/xmlns/relaxngcc"
xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
>
<define name="complexType"
cc:return-type="ComplexTypeImpl" cc:return-value="result">
<cc:java-body>
private ComplexTypeImpl result;
private Ref.Type baseType;
private Ref.ContentType contentType;
// local variables for simpleContent/restriction
private Ref.SimpleType baseContentType;
private RestrictionSimpleTypeImpl contentSimpleType;
private Locator locator,locator2;
private static class BaseContentSimpleTypeRef implements Ref.SimpleType {
private final Ref.Type baseType;
private BaseContentSimpleTypeRef(Ref.Type _baseType ) { this.baseType = _baseType; }
public XSSimpleType getType() {
return (XSSimpleType)((XSComplexType)baseType.getType()).getContentType();
}
}
</cc:java-body>
<element name="complexType">
<cc:java>locator = $runtime.copyLocator();</cc:java>
<optional>
<attribute name="abstract">
<data type="boolean" cc:alias="abstractValue" />
</attribute>
</optional>
<optional>
<attribute name="block">
<ref name="erSet" cc:alias="blockValue"/>
</attribute>
</optional>
<optional>
<attribute name="final">
<ref name="erSet" cc:alias="finalValue"/>
</attribute>
</optional>
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
<optional>
<attribute name="mixed">
<data type="boolean" cc:alias="mixedValue"/>
</attribute>
</optional>
<optional>
<attribute name="name">
<data type="NCName" cc:alias="name" />
</attribute>
</optional>
fa = <ref name="foreignAttributes"/>(fa);
<optional>
<ref name="annotation" cc:alias="annotation"/>(null,AnnotationContext.COMPLEXTYPE_DECL);
</optional>
<!-- body of the complex type -->
<choice>
<element name="simpleContent">
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
fa = <ref name="foreignAttributes"/>(fa);
<optional>
annotation = <ref name="annotation"/>(annotation,AnnotationContext.COMPLEXTYPE_DECL);
</optional>
<choice>
<!-- simpleContent/restriction -->
<element name="restriction">
<cc:java>locator2 = $runtime.copyLocator();</cc:java>
<attribute name="base">
<ref name="qname" cc:alias="baseTypeName"/>
<cc:java>
baseType = new DelayedRef.Type(
$runtime, locator2, $runtime.currentSchema, baseTypeName );
</cc:java>
</attribute>
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
fa = <ref name="foreignAttributes"/>(fa);
<optional>
annotation = <ref name="annotation"/>(annotation,AnnotationContext.COMPLEXTYPE_DECL);
</optional>
<optional>
<ref name="simpleType" cc:alias="baseContentType"/>
</optional>
<cc:java>
if(baseContentType==null) {
// contentType of the base type, which must be a complex type
baseContentType = new BaseContentSimpleTypeRef(baseType);
}
contentSimpleType = new RestrictionSimpleTypeImpl(
$runtime.document, null/*?*/, locator2, null,
null, true, Collections.EMPTY_SET, baseContentType );
contentType = contentSimpleType;
</cc:java>
<zeroOrMore>
<ref name="facet" cc:alias="facet"/>
<cc:java>contentSimpleType.addFacet(facet);</cc:java>
</zeroOrMore>
<cc:java>
makeResult(XSType.RESTRICTION);
result.setContentType(contentType);
</cc:java>
<ref name="attributeUses" cc:with-params="result" />
</element>
<!-- simpleContent/extension -->
<element name="extension">
<cc:java>locator2 = $runtime.copyLocator();</cc:java>
<attribute name="base">
<ref name="qname" cc:alias="baseTypeName"/>
<cc:java>
baseType = new DelayedRef.Type(
$runtime, locator2, $runtime.currentSchema, baseTypeName );
</cc:java>
</attribute>
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
fa = <ref name="foreignAttributes"/>(fa);
<optional>
annotation = <ref name="annotation"/>(annotation,AnnotationContext.COMPLEXTYPE_DECL);
</optional>
<cc:java>
contentType = new BaseContentRef($runtime,baseType);
makeResult(XSType.EXTENSION);
result.setContentType(contentType);
</cc:java>
<ref name="attributeUses" cc:with-params="result" />
</element>
</choice>
</element>
<element name="complexContent">
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
<optional>
<attribute name="mixed">
<data type="boolean" cc:alias="mixedValue"/>
</attribute>
</optional>
fa = <ref name="foreignAttributes"/>(fa);
<optional>
annotation = <ref name="annotation"/>(annotation,AnnotationContext.COMPLEXTYPE_DECL);
</optional>
<choice>
<!-- complexContent/restriction -->
<element name="restriction">
<cc:java>locator2 = $runtime.copyLocator();</cc:java>
<attribute name="base">
<ref name="qname" cc:alias="baseTypeName"/>
<cc:java>
baseType = new DelayedRef.Type(
$runtime, locator2, $runtime.currentSchema, baseTypeName );
makeResult(XSType.RESTRICTION);
</cc:java>
</attribute>
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
fa = <ref name="foreignAttributes"/>(fa);
<optional>
annotation = <ref name="annotation"/>(annotation,AnnotationContext.COMPLEXTYPE_DECL);
</optional>
<ref name="complexType_complexContent_body"
cc:alias="explicitContent" cc:with-params="result" />
<cc:java>
result.setContentType(explicitContent);
</cc:java>
</element>
<!-- complexContent/extension -->
<element name="extension">
<cc:java>locator2 = $runtime.copyLocator();</cc:java>
<attribute name="base">
<ref name="qname" cc:alias="baseTypeName"/>
<cc:java>
baseType = new DelayedRef.Type(
$runtime, locator2, $runtime.currentSchema, baseTypeName );
makeResult(XSType.EXTENSION);
</cc:java>
</attribute>
<!--optional>
<attribute name="ID">
<data type="ID"/>
</attribute>
</optional-->
fa = <ref name="foreignAttributes"/>(fa);
<optional>
annotation = <ref name="annotation"/>(annotation,AnnotationContext.COMPLEXTYPE_DECL);
</optional>
<ref name="complexType_complexContent_body"
cc:alias="explicitContent" cc:with-params="result" />
<cc:java>
result.setExplicitContent(explicitContent);
result.setContentType(
buildComplexExtensionContentModel(explicitContent));
</cc:java>
</element>
</choice>
</element>
<!-- restriction from anyType -->
<group>
<cc:java>
baseType = $runtime.parser.schemaSet.anyType;
makeResult(XSType.RESTRICTION);
</cc:java>
<ref name="complexType_complexContent_body"
cc:alias="explicitContent" cc:with-params="result"/>
<cc:java>
result.setContentType(explicitContent);
</cc:java>
</group>
</choice>
</element>
<cc:java-body>
// baseType and contentType must be computed before calling this method.
private void makeResult( int derivationMethod ) {
if(finalValue==null)
finalValue = $runtime.finalDefault;
if(blockValue==null)
blockValue = $runtime.blockDefault;
result = new ComplexTypeImpl(
$runtime.document,
annotation,
locator,
fa,
name,
name==null,
$runtime.parseBoolean(abstractValue),
derivationMethod,
baseType,
finalValue,
blockValue,
$runtime.parseBoolean(mixedValue)
);
}
// I had to make them static inner classes (as opposed to anonymous ones),
// so that they will not keep references to parser.
private static class BaseComplexTypeContentRef implements Ref.ContentType {
private final Ref.Type baseType;
private BaseComplexTypeContentRef(Ref.Type _baseType) { this.baseType = _baseType; }
public XSContentType getContentType() {
return ((XSComplexType)baseType.getType()).getContentType();
}
}
private static class InheritBaseContentTypeRef implements Ref.ContentType {
private final Ref.Type baseType;
private final XSContentType empty;
private final XSContentType expContent;
private final SchemaDocumentImpl currentDocument;
private InheritBaseContentTypeRef(
Ref.Type _baseType,XSContentType _explicitContent,NGCCRuntimeEx $runtime) {
this.baseType = _baseType;
this.currentDocument = $runtime.document;
expContent = _explicitContent;
this.empty = $runtime.parser.schemaSet.empty;
}
public XSContentType getContentType() {
XSContentType baseContentType =
((XSComplexType)baseType.getType()).getContentType();
if(baseContentType==empty)
return expContent;
else
return new ParticleImpl( currentDocument, null, new ModelGroupImpl(
currentDocument,
null, null, null, XSModelGroup.SEQUENCE,
new ParticleImpl[]{
(ParticleImpl)baseContentType,
(ParticleImpl)expContent}), null );
}
};
private Ref.ContentType buildComplexExtensionContentModel( XSContentType explicitContent ) {
if(explicitContent==$runtime.parser.schemaSet.empty)
return new BaseComplexTypeContentRef(baseType);
else
return new InheritBaseContentTypeRef(baseType,explicitContent,$runtime);
}
</cc:java-body>
</define>
<define name="complexType_complexContent_body"
cc:params="AttributesHolder owner"
cc:return-type="ContentTypeImpl" cc:return-value="particle">
<cc:java-body>
private ContentTypeImpl particle;
</cc:java-body>
<optional>
<ref name="particle" cc:alias="particle"/>
</optional>
<ref name="attributeUses" cc:with-params="owner" />
if(particle==null)
particle = $runtime.parser.schemaSet.empty;
</define>
</grammar>