[389245] Fix wrong line endings in repo
diff --git a/doc/org.eclipse.xsd.cheatsheets/plugin.xml b/doc/org.eclipse.xsd.cheatsheets/plugin.xml
index 751aa76..e6f1bc4 100644
--- a/doc/org.eclipse.xsd.cheatsheets/plugin.xml
+++ b/doc/org.eclipse.xsd.cheatsheets/plugin.xml
@@ -1,16 +1,16 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<?eclipse version="3.2"?>

-<plugin>

-   <extension point="org.eclipse.ui.cheatsheets.cheatSheetContent">

-      <cheatsheet

-            category="org.eclipse.emf"

-            composite="false"

-            contentFile="cheatsheets/GenerateEMFFromXSD.xml"

-            id="org.eclipse.emf.genEMFModXSD"

-            name="%_UI_CheatsheetGenXSD_title">

-         <description>

-            %_UI_CheatsheetGenXSD_description

-         </description>

-      </cheatsheet>

-   </extension>

-</plugin>

+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension point="org.eclipse.ui.cheatsheets.cheatSheetContent">
+      <cheatsheet
+            category="org.eclipse.emf"
+            composite="false"
+            contentFile="cheatsheets/GenerateEMFFromXSD.xml"
+            id="org.eclipse.emf.genEMFModXSD"
+            name="%_UI_CheatsheetGenXSD_title">
+         <description>
+            %_UI_CheatsheetGenXSD_description
+         </description>
+      </cheatsheet>
+   </extension>
+</plugin>
diff --git a/doc/org.eclipse.xsd.doc/org.eclipse.xsd.doc_OLD_build.xml b/doc/org.eclipse.xsd.doc/org.eclipse.xsd.doc_OLD_build.xml
index df740f3..f9a266d 100755
--- a/doc/org.eclipse.xsd.doc/org.eclipse.xsd.doc_OLD_build.xml
+++ b/doc/org.eclipse.xsd.doc/org.eclipse.xsd.doc_OLD_build.xml
@@ -3,7 +3,7 @@
 	
 	<!-- Plug-in information.  This is a HACK.  Do not forget to update version numbers, etc.. -->
 	<property name="pluginVersion" value="2.4.0"/>
-	<property name="docPlugin" value="org.eclipse.xsd.doc"/>

+	<property name="docPlugin" value="org.eclipse.xsd.doc"/>
 	
 	<property name="filesToInclude" value="META-INF/**,about.*,modeling*.png,plugin.*,doc.zip,toc*.xml,topics_*.xml,index/**,images/**,tutorials/**,references/**,css/**"/>
 
diff --git a/plugins/org.eclipse.xsd.ecore.exporter/.gitignore b/plugins/org.eclipse.xsd.ecore.exporter/.gitignore
index d0f0b10..4c49b59 100644
--- a/plugins/org.eclipse.xsd.ecore.exporter/.gitignore
+++ b/plugins/org.eclipse.xsd.ecore.exporter/.gitignore
@@ -1,6 +1,6 @@
-bin

-bin.tasks

-build.xml

-ant_tasks

-temp.folder

-*.jar

+bin
+bin.tasks
+build.xml
+ant_tasks
+temp.folder
+*.jar
diff --git a/plugins/org.eclipse.xsd/src/org/eclipse/xsd/impl/XSDSimpleTypeDefinitionImpl.java b/plugins/org.eclipse.xsd/src/org/eclipse/xsd/impl/XSDSimpleTypeDefinitionImpl.java
index 7d562ba..63123f0 100644
--- a/plugins/org.eclipse.xsd/src/org/eclipse/xsd/impl/XSDSimpleTypeDefinitionImpl.java
+++ b/plugins/org.eclipse.xsd/src/org/eclipse/xsd/impl/XSDSimpleTypeDefinitionImpl.java
@@ -1,4291 +1,4291 @@
-/**

- * Copyright (c) 2002-2007 IBM Corporation and others.

- * All rights reserved.   This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- * 

- * Contributors: 

- *   IBM - Initial API and implementation

- */

-package org.eclipse.xsd.impl;

-

-

-import java.text.MessageFormat;

-import java.util.ArrayList;

-import java.util.Collection;

-import java.util.Collections;

-import java.util.Iterator;

-import java.util.List;

-import java.util.ListIterator;

-import java.util.Map;

-import java.util.StringTokenizer;

-

-import org.w3c.dom.Element;

-import org.w3c.dom.Node;

-

-import org.eclipse.emf.common.notify.Notification;

-import org.eclipse.emf.common.notify.NotificationChain;

-import org.eclipse.emf.common.util.BasicEList;

-import org.eclipse.emf.common.util.EList;

-import org.eclipse.emf.common.util.UniqueEList;

-import org.eclipse.emf.ecore.EAttribute;

-import org.eclipse.emf.ecore.EClass;

-import org.eclipse.emf.ecore.EReference;

-import org.eclipse.emf.ecore.InternalEObject;

-import org.eclipse.emf.ecore.impl.ENotificationImpl;

-import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;

-import org.eclipse.emf.ecore.util.EObjectContainmentEList;

-import org.eclipse.emf.ecore.util.EObjectEList;

-import org.eclipse.emf.ecore.util.EcoreEList;

-import org.eclipse.emf.ecore.util.InternalEList;

-

-import org.eclipse.xsd.XSDAnnotation;

-import org.eclipse.xsd.XSDBoundedFacet;

-import org.eclipse.xsd.XSDCardinality;

-import org.eclipse.xsd.XSDCardinalityFacet;

-import org.eclipse.xsd.XSDComplexTypeDefinition;

-import org.eclipse.xsd.XSDComponent;

-import org.eclipse.xsd.XSDConcreteComponent;

-import org.eclipse.xsd.XSDConstrainingFacet;

-import org.eclipse.xsd.XSDDerivationMethod;

-import org.eclipse.xsd.XSDDiagnostic;

-import org.eclipse.xsd.XSDDiagnosticSeverity;

-import org.eclipse.xsd.XSDEnumerationFacet;

-import org.eclipse.xsd.XSDFacet;

-import org.eclipse.xsd.XSDFactory;

-import org.eclipse.xsd.XSDFeature;

-import org.eclipse.xsd.XSDFractionDigitsFacet;

-import org.eclipse.xsd.XSDFundamentalFacet;

-import org.eclipse.xsd.XSDLengthFacet;

-import org.eclipse.xsd.XSDMaxExclusiveFacet;

-import org.eclipse.xsd.XSDMaxFacet;

-import org.eclipse.xsd.XSDMaxInclusiveFacet;

-import org.eclipse.xsd.XSDMaxLengthFacet;

-import org.eclipse.xsd.XSDMinExclusiveFacet;

-import org.eclipse.xsd.XSDMinFacet;

-import org.eclipse.xsd.XSDMinInclusiveFacet;

-import org.eclipse.xsd.XSDMinLengthFacet;

-import org.eclipse.xsd.XSDNumericFacet;

-import org.eclipse.xsd.XSDOrdered;

-import org.eclipse.xsd.XSDOrderedFacet;

-import org.eclipse.xsd.XSDPackage;

-import org.eclipse.xsd.XSDParticle;

-import org.eclipse.xsd.XSDPatternFacet;

-import org.eclipse.xsd.XSDPlugin;

-import org.eclipse.xsd.XSDProhibitedSubstitutions;

-import org.eclipse.xsd.XSDRedefine;

-import org.eclipse.xsd.XSDSchema;

-import org.eclipse.xsd.XSDSimpleFinal;

-import org.eclipse.xsd.XSDSimpleTypeDefinition;

-import org.eclipse.xsd.XSDTotalDigitsFacet;

-import org.eclipse.xsd.XSDTypeDefinition;

-import org.eclipse.xsd.XSDVariety;

-import org.eclipse.xsd.XSDWhiteSpaceFacet;

-import org.eclipse.xsd.impl.type.XSDAnySimpleType;

-import org.eclipse.xsd.impl.type.XSDTypeRegister;

-import org.eclipse.xsd.util.XSDConstants;

-

-

-/**

- * <!-- begin-user-doc -->

- * An implementation of the model object '<em><b>Simple Type Definition</b></em>'.

- * <!-- end-user-doc -->

- * <p>

- * The following features are implemented:

- * <ul>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getVariety <em>Variety</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFinal <em>Final</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getLexicalFinal <em>Lexical Final</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getValidFacets <em>Valid Facets</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getContents <em>Contents</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFacetContents <em>Facet Contents</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFacets <em>Facets</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMemberTypeDefinitions <em>Member Type Definitions</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFundamentalFacets <em>Fundamental Facets</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getBaseTypeDefinition <em>Base Type Definition</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getPrimitiveTypeDefinition <em>Primitive Type Definition</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getItemTypeDefinition <em>Item Type Definition</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getRootTypeDefinition <em>Root Type Definition</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMinFacet <em>Min Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMaxFacet <em>Max Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMaxInclusiveFacet <em>Max Inclusive Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMinInclusiveFacet <em>Min Inclusive Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMinExclusiveFacet <em>Min Exclusive Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMaxExclusiveFacet <em>Max Exclusive Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getLengthFacet <em>Length Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getWhiteSpaceFacet <em>White Space Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEnumerationFacets <em>Enumeration Facets</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getPatternFacets <em>Pattern Facets</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getCardinalityFacet <em>Cardinality Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getNumericFacet <em>Numeric Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMaxLengthFacet <em>Max Length Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMinLengthFacet <em>Min Length Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getTotalDigitsFacet <em>Total Digits Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFractionDigitsFacet <em>Fraction Digits Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getOrderedFacet <em>Ordered Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getBoundedFacet <em>Bounded Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveMaxFacet <em>Effective Max Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveWhiteSpaceFacet <em>Effective White Space Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveMaxLengthFacet <em>Effective Max Length Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveFractionDigitsFacet <em>Effective Fraction Digits Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectivePatternFacet <em>Effective Pattern Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveEnumerationFacet <em>Effective Enumeration Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveTotalDigitsFacet <em>Effective Total Digits Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveMinLengthFacet <em>Effective Min Length Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveLengthFacet <em>Effective Length Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveMinFacet <em>Effective Min Facet</em>}</li>

- *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getSyntheticFacets <em>Synthetic Facets</em>}</li>

- * </ul>

- * </p>

- *

- * @generated

- */

-public class XSDSimpleTypeDefinitionImpl 

-  extends XSDTypeDefinitionImpl 

-  implements XSDSimpleTypeDefinition

