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 2001/10/06 00:28:17 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl/v2/xpath XPath.java
neilg 01/10/05 15:28:17
Modified: java/src/org/apache/xerces/impl/v2 XSDHandler.java
XSDElementTraverser.java
SchemaNamespaceSupport.java
java/src/org/apache/xerces/impl/v2/xpath XPath.java
Log:
fixed some bugs; generally prepared the way for dropping in the changes to the validator to accomodate Identity Constraints.
Revision Changes Path
1.37 +72 -4 xml-xerces/java/src/org/apache/xerces/impl/v2/XSDHandler.java
Index: XSDHandler.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDHandler.java,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- XSDHandler.java 2001/10/04 14:19:19 1.36
+++ XSDHandler.java 2001/10/05 22:28:16 1.37
@@ -97,7 +97,7 @@
* schema, other grammars may be constructed as a side-effect.
*
* @author Neil Graham, IBM
- * @version $Id: XSDHandler.java,v 1.36 2001/10/04 14:19:19 neilg Exp $
+ * @version $Id: XSDHandler.java,v 1.37 2001/10/05 22:28:16 neilg Exp $
*/
class XSDHandler {
@@ -230,6 +230,20 @@
private int[] fAllContext;
private String [][] fLocalElemNamespaceContext;
+ // these data members are needed for the deferred traversal
+ // of keyrefs.
+
+ // the initial size of the array to store deferred keyrefs
+ private static final int INIT_KEYREF_STACK = 2;
+ // 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 Element [] fKeyrefs;
+ private XSElementDecl [] fKeyrefElems;
+ private String [][] fKeyrefNamespaceContext;
+
// Constructors
// it should be possible to use the same XSDHandler to parse
@@ -287,7 +301,7 @@
traverseLocalElements();
// fifth phase: handle Keyrefs
-// resolveKeyRefs();
+ resolveKeyRefs();
// sixth phase: handle derivation constraint checking
// and UPA, and validate attribute of non-schema namespaces
@@ -318,6 +332,7 @@
if(currSchemaInfo.fTargetNamespace == null) {
currSchemaInfo.fTargetNamespace = callerTNS;
} else if(callerTNS != currSchemaInfo.fTargetNamespace) {
+ System.err.println(callerTNS + " and " + currSchemaInfo.fTargetNamespace);
fElementTraverser.reportSchemaError("src-include.2", new Object [] {callerTNS, currSchemaInfo.fTargetNamespace});
}
}
@@ -767,8 +782,51 @@
// from the elementTraverser class (which must ignore keyrefs),
// but there seems to be no efficient way around this...
protected void resolveKeyRefs() {
+ for (int i=0; i<fKeyrefStackPos; i++) {
+ Document keyrefDoc = DOMUtil.getDocument(fKeyrefs[i]);
+ XSDocumentInfo keyrefSchemaDoc = (XSDocumentInfo)fDoc2XSDocumentMap.get(keyrefDoc);
+ keyrefSchemaDoc.fNamespaceSupport.makeGlobal();
+ keyrefSchemaDoc.fNamespaceSupport.setEffectiveContext( fKeyrefNamespaceContext[i] );
+ SchemaGrammar keyrefGrammar = fGrammarResolver.getGrammar(keyrefSchemaDoc.fTargetNamespace);
+ fKeyrefTraverser.traverse(fKeyrefs[i], fKeyrefElems[i], keyrefSchemaDoc, keyrefGrammar);
+ }
} // end resolveKeyRefs
+ // an accessor method. Just makes sure callers
+ // who want the Identity constraint registry vaguely know what they're about.
+ protected Hashtable getIDRegistry() {
+ return fUnparsedIdentityConstraintRegistry;
+ }
+
+ // This method squirrels away <keyref> declarations--along with the element
+ // decls and namespace bindings they might find handy.
+ protected void storeKeyRef (Element keyrefToStore, XSDocumentInfo schemaDoc,
+ XSElementDecl currElemDecl) {
+ String keyrefName = DOMUtil.getAttrValue(keyrefToStore, SchemaSymbols.ATT_NAME);
+ if(keyrefName.length() != 0) {
+ String keyrefQName = schemaDoc.fTargetNamespace == null?
+ "," + keyrefName: schemaDoc.fTargetNamespace+","+keyrefName;
+ checkForDuplicateNames(keyrefQName, fUnparsedIdentityConstraintRegistry, keyrefToStore, schemaDoc);
+ }
+ // now set up all the registries we'll need...
+
+ // check array sizes
+ if(fKeyrefStackPos == fKeyrefs.length) {
+ Element [] elemArray = new Element [fKeyrefStackPos + INC_KEYREF_STACK_AMOUNT];
+ System.arraycopy(fKeyrefs, 0, elemArray, 0, fKeyrefStackPos);
+ fKeyrefs = elemArray;
+ XSElementDecl [] declArray = new XSElementDecl [fKeyrefStackPos + INC_KEYREF_STACK_AMOUNT];
+ System.arraycopy(fKeyrefElems, 0, declArray, 0, fKeyrefStackPos);
+ fKeyrefElems = declArray;
+ String[][] stringArray = new String [fKeyrefStackPos + INC_KEYREF_STACK_AMOUNT][];
+ System.arraycopy(fKeyrefNamespaceContext, 0, stringArray, 0, fKeyrefStackPos);
+ fKeyrefNamespaceContext = stringArray;
+ }
+ fKeyrefs[fKeyrefStackPos] = keyrefToStore;
+ fKeyrefElems[fKeyrefStackPos] = currElemDecl;
+ fKeyrefNamespaceContext[fKeyrefStackPos++] = schemaDoc.fNamespaceSupport.getEffectiveLocalContext();
+ } // storeKeyref (Element, XSDocumentInfo, XSElementDecl): void
+
// This method is responsible for schema resolution. If it finds
// a schema document that the XMLEntityResolver resolves to with
// the given namespace and hint, it returns it. It returns true
@@ -873,6 +931,12 @@
// err on the small side for num. of local namespaces declared...
fLocalElemNamespaceContext = new String [INIT_STACK_SIZE][1];
+ // and do same for keyrefs.
+ 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(fErrorReporter, fSymbolTable);
fAttributeGroupTraverser.reset(fErrorReporter, fSymbolTable);
@@ -939,10 +1003,12 @@
* right schema. It then renames the component correctly. If it
* detects a collision--a duplicate definition--then it complains.
*/
- private void checkForDuplicateNames(String qName,
+ void checkForDuplicateNames(String qName,
Hashtable registry, Element currComp,
XSDocumentInfo currSchema) {
Object objElem = null;
+ // REVISIT: when we add derivation checking, we'll have to make
+ // sure that ID constraint collisions don't necessarily result in error messages.
if((objElem = registry.get(qName)) == null) {
// just add it in!
registry.put(qName, currComp);
@@ -1224,7 +1290,9 @@
public static void main (String args[]) throws Exception {
DefaultHandler handler = new DefaultHandler();
XSDHandler me = new XSDHandler(new XSGrammarResolver());
- me.reset(new XMLErrorReporter(), new EntityResolverWrapper(new org.apache.xerces.impl.v2.XSDHandler.DummyResolver()), new SymbolTable());
+ XMLErrorReporter rep = new XMLErrorReporter();
+ rep.putMessageFormatter(XSMessageFormatter.SCHEMA_DOMAIN, new XSMessageFormatter());
+ me.reset(rep, new EntityResolverWrapper(new org.apache.xerces.impl.v2.XSDHandler.DummyResolver()), new SymbolTable());
me.parseSchema(args[0], args[1]);
Enumeration types = me.fUnparsedTypeRegistry.keys();
String name = null;
1.21 +17 -25 xml-xerces/java/src/org/apache/xerces/impl/v2/XSDElementTraverser.java
Index: XSDElementTraverser.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/XSDElementTraverser.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- XSDElementTraverser.java 2001/10/03 18:10:54 1.20
+++ XSDElementTraverser.java 2001/10/05 22:28:17 1.21
@@ -89,7 +89,7 @@
*
* @author Sandy Gao, IBM
*
- * @version $Id: XSDElementTraverser.java,v 1.20 2001/10/03 18:10:54 elena Exp $
+ * @version $Id: XSDElementTraverser.java,v 1.21 2001/10/05 22:28:17 neilg Exp $
*/
class XSDElementTraverser extends XSDAbstractTraverser {
@@ -335,42 +335,34 @@
element.fType = elementType;
- // get 'identity constaint'
+ // get 'identity constraint'
// see if there's something here; it had better be key, keyref or unique.
if (child != null) {
- String childName = DOMUtil.getLocalName(child);
+ String childName = fSymbolTable.addSymbol(DOMUtil.getLocalName(child));
while (child != null &&
(childName.equals(SchemaSymbols.ELT_KEY) ||
childName.equals(SchemaSymbols.ELT_KEYREF) ||
childName.equals(SchemaSymbols.ELT_UNIQUE))) {
+ if(childName == SchemaSymbols.ELT_KEY ||
+ childName == SchemaSymbols.ELT_UNIQUE) {
+ fSchemaHandler.fUniqueOrKeyTraverser.traverse(child, element, schemaDoc, grammar);
+ if(DOMUtil.getAttrValue(child, SchemaSymbols.ATT_NAME).length() != 0 ) {
+ fSchemaHandler.checkForDuplicateNames(
+ (schemaDoc.fTargetNamespace == null) ? ","+DOMUtil.getAttrValue(child, SchemaSymbols.ATT_NAME)
+ : schemaDoc.fTargetNamespace+","+ DOMUtil.getAttrValue(child, SchemaSymbols.ATT_NAME),
+ fSchemaHandler.getIDRegistry(),
+ child, schemaDoc);
+ }
+ } else if (childName == SchemaSymbols.ELT_KEYREF) {
+ fSchemaHandler.storeKeyRef(child, schemaDoc, element);
+ }
child = DOMUtil.getNextSiblingElement(child);
if (child != null) {
- childName = DOMUtil.getLocalName(child);
+ childName = fSymbolTable.addSymbol(DOMUtil.getLocalName(child));
}
}
}
-
- //
- // REVISIT: key/keyref/unique processing
- //
-
- /*Element ic = XUtil.getFirstChildElementNS(elementDecl, IDENTITY_CONSTRAINTS);
- if (ic != null) {
- XInt elementIndexObj = XIntPool.getXInt(elementIndex);
- Vector identityConstraints = (Vector)fIdentityConstraints.get(elementIndexObj);
- if (identityConstraints == null) {
- identityConstraints = new Vector();
- fIdentityConstraints.put(elementIndexObj, identityConstraints);
- }
- while (ic != null) {
- if (DEBUG_IC_DATATYPES) {
- System.out.println("<ICD>: adding ic for later traversal: "+ic);
- }
- identityConstraints.addElement(ic);
- ic = XUtil.getNextSiblingElementNS(ic, IDENTITY_CONSTRAINTS);
- }
- }*/
// Step 2: register the element decl to the grammar
if (nameAtt != null)
1.3 +2 -1 xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaNamespaceSupport.java
Index: SchemaNamespaceSupport.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/SchemaNamespaceSupport.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- SchemaNamespaceSupport.java 2001/10/02 21:42:57 1.2
+++ SchemaNamespaceSupport.java 2001/10/05 22:28:17 1.3
@@ -66,7 +66,7 @@
*
* @author Neil Graham, IBM
*
- * @version $Id: SchemaNamespaceSupport.java,v 1.2 2001/10/02 21:42:57 neilg Exp $
+ * @version $Id: SchemaNamespaceSupport.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
*/
public class SchemaNamespaceSupport
extends NamespaceSupport {
@@ -91,6 +91,7 @@
* being imported had better be using the same SymbolTable.
*/
void setEffectiveContext (String [] namespaceDecls) {
+ if(namespaceDecls == null || namespaceDecls.length == 0) return;
if(fCurrentContext == fContext.length) {
// expand size of fContext
int[] newContext = new int[fContext.length*2];
1.3 +5 -5 xml-xerces/java/src/org/apache/xerces/impl/v2/xpath/XPath.java
Index: XPath.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/v2/xpath/XPath.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- XPath.java 2001/09/21 16:22:30 1.2
+++ XPath.java 2001/10/05 22:28:17 1.3
@@ -66,7 +66,7 @@
* Bare minimum XPath parser.
*
* @author Andy Clark, IBM
- * @version $Id: XPath.java,v 1.2 2001/09/21 16:22:30 sandygao Exp $
+ * @version $Id: XPath.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
*/
public class XPath {
@@ -780,7 +780,7 @@
* @author Glenn Marcy, IBM
* @author Andy Clark, IBM
*
- * @version $Id: XPath.java,v 1.2 2001/09/21 16:22:30 sandygao Exp $
+ * @version $Id: XPath.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
*/
private static final class Tokens {
@@ -1262,7 +1262,7 @@
* @author Glenn Marcy, IBM
* @author Andy Clark, IBM
*
- * @version $Id: XPath.java,v 1.2 2001/09/21 16:22:30 sandygao Exp $
+ * @version $Id: XPath.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
*/
private static class Scanner {
@@ -1828,7 +1828,7 @@
nameHandle = symbolTable.addSymbol(data.substring(nameOffset, currentOffset));
boolean isNameTestNCName = false;
boolean isAxisName = false;
- prefixHandle = null;
+ prefixHandle = "";
if (ch == ':') {
if (++currentOffset == endOffset) {
// System.out.println("abort 5");
@@ -2230,7 +2230,7 @@
* @author Glenn Marcy, IBM
* @author Andy Clark, IBM
*
- * @version $Id: XPath.java,v 1.2 2001/09/21 16:22:30 sandygao Exp $
+ * @version $Id: XPath.java,v 1.3 2001/10/05 22:28:17 neilg Exp $
*/
/***
public static class XPathExprParser {
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org