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 2004/02/03 18:27:46 UTC
cvs commit: xml-xerces/java/src/org/apache/xerces/impl/xs/traversers XSDAbstractParticleTraverser.java XSDElementTraverser.java XSDGroupTraverser.java XSDHandler.java
sandygao 2004/02/03 09:27:46
Modified: java/src/org/apache/xerces/impl/xs XSConstraints.java
java/src/org/apache/xerces/impl/xs/models CMBuilder.java
java/src/org/apache/xerces/impl/xs/traversers
XSDAbstractParticleTraverser.java
XSDElementTraverser.java XSDGroupTraverser.java
XSDHandler.java
Log:
Fixing a potential NPE.
When there exist empty particles, it's possible for other parts to get NPE when
they try to access such particles. Now all empty particles are removed from
the model group that contains it.
Revision Changes Path
1.37 +2 -2 xml-xerces/java/src/org/apache/xerces/impl/xs/XSConstraints.java
Index: XSConstraints.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/XSConstraints.java,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- XSConstraints.java 3 Feb 2004 17:10:38 -0000 1.36
+++ XSConstraints.java 3 Feb 2004 17:27:45 -0000 1.37
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999-2002 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
1.21 +5 -8 xml-xerces/java/src/org/apache/xerces/impl/xs/models/CMBuilder.java
Index: CMBuilder.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/models/CMBuilder.java,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- CMBuilder.java 18 Jun 2003 13:40:11 -0000 1.20
+++ CMBuilder.java 3 Feb 2004 17:27:45 -0000 1.21
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
+ * Copyright (c) 2001-2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -153,12 +153,9 @@
// the <all> itself is optional
XSAllCM allContent = new XSAllCM(particle.fMinOccurs == 0, group.fParticleCount);
for (int i = 0; i < group.fParticleCount; i++) {
- // for all non-empty particles
- if (group.fParticles[i].fType != XSParticleDecl.PARTICLE_EMPTY &&
- group.fParticles[i].fMaxOccurs != 0)
- // add the element decl to the all content model
- allContent.addElement((XSElementDecl)group.fParticles[i].fValue,
- group.fParticles[i].fMinOccurs == 0);
+ // add the element decl to the all content model
+ allContent.addElement((XSElementDecl)group.fParticles[i].fValue,
+ group.fParticles[i].fMinOccurs == 0);
}
return allContent;
}
1.15 +13 -12 xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDAbstractParticleTraverser.java
Index: XSDAbstractParticleTraverser.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDAbstractParticleTraverser.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- XSDAbstractParticleTraverser.java 23 Jun 2003 16:35:22 -0000 1.14
+++ XSDAbstractParticleTraverser.java 3 Feb 2004 17:27:45 -0000 1.15
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
+ * Copyright (c) 2001-2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -65,6 +65,7 @@
import org.apache.xerces.impl.xs.XSComplexTypeDecl;
import org.apache.xerces.util.DOMUtil;
import org.apache.xerces.impl.xs.util.XInt;
+import org.apache.xerces.xs.XSObject;
import org.w3c.dom.Element;
/**
@@ -94,7 +95,7 @@
XSDocumentInfo schemaDoc,
SchemaGrammar grammar,
int allContextFlags,
- XSComplexTypeDecl enclosingCT) {
+ XSObject parent) {
// General Attribute Checking
@@ -121,7 +122,7 @@
// Only elements are allowed in <all>
if (childName.equals(SchemaSymbols.ELT_ELEMENT)) {
- particle = fSchemaHandler.fElementTraverser.traverseLocal(child, schemaDoc, grammar, PROCESSING_ALL_EL, enclosingCT);
+ particle = fSchemaHandler.fElementTraverser.traverseLocal(child, schemaDoc, grammar, PROCESSING_ALL_EL, parent);
}
else {
Object[] args = {"all", "(annotation?, element*)", DOMUtil.getLocalName(child)};
@@ -177,9 +178,9 @@
XSDocumentInfo schemaDoc,
SchemaGrammar grammar,
int allContextFlags,
- XSComplexTypeDecl enclosingCT) {
+ XSObject parent) {
- return traverseSeqChoice(seqDecl, schemaDoc, grammar, allContextFlags, false, enclosingCT);
+ return traverseSeqChoice(seqDecl, schemaDoc, grammar, allContextFlags, false, parent);
}
/**
@@ -201,9 +202,9 @@
XSDocumentInfo schemaDoc,
SchemaGrammar grammar,
int allContextFlags,
- XSComplexTypeDecl enclosingCT) {
+ XSObject parent) {
- return traverseSeqChoice (choiceDecl, schemaDoc, grammar, allContextFlags, true, enclosingCT);
+ return traverseSeqChoice (choiceDecl, schemaDoc, grammar, allContextFlags, true, parent);
}
/**
@@ -220,7 +221,7 @@
SchemaGrammar grammar,
int allContextFlags,
boolean choice,
- XSComplexTypeDecl enclosingCT) {
+ XSObject parent) {
// General Attribute Checking
Object[] attrValues = fAttrChecker.checkAttributes(decl, false, schemaDoc);
@@ -245,7 +246,7 @@
childName = DOMUtil.getLocalName(child);
if (childName.equals(SchemaSymbols.ELT_ELEMENT)) {
- particle = fSchemaHandler.fElementTraverser.traverseLocal(child, schemaDoc, grammar, NOT_ALL_CONTEXT, enclosingCT);
+ particle = fSchemaHandler.fElementTraverser.traverseLocal(child, schemaDoc, grammar, NOT_ALL_CONTEXT, parent);
}
else if (childName.equals(SchemaSymbols.ELT_GROUP)) {
particle = fSchemaHandler.fGroupTraverser.traverseLocal(child, schemaDoc, grammar);
@@ -261,10 +262,10 @@
}
else if (childName.equals(SchemaSymbols.ELT_CHOICE)) {
- particle = traverseChoice(child, schemaDoc, grammar, NOT_ALL_CONTEXT, enclosingCT);
+ particle = traverseChoice(child, schemaDoc, grammar, NOT_ALL_CONTEXT, parent);
}
else if (childName.equals(SchemaSymbols.ELT_SEQUENCE)) {
- particle = traverseSequence(child, schemaDoc, grammar, NOT_ALL_CONTEXT, enclosingCT);
+ particle = traverseSequence(child, schemaDoc, grammar, NOT_ALL_CONTEXT, parent);
}
else if (childName.equals(SchemaSymbols.ELT_ANY)) {
particle = fSchemaHandler.fWildCardTraverser.traverseAny(child, schemaDoc, grammar);
1.29 +14 -11 xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDElementTraverser.java
Index: XSDElementTraverser.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDElementTraverser.java,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- XSDElementTraverser.java 11 Nov 2003 20:15:00 -0000 1.28
+++ XSDElementTraverser.java 3 Feb 2004 17:27:45 -0000 1.29
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
+ * Copyright (c) 2001-2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -67,6 +67,7 @@
import org.apache.xerces.impl.xs.XSElementDecl;
import org.apache.xerces.impl.xs.XSParticleDecl;
import org.apache.xerces.xs.XSConstants;
+import org.apache.xerces.xs.XSObject;
import org.apache.xerces.xs.XSTypeDefinition;
import org.apache.xerces.impl.xs.util.XInt;
import org.apache.xerces.util.DOMUtil;
@@ -103,7 +104,6 @@
class XSDElementTraverser extends XSDAbstractTraverser {
protected final XSElementDecl fTempElementDecl = new XSElementDecl();
- protected final XSParticleDecl fTempParticleDecl = new XSParticleDecl();
// this controls what happens when a local element is encountered.
// We may not encounter all local elements when first parsing.
@@ -131,7 +131,7 @@
XSDocumentInfo schemaDoc,
SchemaGrammar grammar,
int allContextFlags,
- XSComplexTypeDecl enclosingCT) {
+ XSObject parent) {
XSParticleDecl particle = null;
if (fSchemaHandler.fDeclPool !=null) {
@@ -155,9 +155,12 @@
catch (NumberFormatException ex) {
}
}
- fSchemaHandler.fillInLocalElemInfo(elmDecl, schemaDoc, allContextFlags, enclosingCT, particle);
+ fSchemaHandler.fillInLocalElemInfo(elmDecl, schemaDoc, allContextFlags, parent, particle);
} else {
- traverseLocal(particle, elmDecl, schemaDoc, grammar, allContextFlags, enclosingCT);
+ traverseLocal(particle, elmDecl, schemaDoc, grammar, allContextFlags, parent);
+ // If it's an empty particle, return null.
+ if (particle.fType == XSParticleDecl.PARTICLE_EMPTY)
+ particle = null;
}
return particle;
@@ -176,7 +179,7 @@
XSDocumentInfo schemaDoc,
SchemaGrammar grammar,
int allContextFlags,
- XSComplexTypeDecl enclosingCT) {
+ XSObject parent) {
// General Attribute Checking
Object[] attrValues = fAttrChecker.checkAttributes(elmDecl, false, schemaDoc);
@@ -208,7 +211,7 @@
element = null;
}
} else {
- element = traverseNamedElement(elmDecl, attrValues, schemaDoc, grammar, false, enclosingCT);
+ element = traverseNamedElement(elmDecl, attrValues, schemaDoc, grammar, false, parent);
}
particle.fMinOccurs = minAtt.intValue();
@@ -263,7 +266,7 @@
XSDocumentInfo schemaDoc,
SchemaGrammar grammar,
boolean isGlobal,
- XSComplexTypeDecl enclosingCT) {
+ XSObject parent) {
Boolean abstractAtt = (Boolean) attrValues[XSAttributeChecker.ATTIDX_ABSTRACT];
XInt blockAtt = (XInt) attrValues[XSAttributeChecker.ATTIDX_BLOCK];
@@ -294,8 +297,8 @@
element.setIsGlobal();
}
else {
- if (enclosingCT != null)
- element.setIsLocal(enclosingCT);
+ if (parent instanceof XSComplexTypeDecl)
+ element.setIsLocal((XSComplexTypeDecl)parent);
if (formAtt != null) {
if (formAtt.intValue() == SchemaSymbols.FORM_QUALIFIED)
1.19 +17 -10 xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDGroupTraverser.java
Index: XSDGroupTraverser.java
===================================================================
RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/traversers/XSDGroupTraverser.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- XSDGroupTraverser.java 23 Jun 2003 16:35:22 -0000 1.18
+++ XSDGroupTraverser.java 3 Feb 2004 17:27:45 -0000 1.19
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
+ * Copyright (c) 2001-2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -169,10 +169,14 @@
Element l_elmChild = DOMUtil.getFirstChildElement(elmNode);
XSAnnotationImpl annotation = null;
if (l_elmChild == null) {
- reportSchemaError("s4s-elt-must-match.2",
+ reportSchemaError("s4s-elt-must-match.2",
new Object[]{"group (global)", "(annotation?, (all | choice | sequence))"},
elmNode);
} else {
+ // Create the group defi up-front, so it can be passed
+ // to the traversal methods
+ group = new XSGroupDecl();
+
String childName = l_elmChild.getLocalName();
if (childName.equals(SchemaSymbols.ELT_ANNOTATION)) {
annotation = traverseAnnotationDecl(l_elmChild, attrValues, true, schemaDoc);
@@ -182,24 +186,24 @@
}
if (l_elmChild == null) {
- reportSchemaError("s4s-elt-must-match.2",
+ reportSchemaError("s4s-elt-must-match.2",
new Object[]{"group (global)", "(annotation?, (all | choice | sequence))"},
elmNode);
} else if (childName.equals(SchemaSymbols.ELT_ALL)) {
- particle = traverseAll(l_elmChild, schemaDoc, grammar, CHILD_OF_GROUP, null);
+ particle = traverseAll(l_elmChild, schemaDoc, grammar, CHILD_OF_GROUP, group);
} else if (childName.equals(SchemaSymbols.ELT_CHOICE)) {
- particle = traverseChoice(l_elmChild, schemaDoc, grammar, CHILD_OF_GROUP, null);
+ particle = traverseChoice(l_elmChild, schemaDoc, grammar, CHILD_OF_GROUP, group);
} else if (childName.equals(SchemaSymbols.ELT_SEQUENCE)) {
- particle = traverseSequence(l_elmChild, schemaDoc, grammar, CHILD_OF_GROUP, null);
+ particle = traverseSequence(l_elmChild, schemaDoc, grammar, CHILD_OF_GROUP, group);
} else {
- reportSchemaError("s4s-elt-must-match.1",
+ reportSchemaError("s4s-elt-must-match.1",
new Object[]{"group (global)", "(annotation?, (all | choice | sequence))", DOMUtil.getLocalName(l_elmChild)},
l_elmChild);
}
if (l_elmChild != null &&
DOMUtil.getNextSiblingElement(l_elmChild) != null) {
- reportSchemaError("s4s-elt-must-match.1",
+ reportSchemaError("s4s-elt-must-match.1",
new Object[]{"group (global)", "(annotation?, (all | choice | sequence))",
DOMUtil.getLocalName(DOMUtil.getNextSiblingElement(l_elmChild))},
DOMUtil.getNextSiblingElement(l_elmChild));
@@ -207,13 +211,16 @@
// add global group declaration to the grammar
if (strNameAttr != null) {
- group = new XSGroupDecl();
group.fName = strNameAttr;
group.fTargetNamespace = schemaDoc.fTargetNamespace;
if (particle != null)
group.fModelGroup = (XSModelGroupImpl)particle.fValue;
group.fAnnotation = annotation;
grammar.addGlobalGroupDecl(group);
+ }
+ else {
+ // name attribute is not there, don't return this group.
+ group = null;
}
}
if(group != null) {
1.75 +39 -9 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.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- XSDHandler.java 21 Jan 2004 23:08:33 -0000 1.74
+++ XSDHandler.java 3 Feb 2004 17:27:45 -0000 1.75
@@ -2,7 +2,7 @@
* The Apache Software License, Version 1.1
*
*
- * Copyright (c) 1999-2003 The Apache Software Foundation. All rights
+ * Copyright (c) 1999-2004 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -75,7 +75,9 @@
import org.apache.xerces.impl.xs.XSDeclarationPool;
import org.apache.xerces.impl.xs.XSElementDecl;
import org.apache.xerces.impl.xs.XSGrammarBucket;
+import org.apache.xerces.impl.xs.XSGroupDecl;
import org.apache.xerces.impl.xs.XSMessageFormatter;
+import org.apache.xerces.impl.xs.XSModelGroupImpl;
import org.apache.xerces.impl.xs.XSParticleDecl;
import org.apache.xerces.impl.xs.opti.ElementImpl;
import org.apache.xerces.impl.xs.opti.SchemaParsingConfig;
@@ -90,6 +92,7 @@
import org.apache.xerces.xni.parser.XMLEntityResolver;
import org.apache.xerces.xni.parser.XMLErrorHandler;
import org.apache.xerces.xni.parser.XMLInputSource;
+import org.apache.xerces.xs.XSObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -311,7 +314,7 @@
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 XSComplexTypeDecl[] fEnclosingCT = new XSComplexTypeDecl[INIT_STACK_SIZE];
+ private XSObject[] fParent = new XSObject[INIT_STACK_SIZE];
private String [][] fLocalElemNamespaceContext = new String [INIT_STACK_SIZE][1];
// these data members are needed for the deferred traversal
@@ -1675,8 +1678,35 @@
Element currElem = fLocalElementDecl[i];
XSDocumentInfo currSchema = (XSDocumentInfo)fDoc2XSDocumentMap.get(DOMUtil.getDocument(currElem));
SchemaGrammar currGrammar = fGrammarBucket.getGrammar(currSchema.fTargetNamespace);
- fElementTraverser.traverseLocal (fParticle[i], currElem, currSchema, currGrammar, fAllContext[i], fEnclosingCT[i]);
+ fElementTraverser.traverseLocal (fParticle[i], currElem, currSchema, currGrammar, fAllContext[i], fParent[i]);
+ // If it's an empty particle, remove it from the containing component.
+ if (fParticle[i].fType == XSParticleDecl.PARTICLE_EMPTY) {
+ XSModelGroupImpl group;
+ if (fParent[i] instanceof XSComplexTypeDecl)
+ group = (XSModelGroupImpl)((XSComplexTypeDecl)fParent[i]).getParticle().getTerm();
+ else
+ group = ((XSGroupDecl)fParent[i]).fModelGroup;
+ removeParticle(group, fParticle[i]);
+ }
+ }
+ }
+
+ private boolean removeParticle(XSModelGroupImpl group, XSParticleDecl particle) {
+ XSParticleDecl member;
+ for (int i = 0; i < group.fParticleCount; i++) {
+ member = group.fParticles[i];
+ if (member == particle) {
+ for (int j = i; j < group.fParticleCount-1; j++)
+ group.fParticles[j] = group.fParticles[j+1];
+ group.fParticleCount--;
+ return true;
+ }
+ if (member.fType == XSParticleDecl.PARTICLE_MODELGROUP) {
+ if (removeParticle((XSModelGroupImpl)member.fValue, particle))
+ return true;
+ }
}
+ return false;
}
// the purpose of this method is to keep up-to-date structures
@@ -1684,7 +1714,7 @@
void fillInLocalElemInfo(Element elmDecl,
XSDocumentInfo schemaDoc,
int allContextFlags,
- XSComplexTypeDecl enclosingCT,
+ XSObject parent,
XSParticleDecl particle) {
// if the stack is full, increase the size
@@ -1699,9 +1729,9 @@
int[] newStackI = new int[fLocalElemStackPos+INC_STACK_SIZE];
System.arraycopy(fAllContext, 0, newStackI, 0, fLocalElemStackPos);
fAllContext = newStackI;
- XSComplexTypeDecl[] newStackC = new XSComplexTypeDecl[fLocalElemStackPos+INC_STACK_SIZE];
- System.arraycopy(fEnclosingCT, 0, newStackC, 0, fLocalElemStackPos);
- fEnclosingCT = newStackC;
+ XSObject[] newStackC = new XSObject[fLocalElemStackPos+INC_STACK_SIZE];
+ System.arraycopy(fParent, 0, newStackC, 0, fLocalElemStackPos);
+ fParent = newStackC;
String [][] newStackN = new String [fLocalElemStackPos+INC_STACK_SIZE][];
System.arraycopy(fLocalElemNamespaceContext, 0, newStackN, 0, fLocalElemStackPos);
fLocalElemNamespaceContext = newStackN;
@@ -1710,7 +1740,7 @@
fParticle[fLocalElemStackPos] = particle;
fLocalElementDecl[fLocalElemStackPos] = elmDecl;
fAllContext[fLocalElemStackPos] = allContextFlags;
- fEnclosingCT[fLocalElemStackPos] = enclosingCT;
+ fParent[fLocalElemStackPos] = parent;
fLocalElemNamespaceContext[fLocalElemStackPos++] = schemaDoc.fNamespaceSupport.getEffectiveLocalContext();
} // end fillInLocalElemInfo(...)
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org