FileDocCategorySizeDatePackage
XSAttributeGroupDecl.javaAPI DocJava SE 6 API13664Tue Jun 10 00:22:44 BST 2008com.sun.org.apache.xerces.internal.impl.xs

XSAttributeGroupDecl

public class XSAttributeGroupDecl extends Object implements XSAttributeGroupDefinition
The XML representation for an attribute group declaration schema component is a global element information item
xerces.internal
author
Sandy Gao, IBM
author
Rahul Srivastava, Sun Microsystems Inc.
version
$Id: XSAttributeGroupDecl.java,v 1.2.6.1 2005/09/09 07:30:54 sunithareddy Exp $

Fields Summary
public String
fName
public String
fTargetNamespace
int
fAttrUseNum
private static final int
INITIAL_SIZE
XSAttributeUseImpl[]
fAttributeUses
public XSWildcardDecl
fAttributeWC
public String
fIDAttrName
public XSAnnotationImpl
fAnnotation
protected XSObjectListImpl
fAttrUses
Constructors Summary
Methods Summary
public java.lang.StringaddAttributeUse(com.sun.org.apache.xerces.internal.impl.xs.XSAttributeUseImpl attrUse)


    // add an attribute use
    // if the type is derived from ID, but there is already another attribute
    // use of type ID, then return the name of the other attribute use;
    // otherwise, return null
        

        if (fAttrUseNum == fAttributeUses.length) {
            fAttributeUses = resize(fAttributeUses, fAttrUseNum*2);
        }
        fAttributeUses[fAttrUseNum++] = attrUse;
        // if this attribute use is prohibited, then don't check whether it's
        // of type ID
        if (attrUse.fUse == SchemaSymbols.USE_PROHIBITED)
            return null;

        if (attrUse.fAttrDecl.fType.isIDType()) {
            // if there is already an attribute use of type ID, return it' sname
            if (fIDAttrName == null)
                fIDAttrName = attrUse.fAttrDecl.fName;
            else
                return fIDAttrName;
        }

        return null;
    
public com.sun.org.apache.xerces.internal.xs.XSAnnotationgetAnnotation()
Optional. Annotation.

        return fAnnotation;
    
public com.sun.org.apache.xerces.internal.xs.XSAttributeUsegetAttributeUse(java.lang.String namespace, java.lang.String name)

        for (int i=0; i<fAttrUseNum; i++) {
            if ( (fAttributeUses[i].fAttrDecl.fTargetNamespace == namespace) &&
                 (fAttributeUses[i].fAttrDecl.fName == name) )
                return fAttributeUses[i];
        }

        return null;
    
public com.sun.org.apache.xerces.internal.xs.XSObjectListgetAttributeUses()
{attribute uses} A set of attribute uses.

        if (fAttrUses == null){
            fAttrUses = new XSObjectListImpl(fAttributeUses, fAttrUseNum);
        }
        return fAttrUses;
    
public com.sun.org.apache.xerces.internal.xs.XSWildcardgetAttributeWildcard()
{attribute wildcard} Optional. A wildcard.

        return fAttributeWC;
    
public java.lang.StringgetName()
The name of this XSObject depending on the XSObject type.

        return fName;
    
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 fTargetNamespace;
    
public com.sun.org.apache.xerces.internal.xs.XSNamespaceItemgetNamespaceItem()

see
com.sun.org.apache.xerces.internal.xs.XSObject#getNamespaceItem()

        //REVISIT: implement
		return null;
	
public shortgetType()
Get the type of the object, i.e ELEMENT_DECLARATION.

        return XSConstants.ATTRIBUTE_GROUP;
    
