You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by sa...@apache.org on 2002/03/01 01:41:27 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl/xs/traversers XSDHandler.java
sandygao 02/02/28 16:41:27
Modified: java/src/org/apache/xerces/impl/xs/traversers
XSDHandler.java
Log:
Fixing bug [6766]: we didn't reset the schema handler (traversers) between parsing schema documents.
Revision Changes Path
1.30 +56 -45 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.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- XSDHandler.java 27 Feb 2002 17:47:35 -0000 1.29
+++ XSDHandler.java 1 Mar 2002 00:41:27 -0000 1.30
@@ -117,7 +117,7 @@
*
* @author Neil Graham, IBM
* @author Pavani Mukthipudi, Sun Microsystems
- * @version $Id: XSDHandler.java,v 1.29 2002/02/27 17:47:35 neeraj Exp $
+ * @version $Id: XSDHandler.java,v 1.30 2002/03/01 00:41:27 sandygao Exp $
*/
public class XSDHandler {
@@ -325,12 +325,12 @@
// the incremental size of the array to store deferred local elements
private static final int INC_STACK_SIZE = 10;
// current position of the array (# of deferred local elements)
- private int fLocalElemStackPos;
+ private int fLocalElemStackPos = 0;
- private XSParticleDecl[] fParticle;
- private Element[] fLocalElementDecl;
- private int[] fAllContext;
- private String [][] fLocalElemNamespaceContext;
+ private XSParticleDecl[] fParticle = new XSParticleDecl[INIT_STACK_SIZE];
+ private Element[] fLocalElementDecl = new Element[INIT_STACK_SIZE];
+ private int[] fAllContext = new int[INIT_STACK_SIZE];
+ private String [][] fLocalElemNamespaceContext = new String [INIT_STACK_SIZE][1];
// these data members are needed for the deferred traversal
// of keyrefs.
@@ -340,11 +340,11 @@
// the incremental size of the array to store deferred keyrefs
private static final int INC_KEYREF_STACK_AMOUNT = 2;
// current position of the array (# of deferred keyrefs)
- private int fKeyrefStackPos;
+ private int fKeyrefStackPos = 0;
- private Element [] fKeyrefs;
- private XSElementDecl [] fKeyrefElems;
- private String [][] fKeyrefNamespaceContext;
+ private Element [] fKeyrefs = new Element[INIT_KEYREF_STACK];
+ private XSElementDecl [] fKeyrefElems = new XSElementDecl [INIT_KEYREF_STACK];
+ private String [][] fKeyrefNamespaceContext = new String[INIT_KEYREF_STACK][1];
// Constructors
@@ -383,6 +383,10 @@
public SchemaGrammar parseSchema(String schemaNamespace,
XMLInputSource is, short referType) {
+
+ // before parsing a schema, need to reset all traversers and
+ // clear all registries
+ prepare();
// first phase: construct trees.
Document schemaRoot = getSchema(schemaNamespace, is,
@@ -424,7 +428,7 @@
// may wish to have setter methods for ErrorHandler,
// EntityResolver...
- private static String[][] NS_ERROR_CODES = {
+ private static final String[][] NS_ERROR_CODES = {
{"src-include.2.1", "src-include.2.1"},
{"src-redefine.3.1", "src-redefine.3.1"},
{"src-import.3.1", "src-import.3.2"},
@@ -435,7 +439,7 @@
{"TargetNamespace.1", "TargetNamespace.2"}
};
- private static String[] ELE_ERROR_CODES = {
+ private static final String[] ELE_ERROR_CODES = {
"src-include.1", "src-redefine.2", "src-import.2", "schema_reference.4",
"schema_reference.4", "schema_reference.4", "schema_reference.4", "schema_reference.4"
};
@@ -1201,7 +1205,7 @@
fKeyrefNamespaceContext[fKeyrefStackPos++] = schemaDoc.fNamespaceSupport.getEffectiveLocalContext();
} // storeKeyref (Element, XSDocumentInfo, XSElementDecl): void
- private static String[] DOC_ERROR_CODES = {
+ private static final String[] DOC_ERROR_CODES = {
"src-include.0", "src-redefine.0", "src-import.0", "schema_reference.4",
"schema_reference.4", "schema_reference.4", "schema_reference.4", "schema_reference.4"
};
@@ -1319,30 +1323,9 @@
fWildCardTraverser = new XSDWildcardTraverser(this, fAttributeChecker);
} // createTraversers()
- // this method clears all the global structs of this object
- // (except those passed in via the constructor).
- public void reset(XMLErrorReporter errorReporter,
- XMLEntityResolver entityResolver,
- SymbolTable symbolTable,
- String externalSchemaLocation,
- String externalNoNSSchemaLocation,
- Object jaxpSchemaSource, XMLGrammarPool grammarPool) {
-
- fErrorReporter = errorReporter;
- fSymbolTable = symbolTable;
- fGrammarPool = grammarPool;
- fSchemaGrammarDescription.reset();
-
- EMPTY_STRING = fSymbolTable.addSymbol(SchemaSymbols.EMPTY_STRING);
-
- fLocationResolver.reset(entityResolver, externalSchemaLocation, externalNoNSSchemaLocation);
-
- try {
- fSchemaParser.setProperty(ERROR_HANDLER, fErrorReporter.getErrorHandler());
- }
- catch (Exception e) {
- }
-
+ // before parsing a schema, need to reset all traversers and
+ // clear all registries
+ void prepare() {
fUnparsedAttributeRegistry.clear();
fUnparsedAttributeGroupRegistry.clear();
fUnparsedElementRegistry.clear();
@@ -1361,18 +1344,21 @@
fRoot = null;
fLastSchemaWasDuplicate = false;
+ // clear local element stack
+ for (int i = 0; i < fLocalElemStackPos; i++) {
+ fParticle[i] = null;
+ fLocalElementDecl[i] = null;
+ fLocalElemNamespaceContext[i] = null;
+ }
fLocalElemStackPos = 0;
- fParticle = new XSParticleDecl[INIT_STACK_SIZE];
- fLocalElementDecl = new Element[INIT_STACK_SIZE];
- fAllContext = new int[INIT_STACK_SIZE];
- // err on the small side for num. of local namespaces declared...
- fLocalElemNamespaceContext = new String [INIT_STACK_SIZE][1];
// and do same for keyrefs.
+ for (int i = 0; i < fKeyrefStackPos; i++) {
+ fKeyrefs[i] = null;
+ fKeyrefElems[i] = null;
+ fKeyrefNamespaceContext[i] = null;
+ }
fKeyrefStackPos = 0;
- fKeyrefs = new Element[INIT_KEYREF_STACK];
- fKeyrefElems = new XSElementDecl [INIT_KEYREF_STACK];
- fKeyrefNamespaceContext = new String[INIT_KEYREF_STACK][1];
// reset traversers
fAttributeChecker.reset(fSymbolTable);
@@ -1389,6 +1375,31 @@
fRedefinedRestrictedAttributeGroupRegistry.clear();
fRedefinedRestrictedGroupRegistry.clear();
+ }
+
+ // this method reset properties that might change between parses.
+ // and process the jaxp schemaSource property
+ public void reset(XMLErrorReporter errorReporter,
+ XMLEntityResolver entityResolver,
+ SymbolTable symbolTable,
+ String externalSchemaLocation,
+ String externalNoNSSchemaLocation,
+ Object jaxpSchemaSource, XMLGrammarPool grammarPool) {
+
+ fErrorReporter = errorReporter;
+ fSymbolTable = symbolTable;
+ fGrammarPool = grammarPool;
+ fSchemaGrammarDescription.reset();
+
+ EMPTY_STRING = fSymbolTable.addSymbol(SchemaSymbols.EMPTY_STRING);
+
+ fLocationResolver.reset(entityResolver, externalSchemaLocation, externalNoNSSchemaLocation);
+
+ try {
+ fSchemaParser.setProperty(ERROR_HANDLER, fErrorReporter.getErrorHandler());
+ }
+ catch (Exception e) {
+ }
processJAXPSchemaSource(jaxpSchemaSource, entityResolver);
} // reset(ErrorReporter, EntityResolver, SymbolTable)
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org