-{

-  /**

-   * The default value of the '{@link #getVariety() <em>Variety</em>}' attribute.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getVariety()

-   * @generated

-   * @ordered

-   */

-  protected static final XSDVariety VARIETY_EDEFAULT = XSDVariety.ATOMIC_LITERAL;

-

-  /**

-   * The offset of the flags representing the value of the '{@link #getVariety() <em>Variety</em>}' attribute.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   * @ordered

-   */

-  protected static final int VARIETY_EFLAG_OFFSET = 8;

-

-  /**

-   * The flags representing the default value of the '{@link #getVariety() <em>Variety</em>}' attribute.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   * @ordered

-   */

-  protected static final int VARIETY_EFLAG_DEFAULT = VARIETY_EDEFAULT.ordinal() << VARIETY_EFLAG_OFFSET;

-

-  /**

-   * The array of enumeration values for '{@link XSDVariety Variety}'

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   * @ordered

-   */

-  private static final XSDVariety[] VARIETY_EFLAG_VALUES = XSDVariety.values();

-

-  /**

-   * The flags representing the value of the '{@link #getVariety() <em>Variety</em>}' attribute.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getVariety()

-   * @generated

-   * @ordered

-   */

-  protected static final int VARIETY_EFLAG = 0x3 << VARIETY_EFLAG_OFFSET;

-

-  /**

-   * The flag representing whether the Variety attribute has been set.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   * @ordered

-   */

-  protected static final int VARIETY_ESETFLAG = 1 << 10;

-

-  /**

-   * The cached value of the '{@link #getFinal() <em>Final</em>}' attribute list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getFinal()

-   * @generated

-   * @ordered

-   */

-  protected EList<XSDSimpleFinal> final_;

-

-  /**

-   * The cached value of the '{@link #getLexicalFinal() <em>Lexical Final</em>}' attribute list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getLexicalFinal()

-   * @generated

-   * @ordered

-   */

-  protected EList<XSDSimpleFinal> lexicalFinal;

-

-  /**

-   * The cached value of the '{@link #getValidFacets() <em>Valid Facets</em>}' attribute list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getValidFacets()

-   * @generated

-   * @ordered

-   */

-  protected EList<String> validFacets;

-

-  /**

-   * The cached value of the '{@link #getContents() <em>Contents</em>}' containment reference list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getContents()

-   * @generated

-   * @ordered

-   */

-  protected EList<XSDSimpleTypeDefinition> contents;

-

-  /**

-   * The cached value of the '{@link #getFacetContents() <em>Facet Contents</em>}' containment reference list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getFacetContents()

-   * @generated NOT

-   * @ordered

-   */

-  protected EcoreEList<XSDConstrainingFacet> facetContents = null;

-

-  /**

-   * The cached value of the '{@link #getFacets() <em>Facets</em>}' reference list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getFacets()

-   * @generated NOT

-   * @ordered

-   */

-  protected EcoreEList<XSDConstrainingFacet> facets = null;

-

-  /**

-   * The cached value of the '{@link #getMemberTypeDefinitions() <em>Member Type Definitions</em>}' reference list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getMemberTypeDefinitions()

-   * @generated

-   * @ordered

-   */

-  protected EList<XSDSimpleTypeDefinition> memberTypeDefinitions;

-

-  /**

-   * The cached value of the '{@link #getFundamentalFacets() <em>Fundamental Facets</em>}' containment reference list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getFundamentalFacets()

-   * @generated

-   * @ordered

-   */

-  protected EList<XSDFundamentalFacet> fundamentalFacets;

-

-  /**

-   * The cached value of the '{@link #getBaseTypeDefinition() <em>Base Type Definition</em>}' reference.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getBaseTypeDefinition()

-   * @generated

-   * @ordered

-   */

-  protected XSDSimpleTypeDefinition baseTypeDefinition;

-

-  /**

-   * The cached value of the '{@link #getPrimitiveTypeDefinition() <em>Primitive Type Definition</em>}' reference.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getPrimitiveTypeDefinition()

-   * @generated

-   * @ordered

-   */

-  protected XSDSimpleTypeDefinition primitiveTypeDefinition;

-

-  /**

-   * The cached value of the '{@link #getItemTypeDefinition() <em>Item Type Definition</em>}' reference.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getItemTypeDefinition()

-   * @generated

-   * @ordered

-   */

-  protected XSDSimpleTypeDefinition itemTypeDefinition;

-

-  /**

-   * The cached value of the '{@link #getSyntheticFacets() <em>Synthetic Facets</em>}' containment reference list.

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @see #getSyntheticFacets()

-   * @generated

-   * @ordered

-   */

-  protected EList<XSDFacet> syntheticFacets;

-

-  public static XSDSimpleTypeDefinition createSimpleTypeDefinition(Node node)

-  {

-    switch (XSDConstants.nodeType(node))

-    {

-      case XSDConstants.SIMPLETYPE_ELEMENT:

-      case XSDConstants.SIMPLECONTENT_ELEMENT:

-      {

-        XSDSimpleTypeDefinition xsdSimpleTypeDefinition = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();

-        xsdSimpleTypeDefinition.setElement((Element)node);

-        return xsdSimpleTypeDefinition;

-      }

-    }

-

-    return null;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  protected XSDSimpleTypeDefinitionImpl()

-  {

-    super();

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  @Override

-  protected EClass eStaticClass()

-  {

-    return XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public XSDVariety getVariety()

-  {

-    return VARIETY_EFLAG_VALUES[(eFlags & VARIETY_EFLAG) >>> VARIETY_EFLAG_OFFSET];

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public void setVariety(XSDVariety newVariety)

-  {

-    XSDVariety oldVariety = VARIETY_EFLAG_VALUES[(eFlags & VARIETY_EFLAG) >>> VARIETY_EFLAG_OFFSET];

-    if (newVariety == null) newVariety = VARIETY_EDEFAULT;

-    eFlags = eFlags & ~VARIETY_EFLAG | newVariety.ordinal() << VARIETY_EFLAG_OFFSET;

-    boolean oldVarietyESet = (eFlags & VARIETY_ESETFLAG) != 0;

-    eFlags |= VARIETY_ESETFLAG;

-    if (eNotificationRequired())

-      eNotify(new ENotificationImpl(this, Notification.SET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY, oldVariety, newVariety, !oldVarietyESet));

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public void unsetVariety()

-  {

-    XSDVariety oldVariety = VARIETY_EFLAG_VALUES[(eFlags & VARIETY_EFLAG) >>> VARIETY_EFLAG_OFFSET];

-    boolean oldVarietyESet = (eFlags & VARIETY_ESETFLAG) != 0;

-    eFlags = eFlags & ~VARIETY_EFLAG | VARIETY_EFLAG_DEFAULT;

-    eFlags &= ~VARIETY_ESETFLAG;

-    if (eNotificationRequired())

-      eNotify(new ENotificationImpl(this, Notification.UNSET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY, oldVariety, VARIETY_EDEFAULT, oldVarietyESet));

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public boolean isSetVariety()

-  {

-    return (eFlags & VARIETY_ESETFLAG) != 0;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<XSDSimpleFinal> getFinal()

-  {

-    if (final_ == null)

-    {

-      final_ = new EDataTypeUniqueEList<XSDSimpleFinal>(XSDSimpleFinal.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL);

-    }

-    return final_;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<XSDSimpleFinal> getLexicalFinal()

-  {

-    if (lexicalFinal == null)

-    {

-      lexicalFinal = new EDataTypeUniqueEList.Unsettable<XSDSimpleFinal>(XSDSimpleFinal.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL);

-    }

-    return lexicalFinal;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public void unsetLexicalFinal()

-  {

-    if (lexicalFinal != null) ((InternalEList.Unsettable<?>)lexicalFinal).unset();

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public boolean isSetLexicalFinal()

-  {

-    return lexicalFinal != null && ((InternalEList.Unsettable<?>)lexicalFinal).isSet();

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<String> getValidFacets()

-  {

-    if (validFacets == null)

-    {

-      validFacets = new EDataTypeUniqueEList<String>(String.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS);

-    }

-    return validFacets;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<XSDSimpleTypeDefinition> getContents()

-  {

-    if (contents == null)

-    {

-      contents = new EObjectContainmentEList<XSDSimpleTypeDefinition>(XSDSimpleTypeDefinition.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS);

-    }

-    return contents;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<XSDConstrainingFacet> getFacetContents()

-  {

-    if (facetContents == null)

-    {

-      facetContents = new EObjectContainmentEList<XSDConstrainingFacet>(XSDConstrainingFacet.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS);

-    }

-    return facetContents;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<XSDConstrainingFacet> getFacets()

-  {

-    if (facets == null)

-    {

-      facets = new EObjectEList<XSDConstrainingFacet>(XSDConstrainingFacet.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS);

-    }

-    return facets;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<XSDSimpleTypeDefinition> getMemberTypeDefinitions()

-  {

-    if (memberTypeDefinitions == null)

-    {

-      memberTypeDefinitions = new EObjectEList<XSDSimpleTypeDefinition>(XSDSimpleTypeDefinition.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS);

-    }

-    return memberTypeDefinitions;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<XSDFundamentalFacet> getFundamentalFacets()

-  {

-    if (fundamentalFacets == null)

-    {

-      fundamentalFacets = new EObjectContainmentEList<XSDFundamentalFacet>(XSDFundamentalFacet.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS);

-    }

-    return fundamentalFacets;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public XSDSimpleTypeDefinition getBaseTypeDefinition()

-  {

-    return baseTypeDefinition;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public void setBaseTypeDefinition(XSDSimpleTypeDefinition newBaseTypeDefinition)

-  {

-    XSDSimpleTypeDefinition oldBaseTypeDefinition = baseTypeDefinition;

-    baseTypeDefinition = newBaseTypeDefinition;

-    if (eNotificationRequired())

-      eNotify(new ENotificationImpl(this, Notification.SET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION, oldBaseTypeDefinition, baseTypeDefinition));

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public XSDSimpleTypeDefinition getPrimitiveTypeDefinition()

-  {

-    return primitiveTypeDefinition;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public void setPrimitiveTypeDefinition(XSDSimpleTypeDefinition newPrimitiveTypeDefinition)

-  {

-    XSDSimpleTypeDefinition oldPrimitiveTypeDefinition = primitiveTypeDefinition;

-    primitiveTypeDefinition = newPrimitiveTypeDefinition;

-    if (eNotificationRequired())

-      eNotify(new ENotificationImpl(this, Notification.SET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION, oldPrimitiveTypeDefinition, primitiveTypeDefinition));

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public XSDSimpleTypeDefinition getItemTypeDefinition()

-  {

-    return itemTypeDefinition;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public void setItemTypeDefinition(XSDSimpleTypeDefinition newItemTypeDefinition)

-  {

-    XSDSimpleTypeDefinition oldItemTypeDefinition = itemTypeDefinition;

-    itemTypeDefinition = newItemTypeDefinition;

-    if (eNotificationRequired())

-      eNotify(new ENotificationImpl(this, Notification.SET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION, oldItemTypeDefinition, itemTypeDefinition));

-  }

-

-  @Override

-  public Element createElement()

-  {

-    XSDComplexTypeDefinition xsdComplexTypeDefinition =

-      getContainer() instanceof XSDComplexTypeDefinition ? 

-        (XSDComplexTypeDefinition)getContainer() :

-        null;

-

-    Element newElement = 

-      createElement

-        (xsdComplexTypeDefinition != null ?

-           XSDConstants.SIMPLECONTENT_ELEMENT : 

-           XSDConstants.SIMPLETYPE_ELEMENT);

-    setElement(newElement);

-

-    Element childElement = createChildElement();

-    newElement.appendChild(childElement);

-    return newElement;

-  }

-

-  protected Element createChildElement()

-  {

-    return createElement(getRequiredChildElementNodeType());

-  }

-

-  protected int getRequiredChildElementNodeType()

-  {

-    XSDComplexTypeDefinition xsdComplexTypeDefinition =

-      getContainer() instanceof XSDComplexTypeDefinition ? 

-        (XSDComplexTypeDefinition)getContainer() :

-        null;

-

-    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();

-    if (getItemTypeDefinition() != null && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))

-    {

-      return XSDConstants.LIST_ELEMENT;

-    }

-    else if (!getMemberTypeDefinitions().isEmpty() && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))

-    {

-      return XSDConstants.UNION_ELEMENT;

-    }

-    else

-    {

-      return

-        xsdComplexTypeDefinition == null || XSDDerivationMethod.EXTENSION_LITERAL != xsdComplexTypeDefinition.getDerivationMethod() ? 

-          XSDConstants.RESTRICTION_ELEMENT :

-          XSDConstants.EXTENSION_ELEMENT;

-    }

-  }

-

-  @Override

-  protected void patch()

-  {

-    super.patch();

-

-    if (!(getContainer() instanceof XSDComplexTypeDefinition))

-    {

-      XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();

-      if (theBaseTypeDefinition != null && (forceResolve || theBaseTypeDefinition.getContainer() == null))

-      {

-        theBaseTypeDefinition = resolveSimpleTypeDefinition(theBaseTypeDefinition.getTargetNamespace(), theBaseTypeDefinition.getName());

-      }

-      theBaseTypeDefinition = handleNewBaseTypeDefinition(theBaseTypeDefinition);

-      if (theBaseTypeDefinition == null || !theBaseTypeDefinition.isSetVariety() || theBaseTypeDefinition.getVariety() != getVariety())

-      {

-        XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();

-        if (theItemTypeDefinition != null)

-        {

-          if (forceResolve || theItemTypeDefinition.getContainer() == null)

-          {

-            XSDSimpleTypeDefinition newItemTypeDefinition = 

-              resolveSimpleTypeDefinition(theItemTypeDefinition.getTargetNamespace(), theItemTypeDefinition.getName());

-            if ((forceResolve || newItemTypeDefinition.getContainer() != null) && newItemTypeDefinition != theItemTypeDefinition)

-            {

-              setItemTypeDefinition(newItemTypeDefinition);

-            }

-          }

-        }

-        else

-        {

-          for (ListIterator<XSDSimpleTypeDefinition> theMemberTypeDefinitions = getMemberTypeDefinitions().listIterator(); 

-               theMemberTypeDefinitions.hasNext(); )

-          {

-            XSDSimpleTypeDefinition theMemberTypeDefinition = theMemberTypeDefinitions.next();

-            if (forceResolve || theMemberTypeDefinition.getContainer() == null)

-            {

-              XSDSimpleTypeDefinition newMemberTypeDefinition = 

-                resolveSimpleTypeDefinition(theMemberTypeDefinition.getTargetNamespace(), theMemberTypeDefinition.getName());

-              if ((forceResolve || newMemberTypeDefinition.getContainer() != null) && newMemberTypeDefinition != theMemberTypeDefinition)

-              {

-                theMemberTypeDefinitions.set(newMemberTypeDefinition);

-              }

-            }

-          }

-        }

-      }

-    }

-

-    XSDSchema xsdSchema = getSchema();

-    if (xsdSchema != null)

-    {

-      List<XSDSimpleFinal> newFinal = new ArrayList<XSDSimpleFinal>();

-      if (!isSetLexicalFinal())

-      {

-        for (XSDProhibitedSubstitutions value : xsdSchema.getFinalDefault())

-        {

-          switch (value.getValue())

-          {

-            case XSDProhibitedSubstitutions.ALL:

-            {

-              newFinal.add(XSDSimpleFinal.RESTRICTION_LITERAL);

-              newFinal.add(XSDSimpleFinal.LIST_LITERAL);

-              newFinal.add(XSDSimpleFinal.UNION_LITERAL);

-              break;

-            }

-            case XSDProhibitedSubstitutions.RESTRICTION:

-            {

-              newFinal.add(XSDSimpleFinal.RESTRICTION_LITERAL);

-              break;

-            }

-          }

-        }

-      }

-      else

-      {

-        for (XSDSimpleFinal value : getLexicalFinal())

-        {

-          switch (value.getValue())

-          {

-            case XSDSimpleFinal.ALL:

-            {

-              newFinal.add(XSDSimpleFinal.RESTRICTION_LITERAL);

-              newFinal.add(XSDSimpleFinal.LIST_LITERAL);

-              newFinal.add(XSDSimpleFinal.UNION_LITERAL);

-              break;

-            }

-            default:

-            {

-              newFinal.add(value);

-              break;

-            }

-          }

-        }

-      }

-

-      Collection<XSDSimpleFinal> oldFinal = new ArrayList<XSDSimpleFinal>(getFinal());

-      oldFinal.removeAll(newFinal);

-      if (!oldFinal.isEmpty())

-      {

-        getFinal().removeAll(oldFinal);

-      }

-      setListContentAndOrder(getFinal(), newFinal);

-    }

-  }

-

-  @Override

-  protected void traverseToRootForAnalysis()

-  {

-    analysisState = UNANALYZED;

-    super.traverseToRootForAnalysis();

-  }

-

-  protected XSDWhiteSpaceFacet effectiveWhiteSpaceFacet;

-  @Override

-  protected void handleAnalysis()

-  {

-    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();

-

-    XSDConcreteComponent container = getContainer();

-    if (container instanceof XSDComplexTypeDefinition)

-    {

-      if (!getContents().contains(theBaseTypeDefinition))

-      {

-        XSDComplexTypeDefinition xsdComplexTypeDefinition = (XSDComplexTypeDefinitionImpl)container;

-        XSDTypeDefinition complexBaseTypeDefinition = xsdComplexTypeDefinition.getBaseTypeDefinition();

-        if (complexBaseTypeDefinition != null)

-        {

-          ((XSDConcreteComponentImpl)complexBaseTypeDefinition).analyze();

-          theBaseTypeDefinition = handleNewBaseTypeDefinition(complexBaseTypeDefinition.getSimpleType());

-        }

-      }

-    }

-

-    if (getFundamentalFacets().isEmpty())

-    {

-      createFundamentalFacets();

-    }

-

-    List<XSDConstrainingFacet> newFacets = null;

-    boolean newBounded = false;

-    XSDCardinality newCardinality = XSDCardinality.FINITE_LITERAL;

-    boolean newNumeric = false;

-    XSDOrdered newOrdered = XSDOrdered.FALSE_LITERAL;

-    XSDSimpleTypeDefinition newPrimitiveTypeDefinition = null;

-    XSDVariety newVariety = null;

-    EList<String> newValidFacets = null;

-

-    if (theBaseTypeDefinition != null && theBaseTypeDefinition.getContainer() != null)

-    {

-      if (!((XSDConcreteComponentImpl)theBaseTypeDefinition).analyze() && !XSDConstants.isURType(theBaseTypeDefinition) && theBaseTypeDefinition.isCircular())

-      {

-        analysisState = CIRCULAR;

-      }

-      if (theBaseTypeDefinition != this)

-      {

-        if (!XSDConstants.isURType(this))

-        {

-          newVariety = XSDVariety.ATOMIC_LITERAL;

-          newPrimitiveTypeDefinition = this;

-        }

-

-        if (!XSDConstants.isURType(theBaseTypeDefinition))

-        {

-          newVariety = theBaseTypeDefinition.getVariety();

-          newPrimitiveTypeDefinition = theBaseTypeDefinition.getPrimitiveTypeDefinition();

-          newBounded = theBaseTypeDefinition.getBoundedFacet().isValue();

-          newCardinality = theBaseTypeDefinition.getCardinalityFacet().getValue();

-          newNumeric = theBaseTypeDefinition.getNumericFacet().isValue();

-          newOrdered = theBaseTypeDefinition.getOrderedFacet().getValue();

-          newValidFacets = theBaseTypeDefinition.getValidFacets();

-

-          if (XSDVariety.LIST_LITERAL == theBaseTypeDefinition.getVariety())

-          {

-            XSDSimpleTypeDefinition newItemTypeDefinition = theBaseTypeDefinition.getItemTypeDefinition();

-            if (newItemTypeDefinition != getItemTypeDefinition())

-            {

-              setItemTypeDefinition(newItemTypeDefinition);

-            }

-          }

-          else if (XSDVariety.UNION_LITERAL == theBaseTypeDefinition.getVariety())

-          {

-            List<XSDSimpleTypeDefinition> newMemberTypeDefinitions = theBaseTypeDefinition.getMemberTypeDefinitions();

-            List<XSDSimpleTypeDefinition> remainingMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>(getMemberTypeDefinitions());

-            remainingMemberTypeDefinitions.removeAll(newMemberTypeDefinitions);

-            if (!remainingMemberTypeDefinitions.isEmpty())

-            {

-              getMemberTypeDefinitions().removeAll(remainingMemberTypeDefinitions);

-            }

-            if (!newMemberTypeDefinitions.isEmpty())

-            {

-              setListContentAndOrder(getMemberTypeDefinitions(), newMemberTypeDefinitions);

-            }

-          }

-        }

-        else

-        {

-          newFacets = new ArrayList<XSDConstrainingFacet>(getFacetContents());

-        }

-      }

-      else

-      {

-        newFacets = new ArrayList<XSDConstrainingFacet>(getFacetContents());

-      }

-    }

-    else

-    {

-      newFacets = new ArrayList<XSDConstrainingFacet>(getFacetContents());

-    }

-

-    if (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition))

-    {

-      XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();

-      if (theItemTypeDefinition != null && theItemTypeDefinition.getContainer() != null)

-      {

-        newVariety = XSDVariety.LIST_LITERAL;

-        newPrimitiveTypeDefinition = null;

-        if (!((XSDConcreteComponentImpl)theItemTypeDefinition).analyze() && !XSDConstants.isURType(theItemTypeDefinition) && theItemTypeDefinition.isCircular())

-        {

-          analysisState = CIRCULAR;

-        }

-        newValidFacets = getValidFacetsForList();

-        if (effectiveWhiteSpaceFacet == null)

-        {

-          effectiveWhiteSpaceFacet = getXSDFactory().createXSDWhiteSpaceFacet();

-          effectiveWhiteSpaceFacet.setLexicalValue("collapse");

-          effectiveWhiteSpaceFacet.setFixed(true);

-          getSyntheticFacets().add(effectiveWhiteSpaceFacet);

-        }

-        if (newFacets != null)

-        {

-          newFacets.add(effectiveWhiteSpaceFacet);

-        }

-      }

-      else if (!getMemberTypeDefinitions().isEmpty())

-      {

-        newVariety = XSDVariety.UNION_LITERAL;

-        newPrimitiveTypeDefinition = null;

-        newNumeric = true;

-        for (XSDSimpleTypeDefinition theMemberTypeDefinition : getMemberTypeDefinitions())

-        {

-          if (theMemberTypeDefinition.getContainer() != null)

-          {

-            if (!((XSDConcreteComponentImpl)theMemberTypeDefinition).analyze() && !XSDConstants.isURType(theMemberTypeDefinition) && theMemberTypeDefinition.isCircular())

-            {

-              analysisState = CIRCULAR;

-            }

-            if (!theMemberTypeDefinition.getNumericFacet().isValue())

-            {

-              newNumeric = false;

-            }

-          }

-        }

-

-        XSDTypeDefinition lowestCommonAncestor = getLowestCommonAncestor(getMemberTypeDefinitions());

-        if (lowestCommonAncestor instanceof XSDSimpleTypeDefinition && lowestCommonAncestor.getContainer() != null)

-        {

-          newOrdered = ((XSDSimpleTypeDefinition)lowestCommonAncestor).getOrderedFacet().getValue();

-        }

-        newValidFacets = getValidFacetsForUnion();

-      }

-      else if (getElement() != null)

-      {

-        LOOP:

-        for (Node child = getElement().getFirstChild(); child != null; child = child.getNextSibling())

-        {

-          switch (XSDConstants.nodeType(child))

-          {

-            case XSDConstants.UNION_ELEMENT:

-            {

-              newVariety = XSDVariety.UNION_LITERAL;

-              newPrimitiveTypeDefinition = null;

-              newValidFacets = getValidFacetsForUnion();

-              break LOOP;

-            }

-            case XSDConstants.LIST_ELEMENT:

-            {

-              newVariety = XSDVariety.LIST_LITERAL;

-              newPrimitiveTypeDefinition = null;

-              newValidFacets = getValidFacetsForList();

-              break LOOP;

-            }

-          }

-        }

-      }

-    }

-

-    if (newVariety != null)

-    {

-      if (!isSetVariety() || newVariety != getVariety())

-      {

-        setVariety(newVariety);

-      }

-    }

-    else if (isSetVariety())

-    {

-      unsetVariety();

-    }

-

-    if (newPrimitiveTypeDefinition != getPrimitiveTypeDefinition())

-    {

-      setPrimitiveTypeDefinition(newPrimitiveTypeDefinition);

-    }

-

-    // This ensures the the facets are analyzed when the containing type is relatively well-analyzed.

-    //

-    super.handleAnalysis();

-

-    if (newFacets == null)

-    {

-      newFacets = mergeFacets();

-    }

-

-    XSDAnnotation theAnnotation = getAnnotation();

-    if (theAnnotation != null)

-    {

-      for (Element applicationInformationElement :  theAnnotation.getApplicationInformation())

-      {

-        for (Node child = applicationInformationElement.getFirstChild(); child != null; child = child.getNextSibling())

-        {

-          switch (XSDConstants.hfpNodeType(child))

-          {

-            case XSDConstants.HFP_HASFACET_ELEMENT:

-            {

-              Element childElement = (Element)child;

-              String facetName = childElement.getAttributeNS(null, XSDConstants.HFP_NAME_ATTRIBUTE);

-              if (newValidFacets == null)

-              {

-                newValidFacets = new BasicEList<String>();

-              }

-              newValidFacets.add(facetName);

-              break;

-            }

-            case XSDConstants.HFP_HASPROPERTY_ELEMENT:

-            {

-              Element childElement = (Element)child;

-              String propertyName = childElement.getAttributeNS(null, XSDConstants.HFP_NAME_ATTRIBUTE);

-              String propertyValue = childElement.getAttributeNS(null, XSDConstants.HFP_VALUE_ATTRIBUTE);

-              if ("bounded".equals(propertyName))

-              {

-                newBounded = "true".equals(propertyValue);

-              }

-              else if ("cardinality".equals(propertyName))

-              {

-                newCardinality = 

-                  "countably infinite".equals(propertyValue) ? 

-                    XSDCardinality.COUNTABLY_INFINITE_LITERAL : 

-                    XSDCardinality.get(propertyValue);

-              }

-              else if ("numeric".equals(propertyName))

-              {

-                newNumeric = "true".equals(propertyValue);

-              }

-              else if ("ordered".equals(propertyName))

-              {

-                newOrdered = XSDOrdered.get(propertyValue);

-              }

-              break;

-            }

-          }

-        }

-      }

-    }

-

-

-    if (!XSDConstants.isURType(this))

-    {

-      if (newBounded != getBoundedFacet().isValue() /* || !getBoundedFacet().isSetValue()*/)

-      {

-        getBoundedFacet().setValue(newBounded);

-      }

-      if (newCardinality != getCardinalityFacet().getValue() /* || !getCardinalityFacet().isSetValue()*/)

-      {

-        getCardinalityFacet().setValue(newCardinality);

-      }

-      if (newNumeric != getNumericFacet().isValue() /* || !getNumericFacet().isSetValue()*/)

-      {

-        getNumericFacet().setValue(newNumeric);

-      }

-      if (newOrdered == null)

-      {

-        newOrdered = XSDOrdered.FALSE_LITERAL;

-      }

-      if (newOrdered != getOrderedFacet().getValue() /* || !getOrderedFacet().isSetValue()*/)

-      {

-        getOrderedFacet().setValue(newOrdered);

-      }

-    }

-

-    if (newFacets == null)

-    {

-      if (!getFacets().isEmpty())

-      {

-        getFacets().clear();

-      }

-    }

-    else

-    {

-      List<XSDFacet> remainingFacets = new ArrayList<XSDFacet>(getFacets());

-      remainingFacets.removeAll(newFacets);

-      getFacets().removeAll(remainingFacets);

-      if (!newFacets.isEmpty())

-      {

-        setListContentAndOrder(getFacets(), newFacets);

-      }

-    }

-

-    if (newValidFacets == null)

-    {

-      if (!getValidFacets().isEmpty())

-      {

-        getValidFacets().clear();

-      }

-    }

-    else

-    {

-      List<String> remainingValidFacets = new ArrayList<String>(getValidFacets());

-      remainingValidFacets.removeAll(newValidFacets);

-      getValidFacets().removeAll(remainingValidFacets);

-      if (!newValidFacets.isEmpty())

-      {

-        setListContentAndOrder(getValidFacets(), newValidFacets);

-      }

-    }

-  }

-

-  @Override

-  public void validate()

-  {

-    super.validate();

-

-    Element theElement = getElement();

-    Element theRestrictionElement = null;

-    if (theElement != null)

-    {

-      String anchor;

-      if (getContainer() instanceof XSDComplexTypeDefinition)

-      {

-        checkAttributes

-          (XSDConstants.PART2,

-           anchor = "element-simpleContent",

-           theElement,

-           new String []

-           {

-             XSDConstants.ID_ATTRIBUTE

-           });

-

-        XSDComplexTypeDefinition xsdComplexTypeDefinition =

-           (XSDComplexTypeDefinition)getSchema().getSchemaForSchema().resolveElementDeclaration("simpleContent").getTypeDefinition();

-

-        checkComplexContent(xsdComplexTypeDefinition, XSDConstants.PART2, "element-simpleContent", theElement);

-        for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())

-        {

-          switch (XSDConstants.nodeType(child))

-          {

-            case XSDConstants.RESTRICTION_ELEMENT:

-            {

-              Element childElement = (Element)child;

-              theRestrictionElement = childElement;

-  

-              checkAttributes

-                (XSDConstants.PART2,

-                 "element-simpleContent::restriction",

-                 childElement,

-                 new String []

-                 {

-                   XSDConstants.ID_ATTRIBUTE,

-                   XSDConstants.BASE_ATTRIBUTE

-                 });

-

-              checkBuiltInTypeConstraint

-                ("ID",

-                 null,

-                 XSDConstants.PART2,

-                 "element-simpleContent::restriction",

-                 childElement,

-                 XSDConstants.ID_ATTRIBUTE,

-                 false);

-

-              checkComplexContent("simpleRestrictionType", XSDConstants.PART2, "element-simpleContent::restriction", childElement);

-

-              // This is allowed https://bugs.eclipse.org/bugs/show_bug.cgi?id=177035

-              //

-              // if (childElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE) && !getContents().isEmpty())

-              // {

-              //   createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-restriction-base-or-simpleType");

-              // }

-

-              break;

-            }

-            case XSDConstants.EXTENSION_ELEMENT:

-            {

-              Element childElement = (Element)child;

-  

-              checkAttributes

-                (XSDConstants.PART2,

-                 "element-simpleContent::extension",

-                 childElement,

-                 new String []

-                 {

-                   XSDConstants.ID_ATTRIBUTE,

-                   XSDConstants.BASE_ATTRIBUTE

-                 });

-

-              checkBuiltInTypeConstraint

-                ("ID",

-                 null,

-                 XSDConstants.PART2,

-                 "element-simpleContent::extension",

-                 childElement,

-                 XSDConstants.ID_ATTRIBUTE,

-                 false);

-

-              checkComplexContent("simpleExtensionType", XSDConstants.PART2, "element-simpleContent::extension", childElement);

-

-              if (childElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE) && !getContents().isEmpty())

-              {

-                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-restriction-base-or-simpleType");

-              }

-

-              break;

-            }

-          }

-        }

-      }

-      else

-      {

-        if (getContainer() instanceof XSDFeature || getContainer() instanceof XSDSimpleTypeDefinition)

-        {

-          checkAttributes

-            (XSDConstants.PART2,

-             anchor = "element-simpleType",

-             theElement,

-             new String []

-             {

-               XSDConstants.ID_ATTRIBUTE,

-             });

-        }

-        else

-        {

-          checkAttributes

-            (XSDConstants.PART2,

-             anchor = "element-simpleType",

-             theElement,

-             new String []

-             {

-               XSDConstants.FINAL_ATTRIBUTE,

-               XSDConstants.ID_ATTRIBUTE,

-               XSDConstants.NAME_ATTRIBUTE

-             });

-

-          // EATM this is an error in the spec, I believe.

-          //

-          if (theElement.hasAttributeNS(null, XSDConstants.FINAL_ATTRIBUTE))

-          {

-            String value = theElement.getAttributeNS(null, XSDConstants.FINAL_ATTRIBUTE);

-            for (StringTokenizer values = new StringTokenizer(value, " "); values.hasMoreTokens(); )

-            {

-              String token = values.nextToken();

-

-              checkBuiltInTypeConstraint

-                ("simpleDerivationSet",

-                 token,

-                 XSDConstants.PART2,

-                 anchor,

-                 theElement,

-                 XSDConstants.FINAL_ATTRIBUTE,

-                 false);

-            }

-          }

-        }

-

-        checkComplexContent("simpleType", XSDConstants.PART2, "element-simpleType", theElement);

-

-        for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())

-        {

-          switch (XSDConstants.nodeType(child))

-          {

-            case XSDConstants.RESTRICTION_ELEMENT:

-            {

-              Element childElement = (Element)child;

-              theRestrictionElement = childElement;

-  

-              checkAttributes

-                (XSDConstants.PART2,

-                 "element-restriction",

-                 childElement,

-                 new String []

-                 {

-                   XSDConstants.ID_ATTRIBUTE,

-                   XSDConstants.BASE_ATTRIBUTE

-                 });

-

-              checkBuiltInTypeConstraint

-                ("ID",

-                 null,

-                 XSDConstants.PART2,

-                 "element-restriction",

-                 childElement,

-                 XSDConstants.ID_ATTRIBUTE,

-                 false);

-

-              XSDComplexTypeDefinition xsdComplexTypeDefinition =

-                 (XSDComplexTypeDefinition)getSchema().getSchemaForSchema().resolveElementDeclaration("restriction").getTypeDefinition();

-      

-              checkComplexContent(xsdComplexTypeDefinition, XSDConstants.PART2, "element-restriction", childElement);

-

-              if (childElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE)) 

-              {

-                if (!getContents().isEmpty())

-                {

-                  createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-restriction-base-or-simpleType");

-                }

-              }

-              else if (getContents().isEmpty())

-              {

-                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-restriction-base-or-simpleType.0");

-              }

-

-              break;

-            }

-            case XSDConstants.UNION_ELEMENT:

-            {

-              Element childElement = (Element)child;

-  

-              checkAttributes

-                (XSDConstants.PART2,

-                 "element-union",

-                 childElement,

-                 new String []

-                 {

-                   XSDConstants.ID_ATTRIBUTE,

-                   XSDConstants.MEMBERTYPES_ATTRIBUTE

-                 });

-

-              checkBuiltInTypeConstraint

-                ("ID",

-                 null,

-                 XSDConstants.PART2,

-                 "element-union",

-                 childElement,

-                 XSDConstants.ID_ATTRIBUTE,

-                 false);

-

-              XSDComplexTypeDefinition xsdComplexTypeDefinition =

-                 (XSDComplexTypeDefinition)getSchema().getSchemaForSchema().resolveElementDeclaration("union").getTypeDefinition();

-      

-              checkComplexContent(xsdComplexTypeDefinition, XSDConstants.PART2, "element-union", childElement);

-

-              if (getMemberTypeDefinitions().isEmpty())

-              {

-                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-union-memberTypes-or-simpleTypes");

-              }

-

-              break;

-            }

-            case XSDConstants.LIST_ELEMENT:

-            {

-              Element childElement = (Element)child;

-  

-              checkAttributes

-                (XSDConstants.PART2,

-                 "element-list",

-                 childElement,

-                 new String []

-                 {

-                   XSDConstants.ID_ATTRIBUTE,

-                   XSDConstants.ITEMTYPE_ATTRIBUTE

-                 });

-

-              checkBuiltInTypeConstraint

-                ("ID",

-                 null,

-                 XSDConstants.PART2,

-                 "element-list",

-                 childElement,

-                 XSDConstants.ID_ATTRIBUTE,

-                 false);

-

-              XSDComplexTypeDefinition xsdComplexTypeDefinition =

-                 (XSDComplexTypeDefinition)getSchema().getSchemaForSchema().resolveElementDeclaration("list").getTypeDefinition();

-      

-              checkComplexContent(xsdComplexTypeDefinition, XSDConstants.PART2, "element-list", childElement);

-

-              if (childElement.hasAttributeNS(null, XSDConstants.ITEMTYPE_ATTRIBUTE))

-              {

-                if (!getContents().isEmpty())

-                {

-                  createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-list-itemType-or-simpleType");

-                }

-              }

-              else

-              {

-                if (getContents().isEmpty())

-                {

-                  createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-list-itemType-or-simpleType.0");

-                }

-              }

-

-              break;

-            }

-          }

-        }

-      }

-

-      checkBuiltInTypeConstraint

-        ("ID",

-         null,

-         XSDConstants.PART2,

-         anchor,

-         theElement,

-         XSDConstants.ID_ATTRIBUTE,

-         false);

-    }

-

-    if (!(getContainer() instanceof XSDFeature) && !(getContainer() instanceof XSDTypeDefinition))

-    {

-      checkBuiltInTypeConstraint

-        ("NCName",

-         getName(),

-         XSDConstants.PART2,

-         "element-simpleType",

-         theElement,

-         XSDConstants.NAME_ATTRIBUTE,

-         true);

-    }

-

-    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();

-    if (theBaseTypeDefinition == null)

-    {

-      createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", "");

-    }

-    else if (theBaseTypeDefinition.getContainer() == null)

-    {

-      createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", theBaseTypeDefinition.getURI());

-    }

-    else if (isSetVariety())

-    {

-      switch (getVariety().getValue())

-      {

-        case XSDVariety.ATOMIC:

-        {

-          if (theBaseTypeDefinition.getFinal().contains(XSDSimpleFinal.RESTRICTION_LITERAL))

-          {

-            createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.1.2", theBaseTypeDefinition.getURI());

-          }

-          if (isCircular())

-          {

-            reportConstraintViolation

-              (XSDConstants.PART2,

-               "st-props-correct.2",

-               getElement(),

-               XSDConstants.BASE_ATTRIBUTE,

-               new Object [] {});

-          }

-          if (!XSDConstants.isSchemaForSchemaNamespace(getTargetNamespace()) &&

-                XSDConstants.isAnySimpleType(theBaseTypeDefinition) &&

-                (theElement == null || 

-                   theRestrictionElement != null && theRestrictionElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE)))

-          {

-            createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-retricts.0.0", theBaseTypeDefinition.getURI());

-          }

-          break;

-        }

-        case XSDVariety.LIST:

-        {

-          if (!XSDConstants.isURType(theBaseTypeDefinition))

-          {

-            if (theBaseTypeDefinition.getFinal().contains(XSDSimpleFinal.RESTRICTION_LITERAL))

-            {

-              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.1.2", theBaseTypeDefinition.getURI());

-            }

-          }

-          else

-          {

-            XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();

-            if (theItemTypeDefinition == null)

-            {

-              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", "");

-            }

-            else if (theItemTypeDefinition.getContainer() == null)

-            {

-              createDiagnostic

-                (XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", theItemTypeDefinition.getURI());

-            }

-            else if (XSDVariety.ATOMIC_LITERAL != theItemTypeDefinition.getVariety() && 

-                       XSDVariety.UNION_LITERAL != theItemTypeDefinition.getVariety())

-            {

-              reportConstraintViolation

-                (XSDConstants.PART2,

-                 "cos-list-of-atomic",

-                 getElement(),

-                 XSDConstants.ITEMTYPE_ATTRIBUTE,

-                 new Object [] {});

-            }

-            else if (theItemTypeDefinition.getFinal().contains(XSDSimpleFinal.LIST_LITERAL))

-            {

-              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.2.0", theBaseTypeDefinition.getURI());

-            }

-            else if (!XSDConstants.isSchemaForSchemaNamespace(getTargetNamespace()) &&

-                      XSDConstants.isAnySimpleType(theItemTypeDefinition))

-            {

-              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-retricts.0.1", theItemTypeDefinition.getURI());

-            }

-          }

-          if (isCircular())

-          {

-            reportConstraintViolation

-              (XSDConstants.PART2,

-               "st-props-correct.2",

-               getElement(),

-               XSDConstants.ITEMTYPE_ATTRIBUTE,

-               new Object [] {});

-          }

-          break;

-        }

-        case XSDVariety.UNION:

-        {

-          if (!XSDConstants.isURType(theBaseTypeDefinition))

-          {

-            if (theBaseTypeDefinition.getFinal().contains(XSDSimpleFinal.RESTRICTION_LITERAL))

-            {

-              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.1.2", theBaseTypeDefinition.getURI());

-            }

-          }

-          else

-          {

-            for (XSDSimpleTypeDefinition theMemberTypeDefinition : getMemberTypeDefinitions())

-            {

-              if (theMemberTypeDefinition == null)

-              {

-                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", "");

-              }

-              else if (theMemberTypeDefinition.getContainer() == null)

-              {

-                createDiagnostic

-                  (XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", theMemberTypeDefinition.getURI());

-              }

-              else if (theMemberTypeDefinition.getFinal().contains(XSDSimpleFinal.UNION_LITERAL))

-              {

-                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.3.0", theBaseTypeDefinition.getURI());

-              }

-              // Apparently this is allowed now.

-              // else if (!XSDConstants.isSchemaForSchemaNamespace(getTargetNamespace()) &&

-              //           XSDConstants.isAnySimpleType(theMemberTypeDefinition))

-              // {

-              //   createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-retricts.0.2", theMemberTypeDefinition.getURI());

-              // }

-            }

-          }

-          if (isCircular())

-          {

-            reportConstraintViolation

-              (XSDConstants.PART2,

-               "cos-no-circular-unions",

-               getElement(),

-               XSDConstants.MEMBERTYPES_ATTRIBUTE,

-               new Object [] {});

-          }

-          break;

-        }

-      }

-    }

-    else if (isCircular())

-    {

-      reportConstraintViolation

-        (XSDConstants.PART2,

-         "st-props-correct.2",

-         getElement(),

-         XSDConstants.BASE_ATTRIBUTE,

-         new Object [] {});

-    }

-  }

-

-  @Override

-  protected void reconcileAttributes(Element changedElement)

-  {

-    switch (XSDConstants.nodeType(changedElement))

-    {

-      case XSDConstants.EXTENSION_ELEMENT:

-      case XSDConstants.RESTRICTION_ELEMENT:

-      {

-        if (!(getContainer() instanceof XSDComplexTypeDefinition))

-        {

-          XSDSimpleTypeDefinition newBaseTypeDefinition = null;

-          if (changedElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE))

-          {

-            newBaseTypeDefinition =

-              resolveSimpleTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(changedElement, XSDConstants.BASE_ATTRIBUTE));

-          }

-          else if (getContents().contains(getBaseTypeDefinition()))

-          {

-            newBaseTypeDefinition = getBaseTypeDefinition();

-          }

-

-          handleNewBaseTypeDefinition(newBaseTypeDefinition);

-        }

-        else

-        {

-          XSDTypeDefinition newBaseTypeDefinition = null;

-          if (changedElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE))

-          {

-            newBaseTypeDefinition =

-              resolveTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(changedElement, XSDConstants.BASE_ATTRIBUTE));

-          }

-          else if (getContents().contains(getBaseTypeDefinition()))

-          {

-            newBaseTypeDefinition = getBaseTypeDefinition();

-          }

-

-          handleNewComplexBaseTypeDefinition(newBaseTypeDefinition);

-        }

-

-        break;

-      }

-      case XSDConstants.LIST_ELEMENT:

-      {

-        XSDSimpleTypeDefinition newItemTypeDefinition = getItemTypeDefinition();

-        if (changedElement.hasAttributeNS(null, XSDConstants.ITEMTYPE_ATTRIBUTE))

-        {

-          newItemTypeDefinition =

-            resolveSimpleTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(changedElement, XSDConstants.ITEMTYPE_ATTRIBUTE));

-        }

-        else if (!getContents().contains(newItemTypeDefinition))

-        {

-          newItemTypeDefinition = resolveSimpleTypeDefinition(null, "undefined");

-        }

-

-        if (newItemTypeDefinition != getItemTypeDefinition())

-        {

-          setItemTypeDefinition(newItemTypeDefinition);

-        }

-

-        handleNewBaseTypeDefinition(null);

-        break;

-      }

-      case XSDConstants.UNION_ELEMENT:

-      {

-        List<XSDSimpleTypeDefinition> newMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>();

-        if (changedElement.hasAttributeNS(null, XSDConstants.MEMBERTYPES_ATTRIBUTE))

-        {

-          String memberTypes = changedElement.getAttributeNS(null, XSDConstants.MEMBERTYPES_ATTRIBUTE);

-          if (memberTypes != null)

-          {

-            for (StringTokenizer tokens = new StringTokenizer(memberTypes, " "); tokens.hasMoreTokens(); )

-            {

-              String memberTypeQName = tokens.nextToken();

-              XSDSimpleTypeDefinition newMemberTypeDefinition =

-                resolveSimpleTypeDefinitionURI(XSDConstants.lookupQName(changedElement, memberTypeQName));

-              newMemberTypeDefinitions.add(newMemberTypeDefinition);

-            }

-          }

-        }

-

-        newMemberTypeDefinitions.addAll(getContents());

-

-        List<XSDSimpleTypeDefinition> remainingMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>(getMemberTypeDefinitions());

-        remainingMemberTypeDefinitions.removeAll(newMemberTypeDefinitions);

-        getMemberTypeDefinitions().removeAll(remainingMemberTypeDefinitions);

-        if (!newMemberTypeDefinitions.isEmpty())

-        {

-          setListContentAndOrder(getMemberTypeDefinitions(), newMemberTypeDefinitions);

-        }

-

-        handleNewBaseTypeDefinition(null);

-        break;

-      }

-      case XSDConstants.SIMPLETYPE_ELEMENT:

-      case XSDConstants.SIMPLECONTENT_ELEMENT:

-      {

-        super.reconcileAttributes(changedElement);

-

-        if (changedElement.hasAttributeNS(null, XSDConstants.FINAL_ATTRIBUTE))

-        {

-          setStringLexicalFinal(changedElement.getAttributeNS(null, XSDConstants.FINAL_ATTRIBUTE));

-        }

-        else if (isSetLexicalFinal())

-        {

-          unsetLexicalFinal();

-        }

-

-        for (Node child = changedElement.getFirstChild(); child != null; child = child.getNextSibling())

-        {

-          if (child.getNodeType() == Node.ELEMENT_NODE)

-          {

-            reconcileAttributes((Element)child);

-          }

-        }

-        break;

-      }

-    }

-  }

-

-  protected void handleNewComplexBaseTypeDefinition(XSDTypeDefinition newComplexBaseTypeDefinition)

-  {

-    if (getContainer() instanceof XSDComplexTypeDefinition)

-    {

-      XSDComplexTypeDefinitionImpl xsdComplexTypeDefinition = (XSDComplexTypeDefinitionImpl)getContainer();

-      boolean oldIsReconciling = xsdComplexTypeDefinition.isReconciling;

-      xsdComplexTypeDefinition.isReconciling = isReconciling;

-      xsdComplexTypeDefinition.handleNewBaseTypeDefinition(newComplexBaseTypeDefinition);

-      xsdComplexTypeDefinition.isReconciling = oldIsReconciling;

-    }

-  }

-

-  protected XSDSimpleTypeDefinition handleNewBaseTypeDefinition(XSDSimpleTypeDefinition newBaseTypeDefinition)

-  {

-    if (newBaseTypeDefinition == null)

-    {

-      XSDSchema xsdSchema = getSchema();

-      if (xsdSchema == null)

-      {

-        Element theElement = getElement();

-        if (theElement != null)

-        {

-          newBaseTypeDefinition = 

-            XSDSchemaImpl.getSchemaForSchema(theElement.getNamespaceURI()).resolveSimpleTypeDefinition("anySimpleType");

-        }

-        else

-        {

-          newBaseTypeDefinition = this;

-        }

-      }

-      else

-      {

-        newBaseTypeDefinition =  xsdSchema.getSchemaForSchema().resolveSimpleTypeDefinition("anySimpleType");

-      }

-    }

-

-    if (eContainer instanceof XSDRedefine)

-    {

-      XSDSchema redefinedSchema = ((XSDRedefine)eContainer).getIncorporatedSchema();

-      if (redefinedSchema != null)

-      {

-        Map<XSDComponent, XSDComponent> redefinitionMap = ((XSDSchemaImpl)redefinedSchema).getRedefinitionMap();

-        if (redefinitionMap.containsKey(newBaseTypeDefinition))

-        {

-          XSDComponent replacement = redefinitionMap.get(this);

-          if (replacement != null)

-          {

-            newBaseTypeDefinition = (XSDSimpleTypeDefinition)replacement;

-          }

-        }

-      }

-    }

-

-    if (newBaseTypeDefinition != getBaseTypeDefinition())

-    {

-      setBaseTypeDefinition(newBaseTypeDefinition);

-    }

-

-    return newBaseTypeDefinition;

-  }

-

-  @Override

-  protected Node getAdoptionParentNode(EReference eReference)

-  {

-    if (eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS ||

-          eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS ||

-          eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__DERIVATION_ANNOTATION) 

-    {

-      Element element = getElement();

-      if (element == null)

-      {

-        return null;

-      }

-      else

-      {

-        for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling())

-        {

-          switch (XSDConstants.nodeType(child))

-          {

-            case XSDConstants.EXTENSION_ELEMENT:

-            case XSDConstants.RESTRICTION_ELEMENT:

-            case XSDConstants.LIST_ELEMENT:

-            case XSDConstants.UNION_ELEMENT:

-            {

-              return child;

-            }

-          }

-        }

-      }

-    }

-

-    return super.getAdoptionParentNode(eReference);

-  }

-

-  @Override

-  protected Collection<Element> getContentNodes(Element changedElement)

-  {

-    Collection<Element> result = new ArrayList<Element>();

-    for (Node child = getElement().getFirstChild(); child != null; child = child.getNextSibling())

-    {

-      switch (XSDConstants.nodeType(child))

-      {

-        case XSDConstants.ANNOTATION_ELEMENT:

-        {

-          result.add((Element)child);

-          break;

-        }

-        case XSDConstants.EXTENSION_ELEMENT:

-        case XSDConstants.RESTRICTION_ELEMENT:

-        case XSDConstants.LIST_ELEMENT:

-        case XSDConstants.UNION_ELEMENT:

-        {

-          for (Node grandChild = child.getFirstChild(); grandChild != null; grandChild = grandChild.getNextSibling())

-          {

-            if (grandChild.getNodeType() == Node.ELEMENT_NODE)

-            {

-              result.add((Element)grandChild);

-            }

-          }

-          break;

-        }

-      }

-    }

-    return result;

-  }

-

-  @Override

-  protected void handleUnreconciledElement(Element child, List<XSDConcreteComponent> newContents, List<XSDConcreteComponent> remainingContents)

-  {

-    switch (XSDConstants.nodeType(child))

-    {

-      case XSDConstants.ANNOTATION_ELEMENT:

-      {

-        XSDAnnotation xsdAnnotation = XSDAnnotationImpl.createAnnotation(child);

-        newContents.add(xsdAnnotation);

-        break;

-      }

-      case XSDConstants.SIMPLETYPE_ELEMENT:

-      {

-        XSDSimpleTypeDefinition xsdSimpleTypeDefinition = XSDSimpleTypeDefinitionImpl.createSimpleTypeDefinition(child);

-        if (xsdSimpleTypeDefinition != null)

-        {

-          newContents.add(xsdSimpleTypeDefinition);

-        }

-        break;

-      }

-      default:

-      {

-        XSDConstrainingFacet xsdConstrainingFacet = XSDConstrainingFacetImpl.createConstrainingFacet(child);

-        if (xsdConstrainingFacet != null)

-        {

-          newContents.add(xsdConstrainingFacet);

-        }

-      }

-    }

-  }

-

-  @Override

-  protected void handleReconciliation(List<XSDConcreteComponent> newContents, List<XSDConcreteComponent> remainingContents)

-  {

-    if (!newContents.isEmpty() && newContents.get(0).getElement().getParentNode() == getElement())

-    {

-      handleAnnotationReconciliation(XSDPackage.Literals.XSD_TYPE_DEFINITION__ANNOTATION, newContents, remainingContents);

-    }

-    handleAnnotationReconciliation(XSDPackage.Literals.XSD_TYPE_DEFINITION__DERIVATION_ANNOTATION, newContents, remainingContents);

-

-    XSDSimpleTypeDefinition newBaseTypeDefinition = null;

-    XSDTypeDefinition newComplexBaseTypeDefinition = null;

-

-    boolean didContents = false;

-    Element theElement = getElement();

-    LOOP:

-    for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())

-    {

-      switch (XSDConstants.nodeType(child))

-      {

-        case XSDConstants.LIST_ELEMENT:

-        {

-          Element elementChild = (Element)child;

-          XSDSimpleTypeDefinition newTypeContent = null;

-          XSDSimpleTypeDefinition newItemTypeDefinition = null;

-          if (!newContents.isEmpty())

-          {

-            XSDConcreteComponent xsdConcreteComponent = newContents.get(0);

-            if (xsdConcreteComponent instanceof XSDSimpleTypeDefinition)

-            {

-              newItemTypeDefinition = (XSDSimpleTypeDefinition)xsdConcreteComponent;

-              newTypeContent = newItemTypeDefinition;

-              newContents.remove(0);

-            }

-          }

-          if (elementChild.hasAttributeNS(null, XSDConstants.ITEMTYPE_ATTRIBUTE) && newItemTypeDefinition == null)

-          {

-            newItemTypeDefinition = 

-              resolveSimpleTypeDefinitionURI(XSDConstants.lookupQNameForAttribute((Element)child, XSDConstants.ITEMTYPE_ATTRIBUTE));

-          }

-          if (newItemTypeDefinition == null)

-          {

-            newItemTypeDefinition = resolveSimpleTypeDefinition(null, "undefined");

-          }

-

-          getContents().removeAll(remainingContents);

-          if (newTypeContent != null)

-          {

-            getContents().add(newTypeContent);

-          }

-

-          if (newItemTypeDefinition != getItemTypeDefinition())

-          {

-            setItemTypeDefinition(newItemTypeDefinition);

-          }

-          

-          didContents = true;

-          break LOOP;

-        }

-        case XSDConstants.UNION_ELEMENT:

-        {

-          Element elementChild = (Element)child;

-          List<XSDSimpleTypeDefinition> newMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>();

-          if (elementChild.hasAttributeNS(null, XSDConstants.MEMBERTYPES_ATTRIBUTE))

-          {

-            String memberTypes = elementChild.getAttributeNS(null, XSDConstants.MEMBERTYPES_ATTRIBUTE);

-            if (memberTypes != null)

-            {

-              for (StringTokenizer tokens = new StringTokenizer(memberTypes, " "); tokens.hasMoreTokens(); )

-              {

-                String memberTypeQName = tokens.nextToken();

-                XSDSimpleTypeDefinition newMemberTypeDefinition =

-                  resolveSimpleTypeDefinitionURI(XSDConstants.lookupQName(elementChild, memberTypeQName));

-                newMemberTypeDefinitions.add(newMemberTypeDefinition);

-              }

-            }

-          }

-

-          List<XSDSimpleTypeDefinition> newTypeContents = new ArrayList<XSDSimpleTypeDefinition>();

-          for (ListIterator<XSDConcreteComponent> i = newContents.listIterator(); i.hasNext(); )

-          {

-            XSDConcreteComponent xsdConcreteComponent = i.next();

-            if (xsdConcreteComponent instanceof XSDSimpleTypeDefinition)

-            {

-              XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition)xsdConcreteComponent;

-              newTypeContents.add(xsdSimpleTypeDefinition);

-              newMemberTypeDefinitions.add(xsdSimpleTypeDefinition);

-              i.remove();

-            }

-            else

-            {

-              break;

-            }

-          }

-

-          getContents().removeAll(remainingContents);

-          if (!newTypeContents.isEmpty())

-          {

-            setListContentAndOrder(getContents(), newTypeContents);

-          }

-

-          List<XSDSimpleTypeDefinition> remainingMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>(getMemberTypeDefinitions());

-          remainingMemberTypeDefinitions.removeAll(newMemberTypeDefinitions);

-          if (!remainingMemberTypeDefinitions.isEmpty())

-          {

-            getMemberTypeDefinitions().removeAll(remainingMemberTypeDefinitions);

-          }

-          if (!newMemberTypeDefinitions.isEmpty())

-          {

-            setListContentAndOrder(getMemberTypeDefinitions(), newMemberTypeDefinitions);

-          }

-

-          didContents = true;

-          break LOOP;

-        }

-        case XSDConstants.EXTENSION_ELEMENT:

-        case XSDConstants.RESTRICTION_ELEMENT:

-        {

-          Element elementChild = (Element)child;

-          if (!newContents.isEmpty())

-          {

-            XSDConcreteComponent xsdConcreteComponent = newContents.get(0);

-            if (xsdConcreteComponent instanceof XSDSimpleTypeDefinition)

-            {

-              XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition)xsdConcreteComponent;

-              List<XSDSimpleTypeDefinition> theContents = getContents();

-              if (theContents.size() != 1 || theContents.get(0) != xsdConcreteComponent)

-              {

-                if (!theContents.isEmpty())

-                {

-                  remainingContents.removeAll(theContents);

-                  theContents.clear();

-                }

-                theContents.add(xsdSimpleTypeDefinition);

-              }

-              newBaseTypeDefinition = xsdSimpleTypeDefinition;

-              newContents.remove(0);

-            }

-          }

-

-          if (!(getContainer() instanceof XSDComplexTypeDefinition))

-          {

-            if (elementChild.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE) && newBaseTypeDefinition == null)

-            {

-              newBaseTypeDefinition = 

-                resolveSimpleTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(elementChild, XSDConstants.BASE_ATTRIBUTE));

-            }

-          }

-          else

-          {

-            if (elementChild.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE))

-            {

-              newComplexBaseTypeDefinition = 

-                resolveTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(elementChild, XSDConstants.BASE_ATTRIBUTE));

-            }

-          }

-

-          didContents = true;

-          break LOOP;

-        }

-      }

-    }

-

-    if (!didContents && !getContents().isEmpty())

-    {

-      getContents().clear();

-    }

-

-    if (!remainingContents.isEmpty())

-    {

-      getFacetContents().removeAll(remainingContents);

-    }

-

-    if (!newContents.isEmpty())

-    {

-      for (Iterator<?> i = newContents.iterator(); i.hasNext(); )

-      {

-        if (!(i.next() instanceof XSDFacet))

-        {

-          i.remove();

-        }

-      }

-      @SuppressWarnings("unchecked") List<XSDConstrainingFacet> list = (List<XSDConstrainingFacet>)(List<?>)newContents;

-      setListContentAndOrder(getFacetContents(), list);

-    }

-

-    handleNewBaseTypeDefinition(newBaseTypeDefinition);

-    handleNewComplexBaseTypeDefinition(newComplexBaseTypeDefinition);

-  }

-

-  @Override

-  protected void changeAttribute(EAttribute eAttribute)

-  {

-    super.changeAttribute(eAttribute);

-    Element theElement = getElement();

-    if (eAttribute == null || eAttribute == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL)

-    {

-      if (theElement != null)

-      {

-        niceSetAttribute

-          (theElement,

-           XSDConstants.FINAL_ATTRIBUTE,

-           getStringLexicalFinal());

-      }

-      if (eAttribute != null)

-      {

-        traverseToRootForPatching();

-      }

-    }

-    if (eAttribute == null || eAttribute == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__VARIETY)

-    {

-      if (theElement != null && eAttribute != null) 

-      {

-        if (analysisState != ANALYZING) 

-        {

-          LOOP:

-          for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())

-          {

-            int childNodeType = XSDConstants.nodeType(child);

-            switch (childNodeType)

-            {

-              case XSDConstants.RESTRICTION_ELEMENT:

-              case XSDConstants.EXTENSION_ELEMENT:

-              case XSDConstants.UNION_ELEMENT:

-              case XSDConstants.LIST_ELEMENT:

-              {

-                if (childNodeType != getRequiredChildElementNodeType())

-                {

-                  Element newElement = createChildElement();

-                  forceReplace(newElement, (Element)child);

-                }

-                break LOOP;

-              }

-            }

-          }

-          traverseToRootForAnalysis();

-        }

-      }

-    }

-  }

-

-  @Override

-  protected void changeReference(EReference eReference)

-  {

-    super.changeReference(eReference);

-    Element theElement = getElement();

-    if (theElement != null)

-    {

-      if (eReference == null || eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION)

-      {

-        if (!isReconciling && eReference != null)

-        {

-          traverseToRootForPatching();

-        }

-

-        if (!isReconciling && !(getContainer() instanceof XSDComplexTypeDefinition))

-        {

-          XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();

-          if (theBaseTypeDefinition != null && !getContents().contains(theBaseTypeDefinition))

-          {

-            LOOP:

-            for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())

-            {

-              switch (XSDConstants.nodeType(child))

-              {

-                case XSDConstants.EXTENSION_ELEMENT:

-                case XSDConstants.RESTRICTION_ELEMENT:

-                {

-                  niceSetAttributeURIValue((Element)child, XSDConstants.BASE_ATTRIBUTE, theBaseTypeDefinition.getURI());

-                  break LOOP;

-                }

-              }

-            }

-          }

-        }

-      }

-      if (eReference == null || eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION)

-      {

-        if (!isReconciling && eReference != null)

-        {

-          traverseToRootForPatching();

-        }

-

-        XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();

-        if (!isReconciling && theItemTypeDefinition != null && !getContents().contains(theItemTypeDefinition))

-        {

-          LOOP:

-          for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())

-          {

-            switch (XSDConstants.nodeType(child))

-            {

-              case XSDConstants.LIST_ELEMENT:

-              {

-                niceSetAttributeURIValue((Element)child, XSDConstants.ITEMTYPE_ATTRIBUTE, theItemTypeDefinition.getURI());

-                break LOOP;

-              }

-            }

-          }

-        }

-      }

-      if (eReference == null || eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS)

-      {

-        if (!isReconciling && eReference != null)

-        {

-          traverseToRootForPatching();

-        }

-

-        if (!isReconciling)

-        {

-          LOOP:

-          for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())

-          {

-            switch (XSDConstants.nodeType(child))

-            {

-              case XSDConstants.UNION_ELEMENT:

-              {

-                StringBuffer newMemberTypeDefinitions = null;

-                for (XSDSimpleTypeDefinition theMemberTypeDefinition : getMemberTypeDefinitions())

-                {

-                  if (getContents().contains(theMemberTypeDefinition))

-                  {

-                    break;

-                  }

-                  if (newMemberTypeDefinitions == null)

-                  {

-                    newMemberTypeDefinitions = new StringBuffer();

-                  }

-                  else 

-                  {

-                    newMemberTypeDefinitions.append(' ');

-                  }

-                  newMemberTypeDefinitions.append(theMemberTypeDefinition.getURI());

-                }

-                

-                niceSetAttributeURIValue

-                  ((Element)child, 

-                   XSDConstants.MEMBERTYPES_ATTRIBUTE, 

-                   newMemberTypeDefinitions == null ? null : newMemberTypeDefinitions.toString());

-                break LOOP;

-              }

-            }

-          }

-        }

-      }

-    }

-  }

