sandygao 2002/08/26 23:11:08 Modified: java/src/org/apache/xerces/impl/xs/models XSAllCM.java Log: Improving the error-handling code in XSAllCM. In the old code, we go through the whole list of candidate elements to find the one that matches the current element, even if some of those elements were already matched. The new code only looks at those elements that are not matched yet. This will improve the performance for valid documents, because checking whether 2 elements match is an expensive operation (which involves substitution group checking). Of course, the performance would suffer a little bit for invalid documents (because we might need to go through the list twice), but the performance for valid documents is our primary concern. Revision Changes Path 1.6 +22 -33 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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- XSAllCM.java 27 Aug 2002 05:34:09 -0000 1.5 +++ XSAllCM.java 27 Aug 2002 06:11:08 -0000 1.6 @@ -150,6 +150,17 @@ return state; } + // convinient method: when error occurs, to find a matching decl + // from the candidate elements. + Object findMatchingDecl(QName elementName, SubstitutionGroupHandler subGroupHandler) { + Object matchingDecl = null; + for (int i = 0; i < fNumElements; i++) { + matchingDecl = subGroupHandler.getMatchingElemDecl(elementName, fAllElements[i]); + if (matchingDecl != null) + break; + } + return matchingDecl; + } /** * The method corresponds to one transition in the content model. @@ -163,49 +174,27 @@ // error state if (currentState[0] < 0) { currentState[0] = XSCMValidator.SUBSEQUENT_ERROR; - Object matchingDecl = null; - for (int i = 0; i < fNumElements; i++) { - matchingDecl = subGroupHandler.getMatchingElemDecl(elementName, fAllElements[i]); - if (matchingDecl != null) - break; - } - return matchingDecl; + return findMatchingDecl(elementName, subGroupHandler); } Object matchingDecl = null; for (int i = 0; i < fNumElements; i++) { - + // we only try to look for a matching decl if we have not seen + // this element yet. + if (currentState[i+1] != STATE_START) + continue; matchingDecl = subGroupHandler.getMatchingElemDecl(elementName, fAllElements[i]); if (matchingDecl != null) { - - if (currentState[i+1] == STATE_START) { - currentState[i+1] = STATE_VALID; - } - else if (currentState[i+1] == STATE_VALID) { - // duplicate element - currentState[i+1] = XSCMValidator.FIRST_ERROR; - currentState[0] = XSCMValidator.FIRST_ERROR; - } - else if (currentState[i+1] == XSCMValidator.FIRST_ERROR) { - currentState[i+1] = XSCMValidator.SUBSEQUENT_ERROR; - currentState[0] = XSCMValidator.SUBSEQUENT_ERROR; - } - - if (currentState[0] == STATE_START) { - currentState[0] = STATE_VALID; - } - + // found the decl, mark this element as "seen". + currentState[i+1] = STATE_VALID; return matchingDecl; } } - if (currentState[0] == XSCMValidator.FIRST_ERROR) - currentState[0] = XSCMValidator.SUBSEQUENT_ERROR; - else if (currentState[0] == STATE_START || currentState[0] == STATE_VALID) - currentState[0] = XSCMValidator.FIRST_ERROR; - - return null; + // couldn't find the decl, change to error state. + currentState[0] = XSCMValidator.FIRST_ERROR; + return findMatchingDecl(elementName, subGroupHandler); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]