FileDocCategorySizeDatePackage
XSModelGroupImpl.javaAPI DocApache Xerces 3.0.18039Fri Sep 14 20:33:52 BST 2007org.apache.xerces.impl.xs

XSModelGroupImpl

public class XSModelGroupImpl extends Object implements XSModelGroup
Store schema model group declaration.
xerces.internal
author
Sandy Gao, IBM
version
$Id: XSModelGroupImpl.java 446734 2006-09-15 20:51:23Z mrglavas $

Fields Summary
public static final short
MODELGROUP_CHOICE
public static final short
MODELGROUP_SEQUENCE
public static final short
MODELGROUP_ALL
public short
fCompositor
public XSParticleDecl[]
fParticles
public int
fParticleCount
public XSObjectList
fAnnotations
private String
fDescription
get the string description of this particle
Constructors Summary
Methods Summary
public XSAnnotationgetAnnotation()
Optional. Annotation.

        return (fAnnotations != null) ? (XSAnnotation) fAnnotations.item(0) : null;
    
public XSObjectListgetAnnotations()
Optional. Annotations.

        return (fAnnotations != null) ? fAnnotations : XSObjectListImpl.EMPTY_LIST;
    
public shortgetCompositor()
{compositor} One of all, choice or sequence. The valid constants values are: ALL, CHOICE, SEQUENCE.

        if (fCompositor == MODELGROUP_CHOICE)
            return XSModelGroup.COMPOSITOR_CHOICE;
        else if (fCompositor == MODELGROUP_SEQUENCE)
            return XSModelGroup.COMPOSITOR_SEQUENCE;
        else
            return XSModelGroup.COMPOSITOR_ALL;
    
public java.lang.StringgetName()
The name of this XSObject depending on the XSObject type.

        return null;
    
public java.lang.StringgetNamespace()
The namespace URI of this node, or null if it is unspecified. defines how a namespace URI is attached to schema components.

        return null;
    
public XSNamespaceItemgetNamespaceItem()

see
org.apache.xerces.xs.XSObject#getNamespaceItem()

        return null;
    
public XSObjectListgetParticles()
{particles} A list of particles

        return new XSObjectListImpl(fParticles, fParticleCount);
    
public shortgetType()
Get the type of the object, i.e ELEMENT_DECLARATION.

        return XSConstants.MODEL_GROUP;
    
public booleanisEmpty()


    // whether this model group contains nothing
       
        for (int i = 0; i < fParticleCount; i++) {
            if (!fParticles[i].isEmpty())
                return false;
        }
        return true;
    
public intmaxEffectiveTotalRange()

        if (fCompositor == MODELGROUP_CHOICE)
            return maxEffectiveTotalRangeChoice();
        else
            return maxEffectiveTotalRangeAllSeq();
    
private intmaxEffectiveTotalRangeAllSeq()

        int total = 0, one;
        for (int i = 0; i < fParticleCount; i++) {
            one = fParticles[i].maxEffectiveTotalRange();
            if (one == SchemaSymbols.OCCURRENCE_UNBOUNDED)
                return SchemaSymbols.OCCURRENCE_UNBOUNDED;
            total += one;
        }
        return total;
    
private intmaxEffectiveTotalRangeChoice()

        int max = 0, one;
        if (fParticleCount > 0) {
            max = fParticles[0].maxEffectiveTotalRange();
            if (max == SchemaSymbols.OCCURRENCE_UNBOUNDED)
                return SchemaSymbols.OCCURRENCE_UNBOUNDED;
        }

        for (int i = 1; i < fParticleCount; i++) {
            one = fParticles[i].maxEffectiveTotalRange();
            if (one == SchemaSymbols.OCCURRENCE_UNBOUNDED)
                return SchemaSymbols.OCCURRENCE_UNBOUNDED;
            if (one > max)
                max = one;
        }
        return max;
    
public intminEffectiveTotalRange()
3.8.6 Effective Total Range (all and sequence) and Effective Total Range (choice) The following methods are used to return min/max range for a particle. They are not exactly the same as it's described in the spec, but all the values from the spec are retrievable by these methods.

        if (fCompositor == MODELGROUP_CHOICE)
            return minEffectiveTotalRangeChoice();
        else
            return minEffectiveTotalRangeAllSeq();
    
private intminEffectiveTotalRangeAllSeq()

        int total = 0;
        for (int i = 0; i < fParticleCount; i++)
            total += fParticles[i].minEffectiveTotalRange();
        return total;
    
private intminEffectiveTotalRangeChoice()

        int min = 0, one;
        if (fParticleCount > 0)
            min = fParticles[0].minEffectiveTotalRange();

        for (int i = 1; i < fParticleCount; i++) {
            one = fParticles[i].minEffectiveTotalRange();
            if (one < min)
                min = one;
        }

        return min;
    
public voidreset()

        fCompositor = MODELGROUP_SEQUENCE;
        fParticles = null;
        fParticleCount = 0;
        fDescription = null;
        fAnnotations = null;
    
public java.lang.StringtoString()

       
    	// REVISIT: Commented code may help to eliminate redundant parentheses (test first before committing)
        if (fDescription == null) {
            StringBuffer buffer = new StringBuffer();
            if (fCompositor == MODELGROUP_ALL)
                buffer.append("all(");
            else  //if (fMinOccurs != 1 || fMaxOccurs != 1)
                buffer.append('(");
            if (fParticleCount > 0)
                buffer.append(fParticles[0].toString());
            for (int i = 1; i < fParticleCount; i++) {
                if (fCompositor == MODELGROUP_CHOICE)
                    buffer.append('|");
                else
                    buffer.append(',");
                buffer.append(fParticles[i].toString());
            }
            //if (fCompositor == MODELGROUP_ALL || fMinOccurs != 1 || fMaxOccurs != 1)
                  buffer.append(')");
            fDescription = buffer.toString();
        }
        return fDescription;