You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by an...@apache.org on 2001/02/02 07:07:54 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/validators/schema TraverseSchema.java
andyc 01/02/01 22:07:54
Modified: java/src/org/apache/xerces/validators/schema
TraverseSchema.java
Log:
Fixing accidental overwrite of changes for 1.3.0
Revision Changes Path
1.92 +20 -893 xml-xerces/java/src/org/apache/xerces/validators/schema/TraverseSchema.java
Index: TraverseSchema.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/validators/schema/TraverseSchema.java,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -r1.91 -r1.92
--- TraverseSchema.java 2001/02/01 09:58:40 1.91
+++ TraverseSchema.java 2001/02/02 06:07:54 1.92
@@ -121,7 +121,7 @@
*
* @see org.apache.xerces.validators.common.Grammar
*
- * @version $Id: TraverseSchema.java,v 1.91 2001/02/01 09:58:40 andyc Exp $
+ * @version $Id: TraverseSchema.java,v 1.92 2001/02/02 06:07:54 andyc Exp $
*/
public class TraverseSchema implements
NamespacesScope.NamespacesHandler{
@@ -1075,19 +1075,24 @@
int numEnumerationLiterals = 0;
facetData = new Hashtable();
Vector enumData = new Vector();
+ content = checkContent(simpleTypeDecl, content , true);
while (content != null) {
if (content.getNodeType() == Node.ELEMENT_NODE) {
- numFacets++;
- if (content.getLocalName().equals(SchemaSymbols.ELT_ENUMERATION)) {
+ numFacets++;
+ if (content.getLocalName().equals(SchemaSymbols.ELT_ENUMERATION)) {
numEnumerationLiterals++;
String enumVal = content.getAttribute(SchemaSymbols.ATT_VALUE);
enumData.addElement(enumVal);
- //Enumerations can have annotations ? ( 0 | 1 )
checkContent(simpleTypeDecl, XUtil.getFirstChildElement( content ), true);
- }
- else {
- facetData.put(content.getLocalName(),content.getAttribute( SchemaSymbols.ATT_VALUE ));
- }
+ }
+ else if (content.getLocalName().equals(SchemaSymbols.ELT_ANNOTATION)) {
+ reportSchemaError(SchemaMessageProvider.ContentError,
+ new Object [] { simpleTypeDecl.getAttribute( SchemaSymbols.ATT_NAME )});
+ }
+ else {
+ facetData.put(content.getLocalName(),content.getAttribute( SchemaSymbols.ATT_VALUE ));
+ checkContent(simpleTypeDecl, XUtil.getFirstChildElement( content ), true);
+ }
}
content = XUtil.getNextSiblingElement(content);
}
@@ -1433,714 +1438,6 @@
}
/**
- * Traverse ComplexType Declaration.
- *
- * <complexType
- * abstract = boolean
- * base = QName
- * block = #all or (possibly empty) subset of {extension, restriction}
- * content = elementOnly | empty | mixed | textOnly
- * derivedBy = extension | restriction
- * final = #all or (possibly empty) subset of {extension, restriction}
- * id = ID
- * name = NCName>
- * Content: (annotation? , (((minExclusive | minInclusive | maxExclusive
- * | maxInclusive | precision | scale | length | minLength
- * | maxLength | encoding | period | duration | enumeration
- * | pattern)* | (element | group | all | choice | sequence | any)*) ,
- * ((attribute | attributeGroup)* , anyAttribute?)))
- * </complexType>
- * @param complexTypeDecl
- * @return
- */
-
- //REVISIT: TO DO, base and derivation ???
- private int traverseComplexTypeDecl( Element complexTypeDecl ) throws Exception {
- String isAbstract = complexTypeDecl.getAttribute( SchemaSymbols.ATT_ABSTRACT );
- String base = complexTypeDecl.getAttribute(SchemaSymbols.ATT_BASE);
- String blockSet = complexTypeDecl.getAttribute( SchemaSymbols.ATT_BLOCK );
- String content = complexTypeDecl.getAttribute(SchemaSymbols.ATT_CONTENT);
- String derivedBy = complexTypeDecl.getAttribute( SchemaSymbols.ATT_DERIVEDBY );
- String finalSet = complexTypeDecl.getAttribute( SchemaSymbols.ATT_FINAL );
- String typeId = complexTypeDecl.getAttribute( SchemaSymbols.ATTVAL_ID );
- String typeName = complexTypeDecl.getAttribute(SchemaSymbols.ATT_NAME);
- boolean isNamedType = false;
-
-
- // traverseComplexTypeDecl supports the April version of the schema spec.
- // For candidate recommendation support, traverseComplexTypeDeclCR must be
- // invoked
-
- if (CR_IMPL)
- return traverseComplexTypeDeclCR(complexTypeDecl);
-
- if ( DEBUGGING )
- System.out.println("traversing complex Type : " + typeName +","+base+","+content+".");
-
- if (typeName.equals("")) { // gensym a unique name
- //typeName = "http://www.apache.org/xml/xerces/internalType"+fTypeCount++;
- typeName = "#"+fAnonTypeCount++;
- }
- else {
- fCurrentTypeNameStack.push(typeName);
- isNamedType = true;
- }
-
- if (isTopLevel(complexTypeDecl)) {
-
- String fullName = fTargetNSURIString+","+typeName;
- ComplexTypeInfo temp = (ComplexTypeInfo) fComplexTypeRegistry.get(fullName);
- if (temp != null ) {
- return fStringPool.addSymbol(fullName);
- }
- }
-
- int scopeDefined = fScopeCount++;
- int previousScope = fCurrentScope;
- fCurrentScope = scopeDefined;
-
- Element child = null;
- int contentSpecType = -1;
- int csnType = 0;
- int left = -2;
- int right = -2;
-
- ComplexTypeInfo baseTypeInfo = null; //if base is a complexType;
- DatatypeValidator baseTypeValidator = null; //if base is a simple type or a complex type derived from a simpleType
- DatatypeValidator simpleTypeValidator = null;
- int baseTypeSymbol = -1;
- String fullBaseName = "";
-
- boolean baseIsSimpleSimple = false;
- boolean baseIsComplexSimple = false;
- boolean baseFromAnotherSchema = false;
- String baseTypeSchemaURI = null;
- boolean derivedByRestriction = true;
- boolean derivedByExtension = false;
- int baseContentSpecHandle = -1;
- Element baseTypeNode = null;
-
-
- //int parsedderivedBy = parseComplexDerivedBy(derivedBy);
- //handle the inhreitance here.
- if (base.length()>0) {
-
- //first check if derivedBy is present
- if (derivedBy.length() == 0) {
- // REVISIT: Localize
- reportGenericSchemaError("derivedBy must be present when base is present in "
- +SchemaSymbols.ELT_COMPLEXTYPE
- +" "+ typeName);
- derivedBy = SchemaSymbols.ATTVAL_EXTENSION;
- }
-
- if (derivedBy.equals(SchemaSymbols.ATTVAL_EXTENSION)) {
- derivedByRestriction = false;
- }
-
- String prefix = "";
- String localpart = base;
- int colonptr = base.indexOf(":");
- if ( colonptr > 0) {
- prefix = base.substring(0,colonptr);
- localpart = base.substring(colonptr+1);
- }
- int localpartIndex = fStringPool.addSymbol(localpart);
- String typeURI = resolvePrefixToURI(prefix);
-
- // check if the base type is from the same Schema;
- if ( ! typeURI.equals(fTargetNSURIString)
- && ! typeURI.equals(SchemaSymbols.URI_SCHEMAFORSCHEMA)
- && typeURI.length() != 0 ) /*REVISIT, !!!! a hack: for schema that has no target namespace, e.g. personal-schema.xml*/{
- baseFromAnotherSchema = true;
- baseTypeSchemaURI = typeURI;
- baseTypeInfo = getTypeInfoFromNS(typeURI, localpart);
- if (baseTypeInfo == null) {
- baseTypeValidator = getTypeValidatorFromNS(typeURI, localpart);
- if (baseTypeValidator == null) {
- //TO DO: report error here;
- System.out.println("Could not find base type " +localpart
- + " in schema " + typeURI);
- }
- else{
- baseIsSimpleSimple = true;
- }
- }
- }
- else {
-
- fullBaseName = typeURI+","+localpart;
-
- // assume the base is a complexType and try to locate the base type first
- baseTypeInfo = (ComplexTypeInfo) fComplexTypeRegistry.get(fullBaseName);
-
- // if not found, 2 possibilities: 1: ComplexType in question has not been compiled yet;
- // 2: base is SimpleTYpe;
- if (baseTypeInfo == null) {
- baseTypeValidator = getDatatypeValidator(typeURI, localpart);
-
- if (baseTypeValidator == null) {
- baseTypeNode = getTopLevelComponentByName(SchemaSymbols.ELT_COMPLEXTYPE,localpart);
- if (baseTypeNode != null) {
- baseTypeSymbol = traverseComplexTypeDecl( baseTypeNode );
- baseTypeInfo = (ComplexTypeInfo)
- fComplexTypeRegistry.get(fStringPool.toString(baseTypeSymbol)); //REVISIT: should it be fullBaseName;
- }
- else {
- baseTypeNode = getTopLevelComponentByName(SchemaSymbols.ELT_SIMPLETYPE, localpart);
- if (baseTypeNode != null) {
- baseTypeSymbol = traverseSimpleTypeDecl( baseTypeNode );
- simpleTypeValidator = baseTypeValidator = getDatatypeValidator(typeURI, localpart);
- if (simpleTypeValidator == null) {
- //TO DO: signal error here.
- }
-
- baseIsSimpleSimple = true;
- }
- else {
- // REVISIT: Localize
- reportGenericSchemaError("Base type could not be found : " + base);
- }
- }
- }
- else {
- simpleTypeValidator = baseTypeValidator;
- baseIsSimpleSimple = true;
- }
- }
- }
- //Schema Spec : 5.11: Complex Type Definition Properties Correct : 2
- if (baseIsSimpleSimple && derivedByRestriction) {
- // REVISIT: Localize
- reportGenericSchemaError("base is a simpledType, can't derive by restriction in " + typeName);
- }
-
- //if the base is a complexType
- if (baseTypeInfo != null ) {
-
- //Schema Spec : 5.11: Derivation Valid ( Extension ) 1.1.1
- // 5.11: Derivation Valid ( Restriction, Complex ) 1.2.1
- if (derivedByRestriction) {
- //REVISIT: check base Type's finalset does not include "restriction"
- }
- else {
- //REVISIT: check base Type's finalset doest not include "extension"
- }
-
- if ( baseTypeInfo.contentSpecHandle > -1) {
- if (derivedByRestriction) {
- //REVISIT: !!! really hairy staff to check the particle derivation OK in 5.10
- checkParticleDerivationOK(complexTypeDecl, baseTypeNode);
- }
- baseContentSpecHandle = baseTypeInfo.contentSpecHandle;
- }
- else if ( baseTypeInfo.datatypeValidator != null ) {
- baseTypeValidator = baseTypeInfo.datatypeValidator;
- baseIsComplexSimple = true;
- }
- }
-
- //Schema Spec : 5.11: Derivation Valid ( Extension ) 1.1.1
- if (baseIsComplexSimple && !derivedByRestriction ) {
- // REVISIT: Localize
- reportGenericSchemaError("base is ComplexSimple, can't derive by extension in " + typeName);
- }
-
-
- } // END of if (base.length() > 0) {}
-
- // skip refinement and annotations
- child = null;
-
- if (baseIsComplexSimple) {
-
- contentSpecType = XMLElementDecl.TYPE_SIMPLE;
-
- int numEnumerationLiterals = 0;
- int numFacets = 0;
- Hashtable facetData = new Hashtable();
- Vector enumData = new Vector();
-
-
- //REVISIT: there is a better way to do this,
- for (child = XUtil.getFirstChildElement(complexTypeDecl);
- child != null && (child.getLocalName().equals(SchemaSymbols.ELT_MINEXCLUSIVE) ||
- child.getLocalName().equals(SchemaSymbols.ELT_MININCLUSIVE) ||
- child.getLocalName().equals(SchemaSymbols.ELT_MAXEXCLUSIVE) ||
- child.getLocalName().equals(SchemaSymbols.ELT_MAXINCLUSIVE) ||
- child.getLocalName().equals(SchemaSymbols.ELT_PRECISION) ||
- child.getLocalName().equals(SchemaSymbols.ELT_SCALE) ||
- child.getLocalName().equals(SchemaSymbols.ELT_LENGTH) ||
- child.getLocalName().equals(SchemaSymbols.ELT_MINLENGTH) ||
- child.getLocalName().equals(SchemaSymbols.ELT_MAXLENGTH) ||
- child.getLocalName().equals(SchemaSymbols.ELT_ENCODING) ||
- child.getLocalName().equals(SchemaSymbols.ELT_PERIOD) ||
- child.getLocalName().equals(SchemaSymbols.ELT_DURATION) ||
- child.getLocalName().equals(SchemaSymbols.ELT_ENUMERATION) ||
- child.getLocalName().equals(SchemaSymbols.ELT_PATTERN) ||
- child.getLocalName().equals(SchemaSymbols.ELT_ANNOTATION));
- child = XUtil.getNextSiblingElement(child))
- {
- if ( child.getNodeType() == Node.ELEMENT_NODE ) {
- Element facetElt = (Element) child;
- numFacets++;
- if (facetElt.getLocalName().equals(SchemaSymbols.ELT_ENUMERATION)) {
- numEnumerationLiterals++;
- enumData.addElement(facetElt.getAttribute(SchemaSymbols.ATT_VALUE));
- //Enumerations can have annotations ? ( 0 | 1 )
- Element enumContent = XUtil.getFirstChildElement( facetElt );
- if( enumContent != null && enumContent.getLocalName().equals( SchemaSymbols.ELT_ANNOTATION ) ){
- traverseAnnotationDecl( child );
- }
- // TO DO: if Jeff check in new changes to TraverseSimpleType, copy them over
- } else {
- facetData.put(facetElt.getLocalName(),facetElt.getAttribute( SchemaSymbols.ATT_VALUE ));
- }
- }
- }
- if (numEnumerationLiterals > 0) {
- facetData.put(SchemaSymbols.ELT_ENUMERATION, enumData);
- }
-
- //if (numFacets > 0)
- // baseTypeValidator.setFacets(facetData, derivedBy );
- if (numFacets > 0) {
- simpleTypeValidator = fDatatypeRegistry.createDatatypeValidator( typeName, baseTypeValidator,
- facetData, false );
- }
- else
- simpleTypeValidator = baseTypeValidator;
-
- if (child != null) {
- // REVISIT: Localize
- reportGenericSchemaError("Invalid child '"+child.getLocalName()+"' in complexType : '" + typeName
- + "', because it restricts another complexSimpleType");
- }
- }
-
- // if content = textonly, base is a datatype
- if (content.equals(SchemaSymbols.ATTVAL_TEXTONLY)) {
- //TO DO
- if (base.length() == 0) {
- simpleTypeValidator = baseTypeValidator = getDatatypeValidator("", SchemaSymbols.ATTVAL_STRING);
- }
- else if ( baseTypeValidator == null
- && baseTypeInfo != null && baseTypeInfo.datatypeValidator==null ) // must be datatype
- reportSchemaError(SchemaMessageProvider.NotADatatype,
- new Object [] { base }); //REVISIT check forward refs
- //handle datatypes
- contentSpecType = XMLElementDecl.TYPE_SIMPLE;
- /****
- left = fSchemaGrammar.addContentSpecNode(XMLContentSpec.CONTENTSPECNODE_LEAF,
- fStringPool.addSymbol(base),
- -1, false);
- /****/
-
- }
- else {
- if (!baseIsComplexSimple) {
- contentSpecType = XMLElementDecl.TYPE_CHILDREN;
- }
- csnType = XMLContentSpec.CONTENTSPECNODE_SEQ;
- boolean mixedContent = false;
- //REVISIT: is the default content " elementOnly"
- boolean elementContent = true;
- boolean textContent = false;
- boolean emptyContent = false;
- left = -2;
- right = -2;
- boolean hadContent = false;
-
- if (content.equals(SchemaSymbols.ATTVAL_EMPTY)) {
- contentSpecType = XMLElementDecl.TYPE_EMPTY;
- emptyContent = true;
- elementContent = false;
- left = -1; // no contentSpecNode needed
- } else if (content.equals(SchemaSymbols.ATTVAL_MIXED) ) {
- contentSpecType = XMLElementDecl.TYPE_MIXED;
- mixedContent = true;
- elementContent = false;
- csnType = XMLContentSpec.CONTENTSPECNODE_CHOICE;
- } else if (content.equals(SchemaSymbols.ATTVAL_ELEMENTONLY) || content.equals("")) {
- elementContent = true;
- } else if (content.equals(SchemaSymbols.ATTVAL_TEXTONLY)) {
- textContent = true;
- elementContent = false;
- }
-
- if (mixedContent) {
- // add #PCDATA leaf
-
- left = fSchemaGrammar.addContentSpecNode(XMLContentSpec.CONTENTSPECNODE_LEAF,
- -1, // -1 means "#PCDATA" is name
- -1, false);
- csnType = XMLContentSpec.CONTENTSPECNODE_CHOICE;
- }
-
- boolean seeParticle = false;
- boolean seeOtherParticle = false;
- boolean seeAll = false;
-
- for (child = XUtil.getFirstChildElement(complexTypeDecl);
- child != null;
- child = XUtil.getNextSiblingElement(child)) {
-
- int index = -2; // to save the particle's contentSpec handle
- hadContent = true;
-
- seeParticle = false;
-
- String childName = child.getLocalName();
-
- if (childName.equals(SchemaSymbols.ELT_ELEMENT)) {
- if (mixedContent || elementContent) {
- if ( DEBUGGING )
- System.out.println(" child element name " + child.getAttribute(SchemaSymbols.ATT_NAME));
-
- QName eltQName = traverseElementDecl(child);
- index = fSchemaGrammar.addContentSpecNode( XMLContentSpec.CONTENTSPECNODE_LEAF,
- eltQName.localpart,
- eltQName.uri,
- false);
- seeParticle = true;
- seeOtherParticle = true;
-
- }
- else {
- reportSchemaError(SchemaMessageProvider.EltRefOnlyInMixedElemOnly, null);
- }
-
- }
- else if (childName.equals(SchemaSymbols.ELT_GROUP)) {
- index = traverseGroupDecl(child);
- if (index == -1)
- continue;
- seeParticle = true;
- seeOtherParticle = true;
- }
- else if (childName.equals(SchemaSymbols.ELT_ALL)) {
- index = traverseAll(child);
- seeParticle = true;
- seeAll = true;
-
- }
- else if (childName.equals(SchemaSymbols.ELT_CHOICE)) {
- index = traverseChoice(child);
- seeParticle = true;
- seeOtherParticle = true;
- }
- else if (childName.equals(SchemaSymbols.ELT_SEQUENCE)) {
- index = traverseSequence(child);
- seeParticle = true;
- seeOtherParticle = true;
- }
- else if (childName.equals(SchemaSymbols.ELT_ATTRIBUTE) ||
- childName.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP)) {
- break; // attr processing is done later on in this method
- }
- else if (childName.equals(SchemaSymbols.ELT_ANY)) {
-
- index = traverseAny(child);
- seeParticle = true;
- seeOtherParticle = true;
- }
- else if (childName.equals(SchemaSymbols.ELT_ANNOTATION)) {
- //REVISIT, do nothing for annotation for now.
- }
- else if (childName.equals(SchemaSymbols.ELT_ANYATTRIBUTE)) {
- break;
- //REVISIT, do nothing for attribute wildcard for now.
- }
- else { // datatype qual
- if (!baseIsComplexSimple )
- if (base.equals(""))
- reportSchemaError(SchemaMessageProvider.GenericError,
- new Object [] { "unrecognized child '"+childName+"' in complex type "+typeName });
- else
- reportSchemaError(SchemaMessageProvider.GenericError,
- new Object [] { "unrecognized child '"+childName+"' in complex type '"+typeName+"' with base "+base });
- }
-
- // if base is complextype with simpleType content, can't have any particle children at all.
- if (baseIsComplexSimple && seeParticle) {
- // REVISIT: Localize
- reportGenericSchemaError("In complexType "+typeName+", base type is complexType with simpleType content, can't have any particle children at all");
- hadContent = false;
- left = index = -2;
- contentSpecType = XMLElementDecl.TYPE_SIMPLE;
- break;
- }
-
-
- if (seeAll && seeOtherParticle) {
- // REVISIT: Localize
- reportGenericSchemaError ( " 'All' group needs to be the only child in Complextype : " + typeName);
- }
-
- if (seeAll) {
- //TO DO: REVISIT
- //check the minOccurs = 1 and maxOccurs = 1
- }
-
- // check the minOccurs and maxOccurs of the particle, and fix the
- // contentspec accordingly
- if (seeParticle) {
- index = expandContentModel(index, child);
- if (index == -2 ) {
- continue;
- }
- } //end of if (seeParticle)
-
- if (left == -2) {
- left = index;
- } else if (right == -2) {
- right = index;
- } else {
- left = fSchemaGrammar.addContentSpecNode(csnType, left, right, false);
- right = index;
- }
- } //end looping through the children
-
- if ( ! ( seeOtherParticle || seeAll ) && (elementContent || mixedContent)
- && (base.length() == 0 || ( base.length() > 0 && derivedByRestriction && !baseIsComplexSimple)) ) {
- contentSpecType = XMLElementDecl.TYPE_SIMPLE;
- simpleTypeValidator = getDatatypeValidator("", SchemaSymbols.ATTVAL_STRING);
- // REVISIT: Localize
- reportGenericSchemaError ( " complexType '"+typeName+"' with a elementOnly or mixed content "
- +"need to have at least one particle child");
- }
-
- if (hadContent && right != -2)
- left = fSchemaGrammar.addContentSpecNode(csnType, left, right, false);
-
- if (mixedContent && hadContent) {
- // set occurrence count
- left = fSchemaGrammar.addContentSpecNode(XMLContentSpec.CONTENTSPECNODE_ZERO_OR_MORE,
- left, -1, false);
- }
- }
-
- // if derived by extension and base complextype has a content model,
- // compose the final content model by concatenating the base and the
- // current in sequence.
- if (!derivedByRestriction && baseContentSpecHandle > -1 ) {
- if (baseFromAnotherSchema ) {
- SchemaGrammar aGrammar = (SchemaGrammar) fGrammarResolver.getGrammar(baseTypeSchemaURI);
- baseContentSpecHandle = importContentSpec(aGrammar, baseContentSpecHandle);
- }
-
- if (left == -2) {
- left = baseContentSpecHandle;
- }
- else
- left = fSchemaGrammar.addContentSpecNode(XMLContentSpec.CONTENTSPECNODE_SEQ,
- baseContentSpecHandle,
- left,
- false);
- }
-
- // REVISIT: this is when sees a topelevel <complexType name="abc">attrs*</complexType>
- if (content.length() == 0 && base.length() == 0 && left == -2) {
- contentSpecType = XMLElementDecl.TYPE_ANY;
- }
-
- if (content.length() == 0 && simpleTypeValidator == null && left == -2 ) {
- if (base.length() > 0 && baseTypeInfo != null
- && baseTypeInfo.contentType == XMLElementDecl.TYPE_EMPTY) {
- contentSpecType = XMLElementDecl.TYPE_EMPTY;
- }
- }
-
-
- ComplexTypeInfo typeInfo = new ComplexTypeInfo();
- typeInfo.baseComplexTypeInfo = baseTypeInfo;
- typeInfo.baseDataTypeValidator = baseTypeValidator;
- int derivedByInt = -1;
- if (derivedBy.length() > 0) {
- derivedByInt = parseComplexDerivedBy(derivedBy);
- }
- typeInfo.derivedBy = derivedByInt;
- typeInfo.scopeDefined = scopeDefined;
- typeInfo.contentSpecHandle = left;
- typeInfo.contentType = contentSpecType;
- typeInfo.datatypeValidator = simpleTypeValidator;
- typeInfo.blockSet = parseBlockSet(complexTypeDecl.getAttribute(SchemaSymbols.ATT_BLOCK));
- typeInfo.finalSet = parseFinalSet(complexTypeDecl.getAttribute(SchemaSymbols.ATT_FINAL));
- typeInfo.isAbstract = isAbstract.equals(SchemaSymbols.ATTVAL_TRUE) ? true:false ;
-
- //add a template element to the grammar element decl pool.
- int typeNameIndex = fStringPool.addSymbol(typeName);
- int templateElementNameIndex = fStringPool.addSymbol("$"+typeName);
-
- typeInfo.templateElementIndex =
- fSchemaGrammar.addElementDecl(new QName(-1, templateElementNameIndex,typeNameIndex,fTargetNSURI),
- (fTargetNSURI==StringPool.EMPTY_STRING) ? StringPool.EMPTY_STRING : fCurrentScope, scopeDefined,
- contentSpecType, left,
- -1, simpleTypeValidator);
- typeInfo.attlistHead = fSchemaGrammar.getFirstAttributeDeclIndex(typeInfo.templateElementIndex);
-
-
- // (attribute | attrGroupRef)*
- XMLAttributeDecl attWildcard = null;
- Vector anyAttDecls = new Vector();
-
- for (child = XUtil.getFirstChildElement(complexTypeDecl);
- child != null;
- child = XUtil.getNextSiblingElement(child)) {
-
- String childName = child.getLocalName();
-
- if (childName.equals(SchemaSymbols.ELT_ATTRIBUTE)) {
- if ((baseIsComplexSimple||baseIsSimpleSimple) && derivedByRestriction) {
- // REVISIT: Localize
- reportGenericSchemaError("In complexType "+typeName+
- ", base type has simpleType "+
- "content and derivation method is"+
- " 'restriction', can't have any "+
- "attribute children at all");
- break;
- }
- traverseAttributeDecl(child, typeInfo, false);
- }
- else if ( childName.equals(SchemaSymbols.ELT_ATTRIBUTEGROUP) ) {
- if ((baseIsComplexSimple||baseIsSimpleSimple) && derivedByRestriction) {
- // REVISIT: Localize
- reportGenericSchemaError("In complexType "+typeName+", base "+
- "type has simpleType content and "+
- "derivation method is 'restriction',"+
- " can't have any attribute children at all");
- break;
- }
- traverseAttributeGroupDecl(child,typeInfo,anyAttDecls);
- }
- else if ( childName.equals(SchemaSymbols.ELT_ANYATTRIBUTE) ) {
- attWildcard = traverseAnyAttribute(child);
- }
- }
-
- if (attWildcard != null) {
- XMLAttributeDecl fromGroup = null;
- final int count = anyAttDecls.size();
- if ( count > 0) {
- fromGroup = (XMLAttributeDecl) anyAttDecls.elementAt(0);
- for (int i=1; i<count; i++) {
- fromGroup = mergeTwoAnyAttribute(fromGroup,(XMLAttributeDecl)anyAttDecls.elementAt(i));
- }
- }
- if (fromGroup != null) {
- int saveProcessContents = attWildcard.defaultType;
- attWildcard = mergeTwoAnyAttribute(attWildcard, fromGroup);
- attWildcard.defaultType = saveProcessContents;
- }
- }
- else {
- //REVISIT: unclear in the Scheme Structures 4.3.3 what to do in this case
- }
-
- // merge in base type's attribute decls
- XMLAttributeDecl baseAttWildcard = null;
- if (baseTypeInfo != null && baseTypeInfo.attlistHead > -1 ) {
- int attDefIndex = baseTypeInfo.attlistHead;
- SchemaGrammar aGrammar = fSchemaGrammar;
- if (baseFromAnotherSchema) {
- aGrammar = (SchemaGrammar) fGrammarResolver.getGrammar(baseTypeSchemaURI);
- }
- if (aGrammar == null) {
- reportGenericSchemaError("In complexType "+typeName+", can NOT find the grammar "+
- "with targetNamespace" + baseTypeSchemaURI+
- "for the base type");
- }
- else
- while ( attDefIndex > -1 ) {
- fTempAttributeDecl.clear();
- aGrammar.getAttributeDecl(attDefIndex, fTempAttributeDecl);
- if (fTempAttributeDecl.type == XMLAttributeDecl.TYPE_ANY_ANY
- ||fTempAttributeDecl.type == XMLAttributeDecl.TYPE_ANY_LIST
- ||fTempAttributeDecl.type == XMLAttributeDecl.TYPE_ANY_LOCAL
- ||fTempAttributeDecl.type == XMLAttributeDecl.TYPE_ANY_OTHER ) {
- if (attWildcard == null) {
- baseAttWildcard = fTempAttributeDecl;
- }
- attDefIndex = aGrammar.getNextAttributeDeclIndex(attDefIndex);
- continue;
- }
- // if found a duplicate, if it is derived by restriction. then skip the one from the base type
- /**/
- int temp = fSchemaGrammar.getAttributeDeclIndex(typeInfo.templateElementIndex, fTempAttributeDecl.name);
- if ( temp > -1) {
- if (derivedByRestriction) {
- attDefIndex = fSchemaGrammar.getNextAttributeDeclIndex(attDefIndex);
- continue;
- }
- }
-
- /**/
- fSchemaGrammar.addAttDef( typeInfo.templateElementIndex,
- fTempAttributeDecl.name, fTempAttributeDecl.type,
- fTempAttributeDecl.enumeration, fTempAttributeDecl.defaultType,
- fTempAttributeDecl.defaultValue,
- fTempAttributeDecl.datatypeValidator,
- fTempAttributeDecl.list);
- attDefIndex = aGrammar.getNextAttributeDeclIndex(attDefIndex);
- }
- }
- // att wildcard will inserted after all attributes were processed
- if (attWildcard != null) {
- if (attWildcard.type != -1) {
- fSchemaGrammar.addAttDef( typeInfo.templateElementIndex,
- attWildcard.name, attWildcard.type,
- attWildcard.enumeration, attWildcard.defaultType,
- attWildcard.defaultValue,
- attWildcard.datatypeValidator,
- attWildcard.list);
- }
- else {
- //REVISIT: unclear in Schema spec if should report error here.
- }
- }
- else if (baseAttWildcard != null) {
- fSchemaGrammar.addAttDef( typeInfo.templateElementIndex,
- baseAttWildcard.name, baseAttWildcard.type,
- baseAttWildcard.enumeration, baseAttWildcard.defaultType,
- baseAttWildcard.defaultValue,
- baseAttWildcard.datatypeValidator,
- baseAttWildcard.list);
- }
-
- typeInfo.attlistHead = fSchemaGrammar.getFirstAttributeDeclIndex(typeInfo.templateElementIndex);
-
- if (!typeName.startsWith("#")) {
- typeName = fTargetNSURIString + "," + typeName;
- }
- typeInfo.typeName = new String(typeName);
- if ( DEBUGGING )
- System.out.println(">>>add complex Type to Registry: " + typeName +
- " baseDTValidator=" + typeInfo.baseDataTypeValidator +
- " baseCTInfo=" + typeInfo.baseComplexTypeInfo +
- " derivedBy=" + typeInfo.derivedBy +
- " contentType=" + typeInfo.contentType +
- " contentSpecHandle=" + typeInfo.contentSpecHandle +
- " datatypeValidator=" + typeInfo.datatypeValidator);
-
- fComplexTypeRegistry.put(typeName,typeInfo);
-
- // before exit the complex type definition, restore the scope, mainly for nested Anonymous Types
- fCurrentScope = previousScope;
- if (isNamedType) {
- fCurrentTypeNameStack.pop();
- checkRecursingComplexType();
- }
-
- //set template element's typeInfo
- fSchemaGrammar.setElementComplexTypeInfo(typeInfo.templateElementIndex, typeInfo);
-
- typeNameIndex = fStringPool.addSymbol(typeName);
- return typeNameIndex;
-
-
- } // end of method: traverseComplexTypeDecl
-
- /**
* Traverse ComplexType Declaration - CR Implementation.
*
* <complexType
@@ -2158,7 +1455,7 @@
* @return
*/
- private int traverseComplexTypeDeclCR( Element complexTypeDecl ) throws Exception {
+ private int traverseComplexTypeDecl( Element complexTypeDecl ) throws Exception {
// ------------------------------------------------------------------
// Get the attributes of the type
@@ -2303,7 +1600,7 @@
typeNameIndex = fStringPool.addSymbol(typeName);
return typeNameIndex;
- } // end traverseComplexTypeDeclCR
+ } // end traverseComplexTypeDecl
/**
@@ -3001,7 +2298,7 @@
if (typeInfo.contentSpecHandle == -2) {
typeInfo.contentSpecHandle = baseContentSpecHandle;
}
- else {
+ else if (baseContentSpecHandle > -1) {
typeInfo.contentSpecHandle =
fSchemaGrammar.addContentSpecNode(XMLContentSpec.CONTENTSPECNODE_SEQ,
baseContentSpecHandle,
@@ -3283,22 +2580,9 @@
if (minOccurs.equals("")) {
minOccurs = "1";
}
- if (CR_IMPL) { //CR IMPLEMENTATION
- if (maxOccurs.equals("")) {
+ if (maxOccurs.equals("")) {
maxOccurs = "1";
- }
- }
- else { //WORKING DRAFT IMPLEMENTATION
- if (maxOccurs.equals("") ){
- if ( minOccurs.equals("0")) {
- maxOccurs = "1";
- }
- else {
- maxOccurs = minOccurs;
- }
- }
}
-
int leafIndex = index;
@@ -4995,29 +4279,6 @@
}
/**
- * Traverse attributeGroup Declaration
- *
- * <attributeGroup
- * id = ID
- * ref = QName>
- * Content: (annotation?)
- * </>
- *
- * @param elementDecl
- * @exception Exception
- */
- /*private int traverseAttributeGroupDecl( Element attributeGroupDecl ) throws Exception {
- int attributeGroupID = fStringPool.addSymbol(
- attributeGroupDecl.getAttribute( SchemaSymbols.ATTVAL_ID ));
-
- int attributeGroupName = fStringPool.addSymbol(
- attributeGroupDecl.getAttribute( SchemaSymbols.ATT_NAME ));
-
- return -1;
- }*/
-
-
- /**
* Traverse Group Declaration.
*
* <group
@@ -5724,84 +4985,9 @@
if (tPos < targetArray.length-1)
System.arraycopy(targetArray, tPos+1, newTargetArray, tPos, targetArray.length-tPos-1);
} // end arrayProducer
-
- /****************************************
- * The following code is no longre used...
- // builds the all content model
- private int buildAllModel(int children[], int count) throws Exception {
-
- // build all model
- if (count > 1) {
-
- // create and initialize singletons
- XMLContentSpec choice = new XMLContentSpec();
-
- choice.type = XMLContentSpec.CONTENTSPECNODE_CHOICE;
- choice.value = -1;
- choice.otherValue = -1;
-
- int[] exactChildren = new int[count];
- System.arraycopy(children,0,exactChildren,0,count);
- // build all model
- sort(exactChildren, 0, count);
- int index = buildAllModel(exactChildren, 0, choice);
-
- return index;
- }
-
- if (count > 0) {
- return children[0];
- }
-
- return -1;
- }
-
- // Builds the all model.
- private int buildAllModel(int src[], int offset,
- XMLContentSpec choice) throws Exception {
-
- // swap last two places
- if (src.length - offset == 2) {
- int seqIndex = createSeq(src);
- if (choice.value == -1) {
- choice.value = seqIndex;
- }
- else {
- if (choice.otherValue != -1) {
- choice.value = fSchemaGrammar.addContentSpecNode(choice.type, choice.value, choice.otherValue, false);
- }
- choice.otherValue = seqIndex;
- }
- swap(src, offset, offset + 1);
- seqIndex = createSeq(src);
- if (choice.value == -1) {
- choice.value = seqIndex;
- }
- else {
- if (choice.otherValue != -1) {
- choice.value = fSchemaGrammar.addContentSpecNode(choice.type, choice.value, choice.otherValue, false);
- }
- choice.otherValue = seqIndex;
- }
- return fSchemaGrammar.addContentSpecNode(choice.type, choice.value, choice.otherValue, false);
- }
-
- // recurse
- for (int i = offset; i < src.length - 1; i++) {
- choice.value = buildAllModel(src, offset + 1, choice);
- choice.otherValue = -1;
- sort(src, offset, src.length - offset);
- shift(src, offset, i + 1);
- }
-
- int choiceIndex = buildAllModel(src, offset + 1, choice);
- sort(src, offset, src.length - offset);
-
- return choiceIndex;
-
- } // buildAllModel(int[],int,ContentSpecNode,ContentSpecNode):int
- ****************************************/
+
+
/** Creates a sequence. */
private int createSeq(int src[]) throws Exception {
@@ -5816,53 +5002,9 @@
return fSchemaGrammar.addContentSpecNode(XMLContentSpec.CONTENTSPECNODE_SEQ,
left, right, false);
-
- } // createSeq(int[]):int
-
- /****************************************
- * More coe that is no longer necessary...
- // Shifts a value into position.
- private void shift(int src[], int pos, int offset) {
-
- int temp = src[offset];
- for (int i = offset; i > pos; i--) {
- src[i] = src[i - 1];
- }
- src[pos] = temp;
-
- } // shift(int[],int,int)
-
- // Simple sort.
- private void sort(int src[], final int offset, final int length) {
-
- for (int i = offset; i < offset + length - 1; i++) {
- int lowest = i;
- for (int j = i + 1; j < offset + length; j++) {
- if (src[j] < src[lowest]) {
- lowest = j;
- }
- }
- if (lowest != i) {
- int temp = src[i];
- src[i] = src[lowest];
- src[lowest] = temp;
- }
- }
-
- } // sort(int[],int,int)
- // Swaps two values.
- private void swap(int src[], int i, int j) {
+ }
- int temp = src[i];
- src[i] = src[j];
- src[j] = temp;
-
- } // swap(int[],int,int)
- ***************************************/
-
-
-
// utilities from Tom Watson's SchemaParser class
// TO DO: Need to make this more conformant with Schema int type parsing
@@ -5874,23 +5016,8 @@
return Integer.parseInt (intString);
}
}
-
- //REVISIT: should remove after switching to CR!
- private int parseComplexDerivedBy (String derivedByString) throws Exception
- {
- if ( derivedByString.equals (SchemaSymbols.ATTVAL_EXTENSION) ) {
- return SchemaSymbols.EXTENSION;
- }
- else if ( derivedByString.equals (SchemaSymbols.ATTVAL_RESTRICTION) ) {
- return SchemaSymbols.RESTRICTION;
- }
- else {
- // REVISIT: Localize
- reportGenericSchemaError ( "ComplexType: Invalid value for 'derivedBy'" );
- return -1;
- }
- }
+
private int parseSimpleFinal (String finalString) throws Exception
{
if ( finalString.equals (SchemaSymbols.ATTVAL_POUNDALL) ) {