-

-  @Override

-  protected void adoptContent(EReference eReference, XSDConcreteComponent xsdConcreteComponent)

-  {

-    super.adoptContent(eReference, xsdConcreteComponent);

-    if (eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS ||

-          eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS)

-    {

-      traverseToRootForPatching();

-    }

-    else if (eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__ANNOTATION)

-    {

-      getAnnotations().add(0, (XSDAnnotation)xsdConcreteComponent);

-    }

-    else if (eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__DERIVATION_ANNOTATION)

-    {

-      getAnnotations().add((XSDAnnotation)xsdConcreteComponent);

-    }

-  }

-

-  @Override

-  protected void orphanContent(EReference eReference, XSDConcreteComponent xsdConcreteComponent)

-  {

-    super.orphanContent(eReference, xsdConcreteComponent);

-    if (eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS || 

-          eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS)

-    {

-      traverseToRootForPatching();

-    }

-    else if (eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__ANNOTATION ||

-               eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__DERIVATION_ANNOTATION)

-    {

-      getAnnotations().remove(xsdConcreteComponent);

-    }

-  }

-

-  public XSDTotalDigitsFacet getTotalDigitsFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDTotalDigitsFacet)

-        {

-          return (XSDTotalDigitsFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDTotalDigitsFacet getEffectiveTotalDigitsFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDTotalDigitsFacet)

-        {

-          return (XSDTotalDigitsFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDFractionDigitsFacet getFractionDigitsFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDFractionDigitsFacet)

-        {

-          return (XSDFractionDigitsFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDFractionDigitsFacet getEffectiveFractionDigitsFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDFractionDigitsFacet)

-        {

-          return (XSDFractionDigitsFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDLengthFacet getLengthFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDLengthFacet)

-        {

-          return (XSDLengthFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDLengthFacet getEffectiveLengthFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDLengthFacet)

-        {

-          return (XSDLengthFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMaxLengthFacet getMaxLengthFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDMaxLengthFacet)

-        {

-          return (XSDMaxLengthFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMaxLengthFacet getEffectiveMaxLengthFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDMaxLengthFacet)

-        {

-          return (XSDMaxLengthFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMinLengthFacet getMinLengthFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDMinLengthFacet)

-        {

-          return (XSDMinLengthFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMinLengthFacet getEffectiveMinLengthFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDMinLengthFacet)

-        {

-          return (XSDMinLengthFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMaxExclusiveFacet getMaxExclusiveFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDMaxExclusiveFacet)

-        {

-          return (XSDMaxExclusiveFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMaxInclusiveFacet getMaxInclusiveFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDMaxInclusiveFacet)

-        {

-          return (XSDMaxInclusiveFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMaxFacet getMaxFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDMaxFacet)

-        {

-          return (XSDMaxFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMaxFacet getEffectiveMaxFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDMaxFacet)

-        {

-          return (XSDMaxFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMinExclusiveFacet getMinExclusiveFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDMinExclusiveFacet)

-        {

-          return (XSDMinExclusiveFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMinInclusiveFacet getMinInclusiveFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDMinInclusiveFacet)

-        {

-          return (XSDMinInclusiveFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMinFacet getMinFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDMinFacet)

-        {

-          return (XSDMinFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDMinFacet getEffectiveMinFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDMinFacet)

-        {

-          return (XSDMinFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  public EList<XSDFacet> getSyntheticFacets()

-  {

-    if (syntheticFacets == null)

-    {

-      syntheticFacets = new EObjectContainmentEList<XSDFacet>(XSDFacet.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS);

-    }

-    return syntheticFacets;

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  @Override

-  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)

-  {

-    switch (featureID)

-    {

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:

-        return ((InternalEList<?>)getContents()).basicRemove(otherEnd, msgs);

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:

-        return ((InternalEList<?>)getFacetContents()).basicRemove(otherEnd, msgs);

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:

-        return ((InternalEList<?>)getFundamentalFacets()).basicRemove(otherEnd, msgs);

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:

-        return ((InternalEList<?>)getSyntheticFacets()).basicRemove(otherEnd, msgs);

-    }

-    return super.eInverseRemove(otherEnd, featureID, msgs);

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  @Override

-  public Object eGet(int featureID, boolean resolve, boolean coreType)

-  {

-    switch (featureID)

-    {

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY:

-        return getVariety();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL:

-        return getFinal();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL:

-        return getLexicalFinal();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS:

-        return getValidFacets();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:

-        return getContents();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:

-        return getFacetContents();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS:

-        return getFacets();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS:

-        return getMemberTypeDefinitions();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:

-        return getFundamentalFacets();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION:

-        return getBaseTypeDefinition();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION:

-        return getPrimitiveTypeDefinition();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION:

-        return getItemTypeDefinition();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ROOT_TYPE_DEFINITION:

-        return getRootTypeDefinition();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_FACET:

-        return getMinFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_FACET:

-        return getMaxFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_INCLUSIVE_FACET:

-        return getMaxInclusiveFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_INCLUSIVE_FACET:

-        return getMinInclusiveFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_EXCLUSIVE_FACET:

-        return getMinExclusiveFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_EXCLUSIVE_FACET:

-        return getMaxExclusiveFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LENGTH_FACET:

-        return getLengthFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__WHITE_SPACE_FACET:

-        return getWhiteSpaceFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ENUMERATION_FACETS:

-        return getEnumerationFacets();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PATTERN_FACETS:

-        return getPatternFacets();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CARDINALITY_FACET:

-        return getCardinalityFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__NUMERIC_FACET:

-        return getNumericFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_LENGTH_FACET:

-        return getMaxLengthFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_LENGTH_FACET:

-        return getMinLengthFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__TOTAL_DIGITS_FACET:

-        return getTotalDigitsFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FRACTION_DIGITS_FACET:

-        return getFractionDigitsFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ORDERED_FACET:

-        return getOrderedFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BOUNDED_FACET:

-        return getBoundedFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MAX_FACET:

-        return getEffectiveMaxFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_WHITE_SPACE_FACET:

-        return getEffectiveWhiteSpaceFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MAX_LENGTH_FACET:

-        return getEffectiveMaxLengthFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_FRACTION_DIGITS_FACET:

-        return getEffectiveFractionDigitsFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_PATTERN_FACET:

-        return getEffectivePatternFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_ENUMERATION_FACET:

-        return getEffectiveEnumerationFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_TOTAL_DIGITS_FACET:

-        return getEffectiveTotalDigitsFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MIN_LENGTH_FACET:

-        return getEffectiveMinLengthFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_LENGTH_FACET:

-        return getEffectiveLengthFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MIN_FACET:

-        return getEffectiveMinFacet();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:

-        return getSyntheticFacets();

-    }

-    return super.eGet(featureID, resolve, coreType);

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  @SuppressWarnings("unchecked")

-  @Override

-  public void eSet(int featureID, Object newValue)

-  {

-    switch (featureID)

-    {

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY:

-        setVariety((XSDVariety)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL:

-        getFinal().clear();

-        getFinal().addAll((Collection<? extends XSDSimpleFinal>)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL:

-        getLexicalFinal().clear();

-        getLexicalFinal().addAll((Collection<? extends XSDSimpleFinal>)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS:

-        getValidFacets().clear();

-        getValidFacets().addAll((Collection<? extends String>)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:

-        getContents().clear();

-        getContents().addAll((Collection<? extends XSDSimpleTypeDefinition>)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:

-        getFacetContents().clear();

-        getFacetContents().addAll((Collection<? extends XSDConstrainingFacet>)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS:

-        getFacets().clear();

-        getFacets().addAll((Collection<? extends XSDConstrainingFacet>)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS:

-        getMemberTypeDefinitions().clear();

-        getMemberTypeDefinitions().addAll((Collection<? extends XSDSimpleTypeDefinition>)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:

-        getFundamentalFacets().clear();

-        getFundamentalFacets().addAll((Collection<? extends XSDFundamentalFacet>)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION:

-        setBaseTypeDefinition((XSDSimpleTypeDefinition)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION:

-        setPrimitiveTypeDefinition((XSDSimpleTypeDefinition)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION:

-        setItemTypeDefinition((XSDSimpleTypeDefinition)newValue);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:

-        getSyntheticFacets().clear();

-        getSyntheticFacets().addAll((Collection<? extends XSDFacet>)newValue);

-        return;

-    }

-    super.eSet(featureID, newValue);

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  @Override

-  public void eUnset(int featureID)

-  {

-    switch (featureID)

-    {

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY:

-        unsetVariety();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL:

-        getFinal().clear();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL:

-        unsetLexicalFinal();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS:

-        getValidFacets().clear();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:

-        getContents().clear();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:

-        getFacetContents().clear();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS:

-        getFacets().clear();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS:

-        getMemberTypeDefinitions().clear();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:

-        getFundamentalFacets().clear();

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION:

-        setBaseTypeDefinition((XSDSimpleTypeDefinition)null);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION:

-        setPrimitiveTypeDefinition((XSDSimpleTypeDefinition)null);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION:

-        setItemTypeDefinition((XSDSimpleTypeDefinition)null);

-        return;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:

-        getSyntheticFacets().clear();

-        return;

-    }

-    super.eUnset(featureID);

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  @Override

-  public boolean eIsSet(int featureID)

-  {

-    switch (featureID)

-    {

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY:

-        return isSetVariety();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL:

-        return final_ != null && !final_.isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL:

-        return isSetLexicalFinal();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS:

-        return validFacets != null && !validFacets.isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:

-        return contents != null && !contents.isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:

-        return facetContents != null && !facetContents.isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS:

-        return facets != null && !facets.isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS:

-        return memberTypeDefinitions != null && !memberTypeDefinitions.isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:

-        return fundamentalFacets != null && !fundamentalFacets.isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION:

-        return baseTypeDefinition != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION:

-        return primitiveTypeDefinition != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION:

-        return itemTypeDefinition != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ROOT_TYPE_DEFINITION:

-        return getRootTypeDefinition() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_FACET:

-        return getMinFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_FACET:

-        return getMaxFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_INCLUSIVE_FACET:

-        return getMaxInclusiveFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_INCLUSIVE_FACET:

-        return getMinInclusiveFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_EXCLUSIVE_FACET:

-        return getMinExclusiveFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_EXCLUSIVE_FACET:

-        return getMaxExclusiveFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LENGTH_FACET:

-        return getLengthFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__WHITE_SPACE_FACET:

-        return getWhiteSpaceFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ENUMERATION_FACETS:

-        return !getEnumerationFacets().isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PATTERN_FACETS:

-        return !getPatternFacets().isEmpty();

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CARDINALITY_FACET:

-        return getCardinalityFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__NUMERIC_FACET:

-        return getNumericFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_LENGTH_FACET:

-        return getMaxLengthFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_LENGTH_FACET:

-        return getMinLengthFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__TOTAL_DIGITS_FACET:

-        return getTotalDigitsFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FRACTION_DIGITS_FACET:

-        return getFractionDigitsFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ORDERED_FACET:

-        return getOrderedFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BOUNDED_FACET:

-        return getBoundedFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MAX_FACET:

-        return getEffectiveMaxFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_WHITE_SPACE_FACET:

-        return getEffectiveWhiteSpaceFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MAX_LENGTH_FACET:

-        return getEffectiveMaxLengthFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_FRACTION_DIGITS_FACET:

-        return getEffectiveFractionDigitsFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_PATTERN_FACET:

-        return getEffectivePatternFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_ENUMERATION_FACET:

-        return getEffectiveEnumerationFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_TOTAL_DIGITS_FACET:

-        return getEffectiveTotalDigitsFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MIN_LENGTH_FACET:

-        return getEffectiveMinLengthFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_LENGTH_FACET:

-        return getEffectiveLengthFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MIN_FACET:

-        return getEffectiveMinFacet() != null;

-      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:

-        return syntheticFacets != null && !syntheticFacets.isEmpty();

-    }

-    return super.eIsSet(featureID);

-  }

-

-  /**

-   * <!-- begin-user-doc -->

-   * <!-- end-user-doc -->

-   * @generated

-   */

-  @Override

-  public String toString()

-  {

-    if (eIsProxy()) return super.toString();

-

-    StringBuffer result = new StringBuffer(super.toString());

-    result.append(" (variety: ");

-    if ((eFlags & VARIETY_ESETFLAG) != 0) result.append(VARIETY_EFLAG_VALUES[(eFlags & VARIETY_EFLAG) >>> VARIETY_EFLAG_OFFSET]); else result.append("<unset>");

-    result.append(", final: ");

-    result.append(final_);

-    result.append(", lexicalFinal: ");

-    result.append(lexicalFinal);

-    result.append(", validFacets: ");

-    result.append(validFacets);

-    result.append(')');

-    return result.toString();

-  }

-

-  public XSDWhiteSpaceFacet getWhiteSpaceFacet()

-  {

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDWhiteSpaceFacet)

-        {

-          return (XSDWhiteSpaceFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public XSDWhiteSpaceFacet getEffectiveWhiteSpaceFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDWhiteSpaceFacet)

-        {

-          return (XSDWhiteSpaceFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public EList<XSDEnumerationFacet> getEnumerationFacets()

-  {

-    EList<XSDEnumerationFacet> result = new BasicEList<XSDEnumerationFacet>();

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDEnumerationFacet)

-        {

-          result.add((XSDEnumerationFacet)facet);

-        }

-      }

-    }

-    return 

-      new EcoreEList.UnmodifiableEList.FastCompare<XSDEnumerationFacet>

-        (this, XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__ENUMERATION_FACETS, result.size(), result.toArray());

-  }

-

-  public XSDEnumerationFacet getEffectiveEnumerationFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDEnumerationFacet)

-        {

-          return (XSDEnumerationFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  public EList<XSDPatternFacet> getPatternFacets()

-  {

-    EList<XSDPatternFacet> result = new BasicEList<XSDPatternFacet>();

-    if (facetContents != null)

-    {

-      Object [] facets = facetContents.data();

-      for (int i = 0, size = facetContents.size(); i < size; ++i)

-      {

-        Object facet = facets[i];

-        if (facet instanceof XSDPatternFacet)

-        {

-          result.add((XSDPatternFacet)facet);

-        }

-      }

-    }

-    return 

-      new EcoreEList.UnmodifiableEList.FastCompare<XSDPatternFacet>

-        (this, XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__PATTERN_FACETS, result.size(), result.toArray());

-  }

-

-  public XSDPatternFacet getEffectivePatternFacet()

-  {

-    if (facets != null)

-    {

-      Object [] facetData = facets.data();

-      for (int i = 0, size = facets.size(); i < size; ++i)

-      {

-        Object facet = facetData[i];

-        if (facet instanceof XSDPatternFacet)

-        {

-          return (XSDPatternFacet)facet;

-        }

-      }

-    }

-    return null;

-  }

-

-  protected XSDBoundedFacet boundedFacet;

-  public XSDBoundedFacet getBoundedFacet()

-  {

-    if (boundedFacet == null)

-    {

-      createFundamentalFacets();

-    }

-    return boundedFacet;

-  }

-

-  protected XSDCardinalityFacet cardinalityFacet;

-  public XSDCardinalityFacet getCardinalityFacet()

-  {

-    if (cardinalityFacet == null)

-    {

-      createFundamentalFacets();

-    }

-    return cardinalityFacet;

-  }

-

-  protected XSDNumericFacet numericFacet;

-  public XSDNumericFacet getNumericFacet()

-  {

-    if (numericFacet == null)

-    {

-      createFundamentalFacets();

-    }

-    return numericFacet;

-  }

-

-  protected XSDOrderedFacet orderedFacet;

-  public XSDOrderedFacet getOrderedFacet()

-  {

-    if (orderedFacet == null)

-    {

-      createFundamentalFacets();

-    }

-    return orderedFacet;

-  }

-

-  protected void createFundamentalFacets()

-  {

-    List<XSDFundamentalFacet> theFundamentalFacets = getFundamentalFacets();

-    boundedFacet = getXSDFactory().createXSDBoundedFacet();

-    cardinalityFacet = getXSDFactory().createXSDCardinalityFacet();

-    numericFacet = getXSDFactory().createXSDNumericFacet();

-    orderedFacet = getXSDFactory().createXSDOrderedFacet();

-    List<XSDFundamentalFacet> list = new ArrayList<XSDFundamentalFacet>(4);

-    list.add(boundedFacet);

-    list.add(cardinalityFacet);

-    list.add(numericFacet);

-    list.add(orderedFacet);

-    theFundamentalFacets.addAll(list);

-  }

-

-  protected static EList<String> validFacetsForList;

-  public EList<String> getValidFacetsForList()

-  {

-    if (validFacetsForList == null)

-    {

-      validFacetsForList = new BasicEList<String>();

-      validFacetsForList.add("length");

-      validFacetsForList.add("maxLength");

-      validFacetsForList.add("minLength");

-      validFacetsForList.add("whiteSpace");

-      validFacetsForList.add("enumeration");

-      validFacetsForList.add("pattern");

-    }

-    return validFacetsForList;

-  }

-

-  protected static EList<String> validFacetsForUnion;

-  public EList<String> getValidFacetsForUnion()

-  {

-    if (validFacetsForUnion == null)

-    {

-      validFacetsForUnion = new BasicEList<String>();

-      validFacetsForUnion.add("enumeration");

-      validFacetsForUnion.add("pattern");

-    }

-    return validFacetsForUnion;

-  }

-

-  @Override

-  public XSDTypeDefinition getBaseType()

-  {

-    XSDTypeDefinition result = getBaseTypeDefinition();

-    if (result == this && XSDConstants.isAnyType(this))

-    {

-      XSDSchema xsdSchema = getSchema();

-      if (xsdSchema != null)

-      {

-        String schemaForSchemaNamespace = xsdSchema.getSchemaForSchemaNamespace();

-        XSDSchemaImpl.getSchemaForSchema(schemaForSchemaNamespace).resolveComplexTypeDefinition("anyType");

-      }

-    }

-    return result;

-  }

-

-  @Override

-  public XSDTypeDefinition getRootType()

-  {

-    return getRootTypeDefinition();

-  }

-

-  public XSDSimpleTypeDefinition getRootTypeDefinition()

-  {

-    XSDSimpleTypeDefinition result = this;

-    if (!isCircular())

-    {

-      for (XSDSimpleTypeDefinition theBaseTypeDefinition = result.getBaseTypeDefinition();

-           theBaseTypeDefinition != null && !XSDConstants.isURType(theBaseTypeDefinition); 

-           theBaseTypeDefinition = theBaseTypeDefinition.getBaseTypeDefinition())

-      {

-        result = theBaseTypeDefinition;

-      }

-    }

-    return result;

-  }

-

-  @Override

-  public XSDSimpleTypeDefinition getSimpleType()

-  {

-    return this;

-  }

-

-  @Override

-  public XSDParticle getComplexType()

-  {

-    return null;

-  }

-

-  protected XSDEnumerationFacetImpl effectiveEnumerationFacet;

-  protected XSDPatternFacetImpl effectivePatternFacet;

-

-  protected List<XSDConstrainingFacet> mergeFacets()

-  {

-    List<XSDConstrainingFacet> result = new ArrayList<XSDConstrainingFacet>();

-

-    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();

-

-    XSDWhiteSpaceFacet xsdWhiteSpaceFacet = getWhiteSpaceFacet();

-    if (xsdWhiteSpaceFacet == null)

-    {

-      xsdWhiteSpaceFacet = theBaseTypeDefinition.getEffectiveWhiteSpaceFacet();

-    }

-    if (xsdWhiteSpaceFacet != null)

-    {

-      result.add(xsdWhiteSpaceFacet);

-    }

-

-    XSDTotalDigitsFacet xsdTotalDigitsFacet = getTotalDigitsFacet();

-    if (xsdTotalDigitsFacet == null)

-    {

-      xsdTotalDigitsFacet = theBaseTypeDefinition.getEffectiveTotalDigitsFacet();

-    }

-    if (xsdTotalDigitsFacet != null)

-    {

-      result.add(xsdTotalDigitsFacet);

-    }

-

-    XSDFractionDigitsFacet xsdFractionDigitsFacet = getFractionDigitsFacet();

-    if (xsdFractionDigitsFacet == null)

-    {

-      xsdFractionDigitsFacet = theBaseTypeDefinition.getEffectiveFractionDigitsFacet();

-    }

-    if (xsdFractionDigitsFacet != null)

-    {

-      result.add(xsdFractionDigitsFacet);

-    }

-

-    XSDLengthFacet xsdLengthFacet = getLengthFacet();

-    if (xsdLengthFacet == null)

-    {

-      xsdLengthFacet = theBaseTypeDefinition.getEffectiveLengthFacet();

-    }

-    if (xsdLengthFacet != null)

-    {

-      result.add(xsdLengthFacet);

-    }

-

-    XSDMinLengthFacet xsdMinLengthFacet = getMinLengthFacet();

-    if (xsdMinLengthFacet == null)

-    {

-      xsdMinLengthFacet = theBaseTypeDefinition.getEffectiveMinLengthFacet();

-    }

-    if (xsdMinLengthFacet != null)

-    {

-      result.add(xsdMinLengthFacet);

-    }

-

-    XSDMaxLengthFacet xsdMaxLengthFacet = getMaxLengthFacet();

-    if (xsdMaxLengthFacet == null)

-    {

-      xsdMaxLengthFacet = theBaseTypeDefinition.getEffectiveMaxLengthFacet();

-    }

-    if (xsdMaxLengthFacet != null)

-    {

-      result.add(xsdMaxLengthFacet);

-    }

-

-    XSDConstrainingFacet maxFacet = getMaxFacet();

-    if (maxFacet == null)

-    {

-      maxFacet = theBaseTypeDefinition.getEffectiveMaxFacet();

-    }

-    if (maxFacet != null)

-    {

-      result.add(maxFacet);

-    }

-

-    XSDConstrainingFacet minFacet = getMinFacet();

-    if (minFacet == null)

-    {

-      minFacet = theBaseTypeDefinition.getEffectiveMinFacet();

-    }

-    if (minFacet != null)

-    {

-      result.add(minFacet);

-    }

-

-    List<XSDEnumerationFacet> enumerationFacets = getEnumerationFacets();

-    if (enumerationFacets.isEmpty())

-    {

-      XSDEnumerationFacet baseEnumerationFacet = theBaseTypeDefinition.getEffectiveEnumerationFacet();

-      if (baseEnumerationFacet != null)

-      {

-        result.add(baseEnumerationFacet);

-      }

-    }

-    else

-    {

-      if (effectiveEnumerationFacet == null)

-      {

-        effectiveEnumerationFacet = (XSDEnumerationFacetImpl)getXSDFactory().createXSDEnumerationFacet();

-        getSyntheticFacets().add(effectiveEnumerationFacet);

-      }

-

-      StringBuffer newLexicalValue = new StringBuffer();

-      List<Object> newValue = new UniqueEList<Object>();

-      List<XSDAnnotation> newAnnotations = new ArrayList<XSDAnnotation>();

-

-      for (XSDEnumerationFacet enumerationFacet : enumerationFacets)

-      {

-        XSDAnnotation xsdAnnotation = enumerationFacet.getAnnotation();

-        if (xsdAnnotation != null)

-        {

-          newAnnotations.add(xsdAnnotation);

-        }

-

-        if (newValue.addAll(enumerationFacet.getValue()))

-        {

-          if (newLexicalValue.length() != 0)

-          {

-            newLexicalValue.append(", ");

-          }

-          newLexicalValue.append(enumerationFacet.getLexicalValue());

-        }

-      }

-      String newLexicalValueString = newLexicalValue.toString();

-

-      List<Object> remainingValues = new ArrayList<Object>(effectiveEnumerationFacet.getValue());

-      remainingValues.removeAll(newValue);

-      if (!remainingValues.isEmpty())

-      {

-        effectiveEnumerationFacet.getValue().removeAll(remainingValues);

-      }

-      if (!newValue.isEmpty())

-      {

-        setListContentAndOrder(effectiveEnumerationFacet.getValue(), newValue);

-      }

-

-      List<XSDAnnotation> remainingAnnotations = new ArrayList<XSDAnnotation>(effectiveEnumerationFacet.getAnnotations());

-      remainingAnnotations.removeAll(newAnnotations);

-      if (!remainingAnnotations.isEmpty())

-      {

-        effectiveEnumerationFacet.getAnnotations().removeAll(remainingAnnotations);

-      }

-      if (!newAnnotations.isEmpty())

-      {

-        setListContentAndOrder(effectiveEnumerationFacet.getAnnotations(), newAnnotations);

-      }

-

-      if (!newLexicalValueString.equals(effectiveEnumerationFacet.getLexicalValue()))

-      {

-        effectiveEnumerationFacet.isReconciling = true;

-        effectiveEnumerationFacet.setLexicalValue(newLexicalValueString);

-        effectiveEnumerationFacet.isReconciling = false;

-      }

-

-      result.add(effectiveEnumerationFacet);

-    }

-

-    List<XSDPatternFacet> patternFacets = getPatternFacets();

-    if (patternFacets.isEmpty())

-    {

-      XSDPatternFacet basePatternFacet = theBaseTypeDefinition.getEffectivePatternFacet();

-      if (basePatternFacet != null)

-      {

-        result.add(basePatternFacet);

-      }

-    }

-    else

-    {

-      if (effectivePatternFacet == null)

-      {

-        effectivePatternFacet = (XSDPatternFacetImpl)getXSDFactory().createXSDPatternFacet();

-        getSyntheticFacets().add(effectivePatternFacet);

-      }

-

-      List<String> newValue = new ArrayList<String>();

-      List<XSDAnnotation> newAnnotations = new ArrayList<XSDAnnotation>();

-      XSDPatternFacet effectiveBasePatternFacet = theBaseTypeDefinition.getEffectivePatternFacet();

-      if (effectiveBasePatternFacet != null)

-      {

-        newValue.addAll(effectiveBasePatternFacet.getValue());

-      }

-

-      StringBuffer combinedPattern = new StringBuffer();

-      if (patternFacets.size() == 1)

-      {

-        XSDPatternFacet xsdPatternFacet = patternFacets.get(0);

-        combinedPattern.append(xsdPatternFacet.getLexicalValue());

-        XSDAnnotation xsdAnnotation = xsdPatternFacet.getAnnotation();

-        if (xsdAnnotation != null)

-        {

-          newAnnotations.add(xsdAnnotation);

-        }

-      }

-      else

-      {

-        for (XSDPatternFacet xsdPatternFacet : patternFacets)

-        {

-          if (combinedPattern.length() != 0)

-          {

-            combinedPattern.append("|");

-          }

-          combinedPattern.append("(");

-          combinedPattern.append(xsdPatternFacet.getLexicalValue());

-          combinedPattern.append(")");

-          XSDAnnotation xsdAnnotation = xsdPatternFacet.getAnnotation();

-          if (xsdAnnotation != null)

-          {

-            newAnnotations.add(xsdAnnotation);

-          }

-        }

-      }

-      newValue.add(combinedPattern.toString());

-

-      List<String> remainingValues = new ArrayList<String>(effectivePatternFacet.getValue());

-      remainingValues.removeAll(newValue);

-      if (!remainingValues.isEmpty())

-      {

-        effectivePatternFacet.getValue().removeAll(remainingValues);

-      }

-      if (!newValue.isEmpty())

-      {

-        setListContentAndOrder(effectivePatternFacet.getValue(), newValue);

-      }

-

-      List<XSDAnnotation> remainingAnnotations = new ArrayList<XSDAnnotation>(effectivePatternFacet.getAnnotations());

-      remainingAnnotations.removeAll(newAnnotations);

-      if (!remainingAnnotations.isEmpty())

-      {

-        effectivePatternFacet.getAnnotations().removeAll(remainingAnnotations);

-      }

-      if (!newAnnotations.isEmpty())

-      {

-        setListContentAndOrder(effectivePatternFacet.getAnnotations(), newAnnotations);

-      }

-

-      StringBuffer newLexicalValue = new StringBuffer();

-      if (newValue.size() == 1)

-      {

-        newLexicalValue.append(newValue.get(0));

-      }

-      else

-      {

-        for (String string : newValue)

-        {

-          if (newLexicalValue.length() != 0)

-          {

-            newLexicalValue.append(" & ");

-          }

-          newLexicalValue.append("(");

-          newLexicalValue.append(string);

-          newLexicalValue.append(")");

-        }

-      }

-      String newLexicalValueString = newLexicalValue.toString();

-      if (!newLexicalValueString.equals(effectivePatternFacet.getLexicalValue()))

-      {

-        effectivePatternFacet.isReconciling = true;

-        effectivePatternFacet.setLexicalValue(newLexicalValueString);

-        effectivePatternFacet.isReconciling = false;

-      }

-

-      result.add(effectivePatternFacet);

-    }

-

-    return result;

-  }

-

-

-  public String getStringLexicalFinal()

-  {

-    if (isSetLexicalFinal())

-    {

-      StringBuffer result = new StringBuffer();

-      for (Object literal : getLexicalFinal())

-      {

-        if (result.length() != 0)

-        {

-          result.append(' ');

-        }

-        if (literal.toString().equals("all"))

-        {

-          result.append("#all");

-        }

-        else

-        {

-          result.append(literal);

-        }

-      }

-      return result.toString();

-    }

-    else

-    {

-      return null;

-    }

-  }

-

-  public void setStringLexicalFinal(String finalDefault)

-  {

-    if (finalDefault == null)

-    {

-      unsetLexicalFinal();

-    }

-    else

-    {

-      List<XSDSimpleFinal> newLexicalFinal = new ArrayList<XSDSimpleFinal>();

-      for (StringTokenizer stringTokenizer = new StringTokenizer(finalDefault); stringTokenizer.hasMoreTokens(); )

-      {

-        String token = stringTokenizer.nextToken();

-        if (token.equals("#all"))

-        {

-          token = "all";

-        }

-        XSDSimpleFinal literal = XSDSimpleFinal.get(token);

-        if (literal != null)

-        {

-          newLexicalFinal.add(literal);

-        }

-      }

-      if (!newLexicalFinal.equals(getLexicalFinal()))

-      {

-        Collection<XSDSimpleFinal> oldContents = new ArrayList<XSDSimpleFinal>(getLexicalFinal());

-        oldContents.removeAll(newLexicalFinal);

-        if (!oldContents.isEmpty())

-        {

-          getLexicalFinal().removeAll(oldContents);

-        }

-        setListContentAndOrder(getLexicalFinal(), newLexicalFinal);

-      }

-      else if (newLexicalFinal.isEmpty() && !isSetLexicalFinal())

-      {

-        getLexicalFinal().clear();

-      }

-    }

-  }

-

-  public String getStringFinal()

-  {

-    StringBuffer result = new StringBuffer();

-    for (Object literal : getFinal())

-    {

-      if (result.length() != 0)

-      {

-        result.append(' ');

-      }

-      result.append(literal);

-    }

-    return result.toString();

-  }

-

-  /**

-   * This is used to gather selectively 

-   * the information determined when assessing a literal string 

-   * with respect to a {@link XSDSimpleTypeDefinition}.

-   * It is intended to be very light-weight and flexible.

-   *

-   * You may begin assessment with a {@link #node}, which handles three cases:

-   * if the node is an attribute, it's value is used to determine the literal;

-   * if the node is a text node, it's value is used to determine the literal;

-   * if the node is an element, it's (one and only) child text node is used to determine the literal in the preceeding case.

-   * You may begin assessment with a {@link #literal} by not setting a node.

-   * And you may begin assessment with a {@link #normalizedLiteral} by setting neither the node nor the literal.

-   *

-   * Unless additional {@link #yield} flags are set,

-   * assessment will perform but one function:

-   * it will set the {@link #diagnostics} to Collections.EMPTY_LIST when the literal fails to assess as valid.

-   * Hence, this most-light-weight invocation will only determine validity.

-   *

-   * You may choose for assessment to yield additional results, 

-   * i.e., the {@link #value}, the {@link #canonicalLiteral}, and the {@link #diagnostics},

-   * using the flags {@link #YIELD_VALUE}, {@link #YIELD_CANONICAL_LITERAL}, {@link #YIELD_DIAGNOSTICS}.

-   */

-  public static class AssessmentImpl implements XSDSimpleTypeDefinition.Assessment

-  { 

-    public static final int YIELD_VALUE             = 0x01;

-    public static final int YIELD_CANONICAL_LITERAL = 0x02;

-    public static final int YIELD_DIAGNOSTICS       = 0x04;

-

-    /**

-     * This is the simple type definition doing the assessment.

-     */

-    public XSDSimpleTypeDefinitionImpl xsdSimpleTypeDefinition;

-

-    /**

-     * This is the simple type definition doing the assessment for an atomic type.

-     */

-    public XSDAnySimpleType xsdAnySimpleType;

-

-    /**

-     * This is the context in which the prefix of QNames are resolved.

-     */

-    public Element context;

-

-    /**

-     * This is the node whose literal is being assessed.

-     */

-    public Node node;

-

-    /**

-     * This is the literal that is being assessed.

-     */

-    public String literal;

-

-    /**

-     * This is the normalized value of the literal being assessed.

-     */

-    public String normalizedLiteral;

-

-    /**

-     *  This determines the results that will be yielded during assessment.

-     */

-    public int yield;

-

-    /**

-     * This is the value of the normalized literal in the Java representation of the value space.

-     */

-    public Object value;

-

-    /**

-     * This is the canonical literal representation of the literal.

-     */

-    public String canonicalLiteral;

-

-    /**

-     * These are the diagnostics that are collected.

-     */

-    public Collection<XSDDiagnostic> diagnostics;

-

-    /**

-     * This records any nested assessments that were performed.

-     */

-    public Collection<Assessment> assessments;

-

-    /**

-     * This creates an empty instance;

-     * minimally, the node or literal would need to be set before using this.

-     */

-    public AssessmentImpl()

-    {

-      super();

-    }

-

-    /**

-     * This creates an instance to assess the given node and to yield the specified results.

-     */

-    public AssessmentImpl(Node node, int yield)

-    {

-      this.yield = yield;

-      this.node = node;

-    }

-

-    /**

-     * This creates an instance to assess the given node and to yield the specified results.

-     */

-    public AssessmentImpl(Element context, Node node, int yield)

-    {

-      this.context = context;

-      this.yield = yield;

-      this.node = node;

-    }

-

-    /**

-     * This creates an instance to assess the given literal and to yield the specified results.

-     */

-    public AssessmentImpl(String literal, int yield)

-    {

-      this.yield = yield;

-      this.literal = literal;

-    }

-

-    /**

-     * This creates an instance to assess the given literal and to yield the specified results.

-     */

-    public AssessmentImpl(Element context, String literal, int yield)

-    {

-      this.context = context;

-      this.yield = yield;

-      this.literal = literal;

-    }

-

-    public XSDSimpleTypeDefinition getTypeDefinition()

-    {

-      return xsdSimpleTypeDefinition;

-    }

-

-    public Element getContext()

-    {

-      return context;

-    }

-

-    public Node getNode()

-    {

-      return node;

-    }

-

-    public String getLiteral()

-    {

-      return literal;

-    }

-

-    public String getNormalizedLiteral()

-    {

-      return normalizedLiteral;

-    }

-

-    public Object getValue()

-    {

-      return value;

-    }

-

-    public String getCanonicalLiteral()

-    {

-      return normalizedLiteral;

-    }

-

-    public XSDSimpleTypeDefinition getMemberTypeDefinition()

-    {

-      return null;

-    }

-

-    public Collection<XSDDiagnostic> getLocalDiagnostics()

-    {

-      return diagnostics == null ? Collections.<XSDDiagnostic>emptyList() : diagnostics;

-    }

-

-    public Collection<Assessment> getAssessments()

-    {

-      return assessments;

-    }

-

-    public Collection<XSDDiagnostic> getDiagnostics()

-    {

-      Collection<XSDDiagnostic> result = new ArrayList<XSDDiagnostic>();

-      getAllDiagnostics(result);

-      return result;

-    }

-

-    protected void getAllDiagnostics(Collection<XSDDiagnostic> result)

-    {

-      if (diagnostics != null)

-      {

-        result.addAll(diagnostics);

-      }

-      if (assessments != null)

-      {

-        for (Assessment assessment : assessments)

-        {

-          ((AssessmentImpl)assessment).getAllDiagnostics(result);

-        }

-      }

-    }

-

-    public void format(String noun, String name)

-    {

-      if (diagnostics != null)

-      {

-        for (XSDDiagnostic xsdDiagnostic : diagnostics)

-        {

-          xsdDiagnostic.setMessage(MessageFormat.format(xsdDiagnostic.getMessage(), new Object [] { noun, name }));

-        }

-      }

-      if (assessments != null)

-      {

-        for (Assessment assessment :  assessments)

-        {

-          assessment.format(noun, name);

-        }

-      }

-    }

-

-    public void assignDiagnostics(XSDConcreteComponent xsdConcreteComponent, Element element, String attributeName)

-    {

-      Collection<XSDDiagnostic> allDiagnostics = getDiagnostics();

-      if (!allDiagnostics.isEmpty())

-      {

-        Node theNode = element;

-        if (element != null && element.hasAttributeNS(null, attributeName))

-        {

-          theNode = element.getAttributeNodeNS(null, attributeName);

-        }

-

-        Object [] substitutions = new Object [] { XSDPlugin.INSTANCE.getString("attribute_noun"), attributeName };

-        for (XSDDiagnostic xsdDiagnostic : allDiagnostics)

-        {

-          xsdDiagnostic.setMessage(MessageFormat.format(xsdDiagnostic.getMessage(), substitutions));

-          xsdDiagnostic.getComponents().add(0, xsdConcreteComponent);

-          xsdDiagnostic.setNode(theNode);

-        }

-      }

-    }

-

-    public void validate(XSDConstrainingFacet xsdConstrainingFacet)

-    {

-      if (xsdConstrainingFacet != null &&

-            !(xsdConstrainingFacet instanceof XSDPatternFacet ?

-                ((XSDPatternFacet)xsdConstrainingFacet).isConstraintSatisfied(normalizedLiteral) :

-                xsdConstrainingFacet.isConstraintSatisfied(value)))

-      {

-        XSDDiagnostic result = ((XSDConcreteComponentImpl)xsdConstrainingFacet).getXSDFactory().createXSDDiagnostic();

-        result.setSeverity(XSDDiagnosticSeverity.ERROR_LITERAL);

-        Object [] substitutions =  createSubstitutions(5);

-        substitutions[3] = xsdConstrainingFacet.getLexicalValue();

-        substitutions[4] = xsdConstrainingFacet.getSimpleTypeDefinition().getURI();

-

-        String message = populateDiagnostic(result, "cvc-" + xsdConstrainingFacet.getFacetName() + "-valid", substitutions);

-        if (node == null || node.getNodeType() == Node.TEXT_NODE)

-        {

-          message = requote(message);

-        }

-        result.setMessage(XSDPlugin.INSTANCE.getString("_UI_XSDError_message", new Object [] { message}));

-        result.setAnnotationURI(XSDConstants.PART2 + "#" + xsdConstrainingFacet.getFacetName());

-        result.setPrimaryComponent(xsdConstrainingFacet);

-        result.setNode(node);

-

-        if (diagnostics == null)

-        {

-          diagnostics = new ArrayList<XSDDiagnostic>();

-        }

-        diagnostics.add(result);

-      }

-    }

-

-    protected Object [] createSubstitutions(int length)

-    {

-      Object [] substitutions =  new Object [length];

-      if (normalizedLiteral != null)

-      {

-        substitutions[0] = normalizedLiteral;

-      }

-      else if (literal != null)

-      {

-        substitutions[0] = literal;

-      }

-      else 

-      {

-        substitutions[0] = value;

-      }

-

-      if (node == null || node.getNodeType() == Node.TEXT_NODE)

-      {

-        substitutions[1] = "\000";

-        substitutions[2] = "\001";

-      }

-      else if (node.getNodeType() == Node.ATTRIBUTE_NODE)

-      {

-        substitutions[1] =  XSDPlugin.INSTANCE.getString("attribute_noun");

-        substitutions[2] = node.getLocalName();

-      }

-      else if (node.getNodeType() == Node.ELEMENT_NODE)

-      {

-        substitutions[1] =  XSDPlugin.INSTANCE.getString("element_noun");

-        substitutions[2] = node.getLocalName();

-      }

-

-      return substitutions;

-    }

-

-    protected static String requote(String message)

-    {

-      StringBuffer stringBuffer = new StringBuffer(message);

-      for (int i = stringBuffer.length() - 1;  i > 0; --i)

-      {

-        switch (stringBuffer.charAt(i))

-        {

-          case 0:

-          {

-            stringBuffer.replace(i, i + 1, "{0}");

-            break;

-          }

-          case 1:

-          {

-            stringBuffer.replace(i, i + 1, "{1}");

-            break;

-          }

-          case '\'':

-          {

-            stringBuffer.insert(i, '\'');

-            break;

-          }

-          case '{': // }

-          {

-            stringBuffer.replace(i, i + 1, "'{'"); // }

-            break;

-          }

-        }

-      }

-      return stringBuffer.toString();

-    }

-

-    public void reportDatatypeDiagnostic()

-    {

-      XSDDiagnostic result = xsdSimpleTypeDefinition.getXSDFactory().createXSDDiagnostic();

-      result.setSeverity(XSDDiagnosticSeverity.ERROR_LITERAL);

-      Object [] substitutions =  createSubstitutions(4);

-      substitutions[3] = xsdSimpleTypeDefinition.getURI();

-      XSDSimpleTypeDefinition primitiveTypeDefinition = xsdSimpleTypeDefinition.getPrimitiveTypeDefinition();

-      String message = 

-        populateDiagnostic

-          (result,

-           primitiveTypeDefinition == null ? 

-             "cvc-datatype-valid.1.2.3" : 

-             "cvc-datatype-valid.1.2.1", 

-           substitutions);

-      if (node == null || node.getNodeType() == Node.TEXT_NODE)

-      {

-        message = requote(message);

-      }

-      result.setMessage(XSDPlugin.INSTANCE.getString("_UI_XSDError_message", new Object [] { message }));

-      if (primitiveTypeDefinition != null)

-      {

-        result.setAnnotationURI(XSDConstants.PART2 + "#" + primitiveTypeDefinition.getName());

-      }

-      result.setPrimaryComponent(primitiveTypeDefinition);

-      result.setNode(node);

-

-      if (diagnostics == null)

-      {

-        diagnostics = new ArrayList<XSDDiagnostic>();

-      }

-      diagnostics.add(result);

-    }

-  }

-

-  public XSDSimpleTypeDefinition.Assessment assess(Node node)

-  {

-    return assess(null, node);

-  }

-

-  public XSDSimpleTypeDefinition.Assessment assess(Element context, Node node)

-  {

-    AssessmentImpl assessment = new AssessmentImpl(context, node, 0);

-    return assess(assessment);

-  }

-

-  public XSDSimpleTypeDefinition.Assessment assess(String literal)

-  {

-    return assess(null, literal);

-  }

-

-  public XSDSimpleTypeDefinition.Assessment assess(Element context, String literal)

-  {

-    AssessmentImpl assessment = new AssessmentImpl(context, literal, 0);

-    return assess(assessment);

-  }

-

-  public AssessmentImpl assess(AssessmentImpl assessment)

-  {

-    return assess(assessment, true);

-  }

-

-  public AssessmentImpl assess(AssessmentImpl assessment, boolean validate)

-  {

-    assessment.xsdSimpleTypeDefinition = this;

-

-    // Determine the literal from the node.

-    //

-    if (assessment.literal == null && assessment.node != null)

-    {

-      switch (assessment.node.getNodeType())

-      {

-        case Node.ATTRIBUTE_NODE:

-        {

-          assessment.literal = assessment.node.getNodeValue();

-          break;

-        }

-        case Node.ELEMENT_NODE:

-        {

-          Element element = (Element)assessment.node;

-          StringBuffer text = new StringBuffer();

-          for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling())

-          {

-            switch (child.getNodeType())

-            {

-              case Node.TEXT_NODE:

-              case Node.CDATA_SECTION_NODE:

-              {

-                text.append(child.getNodeValue());

-                break;

-              }

-            }

-          }

-          assessment.literal = text.toString();

-          break;

-        }

-        case Node.TEXT_NODE:

-        case Node.CDATA_SECTION_NODE:

-        {

-          assessment.literal = assessment.node.getNodeValue();

-          break;

-        }

-      }

-    }

-

-    // Determine the normalized literal from the literal.

-    //

-    if (assessment.normalizedLiteral == null && assessment.literal != null)

-    {

-      assessment.normalizedLiteral = assessment.literal;

-      XSDWhiteSpaceFacet effectiveWhiteSpaceFacet = getEffectiveWhiteSpaceFacet();

-      if (effectiveWhiteSpaceFacet != null)

-      {

-        assessment.normalizedLiteral = effectiveWhiteSpaceFacet.getNormalizedLiteral(assessment.literal);

-      }

-    }

-

-    if (!isCircular())

-    {

-      if (validate)

-      {

-        assessment.validate(getEffectivePatternFacet());

-      }

-

-      switch (getVariety().getValue())

-      {

-        case XSDVariety.ATOMIC:

-        {

-          XSDSimpleTypeDefinition thePrimitiveTypeDefinition = getPrimitiveTypeDefinition();

-          if (thePrimitiveTypeDefinition != null)

-          {

-            XSDAnySimpleType xsdAnySimpleType = XSDTypeRegister.getTypeImplementer(thePrimitiveTypeDefinition.getName());

-            xsdAnySimpleType.assess(assessment);

-            if (validate && assessment.diagnostics == null)

-            {

-              assessment.validate(getEffectiveLengthFacet());

-              assessment.validate(getEffectiveMinLengthFacet());

-              assessment.validate(getEffectiveMaxLengthFacet());

-

-              assessment.validate(getEffectiveTotalDigitsFacet());

-              assessment.validate(getEffectiveFractionDigitsFacet());

-

-              if (XSDOrdered.FALSE_LITERAL != getOrderedFacet().getValue())

-              {

-                assessment.validate(getEffectiveMinFacet());

-                assessment.validate(getEffectiveMaxFacet());

-              }

-            }

-          }

-          break;

-        }

-        case XSDVariety.UNION:

-        {

-          boolean good = false;

-          for (XSDSimpleTypeDefinition memberTypeDefinition : getMemberTypeDefinitions())

-          {

-            AssessmentImpl nestedAssessment = new AssessmentImpl(assessment.context, assessment.node, assessment.yield);

-            nestedAssessment.literal = nestedAssessment.normalizedLiteral = assessment.normalizedLiteral;

-

-            ((XSDSimpleTypeDefinitionImpl)memberTypeDefinition).assess(nestedAssessment);

-

-            if (nestedAssessment.diagnostics == null)

-            {

-              if (assessment.assessments == null)

-              {

-                assessment.assessments = new ArrayList<Assessment>();

-              }

-              assessment.assessments.add(nestedAssessment);

-              assessment.value = nestedAssessment.value;

-              good = true;

-              break;

-            }

-          }

-

-          if (validate && !good)

-          {

-            assessment.reportDatatypeDiagnostic();

-          }

-

-          break;

-        }

-        case XSDVariety.LIST:

-        {

-          XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();

-          if (theItemTypeDefinition != null)

-          {

-            List<Object> list = new ArrayList<Object>();

-            assessment.value = list;

-            for (StringTokenizer tokens = new StringTokenizer(assessment.normalizedLiteral, " "); 

-                 tokens.hasMoreTokens();  )

-            {

-              AssessmentImpl nestedAssessment = new AssessmentImpl(assessment.context, assessment.node, assessment.yield);

-              nestedAssessment.literal = nestedAssessment.normalizedLiteral = tokens.nextToken();

-              ((XSDSimpleTypeDefinitionImpl)getItemTypeDefinition()).assess(nestedAssessment, validate);

-              if (nestedAssessment.value != null)

-              {

-                list.add(nestedAssessment.value);

-              }

-              if (assessment.assessments == null)

-              {

-                assessment.assessments = new ArrayList<Assessment>();

-              }

-              assessment.assessments.add(nestedAssessment);

-            }

-

-            if (validate)

-            {

-              assessment.validate(getEffectiveLengthFacet());

-              assessment.validate(getEffectiveMinLengthFacet());

-              assessment.validate(getEffectiveMaxLengthFacet());

-            }

-          }

-          break;

-        }

-      }

-

-      if (validate)

-      {

-        assessment.validate(getEffectiveEnumerationFacet());

-      }

-    }

-

-    return assessment;

-  }

-

-  public boolean isValidLiteral(String literal)

-  {

-    return isValidLiteral(null, literal);

-  }

-

-  public boolean isValidLiteral(Element context, String literal)

-  {

-    AssessmentImpl assessment = new AssessmentImpl(context, literal, 0);

-    assess(assessment);

-    return assessment.diagnostics == null;

-  }

-

-  public Object getValue(String literal)

-  {

-    return getValue(null, literal);

-    

-  }

-

-  public Object getValue(Element context, String literal)

-  {

-    AssessmentImpl assessment = new AssessmentImpl(context, literal, 0);

-    assess(assessment, false);

-    return assessment.value;

-  }

-

-  public String getCanonicalLiteral(String literal)

-  {

-    AssessmentImpl assessment = new AssessmentImpl(null, literal, 0);

-    assess(assessment, false);

-    return assessment.normalizedLiteral;

-  }

-

-  public String getNormalizedLiteral(String literal)

-  {

-    String result = literal;

-    XSDWhiteSpaceFacet effectiveWhiteSpaceFacet = getEffectiveWhiteSpaceFacet();

-    if (effectiveWhiteSpaceFacet != null)

-    {

-      result = effectiveWhiteSpaceFacet.getNormalizedLiteral(result);

-    }

-    return result;

-  }

-

-  public boolean equalValues(Object value1, Object value2)

-  {

-    return value1 == null ? value2 == null : value1.equals(value2);

-  }

-

-  public boolean equalLiterals(String literal1, String literal2)

-  {

-    return equalLiterals(null, literal1, null, literal2);

-  }

-

-  public boolean equalLiterals(Element context1, String literal1, Element context2, String literal2)

-  {

-    return equalValues(getValue(context1, literal1), getValue(context2, literal2));

-  }

-

-  public int compareValues(Object value1, Object value2)

-  {

-    if (XSDOrdered.FALSE_LITERAL != getOrderedFacet().getValue())

-    {

-      XSDSimpleTypeDefinition thePrimitiveTypeDefinition = getPrimitiveTypeDefinition();

-      if (thePrimitiveTypeDefinition != null)

-      {

-        XSDAnySimpleType xsdAnySimpleType = 

-          XSDTypeRegister.getTypeImplementer(thePrimitiveTypeDefinition.getName());

-        return 

-          value1 == null ?

-             value2 == null ? 

-               0 : 

-               -1 :

-             value2 == null ? 

-               1 :

-               xsdAnySimpleType.compareValues(value1, value2);

-      }

-    }

-    return 0;

-  }

-

-  public int compareLiterals(String literal1, String literal2)

-  {

-    return compareLiterals(null, literal1, null, literal2);

-  }

-

-  public int compareLiterals(Element context1, String literal1, Element context2, String literal2)

-  {

-    return compareValues(getValue(context1, literal1), getValue(context2, literal2));

-  }

-

-  @Override

-  public XSDTypeDefinition getBadTypeDerivation(XSDTypeDefinition xsdTypeDefinition, boolean extension, boolean restriction)

-  {

-    if (xsdTypeDefinition == this)

-    {

-      return null;

-    }

-    else if (!restriction || 

-               getBaseTypeDefinition() == null || 

-               getBaseTypeDefinition().getFinal().contains(XSDSimpleFinal.RESTRICTION_LITERAL))

-    {

-      return this;

-    }

-    else

-    {

-      XSDTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();

-      XSDTypeDefinition result = theBaseTypeDefinition;

-      if (theBaseTypeDefinition == xsdTypeDefinition)

-      {

-        return null;

-      }

-      else if (!XSDConstants.isURType(theBaseTypeDefinition))

-      {

-        result = theBaseTypeDefinition.getBadTypeDerivation(xsdTypeDefinition, extension, restriction);

-        if (result == null)

-        {

-          return null;

-        }

-      }

-

-      switch (getVariety().getValue())

-      {

-        case XSDVariety.LIST:

-        case XSDVariety.UNION:

-        {

-          if (XSDConstants.isURType(xsdTypeDefinition))

-          {

-            return null;

-          }

-        }

-      }

-

-      if (xsdTypeDefinition instanceof XSDSimpleTypeDefinition)

-      {

-        XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition)xsdTypeDefinition;

-        if (xsdSimpleTypeDefinition.getVariety() == XSDVariety.UNION_LITERAL)

-        {

-          for (XSDSimpleTypeDefinition memberTypeDefinition : xsdSimpleTypeDefinition.getMemberTypeDefinitions())

-          {

-            XSDTypeDefinition memberResult = getBadTypeDerivation(memberTypeDefinition, extension, restriction);

-            if (memberResult == null)

-            {

-              return null;

-            }

-          }

-        }

-      }

-      else if (XSDConstants.isAnyType(xsdTypeDefinition))

-      {

-        return null;

-      }

-

-      return result;

-    }

-  }

-

-  @Override

-  public XSDConcreteComponent cloneConcreteComponent(boolean deep, boolean shareDOM)

-  {

-    XSDSimpleTypeDefinitionImpl clonedSimpleTypeDefinition =

-      (XSDSimpleTypeDefinitionImpl)getXSDFactory().createXSDSimpleTypeDefinition();

-    clonedSimpleTypeDefinition.isReconciling = true;

-

-    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();

-

-    if (getName() != null)

-    {

-      clonedSimpleTypeDefinition.setName(getName());

-    }

-    if (isSetLexicalFinal())

-    {

-      if (!getLexicalFinal().isEmpty())

-      {

-        clonedSimpleTypeDefinition.getLexicalFinal().addAll(getLexicalFinal());

-      }

-      else

-      {

-        clonedSimpleTypeDefinition.getLexicalFinal().clear();

-      }

-    }

-

-    if (!(getContainer() instanceof XSDComplexTypeDefinition))

-    {

-      if (getItemTypeDefinition() != null && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))

-      {

-        if (!getContents().contains(getItemTypeDefinition()))

-        {

-          XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();

-          clonedSimpleTypeDefinition.setItemTypeDefinition

-            (createUnresolvedSimpleTypeDefinition

-              (theItemTypeDefinition.getTargetNamespace(), theItemTypeDefinition.getName()));

-        }

-      }

-      else if (!getMemberTypeDefinitions().isEmpty() && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))

-      {

-        List<XSDSimpleTypeDefinition> unresolvedMembers = new ArrayList<XSDSimpleTypeDefinition>(getMemberTypeDefinitions().size());

-        for (XSDSimpleTypeDefinition memberTypeDefinition : getMemberTypeDefinitions())

-        {

-          if (getContents().contains(memberTypeDefinition))

-          {

-            break;

-          }

-          else

-          {

-            unresolvedMembers.add

-              (createUnresolvedSimpleTypeDefinition

-                (memberTypeDefinition.getTargetNamespace(), memberTypeDefinition.getName()));

-          }

-        }

-        if (!unresolvedMembers.isEmpty())

-        {

-          clonedSimpleTypeDefinition.getMemberTypeDefinitions().addAll(unresolvedMembers);

-        }

-      }

-      else

-      {

-        if (getBaseTypeDefinition() != null && !getContents().contains(getBaseTypeDefinition()))

-        {

-          clonedSimpleTypeDefinition.setBaseTypeDefinition

-            (createUnresolvedSimpleTypeDefinition

-              (theBaseTypeDefinition.getTargetNamespace(), theBaseTypeDefinition.getName()));

-        }

-      }

-    }

-

-    if (deep)

-    {

-      if (getAnnotation() != null)

-      {

-        clonedSimpleTypeDefinition.setAnnotation((XSDAnnotation)getAnnotation().cloneConcreteComponent(deep, shareDOM));

-      }

-      if (getDerivationAnnotation() != null)

-      {

-        clonedSimpleTypeDefinition.setDerivationAnnotation((XSDAnnotation)getDerivationAnnotation().cloneConcreteComponent(deep, shareDOM));

-      }

-      if (!getContents().isEmpty())

-      {

-        clonedSimpleTypeDefinition.getContents().addAll(cloneConcreteComponents(getContents(), deep, shareDOM));

-        if (getItemTypeDefinition() != null && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))

-        {

-          clonedSimpleTypeDefinition.setItemTypeDefinition(clonedSimpleTypeDefinition.getContents().get(0));

-        }

-        else if (!getMemberTypeDefinitions().isEmpty() && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))

-        {

-          clonedSimpleTypeDefinition.getMemberTypeDefinitions().addAll(clonedSimpleTypeDefinition.getContents());

-        }

-        else

-        {

-          clonedSimpleTypeDefinition.setBaseTypeDefinition(clonedSimpleTypeDefinition.getContents().get(0));

-        }

-      }

-      if (!getFacetContents().isEmpty())

-      {

-        clonedSimpleTypeDefinition.getFacetContents().addAll(cloneConcreteComponents(getFacetContents(), deep, shareDOM));

-      }

-    }

-

-    if (shareDOM && getElement() != null)

-    {

-      clonedSimpleTypeDefinition.setElement(getElement());

-    }

-

-    clonedSimpleTypeDefinition.isReconciling = shareDOM;

-    return clonedSimpleTypeDefinition;

-  }

-}

+/**
+ * Copyright (c) 2002-2007 IBM Corporation and others.
+ * All rights reserved.   This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors: 
+ *   IBM - Initial API and implementation
+ */
+package org.eclipse.xsd.impl;
+
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.UniqueEList;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.EObjectEList;
+import org.eclipse.emf.ecore.util.EcoreEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.xsd.XSDAnnotation;
+import org.eclipse.xsd.XSDBoundedFacet;
+import org.eclipse.xsd.XSDCardinality;
+import org.eclipse.xsd.XSDCardinalityFacet;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDComponent;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDConstrainingFacet;
+import org.eclipse.xsd.XSDDerivationMethod;
+import org.eclipse.xsd.XSDDiagnostic;
+import org.eclipse.xsd.XSDDiagnosticSeverity;
+import org.eclipse.xsd.XSDEnumerationFacet;
+import org.eclipse.xsd.XSDFacet;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDFeature;
+import org.eclipse.xsd.XSDFractionDigitsFacet;
+import org.eclipse.xsd.XSDFundamentalFacet;
+import org.eclipse.xsd.XSDLengthFacet;
+import org.eclipse.xsd.XSDMaxExclusiveFacet;
+import org.eclipse.xsd.XSDMaxFacet;
+import org.eclipse.xsd.XSDMaxInclusiveFacet;
+import org.eclipse.xsd.XSDMaxLengthFacet;
+import org.eclipse.xsd.XSDMinExclusiveFacet;
+import org.eclipse.xsd.XSDMinFacet;
+import org.eclipse.xsd.XSDMinInclusiveFacet;
+import org.eclipse.xsd.XSDMinLengthFacet;
+import org.eclipse.xsd.XSDNumericFacet;
+import org.eclipse.xsd.XSDOrdered;
+import org.eclipse.xsd.XSDOrderedFacet;
+import org.eclipse.xsd.XSDPackage;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDPatternFacet;
+import org.eclipse.xsd.XSDPlugin;
+import org.eclipse.xsd.XSDProhibitedSubstitutions;
+import org.eclipse.xsd.XSDRedefine;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleFinal;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTotalDigitsFacet;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDVariety;
+import org.eclipse.xsd.XSDWhiteSpaceFacet;
+import org.eclipse.xsd.impl.type.XSDAnySimpleType;
+import org.eclipse.xsd.impl.type.XSDTypeRegister;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Simple Type Definition</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getVariety <em>Variety</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFinal <em>Final</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getLexicalFinal <em>Lexical Final</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getValidFacets <em>Valid Facets</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getContents <em>Contents</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFacetContents <em>Facet Contents</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFacets <em>Facets</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMemberTypeDefinitions <em>Member Type Definitions</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFundamentalFacets <em>Fundamental Facets</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getBaseTypeDefinition <em>Base Type Definition</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getPrimitiveTypeDefinition <em>Primitive Type Definition</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getItemTypeDefinition <em>Item Type Definition</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getRootTypeDefinition <em>Root Type Definition</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMinFacet <em>Min Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMaxFacet <em>Max Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMaxInclusiveFacet <em>Max Inclusive Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMinInclusiveFacet <em>Min Inclusive Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMinExclusiveFacet <em>Min Exclusive Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMaxExclusiveFacet <em>Max Exclusive Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getLengthFacet <em>Length Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getWhiteSpaceFacet <em>White Space Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEnumerationFacets <em>Enumeration Facets</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getPatternFacets <em>Pattern Facets</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getCardinalityFacet <em>Cardinality Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getNumericFacet <em>Numeric Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMaxLengthFacet <em>Max Length Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getMinLengthFacet <em>Min Length Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getTotalDigitsFacet <em>Total Digits Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getFractionDigitsFacet <em>Fraction Digits Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getOrderedFacet <em>Ordered Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getBoundedFacet <em>Bounded Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveMaxFacet <em>Effective Max Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveWhiteSpaceFacet <em>Effective White Space Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveMaxLengthFacet <em>Effective Max Length Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveFractionDigitsFacet <em>Effective Fraction Digits Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectivePatternFacet <em>Effective Pattern Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveEnumerationFacet <em>Effective Enumeration Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveTotalDigitsFacet <em>Effective Total Digits Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveMinLengthFacet <em>Effective Min Length Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveLengthFacet <em>Effective Length Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getEffectiveMinFacet <em>Effective Min Facet</em>}</li>
+ *   <li>{@link org.eclipse.xsd.impl.XSDSimpleTypeDefinitionImpl#getSyntheticFacets <em>Synthetic Facets</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class XSDSimpleTypeDefinitionImpl 
+  extends XSDTypeDefinitionImpl 
+  implements XSDSimpleTypeDefinition
+{
+  /**
+   * The default value of the '{@link #getVariety() <em>Variety</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVariety()
+   * @generated
+   * @ordered
+   */
+  protected static final XSDVariety VARIETY_EDEFAULT = XSDVariety.ATOMIC_LITERAL;
+
+  /**
+   * The offset of the flags representing the value of the '{@link #getVariety() <em>Variety</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  protected static final int VARIETY_EFLAG_OFFSET = 8;
+
+  /**
+   * The flags representing the default value of the '{@link #getVariety() <em>Variety</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  protected static final int VARIETY_EFLAG_DEFAULT = VARIETY_EDEFAULT.ordinal() << VARIETY_EFLAG_OFFSET;
+
+  /**
+   * The array of enumeration values for '{@link XSDVariety Variety}'
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  private static final XSDVariety[] VARIETY_EFLAG_VALUES = XSDVariety.values();
+
+  /**
+   * The flags representing the value of the '{@link #getVariety() <em>Variety</em>}' attribute.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getVariety()
+   * @generated
+   * @ordered
+   */
+  protected static final int VARIETY_EFLAG = 0x3 << VARIETY_EFLAG_OFFSET;
+
+  /**
+   * The flag representing whether the Variety attribute has been set.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   * @ordered
+   */
+  protected static final int VARIETY_ESETFLAG = 1 << 10;
+
+  /**
+   * The cached value of the '{@link #getFinal() <em>Final</em>}' attribute list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getFinal()
+   * @generated
+   * @ordered
+   */
+  protected EList<XSDSimpleFinal> final_;
+
+  /**
+   * The cached value of the '{@link #getLexicalFinal() <em>Lexical Final</em>}' attribute list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getLexicalFinal()
+   * @generated
+   * @ordered
+   */
+  protected EList<XSDSimpleFinal> lexicalFinal;
+
+  /**
+   * The cached value of the '{@link #getValidFacets() <em>Valid Facets</em>}' attribute list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getValidFacets()
+   * @generated
+   * @ordered
+   */
+  protected EList<String> validFacets;
+
+  /**
+   * The cached value of the '{@link #getContents() <em>Contents</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getContents()
+   * @generated
+   * @ordered
+   */
+  protected EList<XSDSimpleTypeDefinition> contents;
+
+  /**
+   * The cached value of the '{@link #getFacetContents() <em>Facet Contents</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getFacetContents()
+   * @generated NOT
+   * @ordered
+   */
+  protected EcoreEList<XSDConstrainingFacet> facetContents = null;
+
+  /**
+   * The cached value of the '{@link #getFacets() <em>Facets</em>}' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getFacets()
+   * @generated NOT
+   * @ordered
+   */
+  protected EcoreEList<XSDConstrainingFacet> facets = null;
+
+  /**
+   * The cached value of the '{@link #getMemberTypeDefinitions() <em>Member Type Definitions</em>}' reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getMemberTypeDefinitions()
+   * @generated
+   * @ordered
+   */
+  protected EList<XSDSimpleTypeDefinition> memberTypeDefinitions;
+
+  /**
+   * The cached value of the '{@link #getFundamentalFacets() <em>Fundamental Facets</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getFundamentalFacets()
+   * @generated
+   * @ordered
+   */
+  protected EList<XSDFundamentalFacet> fundamentalFacets;
+
+  /**
+   * The cached value of the '{@link #getBaseTypeDefinition() <em>Base Type Definition</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getBaseTypeDefinition()
+   * @generated
+   * @ordered
+   */
+  protected XSDSimpleTypeDefinition baseTypeDefinition;
+
+  /**
+   * The cached value of the '{@link #getPrimitiveTypeDefinition() <em>Primitive Type Definition</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getPrimitiveTypeDefinition()
+   * @generated
+   * @ordered
+   */
+  protected XSDSimpleTypeDefinition primitiveTypeDefinition;
+
+  /**
+   * The cached value of the '{@link #getItemTypeDefinition() <em>Item Type Definition</em>}' reference.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getItemTypeDefinition()
+   * @generated
+   * @ordered
+   */
+  protected XSDSimpleTypeDefinition itemTypeDefinition;
+
+  /**
+   * The cached value of the '{@link #getSyntheticFacets() <em>Synthetic Facets</em>}' containment reference list.
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @see #getSyntheticFacets()
+   * @generated
+   * @ordered
+   */
+  protected EList<XSDFacet> syntheticFacets;
+
+  public static XSDSimpleTypeDefinition createSimpleTypeDefinition(Node node)
+  {
+    switch (XSDConstants.nodeType(node))
+    {
+      case XSDConstants.SIMPLETYPE_ELEMENT:
+      case XSDConstants.SIMPLECONTENT_ELEMENT:
+      {
+        XSDSimpleTypeDefinition xsdSimpleTypeDefinition = XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
+        xsdSimpleTypeDefinition.setElement((Element)node);
+        return xsdSimpleTypeDefinition;
+      }
+    }
+
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  protected XSDSimpleTypeDefinitionImpl()
+  {
+    super();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  protected EClass eStaticClass()
+  {
+    return XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public XSDVariety getVariety()
+  {
+    return VARIETY_EFLAG_VALUES[(eFlags & VARIETY_EFLAG) >>> VARIETY_EFLAG_OFFSET];
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setVariety(XSDVariety newVariety)
+  {
+    XSDVariety oldVariety = VARIETY_EFLAG_VALUES[(eFlags & VARIETY_EFLAG) >>> VARIETY_EFLAG_OFFSET];
+    if (newVariety == null) newVariety = VARIETY_EDEFAULT;
+    eFlags = eFlags & ~VARIETY_EFLAG | newVariety.ordinal() << VARIETY_EFLAG_OFFSET;
+    boolean oldVarietyESet = (eFlags & VARIETY_ESETFLAG) != 0;
+    eFlags |= VARIETY_ESETFLAG;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY, oldVariety, newVariety, !oldVarietyESet));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void unsetVariety()
+  {
+    XSDVariety oldVariety = VARIETY_EFLAG_VALUES[(eFlags & VARIETY_EFLAG) >>> VARIETY_EFLAG_OFFSET];
+    boolean oldVarietyESet = (eFlags & VARIETY_ESETFLAG) != 0;
+    eFlags = eFlags & ~VARIETY_EFLAG | VARIETY_EFLAG_DEFAULT;
+    eFlags &= ~VARIETY_ESETFLAG;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.UNSET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY, oldVariety, VARIETY_EDEFAULT, oldVarietyESet));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isSetVariety()
+  {
+    return (eFlags & VARIETY_ESETFLAG) != 0;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<XSDSimpleFinal> getFinal()
+  {
+    if (final_ == null)
+    {
+      final_ = new EDataTypeUniqueEList<XSDSimpleFinal>(XSDSimpleFinal.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL);
+    }
+    return final_;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<XSDSimpleFinal> getLexicalFinal()
+  {
+    if (lexicalFinal == null)
+    {
+      lexicalFinal = new EDataTypeUniqueEList.Unsettable<XSDSimpleFinal>(XSDSimpleFinal.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL);
+    }
+    return lexicalFinal;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void unsetLexicalFinal()
+  {
+    if (lexicalFinal != null) ((InternalEList.Unsettable<?>)lexicalFinal).unset();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public boolean isSetLexicalFinal()
+  {
+    return lexicalFinal != null && ((InternalEList.Unsettable<?>)lexicalFinal).isSet();
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<String> getValidFacets()
+  {
+    if (validFacets == null)
+    {
+      validFacets = new EDataTypeUniqueEList<String>(String.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS);
+    }
+    return validFacets;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<XSDSimpleTypeDefinition> getContents()
+  {
+    if (contents == null)
+    {
+      contents = new EObjectContainmentEList<XSDSimpleTypeDefinition>(XSDSimpleTypeDefinition.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS);
+    }
+    return contents;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<XSDConstrainingFacet> getFacetContents()
+  {
+    if (facetContents == null)
+    {
+      facetContents = new EObjectContainmentEList<XSDConstrainingFacet>(XSDConstrainingFacet.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS);
+    }
+    return facetContents;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<XSDConstrainingFacet> getFacets()
+  {
+    if (facets == null)
+    {
+      facets = new EObjectEList<XSDConstrainingFacet>(XSDConstrainingFacet.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS);
+    }
+    return facets;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<XSDSimpleTypeDefinition> getMemberTypeDefinitions()
+  {
+    if (memberTypeDefinitions == null)
+    {
+      memberTypeDefinitions = new EObjectEList<XSDSimpleTypeDefinition>(XSDSimpleTypeDefinition.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS);
+    }
+    return memberTypeDefinitions;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<XSDFundamentalFacet> getFundamentalFacets()
+  {
+    if (fundamentalFacets == null)
+    {
+      fundamentalFacets = new EObjectContainmentEList<XSDFundamentalFacet>(XSDFundamentalFacet.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS);
+    }
+    return fundamentalFacets;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public XSDSimpleTypeDefinition getBaseTypeDefinition()
+  {
+    return baseTypeDefinition;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setBaseTypeDefinition(XSDSimpleTypeDefinition newBaseTypeDefinition)
+  {
+    XSDSimpleTypeDefinition oldBaseTypeDefinition = baseTypeDefinition;
+    baseTypeDefinition = newBaseTypeDefinition;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION, oldBaseTypeDefinition, baseTypeDefinition));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public XSDSimpleTypeDefinition getPrimitiveTypeDefinition()
+  {
+    return primitiveTypeDefinition;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setPrimitiveTypeDefinition(XSDSimpleTypeDefinition newPrimitiveTypeDefinition)
+  {
+    XSDSimpleTypeDefinition oldPrimitiveTypeDefinition = primitiveTypeDefinition;
+    primitiveTypeDefinition = newPrimitiveTypeDefinition;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION, oldPrimitiveTypeDefinition, primitiveTypeDefinition));
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public XSDSimpleTypeDefinition getItemTypeDefinition()
+  {
+    return itemTypeDefinition;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public void setItemTypeDefinition(XSDSimpleTypeDefinition newItemTypeDefinition)
+  {
+    XSDSimpleTypeDefinition oldItemTypeDefinition = itemTypeDefinition;
+    itemTypeDefinition = newItemTypeDefinition;
+    if (eNotificationRequired())
+      eNotify(new ENotificationImpl(this, Notification.SET, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION, oldItemTypeDefinition, itemTypeDefinition));
+  }
+
+  @Override
+  public Element createElement()
+  {
+    XSDComplexTypeDefinition xsdComplexTypeDefinition =
+      getContainer() instanceof XSDComplexTypeDefinition ? 
+        (XSDComplexTypeDefinition)getContainer() :
+        null;
+
+    Element newElement = 
+      createElement
+        (xsdComplexTypeDefinition != null ?
+           XSDConstants.SIMPLECONTENT_ELEMENT : 
+           XSDConstants.SIMPLETYPE_ELEMENT);
+    setElement(newElement);
+
+    Element childElement = createChildElement();
+    newElement.appendChild(childElement);
+    return newElement;
+  }
+
+  protected Element createChildElement()
+  {
+    return createElement(getRequiredChildElementNodeType());
+  }
+
+  protected int getRequiredChildElementNodeType()
+  {
+    XSDComplexTypeDefinition xsdComplexTypeDefinition =
+      getContainer() instanceof XSDComplexTypeDefinition ? 
+        (XSDComplexTypeDefinition)getContainer() :
+        null;
+
+    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();
+    if (getItemTypeDefinition() != null && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))
+    {
+      return XSDConstants.LIST_ELEMENT;
+    }
+    else if (!getMemberTypeDefinitions().isEmpty() && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))
+    {
+      return XSDConstants.UNION_ELEMENT;
+    }
+    else
+    {
+      return
+        xsdComplexTypeDefinition == null || XSDDerivationMethod.EXTENSION_LITERAL != xsdComplexTypeDefinition.getDerivationMethod() ? 
+          XSDConstants.RESTRICTION_ELEMENT :
+          XSDConstants.EXTENSION_ELEMENT;
+    }
+  }
+
+  @Override
+  protected void patch()
+  {
+    super.patch();
+
+    if (!(getContainer() instanceof XSDComplexTypeDefinition))
+    {
+      XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();
+      if (theBaseTypeDefinition != null && (forceResolve || theBaseTypeDefinition.getContainer() == null))
+      {
+        theBaseTypeDefinition = resolveSimpleTypeDefinition(theBaseTypeDefinition.getTargetNamespace(), theBaseTypeDefinition.getName());
+      }
+      theBaseTypeDefinition = handleNewBaseTypeDefinition(theBaseTypeDefinition);
+      if (theBaseTypeDefinition == null || !theBaseTypeDefinition.isSetVariety() || theBaseTypeDefinition.getVariety() != getVariety())
+      {
+        XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();
+        if (theItemTypeDefinition != null)
+        {
+          if (forceResolve || theItemTypeDefinition.getContainer() == null)
+          {
+            XSDSimpleTypeDefinition newItemTypeDefinition = 
+              resolveSimpleTypeDefinition(theItemTypeDefinition.getTargetNamespace(), theItemTypeDefinition.getName());
+            if ((forceResolve || newItemTypeDefinition.getContainer() != null) && newItemTypeDefinition != theItemTypeDefinition)
+            {
+              setItemTypeDefinition(newItemTypeDefinition);
+            }
+          }
+        }
+        else
+        {
+          for (ListIterator<XSDSimpleTypeDefinition> theMemberTypeDefinitions = getMemberTypeDefinitions().listIterator(); 
+               theMemberTypeDefinitions.hasNext(); )
+          {
+            XSDSimpleTypeDefinition theMemberTypeDefinition = theMemberTypeDefinitions.next();
+            if (forceResolve || theMemberTypeDefinition.getContainer() == null)
+            {
+              XSDSimpleTypeDefinition newMemberTypeDefinition = 
+                resolveSimpleTypeDefinition(theMemberTypeDefinition.getTargetNamespace(), theMemberTypeDefinition.getName());
+              if ((forceResolve || newMemberTypeDefinition.getContainer() != null) && newMemberTypeDefinition != theMemberTypeDefinition)
+              {
+                theMemberTypeDefinitions.set(newMemberTypeDefinition);
+              }
+            }
+          }
+        }
+      }
+    }
+
+    XSDSchema xsdSchema = getSchema();
+    if (xsdSchema != null)
+    {
+      List<XSDSimpleFinal> newFinal = new ArrayList<XSDSimpleFinal>();
+      if (!isSetLexicalFinal())
+      {
+        for (XSDProhibitedSubstitutions value : xsdSchema.getFinalDefault())
+        {
+          switch (value.getValue())
+          {
+            case XSDProhibitedSubstitutions.ALL:
+            {
+              newFinal.add(XSDSimpleFinal.RESTRICTION_LITERAL);
+              newFinal.add(XSDSimpleFinal.LIST_LITERAL);
+              newFinal.add(XSDSimpleFinal.UNION_LITERAL);
+              break;
+            }
+            case XSDProhibitedSubstitutions.RESTRICTION:
+            {
+              newFinal.add(XSDSimpleFinal.RESTRICTION_LITERAL);
+              break;
+            }
+          }
+        }
+      }
+      else
+      {
+        for (XSDSimpleFinal value : getLexicalFinal())
+        {
+          switch (value.getValue())
+          {
+            case XSDSimpleFinal.ALL:
+            {
+              newFinal.add(XSDSimpleFinal.RESTRICTION_LITERAL);
+              newFinal.add(XSDSimpleFinal.LIST_LITERAL);
+              newFinal.add(XSDSimpleFinal.UNION_LITERAL);
+              break;
+            }
+            default:
+            {
+              newFinal.add(value);
+              break;
+            }
+          }
+        }
+      }
+
+      Collection<XSDSimpleFinal> oldFinal = new ArrayList<XSDSimpleFinal>(getFinal());
+      oldFinal.removeAll(newFinal);
+      if (!oldFinal.isEmpty())
+      {
+        getFinal().removeAll(oldFinal);
+      }
+      setListContentAndOrder(getFinal(), newFinal);
+    }
+  }
+
+  @Override
+  protected void traverseToRootForAnalysis()
+  {
+    analysisState = UNANALYZED;
+    super.traverseToRootForAnalysis();
+  }
+
+  protected XSDWhiteSpaceFacet effectiveWhiteSpaceFacet;
+  @Override
+  protected void handleAnalysis()
+  {
+    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();
+
+    XSDConcreteComponent container = getContainer();
+    if (container instanceof XSDComplexTypeDefinition)
+    {
+      if (!getContents().contains(theBaseTypeDefinition))
+      {
+        XSDComplexTypeDefinition xsdComplexTypeDefinition = (XSDComplexTypeDefinitionImpl)container;
+        XSDTypeDefinition complexBaseTypeDefinition = xsdComplexTypeDefinition.getBaseTypeDefinition();
+        if (complexBaseTypeDefinition != null)
+        {
+          ((XSDConcreteComponentImpl)complexBaseTypeDefinition).analyze();
+          theBaseTypeDefinition = handleNewBaseTypeDefinition(complexBaseTypeDefinition.getSimpleType());
+        }
+      }
+    }
+
+    if (getFundamentalFacets().isEmpty())
+    {
+      createFundamentalFacets();
+    }
+
+    List<XSDConstrainingFacet> newFacets = null;
+    boolean newBounded = false;
+    XSDCardinality newCardinality = XSDCardinality.FINITE_LITERAL;
+    boolean newNumeric = false;
+    XSDOrdered newOrdered = XSDOrdered.FALSE_LITERAL;
+    XSDSimpleTypeDefinition newPrimitiveTypeDefinition = null;
+    XSDVariety newVariety = null;
+    EList<String> newValidFacets = null;
+
+    if (theBaseTypeDefinition != null && theBaseTypeDefinition.getContainer() != null)
+    {
+      if (!((XSDConcreteComponentImpl)theBaseTypeDefinition).analyze() && !XSDConstants.isURType(theBaseTypeDefinition) && theBaseTypeDefinition.isCircular())
+      {
+        analysisState = CIRCULAR;
+      }
+      if (theBaseTypeDefinition != this)
+      {
+        if (!XSDConstants.isURType(this))
+        {
+          newVariety = XSDVariety.ATOMIC_LITERAL;
+          newPrimitiveTypeDefinition = this;
+        }
+
+        if (!XSDConstants.isURType(theBaseTypeDefinition))
+        {
+          newVariety = theBaseTypeDefinition.getVariety();
+          newPrimitiveTypeDefinition = theBaseTypeDefinition.getPrimitiveTypeDefinition();
+          newBounded = theBaseTypeDefinition.getBoundedFacet().isValue();
+          newCardinality = theBaseTypeDefinition.getCardinalityFacet().getValue();
+          newNumeric = theBaseTypeDefinition.getNumericFacet().isValue();
+          newOrdered = theBaseTypeDefinition.getOrderedFacet().getValue();
+          newValidFacets = theBaseTypeDefinition.getValidFacets();
+
+          if (XSDVariety.LIST_LITERAL == theBaseTypeDefinition.getVariety())
+          {
+            XSDSimpleTypeDefinition newItemTypeDefinition = theBaseTypeDefinition.getItemTypeDefinition();
+            if (newItemTypeDefinition != getItemTypeDefinition())
+            {
+              setItemTypeDefinition(newItemTypeDefinition);
+            }
+          }
+          else if (XSDVariety.UNION_LITERAL == theBaseTypeDefinition.getVariety())
+          {
+            List<XSDSimpleTypeDefinition> newMemberTypeDefinitions = theBaseTypeDefinition.getMemberTypeDefinitions();
+            List<XSDSimpleTypeDefinition> remainingMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>(getMemberTypeDefinitions());
+            remainingMemberTypeDefinitions.removeAll(newMemberTypeDefinitions);
+            if (!remainingMemberTypeDefinitions.isEmpty())
+            {
+              getMemberTypeDefinitions().removeAll(remainingMemberTypeDefinitions);
+            }
+            if (!newMemberTypeDefinitions.isEmpty())
+            {
+              setListContentAndOrder(getMemberTypeDefinitions(), newMemberTypeDefinitions);
+            }
+          }
+        }
+        else
+        {
+          newFacets = new ArrayList<XSDConstrainingFacet>(getFacetContents());
+        }
+      }
+      else
+      {
+        newFacets = new ArrayList<XSDConstrainingFacet>(getFacetContents());
+      }
+    }
+    else
+    {
+      newFacets = new ArrayList<XSDConstrainingFacet>(getFacetContents());
+    }
+
+    if (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition))
+    {
+      XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();
+      if (theItemTypeDefinition != null && theItemTypeDefinition.getContainer() != null)
+      {
+        newVariety = XSDVariety.LIST_LITERAL;
+        newPrimitiveTypeDefinition = null;
+        if (!((XSDConcreteComponentImpl)theItemTypeDefinition).analyze() && !XSDConstants.isURType(theItemTypeDefinition) && theItemTypeDefinition.isCircular())
+        {
+          analysisState = CIRCULAR;
+        }
+        newValidFacets = getValidFacetsForList();
+        if (effectiveWhiteSpaceFacet == null)
+        {
+          effectiveWhiteSpaceFacet = getXSDFactory().createXSDWhiteSpaceFacet();
+          effectiveWhiteSpaceFacet.setLexicalValue("collapse");
+          effectiveWhiteSpaceFacet.setFixed(true);
+          getSyntheticFacets().add(effectiveWhiteSpaceFacet);
+        }
+        if (newFacets != null)
+        {
+          newFacets.add(effectiveWhiteSpaceFacet);
+        }
+      }
+      else if (!getMemberTypeDefinitions().isEmpty())
+      {
+        newVariety = XSDVariety.UNION_LITERAL;
+        newPrimitiveTypeDefinition = null;
+        newNumeric = true;
+        for (XSDSimpleTypeDefinition theMemberTypeDefinition : getMemberTypeDefinitions())
+        {
+          if (theMemberTypeDefinition.getContainer() != null)
+          {
+            if (!((XSDConcreteComponentImpl)theMemberTypeDefinition).analyze() && !XSDConstants.isURType(theMemberTypeDefinition) && theMemberTypeDefinition.isCircular())
+            {
+              analysisState = CIRCULAR;
+            }
+            if (!theMemberTypeDefinition.getNumericFacet().isValue())
+            {
+              newNumeric = false;
+            }
+          }
+        }
+
+        XSDTypeDefinition lowestCommonAncestor = getLowestCommonAncestor(getMemberTypeDefinitions());
+        if (lowestCommonAncestor instanceof XSDSimpleTypeDefinition && lowestCommonAncestor.getContainer() != null)
+        {
+          newOrdered = ((XSDSimpleTypeDefinition)lowestCommonAncestor).getOrderedFacet().getValue();
+        }
+        newValidFacets = getValidFacetsForUnion();
+      }
+      else if (getElement() != null)
+      {
+        LOOP:
+        for (Node child = getElement().getFirstChild(); child != null; child = child.getNextSibling())
+        {
+          switch (XSDConstants.nodeType(child))
+          {
+            case XSDConstants.UNION_ELEMENT:
+            {
+              newVariety = XSDVariety.UNION_LITERAL;
+              newPrimitiveTypeDefinition = null;
+              newValidFacets = getValidFacetsForUnion();
+              break LOOP;
+            }
+            case XSDConstants.LIST_ELEMENT:
+            {
+              newVariety = XSDVariety.LIST_LITERAL;
+              newPrimitiveTypeDefinition = null;
+              newValidFacets = getValidFacetsForList();
+              break LOOP;
+            }
+          }
+        }
+      }
+    }
+
+    if (newVariety != null)
+    {
+      if (!isSetVariety() || newVariety != getVariety())
+      {
+        setVariety(newVariety);
+      }
+    }
+    else if (isSetVariety())
+    {
+      unsetVariety();
+    }
+
+    if (newPrimitiveTypeDefinition != getPrimitiveTypeDefinition())
+    {
+      setPrimitiveTypeDefinition(newPrimitiveTypeDefinition);
+    }
+
+    // This ensures the the facets are analyzed when the containing type is relatively well-analyzed.
+    //
+    super.handleAnalysis();
+
+    if (newFacets == null)
+    {
+      newFacets = mergeFacets();
+    }
+
+    XSDAnnotation theAnnotation = getAnnotation();
+    if (theAnnotation != null)
+    {
+      for (Element applicationInformationElement :  theAnnotation.getApplicationInformation())
+      {
+        for (Node child = applicationInformationElement.getFirstChild(); child != null; child = child.getNextSibling())
+        {
+          switch (XSDConstants.hfpNodeType(child))
+          {
+            case XSDConstants.HFP_HASFACET_ELEMENT:
+            {
+              Element childElement = (Element)child;
+              String facetName = childElement.getAttributeNS(null, XSDConstants.HFP_NAME_ATTRIBUTE);
+              if (newValidFacets == null)
+              {
+                newValidFacets = new BasicEList<String>();
+              }
+              newValidFacets.add(facetName);
+              break;
+            }
+            case XSDConstants.HFP_HASPROPERTY_ELEMENT:
+            {
+              Element childElement = (Element)child;
+              String propertyName = childElement.getAttributeNS(null, XSDConstants.HFP_NAME_ATTRIBUTE);
+              String propertyValue = childElement.getAttributeNS(null, XSDConstants.HFP_VALUE_ATTRIBUTE);
+              if ("bounded".equals(propertyName))
+              {
+                newBounded = "true".equals(propertyValue);
+              }
+              else if ("cardinality".equals(propertyName))
+              {
+                newCardinality = 
+                  "countably infinite".equals(propertyValue) ? 
+                    XSDCardinality.COUNTABLY_INFINITE_LITERAL : 
+                    XSDCardinality.get(propertyValue);
+              }
+              else if ("numeric".equals(propertyName))
+              {
+                newNumeric = "true".equals(propertyValue);
+              }
+              else if ("ordered".equals(propertyName))
+              {
+                newOrdered = XSDOrdered.get(propertyValue);
+              }
+              break;
+            }
+          }
+        }
+      }
+    }
+
+
+    if (!XSDConstants.isURType(this))
+    {
+      if (newBounded != getBoundedFacet().isValue() /* || !getBoundedFacet().isSetValue()*/)
+      {
+        getBoundedFacet().setValue(newBounded);
+      }
+      if (newCardinality != getCardinalityFacet().getValue() /* || !getCardinalityFacet().isSetValue()*/)
+      {
+        getCardinalityFacet().setValue(newCardinality);
+      }
+      if (newNumeric != getNumericFacet().isValue() /* || !getNumericFacet().isSetValue()*/)
+      {
+        getNumericFacet().setValue(newNumeric);
+      }
+      if (newOrdered == null)
+      {
+        newOrdered = XSDOrdered.FALSE_LITERAL;
+      }
+      if (newOrdered != getOrderedFacet().getValue() /* || !getOrderedFacet().isSetValue()*/)
+      {
+        getOrderedFacet().setValue(newOrdered);
+      }
+    }
+
+    if (newFacets == null)
+    {
+      if (!getFacets().isEmpty())
+      {
+        getFacets().clear();
+      }
+    }
+    else
+    {
+      List<XSDFacet> remainingFacets = new ArrayList<XSDFacet>(getFacets());
+      remainingFacets.removeAll(newFacets);
+      getFacets().removeAll(remainingFacets);
+      if (!newFacets.isEmpty())
+      {
+        setListContentAndOrder(getFacets(), newFacets);
+      }
+    }
+
+    if (newValidFacets == null)
+    {
+      if (!getValidFacets().isEmpty())
+      {
+        getValidFacets().clear();
+      }
+    }
+    else
+    {
+      List<String> remainingValidFacets = new ArrayList<String>(getValidFacets());
+      remainingValidFacets.removeAll(newValidFacets);
+      getValidFacets().removeAll(remainingValidFacets);
+      if (!newValidFacets.isEmpty())
+      {
+        setListContentAndOrder(getValidFacets(), newValidFacets);
+      }
+    }
+  }
+
+  @Override
+  public void validate()
+  {
+    super.validate();
+
+    Element theElement = getElement();
+    Element theRestrictionElement = null;
+    if (theElement != null)
+    {
+      String anchor;
+      if (getContainer() instanceof XSDComplexTypeDefinition)
+      {
+        checkAttributes
+          (XSDConstants.PART2,
+           anchor = "element-simpleContent",
+           theElement,
+           new String []
+           {
+             XSDConstants.ID_ATTRIBUTE
+           });
+
+        XSDComplexTypeDefinition xsdComplexTypeDefinition =
+           (XSDComplexTypeDefinition)getSchema().getSchemaForSchema().resolveElementDeclaration("simpleContent").getTypeDefinition();
+
+        checkComplexContent(xsdComplexTypeDefinition, XSDConstants.PART2, "element-simpleContent", theElement);
+        for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())
+        {
+          switch (XSDConstants.nodeType(child))
+          {
+            case XSDConstants.RESTRICTION_ELEMENT:
+            {
+              Element childElement = (Element)child;
+              theRestrictionElement = childElement;
+  
+              checkAttributes
+                (XSDConstants.PART2,
+                 "element-simpleContent::restriction",
+                 childElement,
+                 new String []
+                 {
+                   XSDConstants.ID_ATTRIBUTE,
+                   XSDConstants.BASE_ATTRIBUTE
+                 });
+
+              checkBuiltInTypeConstraint
+                ("ID",
+                 null,
+                 XSDConstants.PART2,
+                 "element-simpleContent::restriction",
+                 childElement,
+                 XSDConstants.ID_ATTRIBUTE,
+                 false);
+
+              checkComplexContent("simpleRestrictionType", XSDConstants.PART2, "element-simpleContent::restriction", childElement);
+
+              // This is allowed https://bugs.eclipse.org/bugs/show_bug.cgi?id=177035
+              //
+              // if (childElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE) && !getContents().isEmpty())
+              // {
+              //   createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-restriction-base-or-simpleType");
+              // }
+
+              break;
+            }
+            case XSDConstants.EXTENSION_ELEMENT:
+            {
+              Element childElement = (Element)child;
+  
+              checkAttributes
+                (XSDConstants.PART2,
+                 "element-simpleContent::extension",
+                 childElement,
+                 new String []
+                 {
+                   XSDConstants.ID_ATTRIBUTE,
+                   XSDConstants.BASE_ATTRIBUTE
+                 });
+
+              checkBuiltInTypeConstraint
+                ("ID",
+                 null,
+                 XSDConstants.PART2,
+                 "element-simpleContent::extension",
+                 childElement,
+                 XSDConstants.ID_ATTRIBUTE,
+                 false);
+
+              checkComplexContent("simpleExtensionType", XSDConstants.PART2, "element-simpleContent::extension", childElement);
+
+              if (childElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE) && !getContents().isEmpty())
+              {
+                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-restriction-base-or-simpleType");
+              }
+
+              break;
+            }
+          }
+        }
+      }
+      else
+      {
+        if (getContainer() instanceof XSDFeature || getContainer() instanceof XSDSimpleTypeDefinition)
+        {
+          checkAttributes
+            (XSDConstants.PART2,
+             anchor = "element-simpleType",
+             theElement,
+             new String []
+             {
+               XSDConstants.ID_ATTRIBUTE,
+             });
+        }
+        else
+        {
+          checkAttributes
+            (XSDConstants.PART2,
+             anchor = "element-simpleType",
+             theElement,
+             new String []
+             {
+               XSDConstants.FINAL_ATTRIBUTE,
+               XSDConstants.ID_ATTRIBUTE,
+               XSDConstants.NAME_ATTRIBUTE
+             });
+
+          // EATM this is an error in the spec, I believe.
+          //
+          if (theElement.hasAttributeNS(null, XSDConstants.FINAL_ATTRIBUTE))
+          {
+            String value = theElement.getAttributeNS(null, XSDConstants.FINAL_ATTRIBUTE);
+            for (StringTokenizer values = new StringTokenizer(value, " "); values.hasMoreTokens(); )
+            {
+              String token = values.nextToken();
+
+              checkBuiltInTypeConstraint
+                ("simpleDerivationSet",
+                 token,
+                 XSDConstants.PART2,
+                 anchor,
+                 theElement,
+                 XSDConstants.FINAL_ATTRIBUTE,
+                 false);
+            }
+          }
+        }
+
+        checkComplexContent("simpleType", XSDConstants.PART2, "element-simpleType", theElement);
+
+        for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())
+        {
+          switch (XSDConstants.nodeType(child))
+          {
+            case XSDConstants.RESTRICTION_ELEMENT:
+            {
+              Element childElement = (Element)child;
+              theRestrictionElement = childElement;
+  
+              checkAttributes
+                (XSDConstants.PART2,
+                 "element-restriction",
+                 childElement,
+                 new String []
+                 {
+                   XSDConstants.ID_ATTRIBUTE,
+                   XSDConstants.BASE_ATTRIBUTE
+                 });
+
+              checkBuiltInTypeConstraint
+                ("ID",
+                 null,
+                 XSDConstants.PART2,
+                 "element-restriction",
+                 childElement,
+                 XSDConstants.ID_ATTRIBUTE,
+                 false);
+
+              XSDComplexTypeDefinition xsdComplexTypeDefinition =
+                 (XSDComplexTypeDefinition)getSchema().getSchemaForSchema().resolveElementDeclaration("restriction").getTypeDefinition();
+      
+              checkComplexContent(xsdComplexTypeDefinition, XSDConstants.PART2, "element-restriction", childElement);
+
+              if (childElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE)) 
+              {
+                if (!getContents().isEmpty())
+                {
+                  createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-restriction-base-or-simpleType");
+                }
+              }
+              else if (getContents().isEmpty())
+              {
+                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-restriction-base-or-simpleType.0");
+              }
+
+              break;
+            }
+            case XSDConstants.UNION_ELEMENT:
+            {
+              Element childElement = (Element)child;
+  
+              checkAttributes
+                (XSDConstants.PART2,
+                 "element-union",
+                 childElement,
+                 new String []
+                 {
+                   XSDConstants.ID_ATTRIBUTE,
+                   XSDConstants.MEMBERTYPES_ATTRIBUTE
+                 });
+
+              checkBuiltInTypeConstraint
+                ("ID",
+                 null,
+                 XSDConstants.PART2,
+                 "element-union",
+                 childElement,
+                 XSDConstants.ID_ATTRIBUTE,
+                 false);
+
+              XSDComplexTypeDefinition xsdComplexTypeDefinition =
+                 (XSDComplexTypeDefinition)getSchema().getSchemaForSchema().resolveElementDeclaration("union").getTypeDefinition();
+      
+              checkComplexContent(xsdComplexTypeDefinition, XSDConstants.PART2, "element-union", childElement);
+
+              if (getMemberTypeDefinitions().isEmpty())
+              {
+                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-union-memberTypes-or-simpleTypes");
+              }
+
+              break;
+            }
+            case XSDConstants.LIST_ELEMENT:
+            {
+              Element childElement = (Element)child;
+  
+              checkAttributes
+                (XSDConstants.PART2,
+                 "element-list",
+                 childElement,
+                 new String []
+                 {
+                   XSDConstants.ID_ATTRIBUTE,
+                   XSDConstants.ITEMTYPE_ATTRIBUTE
+                 });
+
+              checkBuiltInTypeConstraint
+                ("ID",
+                 null,
+                 XSDConstants.PART2,
+                 "element-list",
+                 childElement,
+                 XSDConstants.ID_ATTRIBUTE,
+                 false);
+
+              XSDComplexTypeDefinition xsdComplexTypeDefinition =
+                 (XSDComplexTypeDefinition)getSchema().getSchemaForSchema().resolveElementDeclaration("list").getTypeDefinition();
+      
+              checkComplexContent(xsdComplexTypeDefinition, XSDConstants.PART2, "element-list", childElement);
+
+              if (childElement.hasAttributeNS(null, XSDConstants.ITEMTYPE_ATTRIBUTE))
+              {
+                if (!getContents().isEmpty())
+                {
+                  createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-list-itemType-or-simpleType");
+                }
+              }
+              else
+              {
+                if (getContents().isEmpty())
+                {
+                  createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "src-list-itemType-or-simpleType.0");
+                }
+              }
+
+              break;
+            }
+          }
+        }
+      }
+
+      checkBuiltInTypeConstraint
+        ("ID",
+         null,
+         XSDConstants.PART2,
+         anchor,
+         theElement,
+         XSDConstants.ID_ATTRIBUTE,
+         false);
+    }
+
+    if (!(getContainer() instanceof XSDFeature) && !(getContainer() instanceof XSDTypeDefinition))
+    {
+      checkBuiltInTypeConstraint
+        ("NCName",
+         getName(),
+         XSDConstants.PART2,
+         "element-simpleType",
+         theElement,
+         XSDConstants.NAME_ATTRIBUTE,
+         true);
+    }
+
+    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();
+    if (theBaseTypeDefinition == null)
+    {
+      createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", "");
+    }
+    else if (theBaseTypeDefinition.getContainer() == null)
+    {
+      createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", theBaseTypeDefinition.getURI());
+    }
+    else if (isSetVariety())
+    {
+      switch (getVariety().getValue())
+      {
+        case XSDVariety.ATOMIC:
+        {
+          if (theBaseTypeDefinition.getFinal().contains(XSDSimpleFinal.RESTRICTION_LITERAL))
+          {
+            createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.1.2", theBaseTypeDefinition.getURI());
+          }
+          if (isCircular())
+          {
+            reportConstraintViolation
+              (XSDConstants.PART2,
+               "st-props-correct.2",
+               getElement(),
+               XSDConstants.BASE_ATTRIBUTE,
+               new Object [] {});
+          }
+          if (!XSDConstants.isSchemaForSchemaNamespace(getTargetNamespace()) &&
+                XSDConstants.isAnySimpleType(theBaseTypeDefinition) &&
+                (theElement == null || 
+                   theRestrictionElement != null && theRestrictionElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE)))
+          {
+            createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-retricts.0.0", theBaseTypeDefinition.getURI());
+          }
+          break;
+        }
+        case XSDVariety.LIST:
+        {
+          if (!XSDConstants.isURType(theBaseTypeDefinition))
+          {
+            if (theBaseTypeDefinition.getFinal().contains(XSDSimpleFinal.RESTRICTION_LITERAL))
+            {
+              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.1.2", theBaseTypeDefinition.getURI());
+            }
+          }
+          else
+          {
+            XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();
+            if (theItemTypeDefinition == null)
+            {
+              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", "");
+            }
+            else if (theItemTypeDefinition.getContainer() == null)
+            {
+              createDiagnostic
+                (XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", theItemTypeDefinition.getURI());
+            }
+            else if (XSDVariety.ATOMIC_LITERAL != theItemTypeDefinition.getVariety() && 
+                       XSDVariety.UNION_LITERAL != theItemTypeDefinition.getVariety())
+            {
+              reportConstraintViolation
+                (XSDConstants.PART2,
+                 "cos-list-of-atomic",
+                 getElement(),
+                 XSDConstants.ITEMTYPE_ATTRIBUTE,
+                 new Object [] {});
+            }
+            else if (theItemTypeDefinition.getFinal().contains(XSDSimpleFinal.LIST_LITERAL))
+            {
+              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.2.0", theBaseTypeDefinition.getURI());
+            }
+            else if (!XSDConstants.isSchemaForSchemaNamespace(getTargetNamespace()) &&
+                      XSDConstants.isAnySimpleType(theItemTypeDefinition))
+            {
+              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-retricts.0.1", theItemTypeDefinition.getURI());
+            }
+          }
+          if (isCircular())
+          {
+            reportConstraintViolation
+              (XSDConstants.PART2,
+               "st-props-correct.2",
+               getElement(),
+               XSDConstants.ITEMTYPE_ATTRIBUTE,
+               new Object [] {});
+          }
+          break;
+        }
+        case XSDVariety.UNION:
+        {
+          if (!XSDConstants.isURType(theBaseTypeDefinition))
+          {
+            if (theBaseTypeDefinition.getFinal().contains(XSDSimpleFinal.RESTRICTION_LITERAL))
+            {
+              createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.1.2", theBaseTypeDefinition.getURI());
+            }
+          }
+          else
+          {
+            for (XSDSimpleTypeDefinition theMemberTypeDefinition : getMemberTypeDefinitions())
+            {
+              if (theMemberTypeDefinition == null)
+              {
+                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", "");
+              }
+              else if (theMemberTypeDefinition.getContainer() == null)
+              {
+                createDiagnostic
+                  (XSDDiagnosticSeverity.ERROR_LITERAL, "_UI_UnresolvedTypeDefinition_message", theMemberTypeDefinition.getURI());
+              }
+              else if (theMemberTypeDefinition.getFinal().contains(XSDSimpleFinal.UNION_LITERAL))
+              {
+                createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-restricts.3.0", theBaseTypeDefinition.getURI());
+              }
+              // Apparently this is allowed now.
+              // else if (!XSDConstants.isSchemaForSchemaNamespace(getTargetNamespace()) &&
+              //           XSDConstants.isAnySimpleType(theMemberTypeDefinition))
+              // {
+              //   createDiagnostic(XSDDiagnosticSeverity.ERROR_LITERAL, "cos-st-retricts.0.2", theMemberTypeDefinition.getURI());
+              // }
+            }
+          }
+          if (isCircular())
+          {
+            reportConstraintViolation
+              (XSDConstants.PART2,
+               "cos-no-circular-unions",
+               getElement(),
+               XSDConstants.MEMBERTYPES_ATTRIBUTE,
+               new Object [] {});
+          }
+          break;
+        }
+      }
+    }
+    else if (isCircular())
+    {
+      reportConstraintViolation
+        (XSDConstants.PART2,
+         "st-props-correct.2",
+         getElement(),
+         XSDConstants.BASE_ATTRIBUTE,
+         new Object [] {});
+    }
+  }
+
+  @Override
+  protected void reconcileAttributes(Element changedElement)
+  {
+    switch (XSDConstants.nodeType(changedElement))
+    {
+      case XSDConstants.EXTENSION_ELEMENT:
+      case XSDConstants.RESTRICTION_ELEMENT:
+      {
+        if (!(getContainer() instanceof XSDComplexTypeDefinition))
+        {
+          XSDSimpleTypeDefinition newBaseTypeDefinition = null;
+          if (changedElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE))
+          {
+            newBaseTypeDefinition =
+              resolveSimpleTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(changedElement, XSDConstants.BASE_ATTRIBUTE));
+          }
+          else if (getContents().contains(getBaseTypeDefinition()))
+          {
+            newBaseTypeDefinition = getBaseTypeDefinition();
+          }
+
+          handleNewBaseTypeDefinition(newBaseTypeDefinition);
+        }
+        else
+        {
+          XSDTypeDefinition newBaseTypeDefinition = null;
+          if (changedElement.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE))
+          {
+            newBaseTypeDefinition =
+              resolveTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(changedElement, XSDConstants.BASE_ATTRIBUTE));
+          }
+          else if (getContents().contains(getBaseTypeDefinition()))
+          {
+            newBaseTypeDefinition = getBaseTypeDefinition();
+          }
+
+          handleNewComplexBaseTypeDefinition(newBaseTypeDefinition);
+        }
+
+        break;
+      }
+      case XSDConstants.LIST_ELEMENT:
+      {
+        XSDSimpleTypeDefinition newItemTypeDefinition = getItemTypeDefinition();
+        if (changedElement.hasAttributeNS(null, XSDConstants.ITEMTYPE_ATTRIBUTE))
+        {
+          newItemTypeDefinition =
+            resolveSimpleTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(changedElement, XSDConstants.ITEMTYPE_ATTRIBUTE));
+        }
+        else if (!getContents().contains(newItemTypeDefinition))
+        {
+          newItemTypeDefinition = resolveSimpleTypeDefinition(null, "undefined");
+        }
+
+        if (newItemTypeDefinition != getItemTypeDefinition())
+        {
+          setItemTypeDefinition(newItemTypeDefinition);
+        }
+
+        handleNewBaseTypeDefinition(null);
+        break;
+      }
+      case XSDConstants.UNION_ELEMENT:
+      {
+        List<XSDSimpleTypeDefinition> newMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>();
+        if (changedElement.hasAttributeNS(null, XSDConstants.MEMBERTYPES_ATTRIBUTE))
+        {
+          String memberTypes = changedElement.getAttributeNS(null, XSDConstants.MEMBERTYPES_ATTRIBUTE);
+          if (memberTypes != null)
+          {
+            for (StringTokenizer tokens = new StringTokenizer(memberTypes, " "); tokens.hasMoreTokens(); )
+            {
+              String memberTypeQName = tokens.nextToken();
+              XSDSimpleTypeDefinition newMemberTypeDefinition =
+                resolveSimpleTypeDefinitionURI(XSDConstants.lookupQName(changedElement, memberTypeQName));
+              newMemberTypeDefinitions.add(newMemberTypeDefinition);
+            }
+          }
+        }
+
+        newMemberTypeDefinitions.addAll(getContents());
+
+        List<XSDSimpleTypeDefinition> remainingMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>(getMemberTypeDefinitions());
+        remainingMemberTypeDefinitions.removeAll(newMemberTypeDefinitions);
+        getMemberTypeDefinitions().removeAll(remainingMemberTypeDefinitions);
+        if (!newMemberTypeDefinitions.isEmpty())
+        {
+          setListContentAndOrder(getMemberTypeDefinitions(), newMemberTypeDefinitions);
+        }
+
+        handleNewBaseTypeDefinition(null);
+        break;
+      }
+      case XSDConstants.SIMPLETYPE_ELEMENT:
+      case XSDConstants.SIMPLECONTENT_ELEMENT:
+      {
+        super.reconcileAttributes(changedElement);
+
+        if (changedElement.hasAttributeNS(null, XSDConstants.FINAL_ATTRIBUTE))
+        {
+          setStringLexicalFinal(changedElement.getAttributeNS(null, XSDConstants.FINAL_ATTRIBUTE));
+        }
+        else if (isSetLexicalFinal())
+        {
+          unsetLexicalFinal();
+        }
+
+        for (Node child = changedElement.getFirstChild(); child != null; child = child.getNextSibling())
+        {
+          if (child.getNodeType() == Node.ELEMENT_NODE)
+          {
+            reconcileAttributes((Element)child);
+          }
+        }
+        break;
+      }
+    }
+  }
+
+  protected void handleNewComplexBaseTypeDefinition(XSDTypeDefinition newComplexBaseTypeDefinition)
+  {
+    if (getContainer() instanceof XSDComplexTypeDefinition)
+    {
+      XSDComplexTypeDefinitionImpl xsdComplexTypeDefinition = (XSDComplexTypeDefinitionImpl)getContainer();
+      boolean oldIsReconciling = xsdComplexTypeDefinition.isReconciling;
+      xsdComplexTypeDefinition.isReconciling = isReconciling;
+      xsdComplexTypeDefinition.handleNewBaseTypeDefinition(newComplexBaseTypeDefinition);
+      xsdComplexTypeDefinition.isReconciling = oldIsReconciling;
+    }
+  }
+
+  protected XSDSimpleTypeDefinition handleNewBaseTypeDefinition(XSDSimpleTypeDefinition newBaseTypeDefinition)
+  {
+    if (newBaseTypeDefinition == null)
+    {
+      XSDSchema xsdSchema = getSchema();
+      if (xsdSchema == null)
+      {
+        Element theElement = getElement();
+        if (theElement != null)
+        {
+          newBaseTypeDefinition = 
+            XSDSchemaImpl.getSchemaForSchema(theElement.getNamespaceURI()).resolveSimpleTypeDefinition("anySimpleType");
+        }
+        else
+        {
+          newBaseTypeDefinition = this;
+        }
+      }
+      else
+      {
+        newBaseTypeDefinition =  xsdSchema.getSchemaForSchema().resolveSimpleTypeDefinition("anySimpleType");
+      }
+    }
+
+    if (eContainer instanceof XSDRedefine)
+    {
+      XSDSchema redefinedSchema = ((XSDRedefine)eContainer).getIncorporatedSchema();
+      if (redefinedSchema != null)
+      {
+        Map<XSDComponent, XSDComponent> redefinitionMap = ((XSDSchemaImpl)redefinedSchema).getRedefinitionMap();
+        if (redefinitionMap.containsKey(newBaseTypeDefinition))
+        {
+          XSDComponent replacement = redefinitionMap.get(this);
+          if (replacement != null)
+          {
+            newBaseTypeDefinition = (XSDSimpleTypeDefinition)replacement;
+          }
+        }
+      }
+    }
+
+    if (newBaseTypeDefinition != getBaseTypeDefinition())
+    {
+      setBaseTypeDefinition(newBaseTypeDefinition);
+    }
+
+    return newBaseTypeDefinition;
+  }
+
+  @Override
+  protected Node getAdoptionParentNode(EReference eReference)
+  {
+    if (eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS ||
+          eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS ||
+          eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__DERIVATION_ANNOTATION) 
+    {
+      Element element = getElement();
+      if (element == null)
+      {
+        return null;
+      }
+      else
+      {
+        for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling())
+        {
+          switch (XSDConstants.nodeType(child))
+          {
+            case XSDConstants.EXTENSION_ELEMENT:
+            case XSDConstants.RESTRICTION_ELEMENT:
+            case XSDConstants.LIST_ELEMENT:
+            case XSDConstants.UNION_ELEMENT:
+            {
+              return child;
+            }
+          }
+        }
+      }
+    }
+
+    return super.getAdoptionParentNode(eReference);
+  }
+
+  @Override
+  protected Collection<Element> getContentNodes(Element changedElement)
+  {
+    Collection<Element> result = new ArrayList<Element>();
+    for (Node child = getElement().getFirstChild(); child != null; child = child.getNextSibling())
+    {
+      switch (XSDConstants.nodeType(child))
+      {
+        case XSDConstants.ANNOTATION_ELEMENT:
+        {
+          result.add((Element)child);
+          break;
+        }
+        case XSDConstants.EXTENSION_ELEMENT:
+        case XSDConstants.RESTRICTION_ELEMENT:
+        case XSDConstants.LIST_ELEMENT:
+        case XSDConstants.UNION_ELEMENT:
+        {
+          for (Node grandChild = child.getFirstChild(); grandChild != null; grandChild = grandChild.getNextSibling())
+          {
+            if (grandChild.getNodeType() == Node.ELEMENT_NODE)
+            {
+              result.add((Element)grandChild);
+            }
+          }
+          break;
+        }
+      }
+    }
+    return result;
+  }
+
+  @Override
+  protected void handleUnreconciledElement(Element child, List<XSDConcreteComponent> newContents, List<XSDConcreteComponent> remainingContents)
+  {
+    switch (XSDConstants.nodeType(child))
+    {
+      case XSDConstants.ANNOTATION_ELEMENT:
+      {
+        XSDAnnotation xsdAnnotation = XSDAnnotationImpl.createAnnotation(child);
+        newContents.add(xsdAnnotation);
+        break;
+      }
+      case XSDConstants.SIMPLETYPE_ELEMENT:
+      {
+        XSDSimpleTypeDefinition xsdSimpleTypeDefinition = XSDSimpleTypeDefinitionImpl.createSimpleTypeDefinition(child);
+        if (xsdSimpleTypeDefinition != null)
+        {
+          newContents.add(xsdSimpleTypeDefinition);
+        }
+        break;
+      }
+      default:
+      {
+        XSDConstrainingFacet xsdConstrainingFacet = XSDConstrainingFacetImpl.createConstrainingFacet(child);
+        if (xsdConstrainingFacet != null)
+        {
+          newContents.add(xsdConstrainingFacet);
+        }
+      }
+    }
+  }
+
+  @Override
+  protected void handleReconciliation(List<XSDConcreteComponent> newContents, List<XSDConcreteComponent> remainingContents)
+  {
+    if (!newContents.isEmpty() && newContents.get(0).getElement().getParentNode() == getElement())
+    {
+      handleAnnotationReconciliation(XSDPackage.Literals.XSD_TYPE_DEFINITION__ANNOTATION, newContents, remainingContents);
+    }
+    handleAnnotationReconciliation(XSDPackage.Literals.XSD_TYPE_DEFINITION__DERIVATION_ANNOTATION, newContents, remainingContents);
+
+    XSDSimpleTypeDefinition newBaseTypeDefinition = null;
+    XSDTypeDefinition newComplexBaseTypeDefinition = null;
+
+    boolean didContents = false;
+    Element theElement = getElement();
+    LOOP:
+    for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())
+    {
+      switch (XSDConstants.nodeType(child))
+      {
+        case XSDConstants.LIST_ELEMENT:
+        {
+          Element elementChild = (Element)child;
+          XSDSimpleTypeDefinition newTypeContent = null;
+          XSDSimpleTypeDefinition newItemTypeDefinition = null;
+          if (!newContents.isEmpty())
+          {
+            XSDConcreteComponent xsdConcreteComponent = newContents.get(0);
+            if (xsdConcreteComponent instanceof XSDSimpleTypeDefinition)
+            {
+              newItemTypeDefinition = (XSDSimpleTypeDefinition)xsdConcreteComponent;
+              newTypeContent = newItemTypeDefinition;
+              newContents.remove(0);
+            }
+          }
+          if (elementChild.hasAttributeNS(null, XSDConstants.ITEMTYPE_ATTRIBUTE) && newItemTypeDefinition == null)
+          {
+            newItemTypeDefinition = 
+              resolveSimpleTypeDefinitionURI(XSDConstants.lookupQNameForAttribute((Element)child, XSDConstants.ITEMTYPE_ATTRIBUTE));
+          }
+          if (newItemTypeDefinition == null)
+          {
+            newItemTypeDefinition = resolveSimpleTypeDefinition(null, "undefined");
+          }
+
+          getContents().removeAll(remainingContents);
+          if (newTypeContent != null)
+          {
+            getContents().add(newTypeContent);
+          }
+
+          if (newItemTypeDefinition != getItemTypeDefinition())
+          {
+            setItemTypeDefinition(newItemTypeDefinition);
+          }
+          
+          didContents = true;
+          break LOOP;
+        }
+        case XSDConstants.UNION_ELEMENT:
+        {
+          Element elementChild = (Element)child;
+          List<XSDSimpleTypeDefinition> newMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>();
+          if (elementChild.hasAttributeNS(null, XSDConstants.MEMBERTYPES_ATTRIBUTE))
+          {
+            String memberTypes = elementChild.getAttributeNS(null, XSDConstants.MEMBERTYPES_ATTRIBUTE);
+            if (memberTypes != null)
+            {
+              for (StringTokenizer tokens = new StringTokenizer(memberTypes, " "); tokens.hasMoreTokens(); )
+              {
+                String memberTypeQName = tokens.nextToken();
+                XSDSimpleTypeDefinition newMemberTypeDefinition =
+                  resolveSimpleTypeDefinitionURI(XSDConstants.lookupQName(elementChild, memberTypeQName));
+                newMemberTypeDefinitions.add(newMemberTypeDefinition);
+              }
+            }
+          }
+
+          List<XSDSimpleTypeDefinition> newTypeContents = new ArrayList<XSDSimpleTypeDefinition>();
+          for (ListIterator<XSDConcreteComponent> i = newContents.listIterator(); i.hasNext(); )
+          {
+            XSDConcreteComponent xsdConcreteComponent = i.next();
+            if (xsdConcreteComponent instanceof XSDSimpleTypeDefinition)
+            {
+              XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition)xsdConcreteComponent;
+              newTypeContents.add(xsdSimpleTypeDefinition);
+              newMemberTypeDefinitions.add(xsdSimpleTypeDefinition);
+              i.remove();
+            }
+            else
+            {
+              break;
+            }
+          }
+
+          getContents().removeAll(remainingContents);
+          if (!newTypeContents.isEmpty())
+          {
+            setListContentAndOrder(getContents(), newTypeContents);
+          }
+
+          List<XSDSimpleTypeDefinition> remainingMemberTypeDefinitions = new ArrayList<XSDSimpleTypeDefinition>(getMemberTypeDefinitions());
+          remainingMemberTypeDefinitions.removeAll(newMemberTypeDefinitions);
+          if (!remainingMemberTypeDefinitions.isEmpty())
+          {
+            getMemberTypeDefinitions().removeAll(remainingMemberTypeDefinitions);
+          }
+          if (!newMemberTypeDefinitions.isEmpty())
+          {
+            setListContentAndOrder(getMemberTypeDefinitions(), newMemberTypeDefinitions);
+          }
+
+          didContents = true;
+          break LOOP;
+        }
+        case XSDConstants.EXTENSION_ELEMENT:
+        case XSDConstants.RESTRICTION_ELEMENT:
+        {
+          Element elementChild = (Element)child;
+          if (!newContents.isEmpty())
+          {
+            XSDConcreteComponent xsdConcreteComponent = newContents.get(0);
+            if (xsdConcreteComponent instanceof XSDSimpleTypeDefinition)
+            {
+              XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition)xsdConcreteComponent;
+              List<XSDSimpleTypeDefinition> theContents = getContents();
+              if (theContents.size() != 1 || theContents.get(0) != xsdConcreteComponent)
+              {
+                if (!theContents.isEmpty())
+                {
+                  remainingContents.removeAll(theContents);
+                  theContents.clear();
+                }
+                theContents.add(xsdSimpleTypeDefinition);
+              }
+              newBaseTypeDefinition = xsdSimpleTypeDefinition;
+              newContents.remove(0);
+            }
+          }
+
+          if (!(getContainer() instanceof XSDComplexTypeDefinition))
+          {
+            if (elementChild.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE) && newBaseTypeDefinition == null)
+            {
+              newBaseTypeDefinition = 
+                resolveSimpleTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(elementChild, XSDConstants.BASE_ATTRIBUTE));
+            }
+          }
+          else
+          {
+            if (elementChild.hasAttributeNS(null, XSDConstants.BASE_ATTRIBUTE))
+            {
+              newComplexBaseTypeDefinition = 
+                resolveTypeDefinitionURI(XSDConstants.lookupQNameForAttribute(elementChild, XSDConstants.BASE_ATTRIBUTE));
+            }
+          }
+
+          didContents = true;
+          break LOOP;
+        }
+      }
+    }
+
+    if (!didContents && !getContents().isEmpty())
+    {
+      getContents().clear();
+    }
+
+    if (!remainingContents.isEmpty())
+    {
+      getFacetContents().removeAll(remainingContents);
+    }
+
+    if (!newContents.isEmpty())
+    {
+      for (Iterator<?> i = newContents.iterator(); i.hasNext(); )
+      {
+        if (!(i.next() instanceof XSDFacet))
+        {
+          i.remove();
+        }
+      }
+      @SuppressWarnings("unchecked") List<XSDConstrainingFacet> list = (List<XSDConstrainingFacet>)(List<?>)newContents;
+      setListContentAndOrder(getFacetContents(), list);
+    }
+
+    handleNewBaseTypeDefinition(newBaseTypeDefinition);
+    handleNewComplexBaseTypeDefinition(newComplexBaseTypeDefinition);
+  }
+
+  @Override
+  protected void changeAttribute(EAttribute eAttribute)
+  {
+    super.changeAttribute(eAttribute);
+    Element theElement = getElement();
+    if (eAttribute == null || eAttribute == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL)
+    {
+      if (theElement != null)
+      {
+        niceSetAttribute
+          (theElement,
+           XSDConstants.FINAL_ATTRIBUTE,
+           getStringLexicalFinal());
+      }
+      if (eAttribute != null)
+      {
+        traverseToRootForPatching();
+      }
+    }
+    if (eAttribute == null || eAttribute == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__VARIETY)
+    {
+      if (theElement != null && eAttribute != null) 
+      {
+        if (analysisState != ANALYZING) 
+        {
+          LOOP:
+          for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())
+          {
+            int childNodeType = XSDConstants.nodeType(child);
+            switch (childNodeType)
+            {
+              case XSDConstants.RESTRICTION_ELEMENT:
+              case XSDConstants.EXTENSION_ELEMENT:
+              case XSDConstants.UNION_ELEMENT:
+              case XSDConstants.LIST_ELEMENT:
+              {
+                if (childNodeType != getRequiredChildElementNodeType())
+                {
+                  Element newElement = createChildElement();
+                  forceReplace(newElement, (Element)child);
+                }
+                break LOOP;
+              }
+            }
+          }
+          traverseToRootForAnalysis();
+        }
+      }
+    }
+  }
+
+  @Override
+  protected void changeReference(EReference eReference)
+  {
+    super.changeReference(eReference);
+    Element theElement = getElement();
+    if (theElement != null)
+    {
+      if (eReference == null || eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION)
+      {
+        if (!isReconciling && eReference != null)
+        {
+          traverseToRootForPatching();
+        }
+
+        if (!isReconciling && !(getContainer() instanceof XSDComplexTypeDefinition))
+        {
+          XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();
+          if (theBaseTypeDefinition != null && !getContents().contains(theBaseTypeDefinition))
+          {
+            LOOP:
+            for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())
+            {
+              switch (XSDConstants.nodeType(child))
+              {
+                case XSDConstants.EXTENSION_ELEMENT:
+                case XSDConstants.RESTRICTION_ELEMENT:
+                {
+                  niceSetAttributeURIValue((Element)child, XSDConstants.BASE_ATTRIBUTE, theBaseTypeDefinition.getURI());
+                  break LOOP;
+                }
+              }
+            }
+          }
+        }
+      }
+      if (eReference == null || eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION)
+      {
+        if (!isReconciling && eReference != null)
+        {
+          traverseToRootForPatching();
+        }
+
+        XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();
+        if (!isReconciling && theItemTypeDefinition != null && !getContents().contains(theItemTypeDefinition))
+        {
+          LOOP:
+          for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())
+          {
+            switch (XSDConstants.nodeType(child))
+            {
+              case XSDConstants.LIST_ELEMENT:
+              {
+                niceSetAttributeURIValue((Element)child, XSDConstants.ITEMTYPE_ATTRIBUTE, theItemTypeDefinition.getURI());
+                break LOOP;
+              }
+            }
+          }
+        }
+      }
+      if (eReference == null || eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS)
+      {
+        if (!isReconciling && eReference != null)
+        {
+          traverseToRootForPatching();
+        }
+
+        if (!isReconciling)
+        {
+          LOOP:
+          for (Node child = theElement.getFirstChild(); child != null; child = child.getNextSibling())
+          {
+            switch (XSDConstants.nodeType(child))
+            {
+              case XSDConstants.UNION_ELEMENT:
+              {
+                StringBuffer newMemberTypeDefinitions = null;
+                for (XSDSimpleTypeDefinition theMemberTypeDefinition : getMemberTypeDefinitions())
+                {
+                  if (getContents().contains(theMemberTypeDefinition))
+                  {
+                    break;
+                  }
+                  if (newMemberTypeDefinitions == null)
+                  {
+                    newMemberTypeDefinitions = new StringBuffer();
+                  }
+                  else 
+                  {
+                    newMemberTypeDefinitions.append(' ');
+                  }
+                  newMemberTypeDefinitions.append(theMemberTypeDefinition.getURI());
+                }
+                
+                niceSetAttributeURIValue
+                  ((Element)child, 
+                   XSDConstants.MEMBERTYPES_ATTRIBUTE, 
+                   newMemberTypeDefinitions == null ? null : newMemberTypeDefinitions.toString());
+                break LOOP;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  @Override
+  protected void adoptContent(EReference eReference, XSDConcreteComponent xsdConcreteComponent)
+  {
+    super.adoptContent(eReference, xsdConcreteComponent);
+    if (eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS ||
+          eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS)
+    {
+      traverseToRootForPatching();
+    }
+    else if (eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__ANNOTATION)
+    {
+      getAnnotations().add(0, (XSDAnnotation)xsdConcreteComponent);
+    }
+    else if (eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__DERIVATION_ANNOTATION)
+    {
+      getAnnotations().add((XSDAnnotation)xsdConcreteComponent);
+    }
+  }
+
+  @Override
+  protected void orphanContent(EReference eReference, XSDConcreteComponent xsdConcreteComponent)
+  {
+    super.orphanContent(eReference, xsdConcreteComponent);
+    if (eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS || 
+          eReference == XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS)
+    {
+      traverseToRootForPatching();
+    }
+    else if (eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__ANNOTATION ||
+               eReference == XSDPackage.Literals.XSD_TYPE_DEFINITION__DERIVATION_ANNOTATION)
+    {
+      getAnnotations().remove(xsdConcreteComponent);
+    }
+  }
+
+  public XSDTotalDigitsFacet getTotalDigitsFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDTotalDigitsFacet)
+        {
+          return (XSDTotalDigitsFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDTotalDigitsFacet getEffectiveTotalDigitsFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDTotalDigitsFacet)
+        {
+          return (XSDTotalDigitsFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDFractionDigitsFacet getFractionDigitsFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDFractionDigitsFacet)
+        {
+          return (XSDFractionDigitsFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDFractionDigitsFacet getEffectiveFractionDigitsFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDFractionDigitsFacet)
+        {
+          return (XSDFractionDigitsFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDLengthFacet getLengthFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDLengthFacet)
+        {
+          return (XSDLengthFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDLengthFacet getEffectiveLengthFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDLengthFacet)
+        {
+          return (XSDLengthFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMaxLengthFacet getMaxLengthFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDMaxLengthFacet)
+        {
+          return (XSDMaxLengthFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMaxLengthFacet getEffectiveMaxLengthFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDMaxLengthFacet)
+        {
+          return (XSDMaxLengthFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMinLengthFacet getMinLengthFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDMinLengthFacet)
+        {
+          return (XSDMinLengthFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMinLengthFacet getEffectiveMinLengthFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDMinLengthFacet)
+        {
+          return (XSDMinLengthFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMaxExclusiveFacet getMaxExclusiveFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDMaxExclusiveFacet)
+        {
+          return (XSDMaxExclusiveFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMaxInclusiveFacet getMaxInclusiveFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDMaxInclusiveFacet)
+        {
+          return (XSDMaxInclusiveFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMaxFacet getMaxFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDMaxFacet)
+        {
+          return (XSDMaxFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMaxFacet getEffectiveMaxFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDMaxFacet)
+        {
+          return (XSDMaxFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMinExclusiveFacet getMinExclusiveFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDMinExclusiveFacet)
+        {
+          return (XSDMinExclusiveFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMinInclusiveFacet getMinInclusiveFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDMinInclusiveFacet)
+        {
+          return (XSDMinInclusiveFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMinFacet getMinFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDMinFacet)
+        {
+          return (XSDMinFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDMinFacet getEffectiveMinFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDMinFacet)
+        {
+          return (XSDMinFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  public EList<XSDFacet> getSyntheticFacets()
+  {
+    if (syntheticFacets == null)
+    {
+      syntheticFacets = new EObjectContainmentEList<XSDFacet>(XSDFacet.class, this, XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS);
+    }
+    return syntheticFacets;
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
+  {
+    switch (featureID)
+    {
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:
+        return ((InternalEList<?>)getContents()).basicRemove(otherEnd, msgs);
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:
+        return ((InternalEList<?>)getFacetContents()).basicRemove(otherEnd, msgs);
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:
+        return ((InternalEList<?>)getFundamentalFacets()).basicRemove(otherEnd, msgs);
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:
+        return ((InternalEList<?>)getSyntheticFacets()).basicRemove(otherEnd, msgs);
+    }
+    return super.eInverseRemove(otherEnd, featureID, msgs);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public Object eGet(int featureID, boolean resolve, boolean coreType)
+  {
+    switch (featureID)
+    {
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY:
+        return getVariety();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL:
+        return getFinal();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL:
+        return getLexicalFinal();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS:
+        return getValidFacets();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:
+        return getContents();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:
+        return getFacetContents();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS:
+        return getFacets();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS:
+        return getMemberTypeDefinitions();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:
+        return getFundamentalFacets();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION:
+        return getBaseTypeDefinition();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION:
+        return getPrimitiveTypeDefinition();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION:
+        return getItemTypeDefinition();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ROOT_TYPE_DEFINITION:
+        return getRootTypeDefinition();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_FACET:
+        return getMinFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_FACET:
+        return getMaxFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_INCLUSIVE_FACET:
+        return getMaxInclusiveFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_INCLUSIVE_FACET:
+        return getMinInclusiveFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_EXCLUSIVE_FACET:
+        return getMinExclusiveFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_EXCLUSIVE_FACET:
+        return getMaxExclusiveFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LENGTH_FACET:
+        return getLengthFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__WHITE_SPACE_FACET:
+        return getWhiteSpaceFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ENUMERATION_FACETS:
+        return getEnumerationFacets();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PATTERN_FACETS:
+        return getPatternFacets();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CARDINALITY_FACET:
+        return getCardinalityFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__NUMERIC_FACET:
+        return getNumericFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_LENGTH_FACET:
+        return getMaxLengthFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_LENGTH_FACET:
+        return getMinLengthFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__TOTAL_DIGITS_FACET:
+        return getTotalDigitsFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FRACTION_DIGITS_FACET:
+        return getFractionDigitsFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ORDERED_FACET:
+        return getOrderedFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BOUNDED_FACET:
+        return getBoundedFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MAX_FACET:
+        return getEffectiveMaxFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_WHITE_SPACE_FACET:
+        return getEffectiveWhiteSpaceFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MAX_LENGTH_FACET:
+        return getEffectiveMaxLengthFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_FRACTION_DIGITS_FACET:
+        return getEffectiveFractionDigitsFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_PATTERN_FACET:
+        return getEffectivePatternFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_ENUMERATION_FACET:
+        return getEffectiveEnumerationFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_TOTAL_DIGITS_FACET:
+        return getEffectiveTotalDigitsFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MIN_LENGTH_FACET:
+        return getEffectiveMinLengthFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_LENGTH_FACET:
+        return getEffectiveLengthFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MIN_FACET:
+        return getEffectiveMinFacet();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:
+        return getSyntheticFacets();
+    }
+    return super.eGet(featureID, resolve, coreType);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @SuppressWarnings("unchecked")
+  @Override
+  public void eSet(int featureID, Object newValue)
+  {
+    switch (featureID)
+    {
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY:
+        setVariety((XSDVariety)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL:
+        getFinal().clear();
+        getFinal().addAll((Collection<? extends XSDSimpleFinal>)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL:
+        getLexicalFinal().clear();
+        getLexicalFinal().addAll((Collection<? extends XSDSimpleFinal>)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS:
+        getValidFacets().clear();
+        getValidFacets().addAll((Collection<? extends String>)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:
+        getContents().clear();
+        getContents().addAll((Collection<? extends XSDSimpleTypeDefinition>)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:
+        getFacetContents().clear();
+        getFacetContents().addAll((Collection<? extends XSDConstrainingFacet>)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS:
+        getFacets().clear();
+        getFacets().addAll((Collection<? extends XSDConstrainingFacet>)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS:
+        getMemberTypeDefinitions().clear();
+        getMemberTypeDefinitions().addAll((Collection<? extends XSDSimpleTypeDefinition>)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:
+        getFundamentalFacets().clear();
+        getFundamentalFacets().addAll((Collection<? extends XSDFundamentalFacet>)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION:
+        setBaseTypeDefinition((XSDSimpleTypeDefinition)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION:
+        setPrimitiveTypeDefinition((XSDSimpleTypeDefinition)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION:
+        setItemTypeDefinition((XSDSimpleTypeDefinition)newValue);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:
+        getSyntheticFacets().clear();
+        getSyntheticFacets().addAll((Collection<? extends XSDFacet>)newValue);
+        return;
+    }
+    super.eSet(featureID, newValue);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public void eUnset(int featureID)
+  {
+    switch (featureID)
+    {
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY:
+        unsetVariety();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL:
+        getFinal().clear();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL:
+        unsetLexicalFinal();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS:
+        getValidFacets().clear();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:
+        getContents().clear();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:
+        getFacetContents().clear();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS:
+        getFacets().clear();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS:
+        getMemberTypeDefinitions().clear();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:
+        getFundamentalFacets().clear();
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION:
+        setBaseTypeDefinition((XSDSimpleTypeDefinition)null);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION:
+        setPrimitiveTypeDefinition((XSDSimpleTypeDefinition)null);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION:
+        setItemTypeDefinition((XSDSimpleTypeDefinition)null);
+        return;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:
+        getSyntheticFacets().clear();
+        return;
+    }
+    super.eUnset(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public boolean eIsSet(int featureID)
+  {
+    switch (featureID)
+    {
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VARIETY:
+        return isSetVariety();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FINAL:
+        return final_ != null && !final_.isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LEXICAL_FINAL:
+        return isSetLexicalFinal();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__VALID_FACETS:
+        return validFacets != null && !validFacets.isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CONTENTS:
+        return contents != null && !contents.isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACET_CONTENTS:
+        return facetContents != null && !facetContents.isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FACETS:
+        return facets != null && !facets.isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MEMBER_TYPE_DEFINITIONS:
+        return memberTypeDefinitions != null && !memberTypeDefinitions.isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FUNDAMENTAL_FACETS:
+        return fundamentalFacets != null && !fundamentalFacets.isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BASE_TYPE_DEFINITION:
+        return baseTypeDefinition != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PRIMITIVE_TYPE_DEFINITION:
+        return primitiveTypeDefinition != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ITEM_TYPE_DEFINITION:
+        return itemTypeDefinition != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ROOT_TYPE_DEFINITION:
+        return getRootTypeDefinition() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_FACET:
+        return getMinFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_FACET:
+        return getMaxFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_INCLUSIVE_FACET:
+        return getMaxInclusiveFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_INCLUSIVE_FACET:
+        return getMinInclusiveFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_EXCLUSIVE_FACET:
+        return getMinExclusiveFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_EXCLUSIVE_FACET:
+        return getMaxExclusiveFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__LENGTH_FACET:
+        return getLengthFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__WHITE_SPACE_FACET:
+        return getWhiteSpaceFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ENUMERATION_FACETS:
+        return !getEnumerationFacets().isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__PATTERN_FACETS:
+        return !getPatternFacets().isEmpty();
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__CARDINALITY_FACET:
+        return getCardinalityFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__NUMERIC_FACET:
+        return getNumericFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MAX_LENGTH_FACET:
+        return getMaxLengthFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__MIN_LENGTH_FACET:
+        return getMinLengthFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__TOTAL_DIGITS_FACET:
+        return getTotalDigitsFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__FRACTION_DIGITS_FACET:
+        return getFractionDigitsFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__ORDERED_FACET:
+        return getOrderedFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__BOUNDED_FACET:
+        return getBoundedFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MAX_FACET:
+        return getEffectiveMaxFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_WHITE_SPACE_FACET:
+        return getEffectiveWhiteSpaceFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MAX_LENGTH_FACET:
+        return getEffectiveMaxLengthFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_FRACTION_DIGITS_FACET:
+        return getEffectiveFractionDigitsFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_PATTERN_FACET:
+        return getEffectivePatternFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_ENUMERATION_FACET:
+        return getEffectiveEnumerationFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_TOTAL_DIGITS_FACET:
+        return getEffectiveTotalDigitsFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MIN_LENGTH_FACET:
+        return getEffectiveMinLengthFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_LENGTH_FACET:
+        return getEffectiveLengthFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__EFFECTIVE_MIN_FACET:
+        return getEffectiveMinFacet() != null;
+      case XSDPackage.XSD_SIMPLE_TYPE_DEFINITION__SYNTHETIC_FACETS:
+        return syntheticFacets != null && !syntheticFacets.isEmpty();
+    }
+    return super.eIsSet(featureID);
+  }
+
+  /**
+   * <!-- begin-user-doc -->
+   * <!-- end-user-doc -->
+   * @generated
+   */
+  @Override
+  public String toString()
+  {
+    if (eIsProxy()) return super.toString();
+
+    StringBuffer result = new StringBuffer(super.toString());
+    result.append(" (variety: ");
+    if ((eFlags & VARIETY_ESETFLAG) != 0) result.append(VARIETY_EFLAG_VALUES[(eFlags & VARIETY_EFLAG) >>> VARIETY_EFLAG_OFFSET]); else result.append("<unset>");
+    result.append(", final: ");
+    result.append(final_);
+    result.append(", lexicalFinal: ");
+    result.append(lexicalFinal);
+    result.append(", validFacets: ");
+    result.append(validFacets);
+    result.append(')');
+    return result.toString();
+  }
+
+  public XSDWhiteSpaceFacet getWhiteSpaceFacet()
+  {
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDWhiteSpaceFacet)
+        {
+          return (XSDWhiteSpaceFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public XSDWhiteSpaceFacet getEffectiveWhiteSpaceFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDWhiteSpaceFacet)
+        {
+          return (XSDWhiteSpaceFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public EList<XSDEnumerationFacet> getEnumerationFacets()
+  {
+    EList<XSDEnumerationFacet> result = new BasicEList<XSDEnumerationFacet>();
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDEnumerationFacet)
+        {
+          result.add((XSDEnumerationFacet)facet);
+        }
+      }
+    }
+    return 
+      new EcoreEList.UnmodifiableEList.FastCompare<XSDEnumerationFacet>
+        (this, XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__ENUMERATION_FACETS, result.size(), result.toArray());
+  }
+
+  public XSDEnumerationFacet getEffectiveEnumerationFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDEnumerationFacet)
+        {
+          return (XSDEnumerationFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  public EList<XSDPatternFacet> getPatternFacets()
+  {
+    EList<XSDPatternFacet> result = new BasicEList<XSDPatternFacet>();
+    if (facetContents != null)
+    {
+      Object [] facets = facetContents.data();
+      for (int i = 0, size = facetContents.size(); i < size; ++i)
+      {
+        Object facet = facets[i];
+        if (facet instanceof XSDPatternFacet)
+        {
+          result.add((XSDPatternFacet)facet);
+        }
+      }
+    }
+    return 
+      new EcoreEList.UnmodifiableEList.FastCompare<XSDPatternFacet>
+        (this, XSDPackage.Literals.XSD_SIMPLE_TYPE_DEFINITION__PATTERN_FACETS, result.size(), result.toArray());
+  }
+
+  public XSDPatternFacet getEffectivePatternFacet()
+  {
+    if (facets != null)
+    {
+      Object [] facetData = facets.data();
+      for (int i = 0, size = facets.size(); i < size; ++i)
+      {
+        Object facet = facetData[i];
+        if (facet instanceof XSDPatternFacet)
+        {
+          return (XSDPatternFacet)facet;
+        }
+      }
+    }
+    return null;
+  }
+
+  protected XSDBoundedFacet boundedFacet;
+  public XSDBoundedFacet getBoundedFacet()
+  {
+    if (boundedFacet == null)
+    {
+      createFundamentalFacets();
+    }
+    return boundedFacet;
+  }
+
+  protected XSDCardinalityFacet cardinalityFacet;
+  public XSDCardinalityFacet getCardinalityFacet()
+  {
+    if (cardinalityFacet == null)
+    {
+      createFundamentalFacets();
+    }
+    return cardinalityFacet;
+  }
+
+  protected XSDNumericFacet numericFacet;
+  public XSDNumericFacet getNumericFacet()
+  {
+    if (numericFacet == null)
+    {
+      createFundamentalFacets();
+    }
+    return numericFacet;
+  }
+
+  protected XSDOrderedFacet orderedFacet;
+  public XSDOrderedFacet getOrderedFacet()
+  {
+    if (orderedFacet == null)
+    {
+      createFundamentalFacets();
+    }
+    return orderedFacet;
+  }
+
+  protected void createFundamentalFacets()
+  {
+    List<XSDFundamentalFacet> theFundamentalFacets = getFundamentalFacets();
+    boundedFacet = getXSDFactory().createXSDBoundedFacet();
+    cardinalityFacet = getXSDFactory().createXSDCardinalityFacet();
+    numericFacet = getXSDFactory().createXSDNumericFacet();
+    orderedFacet = getXSDFactory().createXSDOrderedFacet();
+    List<XSDFundamentalFacet> list = new ArrayList<XSDFundamentalFacet>(4);
+    list.add(boundedFacet);
+    list.add(cardinalityFacet);
+    list.add(numericFacet);
+    list.add(orderedFacet);
+    theFundamentalFacets.addAll(list);
+  }
+
+  protected static EList<String> validFacetsForList;
+  public EList<String> getValidFacetsForList()
+  {
+    if (validFacetsForList == null)
+    {
+      validFacetsForList = new BasicEList<String>();
+      validFacetsForList.add("length");
+      validFacetsForList.add("maxLength");
+      validFacetsForList.add("minLength");
+      validFacetsForList.add("whiteSpace");
+      validFacetsForList.add("enumeration");
+      validFacetsForList.add("pattern");
+    }
+    return validFacetsForList;
+  }
+
+  protected static EList<String> validFacetsForUnion;
+  public EList<String> getValidFacetsForUnion()
+  {
+    if (validFacetsForUnion == null)
+    {
+      validFacetsForUnion = new BasicEList<String>();
+      validFacetsForUnion.add("enumeration");
+      validFacetsForUnion.add("pattern");
+    }
+    return validFacetsForUnion;
+  }
+
+  @Override
+  public XSDTypeDefinition getBaseType()
+  {
+    XSDTypeDefinition result = getBaseTypeDefinition();
+    if (result == this && XSDConstants.isAnyType(this))
+    {
+      XSDSchema xsdSchema = getSchema();
+      if (xsdSchema != null)
+      {
+        String schemaForSchemaNamespace = xsdSchema.getSchemaForSchemaNamespace();
+        XSDSchemaImpl.getSchemaForSchema(schemaForSchemaNamespace).resolveComplexTypeDefinition("anyType");
+      }
+    }
+    return result;
+  }
+
+  @Override
+  public XSDTypeDefinition getRootType()
+  {
+    return getRootTypeDefinition();
+  }
+
+  public XSDSimpleTypeDefinition getRootTypeDefinition()
+  {
+    XSDSimpleTypeDefinition result = this;
+    if (!isCircular())
+    {
+      for (XSDSimpleTypeDefinition theBaseTypeDefinition = result.getBaseTypeDefinition();
+           theBaseTypeDefinition != null && !XSDConstants.isURType(theBaseTypeDefinition); 
+           theBaseTypeDefinition = theBaseTypeDefinition.getBaseTypeDefinition())
+      {
+        result = theBaseTypeDefinition;
+      }
+    }
+    return result;
+  }
+
+  @Override
+  public XSDSimpleTypeDefinition getSimpleType()
+  {
+    return this;
+  }
+
+  @Override
+  public XSDParticle getComplexType()
+  {
+    return null;
+  }
+
+  protected XSDEnumerationFacetImpl effectiveEnumerationFacet;
+  protected XSDPatternFacetImpl effectivePatternFacet;
+
+  protected List<XSDConstrainingFacet> mergeFacets()
+  {
+    List<XSDConstrainingFacet> result = new ArrayList<XSDConstrainingFacet>();
+
+    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();
+
+    XSDWhiteSpaceFacet xsdWhiteSpaceFacet = getWhiteSpaceFacet();
+    if (xsdWhiteSpaceFacet == null)
+    {
+      xsdWhiteSpaceFacet = theBaseTypeDefinition.getEffectiveWhiteSpaceFacet();
+    }
+    if (xsdWhiteSpaceFacet != null)
+    {
+      result.add(xsdWhiteSpaceFacet);
+    }
+
+    XSDTotalDigitsFacet xsdTotalDigitsFacet = getTotalDigitsFacet();
+    if (xsdTotalDigitsFacet == null)
+    {
+      xsdTotalDigitsFacet = theBaseTypeDefinition.getEffectiveTotalDigitsFacet();
+    }
+    if (xsdTotalDigitsFacet != null)
+    {
+      result.add(xsdTotalDigitsFacet);
+    }
+
+    XSDFractionDigitsFacet xsdFractionDigitsFacet = getFractionDigitsFacet();
+    if (xsdFractionDigitsFacet == null)
+    {
+      xsdFractionDigitsFacet = theBaseTypeDefinition.getEffectiveFractionDigitsFacet();
+    }
+    if (xsdFractionDigitsFacet != null)
+    {
+      result.add(xsdFractionDigitsFacet);
+    }
+
+    XSDLengthFacet xsdLengthFacet = getLengthFacet();
+    if (xsdLengthFacet == null)
+    {
+      xsdLengthFacet = theBaseTypeDefinition.getEffectiveLengthFacet();
+    }
+    if (xsdLengthFacet != null)
+    {
+      result.add(xsdLengthFacet);
+    }
+
+    XSDMinLengthFacet xsdMinLengthFacet = getMinLengthFacet();
+    if (xsdMinLengthFacet == null)
+    {
+      xsdMinLengthFacet = theBaseTypeDefinition.getEffectiveMinLengthFacet();
+    }
+    if (xsdMinLengthFacet != null)
+    {
+      result.add(xsdMinLengthFacet);
+    }
+
+    XSDMaxLengthFacet xsdMaxLengthFacet = getMaxLengthFacet();
+    if (xsdMaxLengthFacet == null)
+    {
+      xsdMaxLengthFacet = theBaseTypeDefinition.getEffectiveMaxLengthFacet();
+    }
+    if (xsdMaxLengthFacet != null)
+    {
+      result.add(xsdMaxLengthFacet);
+    }
+
+    XSDConstrainingFacet maxFacet = getMaxFacet();
+    if (maxFacet == null)
+    {
+      maxFacet = theBaseTypeDefinition.getEffectiveMaxFacet();
+    }
+    if (maxFacet != null)
+    {
+      result.add(maxFacet);
+    }
+
+    XSDConstrainingFacet minFacet = getMinFacet();
+    if (minFacet == null)
+    {
+      minFacet = theBaseTypeDefinition.getEffectiveMinFacet();
+    }
+    if (minFacet != null)
+    {
+      result.add(minFacet);
+    }
+
+    List<XSDEnumerationFacet> enumerationFacets = getEnumerationFacets();
+    if (enumerationFacets.isEmpty())
+    {
+      XSDEnumerationFacet baseEnumerationFacet = theBaseTypeDefinition.getEffectiveEnumerationFacet();
+      if (baseEnumerationFacet != null)
+      {
+        result.add(baseEnumerationFacet);
+      }
+    }
+    else
+    {
+      if (effectiveEnumerationFacet == null)
+      {
+        effectiveEnumerationFacet = (XSDEnumerationFacetImpl)getXSDFactory().createXSDEnumerationFacet();
+        getSyntheticFacets().add(effectiveEnumerationFacet);
+      }
+
+      StringBuffer newLexicalValue = new StringBuffer();
+      List<Object> newValue = new UniqueEList<Object>();
+      List<XSDAnnotation> newAnnotations = new ArrayList<XSDAnnotation>();
+
+      for (XSDEnumerationFacet enumerationFacet : enumerationFacets)
+      {
+        XSDAnnotation xsdAnnotation = enumerationFacet.getAnnotation();
+        if (xsdAnnotation != null)
+        {
+          newAnnotations.add(xsdAnnotation);
+        }
+
+        if (newValue.addAll(enumerationFacet.getValue()))
+        {
+          if (newLexicalValue.length() != 0)
+          {
+            newLexicalValue.append(", ");
+          }
+          newLexicalValue.append(enumerationFacet.getLexicalValue());
+        }
+      }
+      String newLexicalValueString = newLexicalValue.toString();
+
+      List<Object> remainingValues = new ArrayList<Object>(effectiveEnumerationFacet.getValue());
+      remainingValues.removeAll(newValue);
+      if (!remainingValues.isEmpty())
+      {
+        effectiveEnumerationFacet.getValue().removeAll(remainingValues);
+      }
+      if (!newValue.isEmpty())
+      {
+        setListContentAndOrder(effectiveEnumerationFacet.getValue(), newValue);
+      }
+
+      List<XSDAnnotation> remainingAnnotations = new ArrayList<XSDAnnotation>(effectiveEnumerationFacet.getAnnotations());
+      remainingAnnotations.removeAll(newAnnotations);
+      if (!remainingAnnotations.isEmpty())
+      {
+        effectiveEnumerationFacet.getAnnotations().removeAll(remainingAnnotations);
+      }
+      if (!newAnnotations.isEmpty())
+      {
+        setListContentAndOrder(effectiveEnumerationFacet.getAnnotations(), newAnnotations);
+      }
+
+      if (!newLexicalValueString.equals(effectiveEnumerationFacet.getLexicalValue()))
+      {
+        effectiveEnumerationFacet.isReconciling = true;
+        effectiveEnumerationFacet.setLexicalValue(newLexicalValueString);
+        effectiveEnumerationFacet.isReconciling = false;
+      }
+
+      result.add(effectiveEnumerationFacet);
+    }
+
+    List<XSDPatternFacet> patternFacets = getPatternFacets();
+    if (patternFacets.isEmpty())
+    {
+      XSDPatternFacet basePatternFacet = theBaseTypeDefinition.getEffectivePatternFacet();
+      if (basePatternFacet != null)
+      {
+        result.add(basePatternFacet);
+      }
+    }
+    else
+    {
+      if (effectivePatternFacet == null)
+      {
+        effectivePatternFacet = (XSDPatternFacetImpl)getXSDFactory().createXSDPatternFacet();
+        getSyntheticFacets().add(effectivePatternFacet);
+      }
+
+      List<String> newValue = new ArrayList<String>();
+      List<XSDAnnotation> newAnnotations = new ArrayList<XSDAnnotation>();
+      XSDPatternFacet effectiveBasePatternFacet = theBaseTypeDefinition.getEffectivePatternFacet();
+      if (effectiveBasePatternFacet != null)
+      {
+        newValue.addAll(effectiveBasePatternFacet.getValue());
+      }
+
+      StringBuffer combinedPattern = new StringBuffer();
+      if (patternFacets.size() == 1)
+      {
+        XSDPatternFacet xsdPatternFacet = patternFacets.get(0);
+        combinedPattern.append(xsdPatternFacet.getLexicalValue());
+        XSDAnnotation xsdAnnotation = xsdPatternFacet.getAnnotation();
+        if (xsdAnnotation != null)
+        {
+          newAnnotations.add(xsdAnnotation);
+        }
+      }
+      else
+      {
+        for (XSDPatternFacet xsdPatternFacet : patternFacets)
+        {
+          if (combinedPattern.length() != 0)
+          {
+            combinedPattern.append("|");
+          }
+          combinedPattern.append("(");
+          combinedPattern.append(xsdPatternFacet.getLexicalValue());
+          combinedPattern.append(")");
+          XSDAnnotation xsdAnnotation = xsdPatternFacet.getAnnotation();
+          if (xsdAnnotation != null)
+          {
+            newAnnotations.add(xsdAnnotation);
+          }
+        }
+      }
+      newValue.add(combinedPattern.toString());
+
+      List<String> remainingValues = new ArrayList<String>(effectivePatternFacet.getValue());
+      remainingValues.removeAll(newValue);
+      if (!remainingValues.isEmpty())
+      {
+        effectivePatternFacet.getValue().removeAll(remainingValues);
+      }
+      if (!newValue.isEmpty())
+      {
+        setListContentAndOrder(effectivePatternFacet.getValue(), newValue);
+      }
+
+      List<XSDAnnotation> remainingAnnotations = new ArrayList<XSDAnnotation>(effectivePatternFacet.getAnnotations());
+      remainingAnnotations.removeAll(newAnnotations);
+      if (!remainingAnnotations.isEmpty())
+      {
+        effectivePatternFacet.getAnnotations().removeAll(remainingAnnotations);
+      }
+      if (!newAnnotations.isEmpty())
+      {
+        setListContentAndOrder(effectivePatternFacet.getAnnotations(), newAnnotations);
+      }
+
+      StringBuffer newLexicalValue = new StringBuffer();
+      if (newValue.size() == 1)
+      {
+        newLexicalValue.append(newValue.get(0));
+      }
+      else
+      {
+        for (String string : newValue)
+        {
+          if (newLexicalValue.length() != 0)
+          {
+            newLexicalValue.append(" & ");
+          }
+          newLexicalValue.append("(");
+          newLexicalValue.append(string);
+          newLexicalValue.append(")");
+        }
+      }
+      String newLexicalValueString = newLexicalValue.toString();
+      if (!newLexicalValueString.equals(effectivePatternFacet.getLexicalValue()))
+      {
+        effectivePatternFacet.isReconciling = true;
+        effectivePatternFacet.setLexicalValue(newLexicalValueString);
+        effectivePatternFacet.isReconciling = false;
+      }
+
+      result.add(effectivePatternFacet);
+    }
+
+    return result;
+  }
+
+
+  public String getStringLexicalFinal()
+  {
+    if (isSetLexicalFinal())
+    {
+      StringBuffer result = new StringBuffer();
+      for (Object literal : getLexicalFinal())
+      {
+        if (result.length() != 0)
+        {
+          result.append(' ');
+        }
+        if (literal.toString().equals("all"))
+        {
+          result.append("#all");
+        }
+        else
+        {
+          result.append(literal);
+        }
+      }
+      return result.toString();
+    }
+    else
+    {
+      return null;
+    }
+  }
+
+  public void setStringLexicalFinal(String finalDefault)
+  {
+    if (finalDefault == null)
+    {
+      unsetLexicalFinal();
+    }
+    else
+    {
+      List<XSDSimpleFinal> newLexicalFinal = new ArrayList<XSDSimpleFinal>();
+      for (StringTokenizer stringTokenizer = new StringTokenizer(finalDefault); stringTokenizer.hasMoreTokens(); )
+      {
+        String token = stringTokenizer.nextToken();
+        if (token.equals("#all"))
+        {
+          token = "all";
+        }
+        XSDSimpleFinal literal = XSDSimpleFinal.get(token);
+        if (literal != null)
+        {
+          newLexicalFinal.add(literal);
+        }
+      }
+      if (!newLexicalFinal.equals(getLexicalFinal()))
+      {
+        Collection<XSDSimpleFinal> oldContents = new ArrayList<XSDSimpleFinal>(getLexicalFinal());
+        oldContents.removeAll(newLexicalFinal);
+        if (!oldContents.isEmpty())
+        {
+          getLexicalFinal().removeAll(oldContents);
+        }
+        setListContentAndOrder(getLexicalFinal(), newLexicalFinal);
+      }
+      else if (newLexicalFinal.isEmpty() && !isSetLexicalFinal())
+      {
+        getLexicalFinal().clear();
+      }
+    }
+  }
+
+  public String getStringFinal()
+  {
+    StringBuffer result = new StringBuffer();
+    for (Object literal : getFinal())
+    {
+      if (result.length() != 0)
+      {
+        result.append(' ');
+      }
+      result.append(literal);
+    }
+    return result.toString();
+  }
+
+  /**
+   * This is used to gather selectively 
+   * the information determined when assessing a literal string 
+   * with respect to a {@link XSDSimpleTypeDefinition}.
+   * It is intended to be very light-weight and flexible.
+   *
+   * You may begin assessment with a {@link #node}, which handles three cases:
+   * if the node is an attribute, it's value is used to determine the literal;
+   * if the node is a text node, it's value is used to determine the literal;
+   * if the node is an element, it's (one and only) child text node is used to determine the literal in the preceeding case.
+   * You may begin assessment with a {@link #literal} by not setting a node.
+   * And you may begin assessment with a {@link #normalizedLiteral} by setting neither the node nor the literal.
+   *
+   * Unless additional {@link #yield} flags are set,
+   * assessment will perform but one function:
+   * it will set the {@link #diagnostics} to Collections.EMPTY_LIST when the literal fails to assess as valid.
+   * Hence, this most-light-weight invocation will only determine validity.
+   *
+   * You may choose for assessment to yield additional results, 
+   * i.e., the {@link #value}, the {@link #canonicalLiteral}, and the {@link #diagnostics},
+   * using the flags {@link #YIELD_VALUE}, {@link #YIELD_CANONICAL_LITERAL}, {@link #YIELD_DIAGNOSTICS}.
+   */
+  public static class AssessmentImpl implements XSDSimpleTypeDefinition.Assessment
+  { 
+    public static final int YIELD_VALUE             = 0x01;
+    public static final int YIELD_CANONICAL_LITERAL = 0x02;
+    public static final int YIELD_DIAGNOSTICS       = 0x04;
+
+    /**
+     * This is the simple type definition doing the assessment.
+     */
+    public XSDSimpleTypeDefinitionImpl xsdSimpleTypeDefinition;
+
+    /**
+     * This is the simple type definition doing the assessment for an atomic type.
+     */
+    public XSDAnySimpleType xsdAnySimpleType;
+
+    /**
+     * This is the context in which the prefix of QNames are resolved.
+     */
+    public Element context;
+
+    /**
+     * This is the node whose literal is being assessed.
+     */
+    public Node node;
+
+    /**
+     * This is the literal that is being assessed.
+     */
+    public String literal;
+
+    /**
+     * This is the normalized value of the literal being assessed.
+     */
+    public String normalizedLiteral;
+
+    /**
+     *  This determines the results that will be yielded during assessment.
+     */
+    public int yield;
+
+    /**
+     * This is the value of the normalized literal in the Java representation of the value space.
+     */
+    public Object value;
+
+    /**
+     * This is the canonical literal representation of the literal.
+     */
+    public String canonicalLiteral;
+
+    /**
+     * These are the diagnostics that are collected.
+     */
+    public Collection<XSDDiagnostic> diagnostics;
+
+    /**
+     * This records any nested assessments that were performed.
+     */
+    public Collection<Assessment> assessments;
+
+    /**
+     * This creates an empty instance;
+     * minimally, the node or literal would need to be set before using this.
+     */
+    public AssessmentImpl()
+    {
+      super();
+    }
+
+    /**
+     * This creates an instance to assess the given node and to yield the specified results.
+     */
+    public AssessmentImpl(Node node, int yield)
+    {
+      this.yield = yield;
+      this.node = node;
+    }
+
+    /**
+     * This creates an instance to assess the given node and to yield the specified results.
+     */
+    public AssessmentImpl(Element context, Node node, int yield)
+    {
+      this.context = context;
+      this.yield = yield;
+      this.node = node;
+    }
+
+    /**
+     * This creates an instance to assess the given literal and to yield the specified results.
+     */
+    public AssessmentImpl(String literal, int yield)
+    {
+      this.yield = yield;
+      this.literal = literal;
+    }
+
+    /**
+     * This creates an instance to assess the given literal and to yield the specified results.
+     */
+    public AssessmentImpl(Element context, String literal, int yield)
+    {
+      this.context = context;
+      this.yield = yield;
+      this.literal = literal;
+    }
+
+    public XSDSimpleTypeDefinition getTypeDefinition()
+    {
+      return xsdSimpleTypeDefinition;
+    }
+
+    public Element getContext()
+    {
+      return context;
+    }
+
+    public Node getNode()
+    {
+      return node;
+    }
+
+    public String getLiteral()
+    {
+      return literal;
+    }
+
+    public String getNormalizedLiteral()
+    {
+      return normalizedLiteral;
+    }
+
+    public Object getValue()
+    {
+      return value;
+    }
+
+    public String getCanonicalLiteral()
+    {
+      return normalizedLiteral;
+    }
+
+    public XSDSimpleTypeDefinition getMemberTypeDefinition()
+    {
+      return null;
+    }
+
+    public Collection<XSDDiagnostic> getLocalDiagnostics()
+    {
+      return diagnostics == null ? Collections.<XSDDiagnostic>emptyList() : diagnostics;
+    }
+
+    public Collection<Assessment> getAssessments()
+    {
+      return assessments;
+    }
+
+    public Collection<XSDDiagnostic> getDiagnostics()
+    {
+      Collection<XSDDiagnostic> result = new ArrayList<XSDDiagnostic>();
+      getAllDiagnostics(result);
+      return result;
+    }
+
+    protected void getAllDiagnostics(Collection<XSDDiagnostic> result)
+    {
+      if (diagnostics != null)
+      {
+        result.addAll(diagnostics);
+      }
+      if (assessments != null)
+      {
+        for (Assessment assessment : assessments)
+        {
+          ((AssessmentImpl)assessment).getAllDiagnostics(result);
+        }
+      }
+    }
+
+    public void format(String noun, String name)
+    {
+      if (diagnostics != null)
+      {
+        for (XSDDiagnostic xsdDiagnostic : diagnostics)
+        {
+          xsdDiagnostic.setMessage(MessageFormat.format(xsdDiagnostic.getMessage(), new Object [] { noun, name }));
+        }
+      }
+      if (assessments != null)
+      {
+        for (Assessment assessment :  assessments)
+        {
+          assessment.format(noun, name);
+        }
+      }
+    }
+
+    public void assignDiagnostics(XSDConcreteComponent xsdConcreteComponent, Element element, String attributeName)
+    {
+      Collection<XSDDiagnostic> allDiagnostics = getDiagnostics();
+      if (!allDiagnostics.isEmpty())
+      {
+        Node theNode = element;
+        if (element != null && element.hasAttributeNS(null, attributeName))
+        {
+          theNode = element.getAttributeNodeNS(null, attributeName);
+        }
+
+        Object [] substitutions = new Object [] { XSDPlugin.INSTANCE.getString("attribute_noun"), attributeName };
+        for (XSDDiagnostic xsdDiagnostic : allDiagnostics)
+        {
+          xsdDiagnostic.setMessage(MessageFormat.format(xsdDiagnostic.getMessage(), substitutions));
+          xsdDiagnostic.getComponents().add(0, xsdConcreteComponent);
+          xsdDiagnostic.setNode(theNode);
+        }
+      }
+    }
+
+    public void validate(XSDConstrainingFacet xsdConstrainingFacet)
+    {
+      if (xsdConstrainingFacet != null &&
+            !(xsdConstrainingFacet instanceof XSDPatternFacet ?
+                ((XSDPatternFacet)xsdConstrainingFacet).isConstraintSatisfied(normalizedLiteral) :
+                xsdConstrainingFacet.isConstraintSatisfied(value)))
+      {
+        XSDDiagnostic result = ((XSDConcreteComponentImpl)xsdConstrainingFacet).getXSDFactory().createXSDDiagnostic();
+        result.setSeverity(XSDDiagnosticSeverity.ERROR_LITERAL);
+        Object [] substitutions =  createSubstitutions(5);
+        substitutions[3] = xsdConstrainingFacet.getLexicalValue();
+        substitutions[4] = xsdConstrainingFacet.getSimpleTypeDefinition().getURI();
+
+        String message = populateDiagnostic(result, "cvc-" + xsdConstrainingFacet.getFacetName() + "-valid", substitutions);
+        if (node == null || node.getNodeType() == Node.TEXT_NODE)
+        {
+          message = requote(message);
+        }
+        result.setMessage(XSDPlugin.INSTANCE.getString("_UI_XSDError_message", new Object [] { message}));
+        result.setAnnotationURI(XSDConstants.PART2 + "#" + xsdConstrainingFacet.getFacetName());
+        result.setPrimaryComponent(xsdConstrainingFacet);
+        result.setNode(node);
+
+        if (diagnostics == null)
+        {
+          diagnostics = new ArrayList<XSDDiagnostic>();
+        }
+        diagnostics.add(result);
+      }
+    }
+
+    protected Object [] createSubstitutions(int length)
+    {
+      Object [] substitutions =  new Object [length];
+      if (normalizedLiteral != null)
+      {
+        substitutions[0] = normalizedLiteral;
+      }
+      else if (literal != null)
+      {
+        substitutions[0] = literal;
+      }
+      else 
+      {
+        substitutions[0] = value;
+      }
+
+      if (node == null || node.getNodeType() == Node.TEXT_NODE)
+      {
+        substitutions[1] = "\000";
+        substitutions[2] = "\001";
+      }
+      else if (node.getNodeType() == Node.ATTRIBUTE_NODE)
+      {
+        substitutions[1] =  XSDPlugin.INSTANCE.getString("attribute_noun");
+        substitutions[2] = node.getLocalName();
+      }
+      else if (node.getNodeType() == Node.ELEMENT_NODE)
+      {
+        substitutions[1] =  XSDPlugin.INSTANCE.getString("element_noun");
+        substitutions[2] = node.getLocalName();
+      }
+
+      return substitutions;
+    }
+
+    protected static String requote(String message)
+    {
+      StringBuffer stringBuffer = new StringBuffer(message);
+      for (int i = stringBuffer.length() - 1;  i > 0; --i)
+      {
+        switch (stringBuffer.charAt(i))
+        {
+          case 0:
+          {
+            stringBuffer.replace(i, i + 1, "{0}");
+            break;
+          }
+          case 1:
+          {
+            stringBuffer.replace(i, i + 1, "{1}");
+            break;
+          }
+          case '\'':
+          {
+            stringBuffer.insert(i, '\'');
+            break;
+          }
+          case '{': // }
+          {
+            stringBuffer.replace(i, i + 1, "'{'"); // }
+            break;
+          }
+        }
+      }
+      return stringBuffer.toString();
+    }
+
+    public void reportDatatypeDiagnostic()
+    {
+      XSDDiagnostic result = xsdSimpleTypeDefinition.getXSDFactory().createXSDDiagnostic();
+      result.setSeverity(XSDDiagnosticSeverity.ERROR_LITERAL);
+      Object [] substitutions =  createSubstitutions(4);
+      substitutions[3] = xsdSimpleTypeDefinition.getURI();
+      XSDSimpleTypeDefinition primitiveTypeDefinition = xsdSimpleTypeDefinition.getPrimitiveTypeDefinition();
+      String message = 
+        populateDiagnostic
+          (result,
+           primitiveTypeDefinition == null ? 
+             "cvc-datatype-valid.1.2.3" : 
+             "cvc-datatype-valid.1.2.1", 
+           substitutions);
+      if (node == null || node.getNodeType() == Node.TEXT_NODE)
+      {
+        message = requote(message);
+      }
+      result.setMessage(XSDPlugin.INSTANCE.getString("_UI_XSDError_message", new Object [] { message }));
+      if (primitiveTypeDefinition != null)
+      {
+        result.setAnnotationURI(XSDConstants.PART2 + "#" + primitiveTypeDefinition.getName());
+      }
+      result.setPrimaryComponent(primitiveTypeDefinition);
+      result.setNode(node);
+
+      if (diagnostics == null)
+      {
+        diagnostics = new ArrayList<XSDDiagnostic>();
+      }
+      diagnostics.add(result);
+    }
+  }
+
+  public XSDSimpleTypeDefinition.Assessment assess(Node node)
+  {
+    return assess(null, node);
+  }
+
+  public XSDSimpleTypeDefinition.Assessment assess(Element context, Node node)
+  {
+    AssessmentImpl assessment = new AssessmentImpl(context, node, 0);
+    return assess(assessment);
+  }
+
+  public XSDSimpleTypeDefinition.Assessment assess(String literal)
+  {
+    return assess(null, literal);
+  }
+
+  public XSDSimpleTypeDefinition.Assessment assess(Element context, String literal)
+  {
+    AssessmentImpl assessment = new AssessmentImpl(context, literal, 0);
+    return assess(assessment);
+  }
+
+  public AssessmentImpl assess(AssessmentImpl assessment)
+  {
+    return assess(assessment, true);
+  }
+
+  public AssessmentImpl assess(AssessmentImpl assessment, boolean validate)
+  {
+    assessment.xsdSimpleTypeDefinition = this;
+
+    // Determine the literal from the node.
+    //
+    if (assessment.literal == null && assessment.node != null)
+    {
+      switch (assessment.node.getNodeType())
+      {
+        case Node.ATTRIBUTE_NODE:
+        {
+          assessment.literal = assessment.node.getNodeValue();
+          break;
+        }
+        case Node.ELEMENT_NODE:
+        {
+          Element element = (Element)assessment.node;
+          StringBuffer text = new StringBuffer();
+          for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling())
+          {
+            switch (child.getNodeType())
+            {
+              case Node.TEXT_NODE:
+              case Node.CDATA_SECTION_NODE:
+              {
+                text.append(child.getNodeValue());
+                break;
+              }
+            }
+          }
+          assessment.literal = text.toString();
+          break;
+        }
+        case Node.TEXT_NODE:
+        case Node.CDATA_SECTION_NODE:
+        {
+          assessment.literal = assessment.node.getNodeValue();
+          break;
+        }
+      }
+    }
+
+    // Determine the normalized literal from the literal.
+    //
+    if (assessment.normalizedLiteral == null && assessment.literal != null)
+    {
+      assessment.normalizedLiteral = assessment.literal;
+      XSDWhiteSpaceFacet effectiveWhiteSpaceFacet = getEffectiveWhiteSpaceFacet();
+      if (effectiveWhiteSpaceFacet != null)
+      {
+        assessment.normalizedLiteral = effectiveWhiteSpaceFacet.getNormalizedLiteral(assessment.literal);
+      }
+    }
+
+    if (!isCircular())
+    {
+      if (validate)
+      {
+        assessment.validate(getEffectivePatternFacet());
+      }
+
+      switch (getVariety().getValue())
+      {
+        case XSDVariety.ATOMIC:
+        {
+          XSDSimpleTypeDefinition thePrimitiveTypeDefinition = getPrimitiveTypeDefinition();
+          if (thePrimitiveTypeDefinition != null)
+          {
+            XSDAnySimpleType xsdAnySimpleType = XSDTypeRegister.getTypeImplementer(thePrimitiveTypeDefinition.getName());
+            xsdAnySimpleType.assess(assessment);
+            if (validate && assessment.diagnostics == null)
+            {
+              assessment.validate(getEffectiveLengthFacet());
+              assessment.validate(getEffectiveMinLengthFacet());
+              assessment.validate(getEffectiveMaxLengthFacet());
+
+              assessment.validate(getEffectiveTotalDigitsFacet());
+              assessment.validate(getEffectiveFractionDigitsFacet());
+
+              if (XSDOrdered.FALSE_LITERAL != getOrderedFacet().getValue())
+              {
+                assessment.validate(getEffectiveMinFacet());
+                assessment.validate(getEffectiveMaxFacet());
+              }
+            }
+          }
+          break;
+        }
+        case XSDVariety.UNION:
+        {
+          boolean good = false;
+          for (XSDSimpleTypeDefinition memberTypeDefinition : getMemberTypeDefinitions())
+          {
+            AssessmentImpl nestedAssessment = new AssessmentImpl(assessment.context, assessment.node, assessment.yield);
+            nestedAssessment.literal = nestedAssessment.normalizedLiteral = assessment.normalizedLiteral;
+
+            ((XSDSimpleTypeDefinitionImpl)memberTypeDefinition).assess(nestedAssessment);
+
+            if (nestedAssessment.diagnostics == null)
+            {
+              if (assessment.assessments == null)
+              {
+                assessment.assessments = new ArrayList<Assessment>();
+              }
+              assessment.assessments.add(nestedAssessment);
+              assessment.value = nestedAssessment.value;
+              good = true;
+              break;
+            }
+          }
+
+          if (validate && !good)
+          {
+            assessment.reportDatatypeDiagnostic();
+          }
+
+          break;
+        }
+        case XSDVariety.LIST:
+        {
+          XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();
+          if (theItemTypeDefinition != null)
+          {
+            List<Object> list = new ArrayList<Object>();
+            assessment.value = list;
+            for (StringTokenizer tokens = new StringTokenizer(assessment.normalizedLiteral, " "); 
+                 tokens.hasMoreTokens();  )
+            {
+              AssessmentImpl nestedAssessment = new AssessmentImpl(assessment.context, assessment.node, assessment.yield);
+              nestedAssessment.literal = nestedAssessment.normalizedLiteral = tokens.nextToken();
+              ((XSDSimpleTypeDefinitionImpl)getItemTypeDefinition()).assess(nestedAssessment, validate);
+              if (nestedAssessment.value != null)
+              {
+                list.add(nestedAssessment.value);
+              }
+              if (assessment.assessments == null)
+              {
+                assessment.assessments = new ArrayList<Assessment>();
+              }
+              assessment.assessments.add(nestedAssessment);
+            }
+
+            if (validate)
+            {
+              assessment.validate(getEffectiveLengthFacet());
+              assessment.validate(getEffectiveMinLengthFacet());
+              assessment.validate(getEffectiveMaxLengthFacet());
+            }
+          }
+          break;
+        }
+      }
+
+      if (validate)
+      {
+        assessment.validate(getEffectiveEnumerationFacet());
+      }
+    }
+
+    return assessment;
+  }
+
+  public boolean isValidLiteral(String literal)
+  {
+    return isValidLiteral(null, literal);
+  }
+
+  public boolean isValidLiteral(Element context, String literal)
+  {
+    AssessmentImpl assessment = new AssessmentImpl(context, literal, 0);
+    assess(assessment);
+    return assessment.diagnostics == null;
+  }
+
+  public Object getValue(String literal)
+  {
+    return getValue(null, literal);
+    
+  }
+
+  public Object getValue(Element context, String literal)
+  {
+    AssessmentImpl assessment = new AssessmentImpl(context, literal, 0);
+    assess(assessment, false);
+    return assessment.value;
+  }
+
+  public String getCanonicalLiteral(String literal)
+  {
+    AssessmentImpl assessment = new AssessmentImpl(null, literal, 0);
+    assess(assessment, false);
+    return assessment.normalizedLiteral;
+  }
+
+  public String getNormalizedLiteral(String literal)
+  {
+    String result = literal;
+    XSDWhiteSpaceFacet effectiveWhiteSpaceFacet = getEffectiveWhiteSpaceFacet();
+    if (effectiveWhiteSpaceFacet != null)
+    {
+      result = effectiveWhiteSpaceFacet.getNormalizedLiteral(result);
+    }
+    return result;
+  }
+
+  public boolean equalValues(Object value1, Object value2)
+  {
+    return value1 == null ? value2 == null : value1.equals(value2);
+  }
+
+  public boolean equalLiterals(String literal1, String literal2)
+  {
+    return equalLiterals(null, literal1, null, literal2);
+  }
+
+  public boolean equalLiterals(Element context1, String literal1, Element context2, String literal2)
+  {
+    return equalValues(getValue(context1, literal1), getValue(context2, literal2));
+  }
+
+  public int compareValues(Object value1, Object value2)
+  {
+    if (XSDOrdered.FALSE_LITERAL != getOrderedFacet().getValue())
+    {
+      XSDSimpleTypeDefinition thePrimitiveTypeDefinition = getPrimitiveTypeDefinition();
+      if (thePrimitiveTypeDefinition != null)
+      {
+        XSDAnySimpleType xsdAnySimpleType = 
+          XSDTypeRegister.getTypeImplementer(thePrimitiveTypeDefinition.getName());
+        return 
+          value1 == null ?
+             value2 == null ? 
+               0 : 
+               -1 :
+             value2 == null ? 
+               1 :
+               xsdAnySimpleType.compareValues(value1, value2);
+      }
+    }
+    return 0;
+  }
+
+  public int compareLiterals(String literal1, String literal2)
+  {
+    return compareLiterals(null, literal1, null, literal2);
+  }
+
+  public int compareLiterals(Element context1, String literal1, Element context2, String literal2)
+  {
+    return compareValues(getValue(context1, literal1), getValue(context2, literal2));
+  }
+
+  @Override
+  public XSDTypeDefinition getBadTypeDerivation(XSDTypeDefinition xsdTypeDefinition, boolean extension, boolean restriction)
+  {
+    if (xsdTypeDefinition == this)
+    {
+      return null;
+    }
+    else if (!restriction || 
+               getBaseTypeDefinition() == null || 
+               getBaseTypeDefinition().getFinal().contains(XSDSimpleFinal.RESTRICTION_LITERAL))
+    {
+      return this;
+    }
+    else
+    {
+      XSDTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();
+      XSDTypeDefinition result = theBaseTypeDefinition;
+      if (theBaseTypeDefinition == xsdTypeDefinition)
+      {
+        return null;
+      }
+      else if (!XSDConstants.isURType(theBaseTypeDefinition))
+      {
+        result = theBaseTypeDefinition.getBadTypeDerivation(xsdTypeDefinition, extension, restriction);
+        if (result == null)
+        {
+          return null;
+        }
+      }
+
+      switch (getVariety().getValue())
+      {
+        case XSDVariety.LIST:
+        case XSDVariety.UNION:
+        {
+          if (XSDConstants.isURType(xsdTypeDefinition))
+          {
+            return null;
+          }
+        }
+      }
+
+      if (xsdTypeDefinition instanceof XSDSimpleTypeDefinition)
+      {
+        XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition)xsdTypeDefinition;
+        if (xsdSimpleTypeDefinition.getVariety() == XSDVariety.UNION_LITERAL)
+        {
+          for (XSDSimpleTypeDefinition memberTypeDefinition : xsdSimpleTypeDefinition.getMemberTypeDefinitions())
+          {
+            XSDTypeDefinition memberResult = getBadTypeDerivation(memberTypeDefinition, extension, restriction);
+            if (memberResult == null)
+            {
+              return null;
+            }
+          }
+        }
+      }
+      else if (XSDConstants.isAnyType(xsdTypeDefinition))
+      {
+        return null;
+      }
+
+      return result;
+    }
+  }
+
+  @Override
+  public XSDConcreteComponent cloneConcreteComponent(boolean deep, boolean shareDOM)
+  {
+    XSDSimpleTypeDefinitionImpl clonedSimpleTypeDefinition =
+      (XSDSimpleTypeDefinitionImpl)getXSDFactory().createXSDSimpleTypeDefinition();
+    clonedSimpleTypeDefinition.isReconciling = true;
+
+    XSDSimpleTypeDefinition theBaseTypeDefinition = getBaseTypeDefinition();
+
+    if (getName() != null)
+    {
+      clonedSimpleTypeDefinition.setName(getName());
+    }
+    if (isSetLexicalFinal())
+    {
+      if (!getLexicalFinal().isEmpty())
+      {
+        clonedSimpleTypeDefinition.getLexicalFinal().addAll(getLexicalFinal());
+      }
+      else
+      {
+        clonedSimpleTypeDefinition.getLexicalFinal().clear();
+      }
+    }
+
+    if (!(getContainer() instanceof XSDComplexTypeDefinition))
+    {
+      if (getItemTypeDefinition() != null && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))
+      {
+        if (!getContents().contains(getItemTypeDefinition()))
+        {
+          XSDSimpleTypeDefinition theItemTypeDefinition = getItemTypeDefinition();
+          clonedSimpleTypeDefinition.setItemTypeDefinition
+            (createUnresolvedSimpleTypeDefinition
+              (theItemTypeDefinition.getTargetNamespace(), theItemTypeDefinition.getName()));
+        }
+      }
+      else if (!getMemberTypeDefinitions().isEmpty() && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))
+      {
+        List<XSDSimpleTypeDefinition> unresolvedMembers = new ArrayList<XSDSimpleTypeDefinition>(getMemberTypeDefinitions().size());
+        for (XSDSimpleTypeDefinition memberTypeDefinition : getMemberTypeDefinitions())
+        {
+          if (getContents().contains(memberTypeDefinition))
+          {
+            break;
+          }
+          else
+          {
+            unresolvedMembers.add
+              (createUnresolvedSimpleTypeDefinition
+                (memberTypeDefinition.getTargetNamespace(), memberTypeDefinition.getName()));
+          }
+        }
+        if (!unresolvedMembers.isEmpty())
+        {
+          clonedSimpleTypeDefinition.getMemberTypeDefinitions().addAll(unresolvedMembers);
+        }
+      }
+      else
+      {
+        if (getBaseTypeDefinition() != null && !getContents().contains(getBaseTypeDefinition()))
+        {
+          clonedSimpleTypeDefinition.setBaseTypeDefinition
+            (createUnresolvedSimpleTypeDefinition
+              (theBaseTypeDefinition.getTargetNamespace(), theBaseTypeDefinition.getName()));
+        }
+      }
+    }
+
+    if (deep)
+    {
+      if (getAnnotation() != null)
+      {
+        clonedSimpleTypeDefinition.setAnnotation((XSDAnnotation)getAnnotation().cloneConcreteComponent(deep, shareDOM));
+      }
+      if (getDerivationAnnotation() != null)
+      {
+        clonedSimpleTypeDefinition.setDerivationAnnotation((XSDAnnotation)getDerivationAnnotation().cloneConcreteComponent(deep, shareDOM));
+      }
+      if (!getContents().isEmpty())
+      {
+        clonedSimpleTypeDefinition.getContents().addAll(cloneConcreteComponents(getContents(), deep, shareDOM));
+        if (getItemTypeDefinition() != null && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))
+        {
+          clonedSimpleTypeDefinition.setItemTypeDefinition(clonedSimpleTypeDefinition.getContents().get(0));
+        }
+        else if (!getMemberTypeDefinitions().isEmpty() && (theBaseTypeDefinition == null || XSDConstants.isURType(theBaseTypeDefinition)))
+        {
+          clonedSimpleTypeDefinition.getMemberTypeDefinitions().addAll(clonedSimpleTypeDefinition.getContents());
+        }
+        else
+        {
+          clonedSimpleTypeDefinition.setBaseTypeDefinition(clonedSimpleTypeDefinition.getContents().get(0));
+        }
+      }
+      if (!getFacetContents().isEmpty())
+      {
+        clonedSimpleTypeDefinition.getFacetContents().addAll(cloneConcreteComponents(getFacetContents(), deep, shareDOM));
+      }
+    }
+
+    if (shareDOM && getElement() != null)
+    {
+      clonedSimpleTypeDefinition.setElement(getElement());
+    }
+
+    clonedSimpleTypeDefinition.isReconciling = shareDOM;
+    return clonedSimpleTypeDefinition;
+  }
+}