You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ne...@apache.org on 2003/06/18 05:08:54 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl/xs/traversers XSDHandler.java XSDocumentInfo.java XSAttributeChecker.java
neilg 2003/06/17 20:08:54
Modified: java/src/org/apache/xerces/impl/msg
XMLSchemaMessages.properties
java/src/org/apache/xerces/impl/xs/traversers
XSDHandler.java XSDocumentInfo.java
XSAttributeChecker.java
Log:
Fix 2 related bugs:
(1) The contents of <include> and <import> elements were not inspected;
(2) attributes of <schema> and <redefine> elements were not
passed to the annotation traverser.
Revision Changes Path
1.67 +3 -1 xml-xerces/java/src/org/apache/xerces/impl/msg/XMLSchemaMessages.properties
Index: XMLSchemaMessages.properties
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/msg/XMLSchemaMessages.properties,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -r1.66 -r1.67
--- XMLSchemaMessages.properties 30 Apr 2003 20:24:49 -0000 1.66
+++ XMLSchemaMessages.properties 18 Jun 2003 03:08:54 -0000 1.67
@@ -132,11 +132,13 @@
src-element.4 = src-element.4: error.
src-expredef = src-expredef: error.
src-identity-constraint.1 = src-identity-constraint.1: a ''<selector>'' or a ''<field>'' element can contain at most one ''<annotation>'' in its content; identity constraint ''{0}'' violates this constraint.
+ src-import = src-import: An <import> element cannot contain a child of type ''{0}''.
src-import.0 = src-import.0: Failed to read imported schema document ''{0}''.
src-import.1.1 = src-import.1.1: The namespace attribute ''{0}'' of an <import> element information item must not be the same as the targetNamespace of the schema it exists in.
src-import.2 = src-import.2: The root element of document ''{0}'' is not <xsd:schema>.
src-import.3.1 = src-import.3.1: The namespace attribute ''{0}'' of an <import> element information item must be identical to the targetNamespace attribute ''{1}'' of the imported document.
src-import.3.2 = src-import.3.2: There is no namespace attribute on the <import> element information item, so the imported document must have no targetNamespace attribute.
+ src-include = src-include: An <include> element cannot contain a child of type ''{0}''.
src-include.0 = src-include.0: Failed to read included schema document ''{0}''.
src-include.1 = src-include.1: The root element of document ''{0}'' is not <xsd:schema>.
src-include.2.1 = src-include.2.1: the targetNamespace of the schema ''{1}'' must be identical to that of the including schema ''{0}''.
1.68 +58 -15 xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java
Index: XSDHandler.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDHandler.java,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- XSDHandler.java 13 Jun 2003 22:34:16 -0000 1.67
+++ XSDHandler.java 18 Jun 2003 03:08:54 -0000 1.68
@@ -511,6 +511,7 @@
XSDocumentInfo currSchemaInfo = null;
try {
+ // note that attributes are freed at end of traverseSchemas()
currSchemaInfo = new XSDocumentInfo(schemaRoot, fAttributeChecker, fSymbolTable);
} catch (XMLSchemaException se) {
reportSchemaError(ELE_ERROR_CODES[referType],
@@ -618,16 +619,30 @@
refType = XSDDescription.CONTEXT_IMPORT;
// have to handle some validation here too!
// call XSAttributeChecker to fill in attrs
- Object[] includeAttrs = fAttributeChecker.checkAttributes(child, true, currSchemaInfo);
- schemaHint = (String)includeAttrs[XSAttributeChecker.ATTIDX_SCHEMALOCATION];
- schemaNamespace = (String)includeAttrs[XSAttributeChecker.ATTIDX_NAMESPACE];
+ Object[] importAttrs = fAttributeChecker.checkAttributes(child, true, currSchemaInfo);
+ schemaHint = (String)importAttrs[XSAttributeChecker.ATTIDX_SCHEMALOCATION];
+ schemaNamespace = (String)importAttrs[XSAttributeChecker.ATTIDX_NAMESPACE];
if (schemaNamespace != null)
schemaNamespace = fSymbolTable.addSymbol(schemaNamespace);
// a document can't import another document with the same namespace
if (schemaNamespace == currSchemaInfo.fTargetNamespace) {
reportSchemaError("src-import.1.1", new Object [] {schemaNamespace}, child);
}
- fAttributeChecker.returnAttrArray(includeAttrs, currSchemaInfo);
+
+ // check contents and process optional annotations
+ Element importChild = DOMUtil.getFirstChildElement(child);
+ if(importChild != null ) {
+ String importComponentType = DOMUtil.getLocalName(importChild);
+ if (importComponentType.equals(SchemaSymbols.ELT_ANNOTATION)) {
+ fElementTraverser.traverseAnnotationDecl(importChild, importAttrs, true, currSchemaInfo);
+ } else {
+ reportSchemaError("src-import", new Object [] {importComponentType}, importChild);
+ }
+ if(DOMUtil.getNextSiblingElement(importChild) != null) {
+ reportSchemaError("src-import", new Object [] {importComponentType}, importChild);
+ }
+ }
+ fAttributeChecker.returnAttrArray(importAttrs, currSchemaInfo);
// if this namespace has been imported by this document,
// ignore the <import> statement
@@ -678,6 +693,35 @@
if (localName.equals(SchemaSymbols.ELT_REDEFINE)) {
fRedefine2NSSupport.put(child, new SchemaNamespaceSupport(currSchemaInfo.fNamespaceSupport));
}
+
+ // check annotations. Must do this here to avoid having to
+ // re-parse attributes later
+ if(localName.equals(SchemaSymbols.ELT_INCLUDE)) {
+ Element includeChild = DOMUtil.getFirstChildElement(child);
+ if(includeChild != null ) {
+ String includeComponentType = DOMUtil.getLocalName(includeChild);
+ if (includeComponentType.equals(SchemaSymbols.ELT_ANNOTATION)) {
+ fElementTraverser.traverseAnnotationDecl(includeChild, includeAttrs, true, currSchemaInfo);
+ } else {
+ reportSchemaError("src-include", new Object [] {includeComponentType}, includeChild);
+ }
+ if(DOMUtil.getNextSiblingElement(includeChild) != null) {
+ reportSchemaError("src-include", new Object [] {includeComponentType}, includeChild);
+ }
+ }
+ }
+ else {
+ for (Element redefinedChild = DOMUtil.getFirstChildElement(child);
+ redefinedChild != null;
+ redefinedChild = DOMUtil.getNextSiblingElement(redefinedChild)) {
+ String redefinedComponentType = DOMUtil.getLocalName(redefinedChild);
+ if (redefinedComponentType.equals(SchemaSymbols.ELT_ANNOTATION)) {
+ fElementTraverser.traverseAnnotationDecl(redefinedChild, includeAttrs, true, currSchemaInfo);
+ DOMUtil.setHidden(redefinedChild);
+ }
+ // catch all other content errors later
+ }
+ }
fAttributeChecker.returnAttrArray(includeAttrs, currSchemaInfo);
// schemaLocation is required on <include> and <redefine>
if (schemaHint == null) {
@@ -892,14 +936,14 @@
schemasToProcess.push(fRoot);
while (!schemasToProcess.empty()) {
XSDocumentInfo currSchemaDoc =
- (XSDocumentInfo)schemasToProcess.pop();
+ (XSDocumentInfo)schemasToProcess.pop();
Document currDoc = currSchemaDoc.fSchemaDoc;
SchemaGrammar currSG = fGrammarBucket.getGrammar(currSchemaDoc.fTargetNamespace);
if (DOMUtil.isHidden(currDoc)) {
// must have processed this already!
continue;
}
- Element currRoot = DOMUtil.getRoot(currDoc);
+ Element currRoot = DOMUtil.getRoot(currDoc);
// traverse this schema's global decls
for (Element globalComp =
@@ -930,11 +974,11 @@
else if (redefinedComponentType.equals(SchemaSymbols.ELT_SIMPLETYPE)) {
fSimpleTypeTraverser.traverseGlobal(redefinedComp, currSchemaDoc, currSG);
}
- else if (redefinedComponentType.equals(SchemaSymbols.ELT_ANNOTATION)) {
- // REVISIT: according to 3.13.2 the PSVI needs the parent's attributes;
- // thus this should be done in buildGlobalNameRegistries not here...
- fElementTraverser.traverseAnnotationDecl(redefinedComp, null, true, currSchemaDoc);
- }
+ // annotations will have been processed already; this is now
+ // unnecessary
+ //else if (redefinedComponentType.equals(SchemaSymbols.ELT_ANNOTATION)) {
+ // fElementTraverser.traverseAnnotationDecl(redefinedComp, null, true, currSchemaDoc);
+ //}
else {
reportSchemaError("src-redefine", new Object [] {componentType}, redefinedComp);
}
@@ -963,9 +1007,7 @@
fSimpleTypeTraverser.traverseGlobal(globalComp, currSchemaDoc, currSG);
}
else if (componentType.equals(SchemaSymbols.ELT_ANNOTATION)) {
- // REVISIT: according to 3.13.2 the PSVI needs the parent's attributes;
- // thus this should be done in buildGlobalNameRegistries not here...
- fElementTraverser.traverseAnnotationDecl(globalComp, null, true, currSchemaDoc);
+ fElementTraverser.traverseAnnotationDecl(globalComp, currSchemaDoc.getSchemaAttrs(), true, currSchemaDoc);
}
else {
reportSchemaError("sch-props-correct.1", new Object [] {DOMUtil.getLocalName(globalComp)}, globalComp);
@@ -973,6 +1015,7 @@
} // end for
// now we're done with this one!
+ currSchemaDoc.returnSchemaAttrs();
DOMUtil.setHidden(currDoc);
// now add the schemas this guy depends on
Vector currSchemaDepends = (Vector)fDependencyMap.get(currSchemaDoc);
1.16 +35 -10 xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDocumentInfo.java
Index: XSDocumentInfo.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDocumentInfo.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- XSDocumentInfo.java 8 May 2003 20:11:57 -0000 1.15
+++ XSDocumentInfo.java 18 Jun 2003 03:08:54 -0000 1.16
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -112,6 +112,16 @@
SymbolTable fSymbolTable = null;
+ // attribute checker to which we'll return the attributes
+ // once we've been told that we're done with them
+ protected XSAttributeChecker fAttrChecker;
+
+ // array of objects on the schema's root element. This is null
+ // once returnSchemaAttrs has been called.
+ protected Object [] fSchemaAttrs;
+
+ // note that the caller must ensure to call returnSchemaAttrs()
+ // to avoid memory leaks!
XSDocumentInfo (Document schemaDoc, XSAttributeChecker attrChecker, SymbolTable symbolTable)
throws XMLSchemaException {
fSchemaDoc = schemaDoc;
@@ -120,26 +130,27 @@
fIsChameleonSchema = false;
fSymbolTable = symbolTable;
+ fAttrChecker = attrChecker;
if(schemaDoc != null) {
Element root = DOMUtil.getRoot(schemaDoc);
- Object[] schemaAttrs = attrChecker.checkAttributes(root, true, this);
+ fSchemaAttrs = attrChecker.checkAttributes(root, true, this);
// schemaAttrs == null means it's not an <xsd:schema> element
// throw an exception, but we don't know the document systemId,
// so we leave that to the caller.
- if (schemaAttrs == null) {
+ if (fSchemaAttrs == null) {
throw new XMLSchemaException(null, null);
}
fAreLocalAttributesQualified =
- ((XInt)schemaAttrs[XSAttributeChecker.ATTIDX_AFORMDEFAULT]).intValue() == SchemaSymbols.FORM_QUALIFIED;
+ ((XInt)fSchemaAttrs[XSAttributeChecker.ATTIDX_AFORMDEFAULT]).intValue() == SchemaSymbols.FORM_QUALIFIED;
fAreLocalElementsQualified =
- ((XInt)schemaAttrs[XSAttributeChecker.ATTIDX_EFORMDEFAULT]).intValue() == SchemaSymbols.FORM_QUALIFIED;
+ ((XInt)fSchemaAttrs[XSAttributeChecker.ATTIDX_EFORMDEFAULT]).intValue() == SchemaSymbols.FORM_QUALIFIED;
fBlockDefault =
- ((XInt)schemaAttrs[XSAttributeChecker.ATTIDX_BLOCKDEFAULT]).shortValue();
+ ((XInt)fSchemaAttrs[XSAttributeChecker.ATTIDX_BLOCKDEFAULT]).shortValue();
fFinalDefault =
- ((XInt)schemaAttrs[XSAttributeChecker.ATTIDX_FINALDEFAULT]).shortValue();
+ ((XInt)fSchemaAttrs[XSAttributeChecker.ATTIDX_FINALDEFAULT]).shortValue();
fTargetNamespace =
- (String)schemaAttrs[XSAttributeChecker.ATTIDX_TARGETNAMESPACE];
+ (String)fSchemaAttrs[XSAttributeChecker.ATTIDX_TARGETNAMESPACE];
if (fTargetNamespace != null)
fTargetNamespace = symbolTable.addSymbol(fTargetNamespace);
@@ -150,7 +161,9 @@
fValidationContext.setSymbolTable(symbolTable);
// pass null as the schema document, so that the namespace
// context is not popped.
- attrChecker.returnAttrArray(schemaAttrs, null);
+
+ // don't return the attribute array yet!
+ //attrChecker.returnAttrArray(schemaAttrs, null);
}
}
@@ -196,6 +209,18 @@
return false;
fReportedTNS.addElement(uri);
return true;
+ }
+
+ // return the attributes on the schema element itself:
+ Object [] getSchemaAttrs () {
+ return fSchemaAttrs;
+ }
+
+ // deallocate the storage set aside for the schema element's
+ // attributes
+ void returnSchemaAttrs () {
+ fAttrChecker.returnAttrArray (fSchemaAttrs, null);
+ fSchemaAttrs = null;
}
} // XSDocumentInfo
1.24 +34 -18 xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSAttributeChecker.java
Index: XSAttributeChecker.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSAttributeChecker.java,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- XSAttributeChecker.java 8 May 2003 20:11:57 -0000 1.23
+++ XSAttributeChecker.java 18 Jun 2003 03:08:54 -0000 1.24
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2001, 2002 The Apache Software Foundation. All rights
+ * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -136,7 +136,8 @@
public static final int ATTIDX_NAME = ATTIDX_COUNT++;
public static final int ATTIDX_NAMESPACE = ATTIDX_COUNT++;
public static final int ATTIDX_NAMESPACE_LIST = ATTIDX_COUNT++;
- public static final int ATTIDX_NILLABLE = ATTIDX_COUNT++;
+ public static final int ATTIDX_NILLABLE = ATTIDX_COUNT++;
+ public static final int ATTIDX_NONSCHEMA = ATTIDX_COUNT++;
public static final int ATTIDX_PROCESSCONTENTS = ATTIDX_COUNT++;
public static final int ATTIDX_PUBLIC = ATTIDX_COUNT++;
public static final int ATTIDX_REF = ATTIDX_COUNT++;
@@ -1108,9 +1109,14 @@
String attrVal = DOMUtil.getValue(sattr);
// skip anything starts with x/X m/M l/L
- // simply put their values in the return hashtable
+ // add this to the list of "non-schema" attributes
if (attrName.toLowerCase(Locale.ENGLISH).startsWith("xml")) {
- //attrValues.put(attrName, attrVal);
+ if(attrValues[ATTIDX_NONSCHEMA] == null) {
+ // these are usually small
+ attrValues[ATTIDX_NONSCHEMA] = new Vector(4,2);
+ }
+ ((Vector)attrValues[ATTIDX_NONSCHEMA]).addElement(attrName);
+ ((Vector)attrValues[ATTIDX_NONSCHEMA]).addElement(attrVal);
//otherValues.put(attrName, attrVal);
continue;
}
@@ -1126,23 +1132,30 @@
reportSchemaError ("s4s-att-not-allowed", new Object[] {elName, attrName}, element);
}
else {
+ if(attrValues[ATTIDX_NONSCHEMA] == null) {
+ // these are usually small
+ attrValues[ATTIDX_NONSCHEMA] = new Vector(4,2);
+ }
+ ((Vector)attrValues[ATTIDX_NONSCHEMA]).addElement(attrName);
+ ((Vector)attrValues[ATTIDX_NONSCHEMA]).addElement(attrVal);
// for attributes from other namespace
// store them in a list, and TRY to validate them after
// schema traversal (because it's "lax")
//otherValues.put(attrName, attrVal);
- String attrRName = attrURI + "," + attrName;
- Vector values = (Vector)fNonSchemaAttrs.get(attrRName);
- if (values == null) {
- values = new Vector();
- values.addElement(attrName);
- values.addElement(elName);
- values.addElement(attrVal);
- fNonSchemaAttrs.put(attrRName, values);
- }
- else {
- values.addElement(elName);
- values.addElement(attrVal);
- }
+ // REVISIT: actually use this some day...
+ // String attrRName = attrURI + "," + attrName;
+ // Vector values = (Vector)fNonSchemaAttrs.get(attrRName);
+ // if (values == null) {
+ // values = new Vector();
+ // values.addElement(attrName);
+ // values.addElement(elName);
+ // values.addElement(attrVal);
+ // fNonSchemaAttrs.put(attrRName, values);
+ // }
+ // else {
+ // values.addElement(elName);
+ // values.addElement(attrVal);
+ // }
}
continue;
}
@@ -1707,6 +1720,9 @@
// mark this array as returned
attrArray[ATTIDX_ISRETURNED] = Boolean.TRUE;
+ // better clear nonschema vector
+ if(attrArray[ATTIDX_NONSCHEMA] != null)
+ ((Vector)attrArray[ATTIDX_NONSCHEMA]).clear();
// and put it into the pool
fArrayPool[--fPoolPos] = attrArray;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org