/*******************************************************************************
 * Copyright (c) 2007, 2010 BMW Car IT, Technische Universitaet Muenchen, 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:
 *     BMW Car IT - Initial API and implementation
 *     Technische Universitaet Muenchen - Major refactoring and extension
 *******************************************************************************/
package org.eclipse.emf.edapt.spi.migration;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EEnumLiteral;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edapt.migration.MigrationException;


/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>Metamodel</b></em>'.
 * <!-- end-user-doc -->
 *
 * <!-- begin-model-doc -->
 * The metamodel in the repository consisting of several resources
 * <!-- end-model-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link org.eclipse.emf.edapt.spi.migration.Metamodel#getResources <em>Resources</em>}</li>
 *   <li>{@link org.eclipse.emf.edapt.spi.migration.Metamodel#getRepository <em>Repository</em>}</li>
 *   <li>{@link org.eclipse.emf.edapt.spi.migration.Metamodel#getDefaultPackage <em>Default Package</em>}</li>
 * </ul>
 * </p>
 *
 * @see org.eclipse.emf.edapt.spi.migration.MigrationPackage#getMetamodel()
 * @model
 * @generated
 */
public interface Metamodel {
	/**
	 * Returns the value of the '<em><b>Resources</b></em>' containment reference list.
	 * The list contents are of type {@link org.eclipse.emf.edapt.spi.migration.MetamodelResource}.
	 * It is bidirectional and its opposite is '{@link org.eclipse.emf.edapt.spi.migration.MetamodelResource#getMetamodel <em>Metamodel</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Resources</em>' containment reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * The resources of which this metamodel consists
	 * <!-- end-model-doc -->
	 * @return the value of the '<em>Resources</em>' containment reference list.
	 * @see org.eclipse.emf.edapt.spi.migration.MigrationPackage#getMetamodel_Resources()
	 * @see org.eclipse.emf.edapt.spi.migration.MetamodelResource#getMetamodel
	 * @model opposite="metamodel" containment="true"
	 * @generated
	 */
	EList<MetamodelResource> getResources();

	/**
	 * Returns the value of the '<em><b>Repository</b></em>' container reference.
	 * It is bidirectional and its opposite is '{@link org.eclipse.emf.edapt.spi.migration.Repository#getMetamodel <em>Metamodel</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Repository</em>' container reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * The repository to which the metamodel belongs
	 * <!-- end-model-doc -->
	 * @return the value of the '<em>Repository</em>' container reference.
	 * @see #setRepository(Repository)
	 * @see org.eclipse.emf.edapt.spi.migration.MigrationPackage#getMetamodel_Repository()
	 * @see org.eclipse.emf.edapt.spi.migration.Repository#getMetamodel
	 * @model opposite="metamodel" transient="false"
	 * @generated
	 */
	Repository getRepository();

	/**
	 * Sets the value of the '{@link org.eclipse.emf.edapt.spi.migration.Metamodel#getRepository <em>Repository</em>}' container reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Repository</em>' container reference.
	 * @see #getRepository()
	 * @generated
	 */
	void setRepository(Repository value);

	/**
	 * Returns the value of the '<em><b>Default Package</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Packages that constitute the root of a metamodel resource
	 * <!-- end-model-doc -->
	 * @return the value of the '<em>Default Package</em>' reference.
	 * @see #setDefaultPackage(EPackage)
	 * @see org.eclipse.emf.edapt.spi.migration.MigrationPackage#getMetamodel_DefaultPackage()
	 * @model
	 * @generated
	 */
	EPackage getDefaultPackage();

	/**
	 * Sets the value of the '{@link org.eclipse.emf.edapt.spi.migration.Metamodel#getDefaultPackage <em>Default Package</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Default Package</em>' reference.
	 * @see #getDefaultPackage()
	 * @generated
	 */
	void setDefaultPackage(EPackage value);

	/**
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>EPackages</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * The root packages of all resources of which the metamodel consists
	 * <!-- end-model-doc -->
	 * @model kind="operation"
	 * @generated
	 */
	EList<EPackage> getEPackages();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve an attribute of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model packageNameRequired="true"
	 * @generated
	 */
	void setDefaultPackage(String packageName);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a data type of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EEnum getEEnum(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a data type of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EEnumLiteral getEEnumLiteral(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Delete an instance from the model, including all the contained instances
	 * <!-- end-model-doc -->
	 * @model metamodelElementRequired="true"
	 * @generated
	 */
	void delete(EModelElement metamodelElement);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Get the inverse value of the reference
	 * <!-- end-model-doc -->
	 * @model metamodelElementRequired="true" referenceRequired="true"
	 * @generated
	 */
	<V> EList<V> getInverse(EModelElement metamodelElement, EReference reference);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Get the inverse value of the reference
	 * <!-- end-model-doc -->
	 * @model eClassRequired="true"
	 * @generated
	 */
	EList<EClass> getESubTypes(EClass eClass);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Get the inverse value of the reference
	 * <!-- end-model-doc -->
	 * @model eClassRequired="true"
	 * @generated
	 */
	EList<EClass> getEAllSubTypes(EClass eClass);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Set the opposite of a reference, adapting opposite values in the model
	 * <!-- end-model-doc -->
	 * @model referenceRequired="true" oppositeRequired="true"
	 * @generated
	 */
	void setEOpposite(EReference reference, EReference opposite);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a package of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EPackage getEPackage(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a classifier of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EClassifier getEClassifier(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a feature of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EStructuralFeature getEFeature(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a class of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EClass getEClass(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a reference of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EReference getEReference(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve an attribute of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EAttribute getEAttribute(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a data type of the metamodel by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EDataType getEDataType(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Resolve a metamodel element by its fully qualified name
	 * <!-- end-model-doc -->
	 * @model nameRequired="true"
	 * @generated
	 */
	EModelElement getElement(String name);

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * <!-- begin-model-doc -->
	 * Validate the metamodel
	 * <!-- end-model-doc -->
	 * @model exceptions="org.eclipse.emf.edapt.migration.MigrationException"
	 * @generated
	 */
	void validate() throws MigrationException;
	
	/** Clear the internal caches within the metamodel elements. */
	void refreshCaches();

} // Metamodel