public voidremoveProhibitedAttrs()

        if (fAttrUseNum == 0) return;
        int pCount = 0;
        XSAttributeUseImpl[] pUses = new XSAttributeUseImpl[fAttrUseNum];
        for (int i = 0; i < fAttrUseNum; i++) {
            if (fAttributeUses[i].fUse == SchemaSymbols.USE_PROHIBITED) {
                pCount++;
                // we use the entries at the end, so that we can use the
                // first entries to store non-prohibited attribute uses,
                // hence avoid creating a new array.
                pUses[fAttrUseNum-pCount] = fAttributeUses[i];
            }
        }

        int newCount = 0;
        if (pCount > 0) {
            OUTER: for (int i = 0; i < fAttrUseNum; i++) {
                if (fAttributeUses[i].fUse == SchemaSymbols.USE_PROHIBITED)
                    continue;
                for (int j = 1; j <= pCount; j++) {
                    if (fAttributeUses[i].fAttrDecl.fName == pUses[fAttrUseNum-pCount].fAttrDecl.fName &&
                        fAttributeUses[i].fAttrDecl.fTargetNamespace == pUses[fAttrUseNum-pCount].fAttrDecl.fTargetNamespace) {
                        continue OUTER;
                    }
                }
                pUses[newCount++] = fAttributeUses[i];
            }
            fAttributeUses = pUses;
            fAttrUseNum = newCount;
        }
    
public voidreset()

        fName = null;
        fTargetNamespace = null;
        // reset attribute uses
        for (int i=0;i<fAttrUseNum;i++) {
            fAttributeUses[i] = null;
        } 
        fAttrUseNum = 0;
        fAttributeWC = null;
        fAnnotation = null;
        fIDAttrName = null;

    
static final com.sun.org.apache.xerces.internal.impl.xs.XSAttributeUseImpl[]resize(com.sun.org.apache.xerces.internal.impl.xs.XSAttributeUseImpl[] oldArray, int newSize)

        XSAttributeUseImpl[] newArray = new XSAttributeUseImpl[newSize];
        System.arraycopy(oldArray, 0, newArray, 0, Math.min(oldArray.length, newSize));
        return newArray;
    
public java.lang.Object[]validRestrictionOf(java.lang.String typeName, com.sun.org.apache.xerces.internal.impl.xs.XSAttributeGroupDecl baseGroup)
Check that the attributes in this group validly restrict those from a base group. If an error is found, an Object[] is returned. This contains the arguments for the error message describing the error. The last element in the array (at index arr.length - 1) is the the error code. Returns null if there is no error. REVISIT: is there a better way of returning the appropriate information for the error?

