- /*
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001-2003 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xerces" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, International
- * Business Machines, Inc., http://www.apache.org. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- */
-
- package com.sun.org.apache.xerces.internal.impl.xs;
-
- import com.sun.org.apache.xerces.internal.impl.dv.XSSimpleType;
- import com.sun.org.apache.xerces.internal.xs.*;
- import com.sun.org.apache.xerces.internal.impl.xs.models.XSCMValidator;
- import com.sun.org.apache.xerces.internal.impl.xs.models.CMBuilder;
- import com.sun.org.apache.xerces.internal.impl.xs.util.XSObjectListImpl;
- import org.w3c.dom.TypeInfo;
- ;
-
- /**
- * The XML representation for a complexType
- * schema component is a <complexType> element information item
- *
- * @author Elena Litani, IBM
- * @author Sandy Gao, IBM
- * @version $Id: XSComplexTypeDecl.java,v 1.7 2003/12/12 02:58:29 kk122374 Exp $
- */
- public class XSComplexTypeDecl implements XSComplexTypeDefinition {
-
- // name of the complexType
- String fName = null;
-
- // target namespace of the complexType
- String fTargetNamespace = null;
-
- // base type of the complexType
- XSTypeDefinition fBaseType = null;
-
- // derivation method of the complexType
- short fDerivedBy = XSConstants.DERIVATION_RESTRICTION;
-
- // final set of the complexType
- short fFinal = XSConstants.DERIVATION_NONE;
-
- // block set (prohibited substitution) of the complexType
- short fBlock = XSConstants.DERIVATION_NONE;
-
- // flags: whether is abstract; whether contains ID type;
- // whether it's an anonymous tpye
- short fMiscFlags = 0;
-
- // the attribute group that holds the attribute uses and attribute wildcard
- XSAttributeGroupDecl fAttrGrp = null;
-
- // the content type of the complexType
- short fContentType = CONTENTTYPE_EMPTY;
-
- // if the content type is simple, then the corresponding simpleType
- XSSimpleType fXSSimpleType = null;
-
- // if the content type is element or mixed, the particle
- XSParticleDecl fParticle = null;
-
- // if there is a particle, the content model corresponding to that particle
- XSCMValidator fCMValidator = null;
-
- // list of annotations affiliated with this type
- XSObjectListImpl fAnnotations = null;
-
- public XSComplexTypeDecl() {
- // do-nothing constructor for now.
- }
-
- public void setValues(String name, String targetNamespace,
- XSTypeDefinition baseType, short derivedBy, short schemaFinal,
- short block, short contentType,
- boolean isAbstract, XSAttributeGroupDecl attrGrp,
- XSSimpleType simpleType, XSParticleDecl particle,
- XSObjectListImpl annotations) {
- fTargetNamespace = targetNamespace;
- fBaseType = baseType;
- fDerivedBy = derivedBy;
- fFinal = schemaFinal;
- fBlock = block;
- fContentType = contentType;
- if(isAbstract)
- fMiscFlags |= CT_IS_ABSTRACT;
- fAttrGrp = attrGrp;
- fXSSimpleType = simpleType;
- fParticle = particle;
- fAnnotations = annotations;
- }
-
- public void setName(String name) {
- fName = name;
- }
-
- public short getTypeCategory() {
- return COMPLEX_TYPE;
- }
-
- public String getTypeName() {
- return fName;
- }
-
- public short getFinalSet(){
- return fFinal;
- }
-
- public String getTargetNamespace(){
- return fTargetNamespace;
- }
-
- // flags for the misc flag
- private static final short CT_IS_ABSTRACT = 1;
- private static final short CT_HAS_TYPE_ID = 2;
- private static final short CT_IS_ANONYMOUS = 4;
-
- // methods to get/set misc flag
-
- public boolean containsTypeID () {
- return((fMiscFlags & CT_HAS_TYPE_ID) != 0);
- }
-
- public void setIsAbstractType() {
- fMiscFlags |= CT_IS_ABSTRACT;
- }
- public void setContainsTypeID() {
- fMiscFlags |= CT_HAS_TYPE_ID;
- }
- public void setIsAnonymous() {
- fMiscFlags |= CT_IS_ANONYMOUS;
- }
-
- public synchronized XSCMValidator getContentModel(CMBuilder cmBuilder) {
- if (fCMValidator == null)
- fCMValidator = cmBuilder.getContentModel(this);
-
- return fCMValidator;
- }
-
- // some utility methods:
-
- // return the attribute group for this complex type
- public XSAttributeGroupDecl getAttrGrp() {
- return fAttrGrp;
- }
-
- public String toString() {
- StringBuffer str = new StringBuffer();
- appendTypeInfo(str);
- return str.toString();
- }
-
- void appendTypeInfo(StringBuffer str) {
- String contentType[] = {"EMPTY", "SIMPLE", "ELEMENT", "MIXED"};
- String derivedBy[] = {"EMPTY", "EXTENSION", "RESTRICTION"};
-
- str.append("Complex type name='" + fTargetNamespace + "," + getTypeName() + "', ");
- if (fBaseType != null)
- str.append(" base type name='" + fBaseType.getName() + "', ");
-
- str.append(" content type='" + contentType[fContentType] + "', ");
- str.append(" isAbstract='" + getAbstract() + "', ");
- str.append(" hasTypeId='" + containsTypeID() + "', ");
- str.append(" final='" + fFinal + "', ");
- str.append(" block='" + fBlock + "', ");
- if (fParticle != null)
- str.append(" particle='" + fParticle.toString() + "', ");
- str.append(" derivedBy='" + derivedBy[fDerivedBy] + "'. ");
-
- }
-
- public boolean derivedFromType(XSTypeDefinition ancestor, short derivationMethod) {
- // ancestor is null, retur false
- if (ancestor == null)
- return false;
- // ancestor is anyType, return true
- if (ancestor == SchemaGrammar.fAnyType)
- return true;
- // recursively get base, and compare it with ancestor
- XSTypeDefinition type = this;
- while (type != ancestor && // compare with ancestor
- type != SchemaGrammar.fAnySimpleType && // reached anySimpleType
- type != SchemaGrammar.fAnyType) { // reached anyType
- type = type.getBaseType();
- }
-
- return type == ancestor;
- }
-
- public boolean derivedFrom(String ancestorNS, String ancestorName, short derivationMethod) {
- // ancestor is null, retur false
- if (ancestorName == null)
- return false;
- // ancestor is anyType, return true
- if (ancestorNS != null &&
- ancestorNS.equals(SchemaSymbols.URI_SCHEMAFORSCHEMA) &&
- ancestorName.equals(SchemaSymbols.ATTVAL_ANYTYPE)) {
- return true;
- }
-
- // recursively get base, and compare it with ancestor
- XSTypeDefinition type = this;
- while (!(ancestorName.equals(type.getName()) &&
- ((ancestorNS == null && type.getNamespace() == null) ||
- (ancestorNS != null && ancestorNS.equals(type.getNamespace())))) && // compare with ancestor
- type != SchemaGrammar.fAnySimpleType && // reached anySimpleType
- type != SchemaGrammar.fAnyType) { // reached anyType
- if( derivationMethod!=0 ) {
- if( type instanceof XSComplexTypeDefinition ) {
- switch( ((XSComplexTypeDefinition)type).getDerivationMethod() ) {
- case XSConstants.DERIVATION_EXTENSION:
- if( (derivationMethod&TypeInfo.DERIVATION_EXTENSION) == 0 )
- return false;
- break;
- case XSConstants.DERIVATION_RESTRICTION:
- if( (derivationMethod&TypeInfo.DERIVATION_RESTRICTION) == 0 )
- return false;
- break;
- }
- } else
- if( type instanceof XSSimpleTypeDefinition ) {
- // broken (but then the spec is broken, so what do you expect!) FIXME.
- switch( ((XSSimpleTypeDefinition)type).getVariety()) {
- case XSSimpleTypeDefinition.VARIETY_ATOMIC:
- if( (derivationMethod&TypeInfo.DERIVATION_RESTRICTION) == 0 )
- return false;
- break;
- case XSSimpleTypeDefinition.VARIETY_LIST:
- if( (derivationMethod&TypeInfo.DERIVATION_LIST) == 0 )
- return false;
- break;
- case XSSimpleTypeDefinition.VARIETY_UNION:
- if( (derivationMethod&TypeInfo.DERIVATION_UNION) == 0 )
- return false;
- break;
- }
- }
- }
- type = (XSTypeDefinition)type.getBaseType();
- }
-
- return type != SchemaGrammar.fAnySimpleType &&
- type != SchemaGrammar.fAnyType;
- }
-
- public void reset(){
- fName = null;
- fTargetNamespace = null;
- fBaseType = null;
- fDerivedBy = XSConstants.DERIVATION_RESTRICTION;
- fFinal = XSConstants.DERIVATION_NONE;
- fBlock = XSConstants.DERIVATION_NONE;
-
- fMiscFlags = 0;
-
- // reset attribute group
- fAttrGrp.reset();
- fContentType = CONTENTTYPE_EMPTY;
- fXSSimpleType = null;
- fParticle = null;
- fCMValidator = null;
- if(fAnnotations != null) {
- // help out the garbage collector
- fAnnotations.clear();
- }
- fAnnotations = null;
- }
-
- /**
- * Get the type of the object, i.e ELEMENT_DECLARATION.
- */
- public short getType() {
- return XSConstants.TYPE_DEFINITION;
- }
-
- /**
- * The <code>name</code> of this <code>XSObject</code> depending on the
- * <code>XSObject</code> type.
- */
- public String getName() {
- return getAnonymous() ? null : fName;
- }
-
- /**
- * A boolean that specifies if the type definition is anonymous.
- * Convenience attribute. This is a field is not part of
- * XML Schema component model.
- */
- public boolean getAnonymous() {
- return((fMiscFlags & CT_IS_ANONYMOUS) != 0);
- }
-
- /**
- * The namespace URI of this node, or <code>null</code> if it is
- * unspecified. defines how a namespace URI is attached to schema
- * components.
- */
- public String getNamespace() {
- return fTargetNamespace;
- }
-
- /**
- * {base type definition} Either a simple type definition or a complex
- * type definition.
- */
- public XSTypeDefinition getBaseType() {
- return fBaseType;
- }
-
- /**
- * {derivation method} Either extension or restriction. The valid constant
- * value for this <code>XSConstants</code> EXTENTION, RESTRICTION.
- */
- public short getDerivationMethod() {
- return fDerivedBy;
- }
-
- /**
- * {final} For complex type definition it is a subset of {extension,
- * restriction}. For simple type definition it is a subset of
- * {extension, list, restriction, union}.
- * @param derivation Extension, restriction, list, union constants
- * (defined in <code>XSConstants</code>).
- * @return True if derivation is in the final set, otherwise false.
- */
- public boolean isFinal(short derivation) {
- return (fFinal & derivation) != 0;
- }
-
- /**
- * {final} For complex type definition it is a subset of {extension, restriction}.
- *
- * @return A bit flag that represents:
- * {extension, restriction) or none for complexTypes;
- * {extension, list, restriction, union} or none for simpleTypes;
- */
- public short getFinal() {
- return fFinal;
- }
-
- /**
- * {abstract} A boolean. Complex types for which {abstract} is true must
- * not be used as the {type definition} for the validation of element
- * information items.
- */
- public boolean getAbstract() {
- return((fMiscFlags & CT_IS_ABSTRACT) != 0);
- }
-
- /**
- * {attribute uses} A set of attribute uses.
- */
- public XSObjectList getAttributeUses() {
- return fAttrGrp.getAttributeUses();
- }
-
- /**
- * {attribute wildcard} Optional. A wildcard.
- */
- public XSWildcard getAttributeWildcard() {
- return fAttrGrp.getAttributeWildcard();
- }
-
- /**
- * {content type} One of empty, a simple type definition (see
- * <code>simpleType</code>, or mixed, element-only (see
- * <code>cmParticle</code>).
- */
- public short getContentType() {
- return fContentType;
- }
-
- /**
- * A simple type definition corresponding to simple content model,
- * otherwise <code>null</code>
- */
- public XSSimpleTypeDefinition getSimpleType() {
- return fXSSimpleType;
- }
-
- /**
- * A particle for mixed or element-only content model, otherwise
- * <code>null</code>
- */
- public XSParticle getParticle() {
- return fParticle;
- }
-
- /**
- * {prohibited substitutions} A subset of {extension, restriction}.
- * @param prohibited extention or restriction constants (defined in
- * <code>XSConstants</code>).
- * @return True if prohibited is a prohibited substitution, otherwise
- * false.
- */
- public boolean isProhibitedSubstitution(short prohibited) {
- return (fBlock & prohibited) != 0;
- }
-
- /**
- * {prohibited substitutions}
- *
- * @return A bit flag corresponding to prohibited substitutions
- */
- public short getProhibitedSubstitutions() {
- return fBlock;
- }
-
- /**
- * Optional. Annotation.
- */
- public XSObjectList getAnnotations() {
- return fAnnotations;
- }
-
- /* (non-Javadoc)
- * @see com.sun.org.apache.xerces.internal.xs.XSComplexTypeDefinition#getAttributeUse(java.lang.String, java.lang.String)
- */
- public XSAttributeUse getAttributeUse(String namespace, String name) {
- return fAttrGrp.getAttributeUse(namespace, name);
- }
-
- /**
- * @see com.sun.org.apache.xerces.internal.impl.xs.psvi.XSObject#getNamespaceItem()
- */
- public XSNamespaceItem getNamespaceItem() {
- // REVISIT: implement
- return null;
- }
-
- public String getTypeNamespace() {
- return getNamespace();
- }
-
- public boolean isDerivedFrom(String typeNamespace, String typeName, int derivationMethod) {
- return derivedFrom(typeNamespace,typeName,(short)derivationMethod);
- }
-
- } // class XSComplexTypeDecl