/**
 * Copyright (c) 2002-2010 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 * 
 * Contributors: 
 *   IBM - Initial API and implementation
 */
package org.eclipse.emf.codegen.ecore.genmodel;


import java.util.List;
import java.util.Map;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EPackage;


/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Gen Package</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPrefix <em>Prefix</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getBasePackage <em>Base Package</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getResource <em>Resource</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isDisposableProviderFactory <em>Disposable Provider Factory</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isAdapterFactory <em>Adapter Factory</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isLoadInitialization <em>Load Initialization</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getInterfacePackageSuffix <em>Interface Package Suffix</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getMetaDataPackageSuffix <em>Meta Data Package Suffix</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getClassPackageSuffix <em>Class Package Suffix</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getUtilityPackageSuffix <em>Utility Package Suffix</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getProviderPackageSuffix <em>Provider Package Suffix</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPresentationPackageSuffix <em>Presentation Package Suffix</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getTestsPackageSuffix <em>Tests Package Suffix</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isGenerateExampleClass <em>Generate Example Class</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isLiteralsInterface <em>Literals Interface</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isDataTypeConverters <em>Data Type Converters</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isMultipleEditorPages <em>Multiple Editor Pages</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isGenerateModelWizard <em>Generate Model Wizard</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isExtensibleProviderFactory <em>Extensible Provider Factory</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isChildCreationExtenders <em>Child Creation Extenders</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getContentTypeIdentifier <em>Content Type Identifier</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getFileExtensions <em>File Extensions</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getEcorePackage <em>Ecore Package</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getGenModel <em>Gen Model</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getGenEnums <em>Gen Enums</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getGenDataTypes <em>Gen Data Types</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getGenClasses <em>Gen Classes</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getNestedGenPackages <em>Nested Gen Packages</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getGenClassifiers <em>Gen Classifiers</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPublicationLocation <em>Publication Location</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getDocumentation <em>Documentation</em>}</li>
 *   <li>{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getLoadInitializationFileExtension <em>Load Initialization File Extension</em>}</li>
 * </ul>
 *
 * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage()
 * @model
 * @generated
 */
public interface GenPackage extends GenBase
{
  /**
   * Returns the value of the '<em><b>Prefix</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Prefix</em>' attribute.
   * @see #setPrefix(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_Prefix()
   * @model
   * @generated
   */
  String getPrefix();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPrefix <em>Prefix</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Prefix</em>' attribute.
   * @see #getPrefix()
   * @generated
   */
  void setPrefix(String value);

  /**
   * Returns the value of the '<em><b>Base Package</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Base Package</em>' attribute.
   * @see #setBasePackage(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_BasePackage()
   * @model
   * @generated
   */
  String getBasePackage();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getBasePackage <em>Base Package</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Base Package</em>' attribute.
   * @see #getBasePackage()
   * @generated
   */
  void setBasePackage(String value);

  /**
   * Returns the value of the '<em><b>Resource</b></em>' attribute.
   * The literals are from the enumeration {@link org.eclipse.emf.codegen.ecore.genmodel.GenResourceKind}.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Resource</em>' attribute.
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenResourceKind
   * @see #setResource(GenResourceKind)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_Resource()
   * @model
   * @generated
   */
  GenResourceKind getResource();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getResource <em>Resource</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Resource</em>' attribute.
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenResourceKind
   * @see #getResource()
   * @generated
   */
  void setResource(GenResourceKind value);

  /**
   * Returns the value of the '<em><b>Disposable Provider Factory</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Disposable Provider Factory</em>' attribute.
   * @see #setDisposableProviderFactory(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_DisposableProviderFactory()
   * @model
   * @generated
   */
  boolean isDisposableProviderFactory();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isDisposableProviderFactory <em>Disposable Provider Factory</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Disposable Provider Factory</em>' attribute.
   * @see #isDisposableProviderFactory()
   * @generated
   */
  void setDisposableProviderFactory(boolean value);

  /**
   * Returns the value of the '<em><b>Adapter Factory</b></em>' attribute.
   * The default value is <code>"true"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Adapter Factory</em>' attribute.
   * @see #setAdapterFactory(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_AdapterFactory()
   * @model default="true"
   * @generated
   */
  boolean isAdapterFactory();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isAdapterFactory <em>Adapter Factory</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Adapter Factory</em>' attribute.
   * @see #isAdapterFactory()
   * @generated
   */
  void setAdapterFactory(boolean value);

