sandygao 2002/11/08 07:55:31
Modified: java/src/org/apache/xerces/impl/xs/models CMBuilder.java
XSAllCM.java
Log:
According to an errata (E1-2), <all minOccurs="0"> is allowed.
Revision Changes Path
1.14 +4 -5
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.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- CMBuilder.java 26 Jul 2002 18:59:18 -0000 1.13
+++ CMBuilder.java 8 Nov 2002 15:55:31 -0000 1.14
@@ -146,12 +146,11 @@
if (particle.fMaxOccurs == 0)
return null;
- // create an all content model. the parameter indicates whether
- // the <all> itself is optional
- XSAllCM allContent = new XSAllCM(particle.fMinOccurs == 0);
-
// get the model group, and add all children of it to the content model
XSModelGroupImpl group = (XSModelGroupImpl)particle.fValue;
+ // create an all content model. the parameter indicates whether
+ // 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 &&
1.7 +15 -40
xml-xerces/java/src/org/apache/xerces/impl/xs/models/XSAllCM.java
Index: XSAllCM.java
===================================================================
RCS file:
/home/cvs/xml-xerces/java/src/org/apache/xerces/impl/xs/models/XSAllCM.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- XSAllCM.java 27 Aug 2002 06:11:08 -0000 1.6
+++ XSAllCM.java 8 Nov 2002 15:55:31 -0000 1.7
@@ -78,54 +78,32 @@
// start the content model: did not see any children
private static final short STATE_START = 0;
private static final short STATE_VALID = 1;
+ private static final short STATE_CHILD = 1;
//
// Data
//
- private XSElementDecl fAllElements[] = new XSElementDecl[10];
- private boolean fIsOptionalElement[] = new boolean[10];
+ private XSElementDecl fAllElements[];
+ private boolean fIsOptionalElement[];
private boolean fHasOptionalContent = false;
- // private boolean fIsMixed = false;
-
private int fNumElements = 0;
- private int fNumRequired = 0;
//
// Constructors
//
- public XSAllCM (boolean hasOptionalContent) {
+ public XSAllCM (boolean hasOptionalContent, int size) {
fHasOptionalContent = hasOptionalContent;
+ fAllElements = new XSElementDecl[size];
+ fIsOptionalElement = new boolean[size];
}
public void addElement (XSElementDecl element, boolean isOptional) {
-
- // resize arrays if necessary
- if (fNumElements >= fAllElements.length) {
- XSElementDecl newAllElements[] = new XSElementDecl
[2*fAllElements.length];
- boolean newIsOptionalElements[] =
- new boolean[2*fIsOptionalElement.length];
- System.arraycopy(fAllElements, 0, newAllElements, 0,
- fAllElements.length);
- System.arraycopy(fIsOptionalElement, 0, newIsOptionalElements, 0,
- fIsOptionalElement.length);
-
- fAllElements = newAllElements;
- fIsOptionalElement = newIsOptionalElements;
- }
-
fAllElements[fNumElements] = element;
fIsOptionalElement[fNumElements] = isOptional;
-
fNumElements++;
-
- // keeping track of the number of elements that are required
- if (!isOptional) {
- fNumRequired++;
- }
-
}
@@ -177,6 +155,9 @@
return findMatchingDecl(elementName, subGroupHandler);
}
+ // seen child
+ currentState[0] = STATE_CHILD;
+
Object matchingDecl = null;
for (int i = 0; i < fNumElements; i++) {
@@ -214,23 +195,17 @@
// If <all> has minOccurs of zero and there are
// no children to validate, it is trivially valid
-
- if (fHasOptionalContent && fNumElements == 0) {
+ if (fHasOptionalContent && state == STATE_START) {
return true;
}
- int numRequiredSeen = 0;
-
for (int i = 0; i < fNumElements; i++) {
- if (!fIsOptionalElement[i] && currentState[i+1] != STATE_START)
- numRequiredSeen++;
- }
-
- if (fNumRequired == numRequiredSeen ) {
- return true;
+ // if one element is required, but not present, then error
+ if (!fIsOptionalElement[i] && currentState[i+1] == STATE_START)
+ return false;
}
- return false;
+ return true;
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]