code: /*
   * The contents of this file are subject to the terms
   * of the Common Development and Distribution License
   * (the "License").  You may not use this file except
   * in compliance with the License.
   * 
   * You can obtain a copy of the license at
   * https://jwsdp.dev.java.net/CDDLv1.0.html
   * See the License for the specific language governing
   * permissions and limitations under the License.
   * 
   * When distributing Covered Code, include this CDDL
   * HEADER in each file and include the License file at
   * https://jwsdp.dev.java.net/CDDLv1.0.html  If applicable,
   * add the following below this CDDL HEADER, with the
   * fields enclosed by brackets "[]" replaced with your
   * own identifying information: Portions Copyright [yyyy]
   * [name of copyright owner]
   */
  package com.sun.xml.xsom;
  
  /**
   * Base interface for {@link XSComplexType} and {@link XSSimpleType}.
   * 
   * @author
   *  Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
   */
  public interface XSType extends XSDeclaration {
      /**
       * Returns the base type of this type.
       *
       * Note that if this type represents <tt>xs:anyType</tt>, this method returns itself.
       * This is awkward as an API, but it follows the schema specification.
       *
       * @return  always non-null.
       */
      XSType getBaseType();
  
      final static int EXTENSION = 1;
      final static int RESTRICTION = 2;
      final static int SUBSTITUTION = 4;
  
      int getDerivationMethod();
  
      /** Returns true if <code>this instanceof XSSimpleType</code>. */
      boolean isSimpleType();
      /** Returns true if <code>this instanceof XSComplexType</code>. */
      boolean isComplexType();
  
      /**
       * Lists up types that can substitute this type by using xsi:type.
       * Includes this type itself.
       * <p>
       * This method honors the block flag.
       */
      XSType[] listSubstitutables();
  
      /**
       * If this {@link XSType} is redefined by another type,
       * return that component.
       *
       * @return null
       *      if this component has not been redefined.
       */
      XSType getRedefinedBy();
  
      /**
       * Returns the number of complex types that redefine this component.
       *
       * <p>
       * For example, if A is redefined by B and B is redefined by C,
       * A.getRedefinedCount()==2, B.getRedefinedCount()==1, and
       * C.getRedefinedCount()==0.
       */
      int getRedefinedCount();
  
  
      /** Casts this object to XSSimpleType if possible, otherwise returns null. */
      XSSimpleType asSimpleType();
      /** Casts this object to XSComplexType if possible, otherwise returns null. */
      XSComplexType asComplexType();
  
      /**
       * Returns true if this type is derived from the specified type.
       *
       * <p>
       * Note that <tt>t.isDerivedFrom(t)</tt> returns true.
       */
      boolean isDerivedFrom( XSType t );
  }
  