/**
 * Copyright (c) 2002-2004 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.provider;


import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.provider.ChangeNotifier;
import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.Disposable;
import org.eclipse.emf.edit.provider.IChangeNotifier;
import org.eclipse.emf.edit.provider.IDisposable;
import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
import org.eclipse.emf.edit.provider.ITableItemLabelProvider;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;

import org.eclipse.xsd.util.XSDAdapterFactory;


/**
 * This is the factory that is used to provide the interfaces needed to support JFace viewers.
 * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged fireNotifyChanged}.
 * The adapters also support property sheets.
 * Note that most of the adapters are shared among multiple instances.
 */
public class XSDItemProviderAdapterFactory 
  extends 
    XSDAdapterFactory 
  implements 
    ComposeableAdapterFactory, 
    IChangeNotifier,
    IDisposable
{
  /**
   *  This keeps track of the root adapter factory that delegates to this adapter factory.
   */
  protected ComposedAdapterFactory parentAdapterFactory;

  /**
   * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
   */
  protected IChangeNotifier changeNotifier = new ChangeNotifier();

  /**
   * This is used to implement {@link org.eclipse.emf.edit.provider.IDisposable}.
   */
  protected Disposable disposable = new Disposable();

  /**
   * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
   */
  protected Collection<Object> supportedTypes = new ArrayList<Object>();

  /**
   * This constructs an instance.
   */
  public XSDItemProviderAdapterFactory()
  {
    supportedTypes.add(IStructuredItemContentProvider.class);
    supportedTypes.add(ITreeItemContentProvider.class);
    supportedTypes.add(IItemPropertySource.class);
    supportedTypes.add(IEditingDomainItemProvider.class);
    supportedTypes.add(IItemLabelProvider.class);
    supportedTypes.add(ITableItemLabelProvider.class);
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDAnnotation} instances.
   */
  protected XSDAnnotationItemProvider xsdAnnotationItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDAnnotation}.
   */
  @Override
  public Adapter createXSDAnnotationAdapter()
  {
    if (xsdAnnotationItemProvider == null)
    {
      xsdAnnotationItemProvider = new XSDAnnotationItemProvider(this);
    }

    return xsdAnnotationItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDConcreteComponent} instances.
   */
  protected XSDConcreteComponentItemProvider xsdConcreteComponentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDConcreteComponent}.
   */
  @Override
  public Adapter createXSDConcreteComponentAdapter()
  {
    if (xsdConcreteComponentItemProvider == null)
    {
      xsdConcreteComponentItemProvider = new XSDConcreteComponentItemProvider(this);
    }

    return xsdConcreteComponentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDComponent} instances.
   */
  protected XSDComponentItemProvider xsdComponentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDComponent}.
   */
  @Override
  public Adapter createXSDComponentAdapter()
  {
    if (xsdComponentItemProvider == null)
    {
      xsdComponentItemProvider = new XSDComponentItemProvider(this);
    }

    return xsdComponentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDAttributeUse} instances.
   */
  protected XSDAttributeUseItemProvider xsdAttributeUseItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDAttributeUse}.
   */
  @Override
  public Adapter createXSDAttributeUseAdapter()
  {
    if (xsdAttributeUseItemProvider == null)
    {
      xsdAttributeUseItemProvider = new XSDAttributeUseItemProvider(this);
    }

    return xsdAttributeUseItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDFeature} instances.
   */
  protected XSDFeatureItemProvider xsdFeatureItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDFeature}.
   */
  @Override
  public Adapter createXSDFeatureAdapter()
  {
    if (xsdFeatureItemProvider == null)
    {
      xsdFeatureItemProvider = new XSDFeatureItemProvider(this);
    }

    return xsdFeatureItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDElementDeclaration} instances.
   */
  protected XSDElementDeclarationItemProvider xsdElementDeclarationItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDElementDeclaration}.
   */
  @Override
  public Adapter createXSDElementDeclarationAdapter()
  {
    if (xsdElementDeclarationItemProvider == null)
    {
      xsdElementDeclarationItemProvider = new XSDElementDeclarationItemProvider(this);
    }

    return xsdElementDeclarationItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDSchema} instances.
   */
  protected XSDSchemaItemProvider xsdSchemaItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDSchema}.
   */
  @Override
  public Adapter createXSDSchemaAdapter()
  {
    if (xsdSchemaItemProvider == null)
    {
      xsdSchemaItemProvider = new XSDSchemaItemProvider(this);
    }

    return xsdSchemaItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDComplexTypeDefinition} instances.
   */
  protected XSDComplexTypeDefinitionItemProvider xsdComplexTypeDefinitionItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDComplexTypeDefinition}.
   */
  @Override
  public Adapter createXSDComplexTypeDefinitionAdapter()
  {
    if (xsdComplexTypeDefinitionItemProvider == null)
    {
      xsdComplexTypeDefinitionItemProvider = new XSDComplexTypeDefinitionItemProvider(this);
    }

    return xsdComplexTypeDefinitionItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDScope} instances.
   */
  protected XSDScopeItemProvider xsdScopeItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDScope}.
   */
  @Override
  public Adapter createXSDScopeAdapter()
  {
    if (xsdScopeItemProvider == null)
    {
      xsdScopeItemProvider = new XSDScopeItemProvider(this);
    }

    return xsdScopeItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDTypeDefinition} instances.
   */
  protected XSDTypeDefinitionItemProvider xsdTypeDefinitionItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDTypeDefinition}.
   */
  @Override
  public Adapter createXSDTypeDefinitionAdapter()
  {
    if (xsdTypeDefinitionItemProvider == null)
    {
      xsdTypeDefinitionItemProvider = new XSDTypeDefinitionItemProvider(this);
    }

    return xsdTypeDefinitionItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDSimpleTypeDefinition} instances.
   */
  protected XSDSimpleTypeDefinitionItemProvider xsdSimpleTypeDefinitionItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDSimpleTypeDefinition}.
   */
  @Override
  public Adapter createXSDSimpleTypeDefinitionAdapter()
  {
    if (xsdSimpleTypeDefinitionItemProvider == null)
    {
      xsdSimpleTypeDefinitionItemProvider = new XSDSimpleTypeDefinitionItemProvider(this);
    }

    return xsdSimpleTypeDefinitionItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDComplexTypeContent} instances.
   */
  protected XSDComplexTypeContentItemProvider xsdComplexTypeContentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDComplexTypeContent}.
   */
  @Override
  public Adapter createXSDComplexTypeContentAdapter()
  {
    if (xsdComplexTypeContentItemProvider == null)
    {
      xsdComplexTypeContentItemProvider = new XSDComplexTypeContentItemProvider(this);
    }

    return xsdComplexTypeContentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDParticle} instances.
   */
  protected XSDParticleItemProvider xsdParticleItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDParticle}.
   */
  @Override
  public Adapter createXSDParticleAdapter()
  {
    if (xsdParticleItemProvider == null)
    {
      xsdParticleItemProvider = new XSDParticleItemProvider(this);
    }

    return xsdParticleItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDModelGroup} instances.
   */
  protected XSDModelGroupItemProvider xsdModelGroupItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDModelGroup}.
   */
  @Override
  public Adapter createXSDModelGroupAdapter()
  {
    if (xsdModelGroupItemProvider == null)
    {
      xsdModelGroupItemProvider = new XSDModelGroupItemProvider(this);
    }

    return xsdModelGroupItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDTerm} instances.
   */
  protected XSDTermItemProvider xsdTermItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDTerm}.
   */
  @Override
  public Adapter createXSDTermAdapter()
  {
    if (xsdTermItemProvider == null)
    {
      xsdTermItemProvider = new XSDTermItemProvider(this);
    }

    return xsdTermItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDParticleContent} instances.
   */
  protected XSDParticleContentItemProvider xsdParticleContentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDParticleContent}.
   */
  @Override
  public Adapter createXSDParticleContentAdapter()
  {
    if (xsdParticleContentItemProvider == null)
    {
      xsdParticleContentItemProvider = new XSDParticleContentItemProvider(this);
    }

    return xsdParticleContentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDModelGroupDefinition} instances.
   */
  protected XSDModelGroupDefinitionItemProvider xsdModelGroupDefinitionItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDModelGroupDefinition}.
   */
  @Override
  public Adapter createXSDModelGroupDefinitionAdapter()
  {
    if (xsdModelGroupDefinitionItemProvider == null)
    {
      xsdModelGroupDefinitionItemProvider = new XSDModelGroupDefinitionItemProvider(this);
    }

    return xsdModelGroupDefinitionItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDRedefineContent} instances.
   */
  protected XSDRedefineContentItemProvider xsdRedefineContentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDRedefineContent}.
   */
  @Override
  public Adapter createXSDRedefineContentAdapter()
  {
    if (xsdRedefineContentItemProvider == null)
    {
      xsdRedefineContentItemProvider = new XSDRedefineContentItemProvider(this);
    }

    return xsdRedefineContentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDRedefinableComponent} instances.
   */
  protected XSDRedefinableComponentItemProvider xsdRedefinableComponentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDRedefinableComponent}.
   */
  @Override
  public Adapter createXSDRedefinableComponentAdapter()
  {
    if (xsdRedefinableComponentItemProvider == null)
    {
      xsdRedefinableComponentItemProvider = new XSDRedefinableComponentItemProvider(this);
    }

    return xsdRedefinableComponentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDAttributeGroupDefinition} instances.
   */
  protected XSDAttributeGroupDefinitionItemProvider xsdAttributeGroupDefinitionItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDAttributeGroupDefinition}.
   */
  @Override
  public Adapter createXSDAttributeGroupDefinitionAdapter()
  {
    if (xsdAttributeGroupDefinitionItemProvider == null)
    {
      xsdAttributeGroupDefinitionItemProvider = new XSDAttributeGroupDefinitionItemProvider(this);
    }

    return xsdAttributeGroupDefinitionItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDAttributeGroupContent} instances.
   */
  protected XSDAttributeGroupContentItemProvider xsdAttributeGroupContentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDAttributeGroupContent}.
   */
  @Override
  public Adapter createXSDAttributeGroupContentAdapter()
  {
    if (xsdAttributeGroupContentItemProvider == null)
    {
      xsdAttributeGroupContentItemProvider = new XSDAttributeGroupContentItemProvider(this);
    }

    return xsdAttributeGroupContentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDWildcard} instances.
   */
  protected XSDWildcardItemProvider xsdWildcardItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDWildcard}.
   */
  @Override
  public Adapter createXSDWildcardAdapter()
  {
    if (xsdWildcardItemProvider == null)
    {
      xsdWildcardItemProvider = new XSDWildcardItemProvider(this);
    }

    return xsdWildcardItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDNamedComponent} instances.
   */
  protected XSDNamedComponentItemProvider xsdNamedComponentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDNamedComponent}.
   */
  @Override
  public Adapter createXSDNamedComponentAdapter()
  {
    if (xsdNamedComponentItemProvider == null)
    {
      xsdNamedComponentItemProvider = new XSDNamedComponentItemProvider(this);
    }

    return xsdNamedComponentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDIdentityConstraintDefinition} instances.
   */
  protected XSDIdentityConstraintDefinitionItemProvider xsdIdentityConstraintDefinitionItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDIdentityConstraintDefinition}.
   */
  @Override
  public Adapter createXSDIdentityConstraintDefinitionAdapter()
  {
    if (xsdIdentityConstraintDefinitionItemProvider == null)
    {
      xsdIdentityConstraintDefinitionItemProvider = new XSDIdentityConstraintDefinitionItemProvider(this);
    }

    return xsdIdentityConstraintDefinitionItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDXPathDefinition} instances.
   */
  protected XSDXPathDefinitionItemProvider xsdxPathDefinitionItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDXPathDefinition}.
   */
  @Override
  public Adapter createXSDXPathDefinitionAdapter()
  {
    if (xsdxPathDefinitionItemProvider == null)
    {
      xsdxPathDefinitionItemProvider = new XSDXPathDefinitionItemProvider(this);
    }

    return xsdxPathDefinitionItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDNotationDeclaration} instances.
   */
  protected XSDNotationDeclarationItemProvider xsdNotationDeclarationItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDNotationDeclaration}.
   */
  @Override
  public Adapter createXSDNotationDeclarationAdapter()
  {
    if (xsdNotationDeclarationItemProvider == null)
    {
      xsdNotationDeclarationItemProvider = new XSDNotationDeclarationItemProvider(this);
    }

    return xsdNotationDeclarationItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDSchemaContent} instances.
   */
  protected XSDSchemaContentItemProvider xsdSchemaContentItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDSchemaContent}.
   */
  @Override
  public Adapter createXSDSchemaContentAdapter()
  {
    if (xsdSchemaContentItemProvider == null)
    {
      xsdSchemaContentItemProvider = new XSDSchemaContentItemProvider(this);
    }

    return xsdSchemaContentItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDAttributeDeclaration} instances.
   */
  protected XSDAttributeDeclarationItemProvider xsdAttributeDeclarationItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDAttributeDeclaration}.
   */
  @Override
  public Adapter createXSDAttributeDeclarationAdapter()
  {
    if (xsdAttributeDeclarationItemProvider == null)
    {
      xsdAttributeDeclarationItemProvider = new XSDAttributeDeclarationItemProvider(this);
    }

    return xsdAttributeDeclarationItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDSchemaDirective} instances.
   */
  protected XSDSchemaDirectiveItemProvider xsdSchemaDirectiveItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDSchemaDirective}.
   */
  @Override
  public Adapter createXSDSchemaDirectiveAdapter()
  {
    if (xsdSchemaDirectiveItemProvider == null)
    {
      xsdSchemaDirectiveItemProvider = new XSDSchemaDirectiveItemProvider(this);
    }

    return xsdSchemaDirectiveItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDImport} instances.
   */
  protected XSDImportItemProvider xsdImportItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDImport}.
   */
  @Override
  public Adapter createXSDImportAdapter()
  {
    if (xsdImportItemProvider == null)
    {
      xsdImportItemProvider = new XSDImportItemProvider(this);
    }

    return xsdImportItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDSchemaCompositor} instances.
   */
  protected XSDSchemaCompositorItemProvider xsdSchemaCompositorItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDSchemaCompositor}.
   */
  @Override
  public Adapter createXSDSchemaCompositorAdapter()
  {
    if (xsdSchemaCompositorItemProvider == null)
    {
      xsdSchemaCompositorItemProvider = new XSDSchemaCompositorItemProvider(this);
    }

    return xsdSchemaCompositorItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDRedefine} instances.
   */
  protected XSDRedefineItemProvider xsdRedefineItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDRedefine}.
   */
  @Override
  public Adapter createXSDRedefineAdapter()
  {
    if (xsdRedefineItemProvider == null)
    {
      xsdRedefineItemProvider = new XSDRedefineItemProvider(this);
    }

    return xsdRedefineItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDInclude} instances.
   */
  protected XSDIncludeItemProvider xsdIncludeItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDInclude}.
   */
  @Override
  public Adapter createXSDIncludeAdapter()
  {
    if (xsdIncludeItemProvider == null)
    {
      xsdIncludeItemProvider = new XSDIncludeItemProvider(this);
    }

    return xsdIncludeItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDFacet} instances.
   */
  protected XSDFacetItemProvider xsdFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDFacet}.
   */
  @Override
  public Adapter createXSDFacetAdapter()
  {
    if (xsdFacetItemProvider == null)
    {
      xsdFacetItemProvider = new XSDFacetItemProvider(this);
    }

    return xsdFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDConstrainingFacet} instances.
   */
  protected XSDConstrainingFacetItemProvider xsdConstrainingFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDConstrainingFacet}.
   */
  @Override
  public Adapter createXSDConstrainingFacetAdapter()
  {
    if (xsdConstrainingFacetItemProvider == null)
    {
      xsdConstrainingFacetItemProvider = new XSDConstrainingFacetItemProvider(this);
    }

    return xsdConstrainingFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDFixedFacet} instances.
   */
  protected XSDFixedFacetItemProvider xsdFixedFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDFixedFacet}.
   */
  @Override
  public Adapter createXSDFixedFacetAdapter()
  {
    if (xsdFixedFacetItemProvider == null)
    {
      xsdFixedFacetItemProvider = new XSDFixedFacetItemProvider(this);
    }

    return xsdFixedFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDFractionDigitsFacet} instances.
   */
  protected XSDFractionDigitsFacetItemProvider xsdFractionDigitsFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDFractionDigitsFacet}.
   */
  @Override
  public Adapter createXSDFractionDigitsFacetAdapter()
  {
    if (xsdFractionDigitsFacetItemProvider == null)
    {
      xsdFractionDigitsFacetItemProvider = new XSDFractionDigitsFacetItemProvider(this);
    }

    return xsdFractionDigitsFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDLengthFacet} instances.
   */
  protected XSDLengthFacetItemProvider xsdLengthFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDLengthFacet}.
   */
  @Override
  public Adapter createXSDLengthFacetAdapter()
  {
    if (xsdLengthFacetItemProvider == null)
    {
      xsdLengthFacetItemProvider = new XSDLengthFacetItemProvider(this);
    }

    return xsdLengthFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDMaxFacet} instances.
   */
  protected XSDMaxFacetItemProvider xsdMaxFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDMaxFacet}.
   */
  @Override
  public Adapter createXSDMaxFacetAdapter()
  {
    if (xsdMaxFacetItemProvider == null)
    {
      xsdMaxFacetItemProvider = new XSDMaxFacetItemProvider(this);
    }

    return xsdMaxFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDMaxExclusiveFacet} instances.
   */
  protected XSDMaxExclusiveFacetItemProvider xsdMaxExclusiveFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDMaxExclusiveFacet}.
   */
  @Override
  public Adapter createXSDMaxExclusiveFacetAdapter()
  {
    if (xsdMaxExclusiveFacetItemProvider == null)
    {
      xsdMaxExclusiveFacetItemProvider = new XSDMaxExclusiveFacetItemProvider(this);
    }

    return xsdMaxExclusiveFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDEnumerationFacet} instances.
   */
  protected XSDEnumerationFacetItemProvider xsdEnumerationFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDEnumerationFacet}.
   */
  @Override
  public Adapter createXSDEnumerationFacetAdapter()
  {
    if (xsdEnumerationFacetItemProvider == null)
    {
      xsdEnumerationFacetItemProvider = new XSDEnumerationFacetItemProvider(this);
    }

    return xsdEnumerationFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDRepeatableFacet} instances.
   */
  protected XSDRepeatableFacetItemProvider xsdRepeatableFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDRepeatableFacet}.
   */
  @Override
  public Adapter createXSDRepeatableFacetAdapter()
  {
    if (xsdRepeatableFacetItemProvider == null)
    {
      xsdRepeatableFacetItemProvider = new XSDRepeatableFacetItemProvider(this);
    }

    return xsdRepeatableFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDPatternFacet} instances.
   */
  protected XSDPatternFacetItemProvider xsdPatternFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDPatternFacet}.
   */
  @Override
  public Adapter createXSDPatternFacetAdapter()
  {
    if (xsdPatternFacetItemProvider == null)
    {
      xsdPatternFacetItemProvider = new XSDPatternFacetItemProvider(this);
    }

    return xsdPatternFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDMinFacet} instances.
   */
  protected XSDMinFacetItemProvider xsdMinFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDMinFacet}.
   */
  @Override
  public Adapter createXSDMinFacetAdapter()
  {
    if (xsdMinFacetItemProvider == null)
    {
      xsdMinFacetItemProvider = new XSDMinFacetItemProvider(this);
    }

    return xsdMinFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDMinExclusiveFacet} instances.
   */
  protected XSDMinExclusiveFacetItemProvider xsdMinExclusiveFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDMinExclusiveFacet}.
   */
  @Override
  public Adapter createXSDMinExclusiveFacetAdapter()
  {
    if (xsdMinExclusiveFacetItemProvider == null)
    {
      xsdMinExclusiveFacetItemProvider = new XSDMinExclusiveFacetItemProvider(this);
    }

    return xsdMinExclusiveFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDMinInclusiveFacet} instances.
   */
  protected XSDMinInclusiveFacetItemProvider xsdMinInclusiveFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDMinInclusiveFacet}.
   */
  @Override
  public Adapter createXSDMinInclusiveFacetAdapter()
  {
    if (xsdMinInclusiveFacetItemProvider == null)
    {
      xsdMinInclusiveFacetItemProvider = new XSDMinInclusiveFacetItemProvider(this);
    }

    return xsdMinInclusiveFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDMaxInclusiveFacet} instances.
   */
  protected XSDMaxInclusiveFacetItemProvider xsdMaxInclusiveFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDMaxInclusiveFacet}.
   */
  @Override
  public Adapter createXSDMaxInclusiveFacetAdapter()
  {
    if (xsdMaxInclusiveFacetItemProvider == null)
    {
      xsdMaxInclusiveFacetItemProvider = new XSDMaxInclusiveFacetItemProvider(this);
    }

    return xsdMaxInclusiveFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDMaxLengthFacet} instances.
   */
  protected XSDMaxLengthFacetItemProvider xsdMaxLengthFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDMaxLengthFacet}.
   */
  @Override
  public Adapter createXSDMaxLengthFacetAdapter()
  {
    if (xsdMaxLengthFacetItemProvider == null)
    {
      xsdMaxLengthFacetItemProvider = new XSDMaxLengthFacetItemProvider(this);
    }

    return xsdMaxLengthFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDMinLengthFacet} instances.
   */
  protected XSDMinLengthFacetItemProvider xsdMinLengthFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDMinLengthFacet}.
   */
  @Override
  public Adapter createXSDMinLengthFacetAdapter()
  {
    if (xsdMinLengthFacetItemProvider == null)
    {
      xsdMinLengthFacetItemProvider = new XSDMinLengthFacetItemProvider(this);
    }

    return xsdMinLengthFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDTotalDigitsFacet} instances.
   */
  protected XSDTotalDigitsFacetItemProvider xsdTotalDigitsFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDTotalDigitsFacet}.
   */
  @Override
  public Adapter createXSDTotalDigitsFacetAdapter()
  {
    if (xsdTotalDigitsFacetItemProvider == null)
    {
      xsdTotalDigitsFacetItemProvider = new XSDTotalDigitsFacetItemProvider(this);
    }

    return xsdTotalDigitsFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDWhiteSpaceFacet} instances.
   */
  protected XSDWhiteSpaceFacetItemProvider xsdWhiteSpaceFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDWhiteSpaceFacet}.
   */
  @Override
  public Adapter createXSDWhiteSpaceFacetAdapter()
  {
    if (xsdWhiteSpaceFacetItemProvider == null)
    {
      xsdWhiteSpaceFacetItemProvider = new XSDWhiteSpaceFacetItemProvider(this);
    }

    return xsdWhiteSpaceFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDFundamentalFacet} instances.
   */
  protected XSDFundamentalFacetItemProvider xsdFundamentalFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDFundamentalFacet}.
   */
  @Override
  public Adapter createXSDFundamentalFacetAdapter()
  {
    if (xsdFundamentalFacetItemProvider == null)
    {
      xsdFundamentalFacetItemProvider = new XSDFundamentalFacetItemProvider(this);
    }

    return xsdFundamentalFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDBoundedFacet} instances.
   */
  protected XSDBoundedFacetItemProvider xsdBoundedFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDBoundedFacet}.
   */
  @Override
  public Adapter createXSDBoundedFacetAdapter()
  {
    if (xsdBoundedFacetItemProvider == null)
    {
      xsdBoundedFacetItemProvider = new XSDBoundedFacetItemProvider(this);
    }

    return xsdBoundedFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDCardinalityFacet} instances.
   */
  protected XSDCardinalityFacetItemProvider xsdCardinalityFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDCardinalityFacet}.
   */
  @Override
  public Adapter createXSDCardinalityFacetAdapter()
  {
    if (xsdCardinalityFacetItemProvider == null)
    {
      xsdCardinalityFacetItemProvider = new XSDCardinalityFacetItemProvider(this);
    }

    return xsdCardinalityFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDNumericFacet} instances.
   */
  protected XSDNumericFacetItemProvider xsdNumericFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDNumericFacet}.
   */
  @Override
  public Adapter createXSDNumericFacetAdapter()
  {
    if (xsdNumericFacetItemProvider == null)
    {
      xsdNumericFacetItemProvider = new XSDNumericFacetItemProvider(this);
    }

    return xsdNumericFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDOrderedFacet} instances.
   */
  protected XSDOrderedFacetItemProvider xsdOrderedFacetItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDOrderedFacet}.
   */
  @Override
  public Adapter createXSDOrderedFacetAdapter()
  {
    if (xsdOrderedFacetItemProvider == null)
    {
      xsdOrderedFacetItemProvider = new XSDOrderedFacetItemProvider(this);
    }

    return xsdOrderedFacetItemProvider;
  }

  /**
   * This keeps track of the one adapter used for all {@link org.eclipse.xsd.XSDDiagnostic} instances.
   */
  protected XSDDiagnosticItemProvider xsdDiagnosticItemProvider;

  /**
   * This creates an adapter for a {@link org.eclipse.xsd.XSDDiagnostic}.
   */
  @Override
  public Adapter createXSDDiagnosticAdapter()
  {
    if (xsdDiagnosticItemProvider == null)
    {
      xsdDiagnosticItemProvider = new XSDDiagnosticItemProvider(this);
    }

    return xsdDiagnosticItemProvider;
  }
  /**
   * This returns the root adapter factory that contains this factory.
   */
  public ComposeableAdapterFactory getRootAdapterFactory()
  {
    return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
  }

  /**
   * This sets the composed adapter factory that contains this factory.
   */
  public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory)
  {
    this.parentAdapterFactory = parentAdapterFactory;
  }

  @Override
  public boolean isFactoryForType(Object type)
  {
    return super.isFactoryForType(type) || supportedTypes.contains(type);
  }

  /**
   * This implementation substitutes the factory itself as the key for the adapter.
   */
  @Override
  public Adapter adapt(Notifier notifier, Object type)
  {
    return super.adapt(notifier, this);
  }

  @Override
  public Object adapt(Object object, Object type)
  {
    // This is a kludge to deal with enumerators, which crash the doSwitch.
    //
    if (object instanceof EObject && ((EObject)object).eClass() == null)
    {
      return null;
    }

    if (isFactoryForType(type))
    {
      Object adapter = super.adapt(object, type);
      if (!(type instanceof Class<?>) || (((Class<?>)type).isInstance(adapter)))
      {
        return adapter;
      }
    }

    return null;
  }

  /**
   * This adds a listener.
   */
  public void addListener(INotifyChangedListener notifyChangedListener)
  {
    changeNotifier.addListener(notifyChangedListener);
  }

  /**
   * This removes a listener.
   */
  public void removeListener(INotifyChangedListener notifyChangedListener)
  {
    changeNotifier.removeListener(notifyChangedListener);
  }

  /**
   * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
   */
  public void fireNotifyChanged(Notification notification)
  {
    changeNotifier.fireNotifyChanged(notification);

    if (parentAdapterFactory != null)
    {
      parentAdapterFactory.fireNotifyChanged(notification);
    }
  }

  @Override
  protected void associate(Adapter adapter, Notifier target)
  {
    super.associate(adapter, target);
    if (adapter != null)
    {
      disposable.add(adapter);
    }
  }

  public void dispose()
  {
    disposable.dispose();
  }
}