  /**
   * Returns the value of the '<em><b>Load Initialization</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * If true, the package meta-data will be initialized by loading it from a resource, instead of building it up programmatically.
   * This should be used for large packasges, for which the generated code for building it would excede the 64k method limit.
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Load Initialization</em>' attribute.
   * @see #setLoadInitialization(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_LoadInitialization()
   * @model
   * @generated
   */
  boolean isLoadInitialization();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isLoadInitialization <em>Load Initialization</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Load Initialization</em>' attribute.
   * @see #isLoadInitialization()
   * @generated
   */
  void setLoadInitialization(boolean value);

  /**
   * Returns the value of the '<em><b>Interface Package Suffix</b></em>' attribute.
   * The default value is <code>""</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Interface Package Suffix</em>' attribute.
   * @see #setInterfacePackageSuffix(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_InterfacePackageSuffix()
   * @model default=""
   * @generated
   */
  String getInterfacePackageSuffix();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getInterfacePackageSuffix <em>Interface Package Suffix</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Interface Package Suffix</em>' attribute.
   * @see #getInterfacePackageSuffix()
   * @generated
   */
  void setInterfacePackageSuffix(String value);

  /**
   * Returns the value of the '<em><b>Meta Data Package Suffix</b></em>' attribute.
   * The default value is <code>""</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Meta Data Package Suffix</em>' attribute.
   * @see #setMetaDataPackageSuffix(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_MetaDataPackageSuffix()
   * @model default=""
   * @generated
   */
  String getMetaDataPackageSuffix();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getMetaDataPackageSuffix <em>Meta Data Package Suffix</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Meta Data Package Suffix</em>' attribute.
   * @see #getMetaDataPackageSuffix()
   * @generated
   */
  void setMetaDataPackageSuffix(String value);

  /**
   * Returns the value of the '<em><b>Class Package Suffix</b></em>' attribute.
   * The default value is <code>"impl"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Class Package Suffix</em>' attribute.
   * @see #setClassPackageSuffix(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_ClassPackageSuffix()
   * @model default="impl"
   * @generated
   */
  String getClassPackageSuffix();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getClassPackageSuffix <em>Class Package Suffix</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Class Package Suffix</em>' attribute.
   * @see #getClassPackageSuffix()
   * @generated
   */
  void setClassPackageSuffix(String value);

  /**
   * Returns the value of the '<em><b>Utility Package Suffix</b></em>' attribute.
   * The default value is <code>"util"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Utility Package Suffix</em>' attribute.
   * @see #setUtilityPackageSuffix(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_UtilityPackageSuffix()
   * @model default="util"
   * @generated
   */
  String getUtilityPackageSuffix();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getUtilityPackageSuffix <em>Utility Package Suffix</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Utility Package Suffix</em>' attribute.
   * @see #getUtilityPackageSuffix()
   * @generated
   */
  void setUtilityPackageSuffix(String value);

  /**
   * Returns the value of the '<em><b>Provider Package Suffix</b></em>' attribute.
   * The default value is <code>"provider"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Provider Package Suffix</em>' attribute.
   * @see #setProviderPackageSuffix(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_ProviderPackageSuffix()
   * @model default="provider"
   * @generated
   */
  String getProviderPackageSuffix();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getProviderPackageSuffix <em>Provider Package Suffix</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Provider Package Suffix</em>' attribute.
   * @see #getProviderPackageSuffix()
   * @generated
   */
  void setProviderPackageSuffix(String value);

  /**
   * Returns the value of the '<em><b>Presentation Package Suffix</b></em>' attribute.
   * The default value is <code>"presentation"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Presentation Package Suffix</em>' attribute.
   * @see #setPresentationPackageSuffix(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_PresentationPackageSuffix()
   * @model default="presentation"
   * @generated
   */
  String getPresentationPackageSuffix();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPresentationPackageSuffix <em>Presentation Package Suffix</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Presentation Package Suffix</em>' attribute.
   * @see #getPresentationPackageSuffix()
   * @generated
   */
  void setPresentationPackageSuffix(String value);

