src/share/jaxws_classes/com/sun/xml/internal/xsom/impl/ComplexTypeImpl.java

Thu, 12 Oct 2017 19:44:07 +0800

author
aoqi
date
Thu, 12 Oct 2017 19:44:07 +0800
changeset 760
e530533619ec
parent 0
373ffda63c9a
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package com.sun.xml.internal.xsom.impl;
    28 import com.sun.xml.internal.xsom.XSAttGroupDecl;
    29 import com.sun.xml.internal.xsom.XSAttributeDecl;
    30 import com.sun.xml.internal.xsom.XSAttributeUse;
    31 import com.sun.xml.internal.xsom.XSComplexType;
    32 import com.sun.xml.internal.xsom.XSContentType;
    33 import com.sun.xml.internal.xsom.XSElementDecl;
    34 import com.sun.xml.internal.xsom.XSSchema;
    35 import com.sun.xml.internal.xsom.XSSchemaSet;
    36 import com.sun.xml.internal.xsom.XSSimpleType;
    37 import com.sun.xml.internal.xsom.XSType;
    38 import com.sun.xml.internal.xsom.XSWildcard;
    39 import com.sun.xml.internal.xsom.impl.parser.DelayedRef;
    40 import com.sun.xml.internal.xsom.impl.parser.SchemaDocumentImpl;
    41 import com.sun.xml.internal.xsom.impl.scd.Iterators;
    42 import com.sun.xml.internal.xsom.visitor.XSFunction;
    43 import com.sun.xml.internal.xsom.visitor.XSVisitor;
    44 import java.util.ArrayList;
    45 import java.util.List;
    46 import org.xml.sax.Locator;
    48 import java.util.Collection;
    49 import java.util.HashMap;
    50 import java.util.Iterator;
    51 import java.util.Map;
    53 public class ComplexTypeImpl extends AttributesHolder implements XSComplexType, Ref.ComplexType
    54 {
    55     public ComplexTypeImpl( SchemaDocumentImpl _parent,
    56         AnnotationImpl _annon, Locator _loc, ForeignAttributesImpl _fa,
    57         String _name, boolean _anonymous,
    59         boolean _abstract, int _derivationMethod,
    60         Ref.Type _base, int _final, int _block, boolean _mixed ) {
    62         super(_parent,_annon,_loc,_fa,_name,_anonymous);
    64         if(_base==null)
    65             throw new IllegalArgumentException();
    67         this._abstract = _abstract;
    68         this.derivationMethod = _derivationMethod;
    69         this.baseType = _base;
    70         this.finalValue = _final;
    71         this.blockValue = _block;
    72         this.mixed = _mixed;
    73     }
    75     public XSComplexType asComplexType(){ return this; }
    77     public boolean isDerivedFrom(XSType t) {
    78         XSType x = this;
    79         while(true) {
    80             if(t==x)
    81                 return true;
    82             XSType s = x.getBaseType();
    83             if(s==x)
    84                 return false;
    85             x = s;
    86         }
    87     }
    89     public XSSimpleType  asSimpleType()    { return null; }
    90     public final boolean isSimpleType() { return false; }
    91     public final boolean isComplexType(){ return true; }
    93     private int derivationMethod;
    94     public int getDerivationMethod() { return derivationMethod; }
    96     private Ref.Type baseType;
    97     public XSType getBaseType() { return baseType.getType(); }
    99     /**
   100      * Called when this complex type redefines the specified complex type.
   101      */
   102     public void redefine( ComplexTypeImpl ct ) {
   103         if( baseType instanceof DelayedRef )
   104             ((DelayedRef)baseType).redefine(ct);
   105         else
   106             this.baseType = ct;
   107         ct.redefinedBy = this;
   108         redefiningCount = (short)(ct.redefiningCount+1);
   109     }
   111     /**
   112      * Number of times this component redefines other components.
   113      */
   114     private short redefiningCount = 0;
   116     private ComplexTypeImpl redefinedBy = null;
   118     public XSComplexType getRedefinedBy() {
   119         return redefinedBy;
   120     }
   122     public int getRedefinedCount() {
   123         int i=0;
   124         for( ComplexTypeImpl ct=this.redefinedBy; ct!=null; ct=ct.redefinedBy)
   125             i++;
   126         return i;
   127     }
   130     private XSElementDecl scope;
   131     public XSElementDecl getScope() { return scope; }
   132     public void setScope( XSElementDecl _scope ) { this.scope=_scope; }
   134     private final boolean _abstract;
   135     public boolean isAbstract() { return _abstract; }
   137     private WildcardImpl localAttWildcard;
   138     /**
   139      * Set the local attribute wildcard.
   140      */
   141     public void setWildcard( WildcardImpl wc ) {
   142         this.localAttWildcard = wc;
   143     }
   144     public XSWildcard getAttributeWildcard() {
   145         WildcardImpl complete = localAttWildcard;
   147         Iterator itr = iterateAttGroups();
   148         while( itr.hasNext() ) {
   149             WildcardImpl w = (WildcardImpl)((XSAttGroupDecl)itr.next()).getAttributeWildcard();
   151             if(w==null)     continue;
   153             if(complete==null)
   154                 complete = w;
   155             else
   156                 // TODO: the spec says it's intersection,
   157                 // but I think it has to be union.
   158                 complete = complete.union(ownerDocument,w);
   159         }
   161         if( getDerivationMethod()==RESTRICTION )    return complete;
   163         WildcardImpl base=null;
   164         XSType baseType = getBaseType();
   165         if(baseType.asComplexType()!=null)
   166             base = (WildcardImpl)baseType.asComplexType().getAttributeWildcard();
   168         if(complete==null)  return base;
   169         if(base==null)      return complete;
   171         return complete.union(ownerDocument,base);
   172     }
   174     private final int finalValue;
   175     public boolean isFinal( int derivationMethod ) {
   176         return (finalValue&derivationMethod)!=0;
   177     }
   179     private final int blockValue;
   180     public boolean isSubstitutionProhibited( int method ) {
   181         return (blockValue&method)!=0;
   182     }
   185     private Ref.ContentType contentType;
   186     public void setContentType( Ref.ContentType v ) { contentType = v; }
   187     public XSContentType getContentType() { return contentType.getContentType(); }
   189     private XSContentType explicitContent;
   190     public void setExplicitContent( XSContentType v ) {
   191         this.explicitContent = v;
   192     }
   193     public XSContentType getExplicitContent() { return explicitContent; }
   195     private final boolean mixed;
   196     public boolean isMixed() { return mixed; }
   201     public XSAttributeUse getAttributeUse( String nsURI, String localName ) {
   202         UName name = new UName(nsURI,localName);
   204         if(prohibitedAtts.contains(name))       return null;
   206         XSAttributeUse o = attributes.get(name);
   209         if(o==null) {
   210             Iterator itr = iterateAttGroups();
   211             while(itr.hasNext() && o==null)
   212                 o = ((XSAttGroupDecl)itr.next()).getAttributeUse(nsURI,localName);
   213         }
   215         if(o==null) {
   216             XSType base = getBaseType();
   217             if(base.asComplexType()!=null)
   218                 o = base.asComplexType().getAttributeUse(nsURI,localName);
   219         }
   221         return o;
   222     }
   224     public Iterator<XSAttributeUse> iterateAttributeUses() {
   226         XSComplexType baseType = getBaseType().asComplexType();
   228         if( baseType==null )    return super.iterateAttributeUses();
   230         return new Iterators.Union<XSAttributeUse>(
   231             new Iterators.Filter<XSAttributeUse>(baseType.iterateAttributeUses()) {
   232                 protected boolean matches(XSAttributeUse value) {
   233                     XSAttributeDecl u = value.getDecl();
   234                     UName n = new UName(u.getTargetNamespace(),u.getName());
   235                     return !prohibitedAtts.contains(n);
   236                 }
   237             },
   238             super.iterateAttributeUses() );
   239     }
   241     public Collection<XSAttributeUse> getAttributeUses() {
   242         XSComplexType baseType = getBaseType().asComplexType();
   244         if( baseType==null )    return super.getAttributeUses();
   246         // TODO: this is fairly inefficient
   247         Map<UName,XSAttributeUse> uses = new HashMap<UName, XSAttributeUse>();
   248         for( XSAttributeUse a : baseType.getAttributeUses())
   249             uses.put(new UName(a.getDecl()),a);
   251         uses.keySet().removeAll(prohibitedAtts);
   253         for( XSAttributeUse a : super.getAttributeUses())
   254             uses.put(new UName(a.getDecl()),a);
   256         return uses.values();
   257     }
   260     public XSType[] listSubstitutables() {
   261         return Util.listSubstitutables(this);
   262     }
   264     public void visit( XSVisitor visitor ) {
   265         visitor.complexType(this);
   266     }
   267     public <T> T apply( XSFunction<T> function ) {
   268         return function.complexType(this);
   269     }
   271     // Ref.ComplexType implementation
   272     public XSComplexType getType() { return this; }
   274     public List<XSComplexType> getSubtypes() {
   275         ArrayList subtypeList = new ArrayList();
   276         Iterator<XSComplexType> cTypes = getRoot().iterateComplexTypes();
   277         while (cTypes.hasNext()) {
   278             XSComplexType cType= cTypes.next();
   279             XSType base = cType.getBaseType();
   280             if ((base != null) && (base.equals(this))) {
   281                 subtypeList.add(cType);
   282             }
   283         }
   284         return subtypeList;
   285     }
   287     public List<XSElementDecl> getElementDecls() {
   288         ArrayList declList = new ArrayList();
   289         XSSchemaSet schemaSet = getRoot();
   290         for (XSSchema sch : schemaSet.getSchemas()) {
   291             for (XSElementDecl decl : sch.getElementDecls().values()) {
   292                 if (decl.getType().equals(this)) {
   293                     declList.add(decl);
   294                 }
   295             }
   296         }
   297         return declList;
   298     }
   299 }

mercurial