param
typeName the name of the type containing this attribute group, used for error reporting purposes
param
baseGroup the XSAttributeGroupDecl that is the base we are checking against


        Object[] errorArgs = null;
        XSAttributeUseImpl attrUse = null;
        XSAttributeDecl attrDecl = null;
        XSAttributeUseImpl baseAttrUse = null;
        XSAttributeDecl baseAttrDecl = null;

        for (int i=0; i<fAttrUseNum; i++) {

            attrUse = fAttributeUses[i];
            attrDecl = attrUse.fAttrDecl;

            // Look for a match in the base
            baseAttrUse = (XSAttributeUseImpl)baseGroup.getAttributeUse(attrDecl.fTargetNamespace,attrDecl.fName);
            if (baseAttrUse != null) {
                //
                // derivation-ok-restriction.  Constraint 2.1.1
                //

                if (baseAttrUse.getRequired() && !attrUse.getRequired()) {
                    errorArgs = new Object[]{typeName, attrDecl.fName,
                    	                     attrUse.fUse == SchemaSymbols.USE_OPTIONAL ? SchemaSymbols.ATTVAL_OPTIONAL : SchemaSymbols.ATTVAL_PROHIBITED,
                                             "derivation-ok-restriction.2.1.1"};
                    return errorArgs;
                }

                // if this attribute is prohibited in the derived type, don't
                // need to check any of the following constraints.
                if (attrUse.fUse == SchemaSymbols.USE_PROHIBITED) {
                    continue;
                }

                baseAttrDecl = baseAttrUse.fAttrDecl;
                //
                // derivation-ok-restriction.  Constraint 2.1.1
                //
                if (! XSConstraints.checkSimpleDerivationOk(attrDecl.fType,
                                                            baseAttrDecl.fType,
                                                            baseAttrDecl.fType.getFinal()) ) {
					errorArgs = new Object[]{typeName, attrDecl.fName, attrDecl.fType.getName(),
						                     baseAttrDecl.fType.getName(), "derivation-ok-restriction.2.1.2"};
					return errorArgs;
                }


                //
                // derivation-ok-restriction.  Constraint 2.1.3
                //
                int baseConsType=baseAttrUse.fConstraintType!=XSConstants.VC_NONE?
                                 baseAttrUse.fConstraintType:baseAttrDecl.getConstraintType();
                int thisConstType = attrUse.fConstraintType!=XSConstants.VC_NONE?
                                    attrUse.fConstraintType:attrDecl.getConstraintType();

                if (baseConsType == XSConstants.VC_FIXED) {

                    if (thisConstType != XSConstants.VC_FIXED) {
						errorArgs = new Object[]{typeName, attrDecl.fName,
												 "derivation-ok-restriction.2.1.3.a"};
						return errorArgs;
                    } else {
                        // check the values are the same.
                        ValidatedInfo baseFixedValue=(baseAttrUse.fDefault!=null ?
                                                      baseAttrUse.fDefault: baseAttrDecl.fDefault);
                        ValidatedInfo thisFixedValue=(attrUse.fDefault!=null ?
                                                      attrUse.fDefault: attrDecl.fDefault);
                        if (!baseFixedValue.actualValue.equals(thisFixedValue.actualValue)) {
							errorArgs = new Object[]{typeName, attrDecl.fName, thisFixedValue.stringValue(),
													 baseFixedValue.stringValue(), "derivation-ok-restriction.2.1.3.b"};
							return errorArgs;
                        }

                    }

                }
            } else {
                // No matching attribute in base - there should be a matching wildcard

                //
                // derivation-ok-restriction.  Constraint 2.2
                //
                if (baseGroup.fAttributeWC == null) {
					errorArgs = new Object[]{typeName, attrDecl.fName,
											 "derivation-ok-restriction.2.2.a"};
					return errorArgs;
                }
                else if (!baseGroup.fAttributeWC.allowNamespace(attrDecl.fTargetNamespace)) {
					errorArgs = new Object[]{typeName, attrDecl.fName,
                                             attrDecl.fTargetNamespace==null?"":attrDecl.fTargetNamespace,
											 "derivation-ok-restriction.2.2.b"};
					return errorArgs;
                }
            }
        }

        //
        // Check that any REQUIRED attributes in the base have matching attributes
        // in this group
        // derivation-ok-restriction.  Constraint 3
        //
        for (int i=0; i<baseGroup.fAttrUseNum; i++) {

            baseAttrUse = baseGroup.fAttributeUses[i];

            if (baseAttrUse.fUse == SchemaSymbols.USE_REQUIRED) {

                baseAttrDecl = baseAttrUse.fAttrDecl;
                // Look for a match in this group
                if (getAttributeUse(baseAttrDecl.fTargetNamespace,baseAttrDecl.fName) == null) {
					errorArgs = new Object[]{typeName, baseAttrUse.fAttrDecl.fName,
											 "derivation-ok-restriction.3"};
					return errorArgs;
                }
            }
        }


        // Now, check wildcards
        //
        // derivation-ok-restriction.  Constraint 4
        //
        if (fAttributeWC != null) {
            if (baseGroup.fAttributeWC == null) {
				errorArgs = new Object[]{typeName, "derivation-ok-restriction.4.1"};
				return errorArgs;
            }
            if (! fAttributeWC.isSubsetOf(baseGroup.fAttributeWC)) {
				errorArgs = new Object[]{typeName, "derivation-ok-restriction.4.2"};
				return errorArgs;
            }
            if (fAttributeWC.weakerProcessContents(baseGroup.fAttributeWC)) {
				errorArgs = new Object[]{typeName,
										 fAttributeWC.getProcessContentsAsString(),
										 baseGroup.fAttributeWC.getProcessContentsAsString(),
										 "derivation-ok-restriction.4.3"};
				return errorArgs;
            }
        }

        return null;