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;
  
  import java.util.List;
  import java.util.Set;
  
  /**
   * Element declaration.
   * 
   * @author
   *  Kohsuke Kawaguchi (kohsuke.kawaguchi@sun.com)
   */
  public interface XSElementDecl extends XSDeclaration, XSTerm
  {
      XSType getType();
  
      boolean isNillable();
  
      XSElementDecl getSubstAffiliation();
  
      /**
       * Returns all the {@link XSIdentityConstraint}s in this element decl.
       *
       * @return
       *      never null, but can be empty.
       */
      List<XSIdentityConstraint> getIdentityConstraints();
  
      /**
       * Checks the substitution excluded property of the schema component.
       * 
       * IOW, this checks the value of the <code>final</code> attribute
       * (plus <code>finalDefault</code>).
       * 
       * @param method
       *      Possible values are {@link XSType.EXTENSION} or 
       *      <code>XSType.RESTRICTION</code>.
       */
      boolean isSubstitutionExcluded(int method);
  
      /**
       * Checks the diallowed substitution property of the schema component.
       * 
       * IOW, this checks the value of the <code>block</code> attribute
       * (plus <code>blockDefault</code>).
       * 
       * @param method
       *      Possible values are {@link XSType.EXTENSION},
       *      <code>XSType.RESTRICTION</code>, or <code>XSType.SUBSTITUTION</code>
       */
      boolean isSubstitutionDisallowed(int method);
  
      boolean isAbstract();
  
      /**
       * Returns the element declarations that can substitute
       * this element.
       * 
       * <p>
       * IOW, this set returns all the element decls that satisfies
       * <a href="http://www.w3.org/TR/xmlschema-1/#cos-equiv-derived-ok-rec">
       * the "Substitution Group OK" constraint.
       * </a>
       * 
       * @return
       *      nun-null valid array. The return value always contains this element
       *      decl itself. 
       * 
       * @deprecated
       *      this method allocates a new array every time, so it could be
       *      inefficient when working with a large schema. Use
       *      {@link #getSubstitutables()} instead.
       */
      XSElementDecl[] listSubstitutables();
      
      /**
       * Returns the element declarations that can substitute
       * this element.
       * 
       * <p>
       * IOW, this set returns all the element decls that satisfies
       * <a href="http://www.w3.org/TR/xmlschema-1/#cos-equiv-derived-ok-rec">
       * the "Substitution Group OK" constraint.
       * </a>
       * 
       * <p>
       * Note that the above clause does <em>NOT</em> check for
       * abstract elements. So abstract elements may still show up
       * in the returned set.
       * 
       * @return
       *      nun-null unmodifiable list.
       *      The returned list always contains this element decl itself. 
       */
      Set<? extends XSElementDecl> getSubstitutables();
      
      /**
       * Returns true if this element declaration can be validly substituted
       * by the given declaration.
       * 
       * <p>
       * Just a short cut of <tt>getSubstitutables().contain(e);</tt>
       */
      boolean canBeSubstitutedBy(XSElementDecl e);
  
      // TODO: identitiy constraints
      // TODO: scope
  
      XmlString getDefaultValue();
      XmlString getFixedValue();
  }
  