  /**
   * Returns the value of the '<em><b>Tests Package Suffix</b></em>' attribute.
   * The default value is <code>"tests"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Tests Package Suffix</em>' attribute.
   * @see #setTestsPackageSuffix(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_TestsPackageSuffix()
   * @model default="tests"
   * @generated
   */
  String getTestsPackageSuffix();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getTestsPackageSuffix <em>Tests Package Suffix</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Tests Package Suffix</em>' attribute.
   * @see #getTestsPackageSuffix()
   * @generated
   */
  void setTestsPackageSuffix(String value);

  /**
   * Returns the value of the '<em><b>Generate Example Class</b></em>' attribute.
   * The default value is <code>"true"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Generate Example Class</em>' attribute.
   * @see #setGenerateExampleClass(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_GenerateExampleClass()
   * @model default="true"
   * @generated
   */
  boolean isGenerateExampleClass();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isGenerateExampleClass <em>Generate Example Class</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Generate Example Class</em>' attribute.
   * @see #isGenerateExampleClass()
   * @generated
   */
  void setGenerateExampleClass(boolean value);

  /**
   * Returns the value of the '<em><b>Literals Interface</b></em>' attribute.
   * The default value is <code>"true"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Literals Interface</em>' attribute.
   * @see #setLiteralsInterface(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_LiteralsInterface()
   * @model default="true"
   * @generated
   */
  boolean isLiteralsInterface();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isLiteralsInterface <em>Literals Interface</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Literals Interface</em>' attribute.
   * @see #isLiteralsInterface()
   * @generated
   */
  void setLiteralsInterface(boolean value);

  /**
   * Returns the value of the '<em><b>Data Type Converters</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Data Type Converters</em>' attribute.
   * @see #setDataTypeConverters(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_DataTypeConverters()
   * @model
   * @generated
   */
  boolean isDataTypeConverters();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isDataTypeConverters <em>Data Type Converters</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Data Type Converters</em>' attribute.
   * @see #isDataTypeConverters()
   * @generated
   */
  void setDataTypeConverters(boolean value);

  /**
   * Returns the value of the '<em><b>Multiple Editor Pages</b></em>' attribute.
   * The default value is <code>"true"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Multiple Editor Pages</em>' attribute.
   * @see #setMultipleEditorPages(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_MultipleEditorPages()
   * @model default="true"
   * @generated
   */
  boolean isMultipleEditorPages();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isMultipleEditorPages <em>Multiple Editor Pages</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Multiple Editor Pages</em>' attribute.
   * @see #isMultipleEditorPages()
   * @generated
   */
  void setMultipleEditorPages(boolean value);

  /**
   * Returns the value of the '<em><b>Generate Model Wizard</b></em>' attribute.
   * The default value is <code>"true"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Generate Model Wizard</em>' attribute.
   * @see #setGenerateModelWizard(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_GenerateModelWizard()
   * @model default="true"
   * @generated
   */
  boolean isGenerateModelWizard();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isGenerateModelWizard <em>Generate Model Wizard</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Generate Model Wizard</em>' attribute.
   * @see #isGenerateModelWizard()
   * @generated
   */
  void setGenerateModelWizard(boolean value);

  /**
   * Returns the value of the '<em><b>Extensible Provider Factory</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * @since 2.4
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Extensible Provider Factory</em>' attribute.
   * @see #setExtensibleProviderFactory(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_ExtensibleProviderFactory()
   * @model
   * @generated
   */
  boolean isExtensibleProviderFactory();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isExtensibleProviderFactory <em>Extensible Provider Factory</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Extensible Provider Factory</em>' attribute.
   * @see #isExtensibleProviderFactory()
   * @generated
   */
  void setExtensibleProviderFactory(boolean value);

  /**
   * Returns the value of the '<em><b>Child Creation Extenders</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * @since 2.4
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Child Creation Extenders</em>' attribute.
   * @see #setChildCreationExtenders(boolean)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_ChildCreationExtenders()
   * @model
   * @generated
   */
  boolean isChildCreationExtenders();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#isChildCreationExtenders <em>Child Creation Extenders</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Child Creation Extenders</em>' attribute.
   * @see #isChildCreationExtenders()
   * @generated
   */
  void setChildCreationExtenders(boolean value);

