FileDocCategorySizeDatePackage
XSAllCM.javaAPI DocApache Xerces 3.0.17516Fri Sep 14 20:33:54 BST 2007org.apache.xerces.impl.xs.models

XSAllCM

public class XSAllCM extends Object implements XSCMValidator
XSAllCM implements XSCMValidator and handles <all>.
xerces.internal
author
Pavani Mukthipudi, Sun Microsystems Inc.
version
$Id: XSAllCM.java 573322 2007-09-06 16:48:47Z peterjm $

Fields Summary
private static final short
STATE_START
private static final short
STATE_VALID
private static final short
STATE_CHILD
private final org.apache.xerces.impl.xs.XSElementDecl[]
fAllElements
private final boolean[]
fIsOptionalElement
private final boolean
fHasOptionalContent
private int
fNumElements
Constructors Summary
public XSAllCM(boolean hasOptionalContent, int size)


    //
    // Constructors
    //

          
        fHasOptionalContent = hasOptionalContent;
        fAllElements = new XSElementDecl[size];
        fIsOptionalElement = new boolean[size];
    
Methods Summary
public voidaddElement(org.apache.xerces.impl.xs.XSElementDecl element, boolean isOptional)

        fAllElements[fNumElements] = element;
        fIsOptionalElement[fNumElements] = isOptional;
        fNumElements++;
    
public booleancheckUniqueParticleAttribution(org.apache.xerces.impl.xs.SubstitutionGroupHandler subGroupHandler)
check whether this content violates UPA constraint.

param
subGroupHandler the substitution group handler
return
true if this content model contains other or list wildcard

        // check whether there is conflict between any two leaves
        for (int i = 0; i < fNumElements; i++) {
            for (int j = i+1; j < fNumElements; j++) {
                if (XSConstraints.overlapUPA(fAllElements[i], fAllElements[j], subGroupHandler)) {
                    // REVISIT: do we want to report all errors? or just one?
                    throw new XMLSchemaException("cos-nonambig", new Object[]{fAllElements[i].toString(),
                                                                              fAllElements[j].toString()});
                }
            }
        }

        return false;
    
public booleanendContentModel(int[] currentState)
The method indicates the end of list of children

param
currentState Current state of the content model
return
true if the last state was a valid final state


        int state = currentState[0];

        if (state == XSCMValidator.FIRST_ERROR || state == XSCMValidator.SUBSEQUENT_ERROR) {
            return false;
        }

        // If <all> has minOccurs of zero and there are
        // no children to validate, it is trivially valid
        if (fHasOptionalContent && state == STATE_START) {
            return true;
        }

        for (int i = 0; i < fNumElements; i++) {
            // if one element is required, but not present, then error
            if (!fIsOptionalElement[i] && currentState[i+1] == STATE_START)
                return false;
        }

        return true;
    
java.lang.ObjectfindMatchingDecl(org.apache.xerces.xni.QName elementName, org.apache.xerces.impl.xs.SubstitutionGroupHandler subGroupHandler)

        Object matchingDecl = null;
        for (int i = 0; i < fNumElements; i++) {
            matchingDecl = subGroupHandler.getMatchingElemDecl(elementName, fAllElements[i]);
            if (matchingDecl != null)
                break;
        }
        return matchingDecl;
    
public booleanisCompactedForUPA()

        return false;
    
public java.lang.ObjectoneTransition(org.apache.xerces.xni.QName elementName, int[] currentState, org.apache.xerces.impl.xs.SubstitutionGroupHandler subGroupHandler)
The method corresponds to one transition in the content model.

param
elementName
param
currentState Current state
return
an element decl object


        // error state
        if (currentState[0] < 0) {
            currentState[0] = XSCMValidator.SUBSEQUENT_ERROR;
            return findMatchingDecl(elementName, subGroupHandler);
        }

        // seen child
        currentState[0] = STATE_CHILD;
        
        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) {
                // found the decl, mark this element as "seen".
                currentState[i+1] = STATE_VALID;
                return matchingDecl;
            }
        }

        // couldn't find the decl, change to error state.
        currentState[0] = XSCMValidator.FIRST_ERROR;
        return findMatchingDecl(elementName, subGroupHandler);
    
public int[]startContentModel()
This methods to be called on entering a first element whose type has this content model. It will return the initial state of the content model

return
Start state of the content model


        int[] state = new int[fNumElements + 1];

        for (int i = 0; i <= fNumElements; i++) {
            state[i] = STATE_START;
        }
        return state;
    
public java.util.VectorwhatCanGoHere(int[] state)
Check which elements are valid to appear at this point. This method also works if the state is in error, in which case it returns what should have been seen.

param
state the current state
return
a Vector whose entries are instances of either XSWildcardDecl or XSElementDecl.

        Vector ret = new Vector();
        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 (state[i+1] == STATE_START)
                ret.addElement(fAllElements[i]);
        }
        return ret;