  /**
   * Returns the value of the '<em><b>Content Type Identifier</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * A content type identifier against which to register the resource factory for this package.
   * @since 2.4
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Content Type Identifier</em>' attribute.
   * @see #setContentTypeIdentifier(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_ContentTypeIdentifier()
   * @model
   * @generated
   */
  String getContentTypeIdentifier();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getContentTypeIdentifier <em>Content Type Identifier</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Content Type Identifier</em>' attribute.
   * @see #getContentTypeIdentifier()
   * @generated
   */
  void setContentTypeIdentifier(String value);

  /**
   * Returns the value of the '<em><b>File Extensions</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * The file extensions against which to register the resource factory for this package. Multiple extensions can be
   * specified as a comma-separated list, but only if this package defines a {@link #isContentType content type}.
   * This will always return a non-null string. The default (returned after the attribute is set to null) is based on
   * the {@link #getPrefix}. 
   * @since 2.4
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>File Extensions</em>' attribute.
   * @see #setFileExtensions(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_FileExtensions()
   * @model
   * @generated
   */
  String getFileExtensions();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getFileExtensions <em>File Extensions</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>File Extensions</em>' attribute.
   * @see #getFileExtensions()
   * @generated
   */
  void setFileExtensions(String value);

  /**
   * Returns the value of the '<em><b>Ecore Package</b></em>' reference.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Ecore Package</em>' reference.
   * @see #setEcorePackage(EPackage)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_EcorePackage()
   * @model required="true"
   * @generated
   */
  EPackage getEcorePackage();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getEcorePackage <em>Ecore Package</em>}' reference.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Ecore Package</em>' reference.
   * @see #getEcorePackage()
   * @generated
   */
  void setEcorePackage(EPackage value);

  /**
   * Returns the value of the '<em><b>Gen Model</b></em>' container reference.
   * It is bidirectional and its opposite is '{@link org.eclipse.emf.codegen.ecore.genmodel.GenModel#getGenPackages <em>Gen Packages</em>}'.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Gen Model</em>' container reference.
   * @see #setGenModel(GenModel)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_GenModel()
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModel#getGenPackages
   * @model opposite="genPackages"
   * @generated
   */
  GenModel getGenModel();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getGenModel <em>Gen Model</em>}' container reference.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Gen Model</em>' container reference.
   * @see #getGenModel()
   * @generated
   */
  void setGenModel(GenModel value);

  /**
   * Returns the value of the '<em><b>Gen Enums</b></em>' containment reference list.
   * The list contents are of type {@link org.eclipse.emf.codegen.ecore.genmodel.GenEnum}.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Gen Enums</em>' containment reference list.
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_GenEnums()
   * @model containment="true"
   * @generated
   */
  EList<GenEnum> getGenEnums();

  /**
   * Returns the value of the '<em><b>Gen Data Types</b></em>' containment reference list.
   * The list contents are of type {@link org.eclipse.emf.codegen.ecore.genmodel.GenDataType}.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Gen Data Types</em>' containment reference list.
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_GenDataTypes()
   * @model containment="true"
   * @generated
   */
  EList<GenDataType> getGenDataTypes();

  /**
   * Returns the value of the '<em><b>Gen Classes</b></em>' containment reference list.
   * The list contents are of type {@link org.eclipse.emf.codegen.ecore.genmodel.GenClass}.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Gen Classes</em>' containment reference list.
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_GenClasses()
   * @model containment="true"
   * @generated
   */
  EList<GenClass> getGenClasses();

  /**
   * Returns the value of the '<em><b>Nested Gen Packages</b></em>' containment reference list.
   * The list contents are of type {@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage}.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Nested Gen Packages</em>' containment reference list.
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_NestedGenPackages()
   * @model containment="true"
   * @generated
   */
  EList<GenPackage> getNestedGenPackages();

  /**
   * Returns the value of the '<em><b>Gen Classifiers</b></em>' reference list.
   * The list contents are of type {@link org.eclipse.emf.codegen.ecore.genmodel.GenClassifier}.
   * It is bidirectional and its opposite is '{@link org.eclipse.emf.codegen.ecore.genmodel.GenClassifier#getGenPackage <em>Gen Package</em>}'.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @return the value of the '<em>Gen Classifiers</em>' reference list.
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_GenClassifiers()
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenClassifier#getGenPackage
   * @model opposite="genPackage" resolveProxies="false" transient="true" changeable="false" volatile="true"
   * @generated
   */
  EList<GenClassifier> getGenClassifiers();

  /**
   * Returns the value of the '<em><b>Publication Location</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <p>
   * @since 2.10
   * </p>
   * <!-- end-user-doc -->
   * @return the value of the '<em>Publication Location</em>' attribute.
   * @see #setPublicationLocation(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_PublicationLocation()
   * @model
   * @generated
   */
  String getPublicationLocation();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getPublicationLocation <em>Publication Location</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Publication Location</em>' attribute.
   * @see #getPublicationLocation()
   * @generated
   */
  void setPublicationLocation(String value);

  /**
   * Returns the value of the '<em><b>Documentation</b></em>' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.14
   * <!-- end-model-doc -->
   * @return the value of the '<em>Documentation</em>' attribute.
   * @see #setDocumentation(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_Documentation()
   * @model unsettable="true" suppressedIsSetVisibility="true" suppressedUnsetVisibility="true"
   * @generated
   */
  String getDocumentation();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getDocumentation <em>Documentation</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Documentation</em>' attribute.
   * @see #getDocumentation()
   * @since 2.14
   * @generated
   */
  void setDocumentation(String value);

  /**
   * Returns the value of the '<em><b>Load Initialization File Extension</b></em>' attribute.
   * The default value is <code>"ecore"</code>.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * <!-- begin-model-doc -->
   * @since 2.15
   * <!-- end-model-doc -->
   * @return the value of the '<em>Load Initialization File Extension</em>' attribute.
   * @see #setLoadInitializationFileExtension(String)
   * @see org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage#getGenPackage_LoadInitializationFileExtension()
   * @model default="ecore"
   * @generated
   */
  String getLoadInitializationFileExtension();

  /**
   * Sets the value of the '{@link org.eclipse.emf.codegen.ecore.genmodel.GenPackage#getLoadInitializationFileExtension <em>Load Initialization File Extension</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @param value the new value of the '<em>Load Initialization File Extension</em>' attribute.
   * @see #getLoadInitializationFileExtension()
   * @since 2.15
   * @generated
   */
  void setLoadInitializationFileExtension(String value);

  String getInterfacePackageName();
  String getReflectionPackageName();
  String getReflectionClassPackageName();
  String getClassPackageName();
  String getUtilitiesPackageName();
  String getTestsPackageName();

  // String getPackageID();
  String getNSName();
  String getNSURI();
  String getPackageName();
  String getQualifiedPackageName();

  /**
   * Returns the name of the single package class generated when interfaces are suppressed.
   * It is simply the package {@link #getPrefix() prefix}, with "Package" appended.
   * This method is analagous to {@link #getFactoryName()} and would be called
   * <code>getPackageName()</code> if that name were not already taken.
   * @since 2.5
   */
  String getBasicPackageName();

  /**
   * @since 2.5
   */
  String getUncapPackageName();

  String getPackageInterfaceName();
  String getQualifiedPackageInterfaceName();
  String getImportedPackageInterfaceName();

  /**
   * @deprecated Use {@link #getUncapFactoryName()}, which won't change with the interface name pattern, instead.
   */
  @Deprecated
  String getUncapPackageInterfaceName();

  String getPackageClassName();
  String getQualifiedPackageClassName();
  String getImportedPackageClassName();

  /**
   * Returns the name of the single factory class generated when interfaces are suppressed.
   * It is simply the package {@link #getPrefix() prefix}, with "Factory" appended.
   * @since 2.5
   */
  String getFactoryName();

  /**
   * @since 2.5
   */
  String getUncapFactoryName();

  String getFactoryInterfaceName();
  String getQualifiedFactoryInterfaceName();
  String getImportedFactoryInterfaceName();

  /**
   * @deprecated Use {@link #getUncapFactoryName()}, which won't change with the interface name pattern, instead.
   */
  @Deprecated
  String getUncapFactoryInterfaceName();

  String getFactoryClassName();
  String getQualifiedFactoryClassName();
  String getImportedFactoryClassName();
  String getFactoryInstanceName();
  String getQualifiedFactoryInstanceAccessor();
  String getQualifiedEFactoryInstanceAccessor();
  String getQualifiedEFactoryInternalInstanceAccessor();

  String getAdapterFactoryClassName();
  String getQualifiedAdapterFactoryClassName();
  String getImportedAdapterFactoryClassName();
  String getUncapAdapterFactoryClassName();

  String getSwitchClassName();
  String getQualifiedSwitchClassName();
  String getValidatorClassName();
  String getQualifiedValidatorClassName();
  String getImportedValidatorClassName();

  String getTestSuiteClassName();
  String getQualifiedTestSuiteClassName();
  String getImportedTestSuiteClassName();
  String getExampleClassName();
  String getQualifiedExampleClassName();

  String getQualifiedXMLProcessorClassName();
  String getXMLProcessorClassName();
  String getImportedXMLProcessorBaseClassName();

  List<GenDataType> getAllGenDataTypes();

  /**
   * Returns the list of GenClasses in the GenPackage, ordered such that
   * a class always follows all of the classes it extends.  Appropriate
   * for use in package interface to declare feature constants, which will
   * depend on (and hence must follow) constants for the extended class.
   */
  List<GenClass> getOrderedGenClasses();
  List<GenClassifier> getOrderedGenClassifiers();

  String getClassifierID(GenClassifier genClassifier);
  int getClassifierValue(GenClassifier genClassifier);
  int getLocalClassifierIndex(GenClassifier genClassifier);

  List<GenPackage> getPackageSimpleDependencies();
  List<GenPackage> getPackageInterDependencies();
  List<GenPackage> getPackageLoadInterDependencies();
  List<GenPackage> getPackageBuildInterDependencies();
  List<GenPackage> getPackageInitializationDependencies();
  String getPackageInstanceVariable(GenPackage genPackage);

  /**
   * Returns a list of those nestedGenPackages for which hasClassifiers() is
   * true.
   */
  List<GenPackage> getSubGenPackages();

  /**
   * Returns the closest GenPackage-typed container for which
   * hasClassifiers() is true, or null if there is none.
   */
  GenPackage getSuperGenPackage();

  /**
   * Returns the top-most GenPackage-typed container for which
   * hasClassifiers() is true, which may be this GenPackage, itself.
   */
  GenPackage getRootGenPackage();
  
  /**
   * Returns true if this is a root package that requires, or has a direct or indirect subpackage that requires, load initialization.
   */
  boolean isLoadingInitialization();
  
  /**
   * Returns true if this package's root, which may be itself, requires, or has a subpackage that requires, load initialization.
   */
  boolean isLoadedInitialization();
  
  boolean isEcorePackage();
  boolean hasInterfaceImplConflict();
  boolean hasJavaLangConflict();
  List<String> getJavaLangConflicts();
  boolean hasClassifiers();
  boolean hasClassifiers(boolean traverseNestedPackages);

  List<GenClass> getAllSwitchGenClasses();
  String getClassUniqueName(GenClass genClass);

  List<GenPackage> getAllValidatorBaseGenPackages();
  String getValidatorPackageUniqueSafeName(GenPackage genPackage);

  void initialize(EPackage ePackage);

  void prepareCache();
  void clearCache();

  /**
   * @deprecated In EMF 2.2, schema generation is properly done via a model exporter. This method will be removed after 2.2.
   */
  @Deprecated
  void generateSchema();

  //
  // EMFEdit generation
  //

  String getProviderPackageName();
  String getPresentationPackageName();

  String getItemProviderAdapterFactoryClassName();
  String getQualifiedItemProviderAdapterFactoryClassName();
  String getImportedItemProviderAdapterFactoryClassName();
  String getEditorClassName();
  String getQualifiedEditorClassName();
  String getImportedEditorClassName();
  String getModelWizardClassName();
  String getQualifiedModelWizardClassName();
  String getImportedModelWizardClassName();
  String getActionBarContributorClassName();
  String getQualifiedActionBarContributorClassName();
  String getImportedActionBarContributorClassName();

  String getAdapterFactoryDelegateName(GenPackage genDelegate);
  String getUncapAdapterFactoryDelegateName(GenPackage genDelegate);

  String getEditPluginClassName();
  String getQualifiedEditPluginClassName();
  String getImportedEditPluginClassName();

  String getEditorPluginClassName();
  String getQualifiedEditorPluginClassName();
  String getImportedEditorPluginClassName();

  String getModelIconFileName();
  String getModelWizardIconFileName();

  // String getCapPackageID();
  List<GenFeature> getAllGenFeatures(); // Includes features in other packages that delegate to those in this one.

  List<GenPackage> getAdapterDelegatePackages();
  List<GenClass> getAdapterDelegateSuperClasses();

  boolean hasStatefulProvider();

  String getModelInfo();

  boolean reconcile(GenPackage oldGenPackageVersion);

  List<String> getAnnotationSources();
  String getAnnotationSourceIdentifier(String annotationSource);
  List<EAnnotation> getAllAnnotations();
  String getAnnotatedModelElementAccessor(EAnnotation eAnnotation);
  List<EAnnotation> getAllNestedAnnotations(EAnnotation eAnnotation);
  
  /**
   * @since 2.5
   */
  final class AnnotationReferenceData
  {
    public final GenPackage containingGenPackage;
    public final String uriFragment;
    
    public AnnotationReferenceData(GenPackage containingGenPackage, String uriFragment)
    {
      this.containingGenPackage = containingGenPackage;
      this.uriFragment = uriFragment;
    }
  }

  /**
   * @since 2.5
   */
  List<AnnotationReferenceData> getReferenceData(EAnnotation eAnnotation);

  String getResourceClassName();
  String getQualifiedResourceClassName();
  String getImportedResourceClassName();
  String getImportedResourceBaseClassName();

  String getResourceFactoryClassName();
  String getQualifiedResourceFactoryClassName();
  String getImportedResourceFactoryClassName();
  String getImportedResourceFactoryBaseClassName();

  boolean hasXMLMap();
  boolean hasDocumentRoot();
  GenClass getDocumentRoot();
  boolean hasExtendedMetaData();
  boolean hasTargetNamespace();

  boolean hasConstraints();

  /**
   * @since 2.6
   */
  boolean hasInvariantExpressions();

  String getSerializedPackageFilename();
  
  List<String> getProviderSupportedTypes();
  
  GenClass getRootClass();
  GenFeature getRootFeature();
  
  boolean hasConcreteClasses();
  
  boolean hasTests();

  /**
   * @since 2.10
   */
  String getSchemaLocation();

  /**
   * Returns a nested map structure describing the child creation extensions that this package provides to other packages.
   * The result maps other packages to their classes that have child creation extension provided by this package.
   * Each inner map maps from the class to the list of child creation data for these extensions.
   * @since 2.4
   */
  Map<GenPackage, Map<GenClass, List<GenClass.ChildCreationData>>> getExtendedChildCreationData();

  /**
   * @since 2.4
   */
  String getChildCreationExtenderName(GenPackage genPackage);

  /**
   * Returns whether the package should define a content type.
   * @see #getContentTypeIdentifier
   * @since 2.4
   */
  boolean isContentType();

  /**
   * Returns the qualified content type identifier. Usually, this is the same as {@link #getContentTypeIdentifier()};
   * however, if that value is unqualified, this will add the implicit model plug-in ID qualification.
   * @see #getContentTypeIdentifier
   * @since 2.4
   */
  String getQualifiedContentTypeIdentifier();

  /**
   * Returns whether the package's {@link #getResource() resource} produces an XMI serialization.
   * @see #getResource
   * @since 2.4
   */
  boolean isXMIResource();

  /**
   * Returns the package's {@link #getQualifiedResourceFactoryClassName() resource factory class name}, or the framework's
   * default XMI resource factory class name if no {@link #getResource() resource} will be generated for the package.
   * @see #getQualifiedResourceFactoryClassName
   * @see #getResource 
   * @since 2.4
   */
  String getQualifiedEffectiveResourceFactoryClassName();

  /**
   * Returns whether the model supports multiple file extensions, based both on the specified
   * {@link #getFileExtensions() extensions} and the use of a {@link #isContentType() content type}.
   * @see #getFileExtensions
   * @see #isContentType
   */
  boolean isMultipleFileExtensions();

  /**
   * Returns the first {@link #getFileExtensions() file extension} in the comma-separated list.
   * @see #getFileExtensions
   * @since 2.4
   */
  String getFileExtension();

  /**
   * Returns a list of the comma-separated contents of {@link #getFileExtensions()}.
   * @since 2.10
   */
  List<String> getFileExtensionList();
}
