/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.eclipse.stem.foodproduction.impl;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;

import org.eclipse.emf.ecore.impl.EPackageImpl;

import org.eclipse.stem.core.common.CommonPackage;

import org.eclipse.stem.core.graph.GraphPackage;

import org.eclipse.stem.core.logger.LoggerPackage;

import org.eclipse.stem.core.model.ModelPackage;

import org.eclipse.stem.core.modifier.ModifierPackage;

import org.eclipse.stem.core.scenario.ScenarioPackage;

import org.eclipse.stem.core.sequencer.SequencerPackage;

import org.eclipse.stem.core.solver.SolverPackage;

import org.eclipse.stem.foodproduction.ConsumptionType;
import org.eclipse.stem.foodproduction.DiseaseCarryingTransformer;
import org.eclipse.stem.foodproduction.FoodConsumer;
import org.eclipse.stem.foodproduction.FoodProducer;
import org.eclipse.stem.foodproduction.FoodTransformer;
import org.eclipse.stem.foodproduction.FoodproductionFactory;
import org.eclipse.stem.foodproduction.FoodproductionPackage;
import org.eclipse.stem.foodproduction.SlaughterHouse;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class FoodproductionPackageImpl extends EPackageImpl implements FoodproductionPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass foodTransformerEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass foodProducerEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass slaughterHouseEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass diseaseCarryingTransformerEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass foodConsumerEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum consumptionTypeEEnum = null;

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see org.eclipse.stem.foodproduction.FoodproductionPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private FoodproductionPackageImpl() {
		super(eNS_URI, FoodproductionFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 * 
	 * <p>This method is used to initialize {@link FoodproductionPackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static FoodproductionPackage init() {
		if (isInited) return (FoodproductionPackage)EPackage.Registry.INSTANCE.getEPackage(FoodproductionPackage.eNS_URI);

		// Obtain or create and register package
		FoodproductionPackageImpl theFoodproductionPackage = (FoodproductionPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof FoodproductionPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new FoodproductionPackageImpl());

		isInited = true;

		// Initialize simple dependencies
		CommonPackage.eINSTANCE.eClass();
		GraphPackage.eINSTANCE.eClass();
		ModelPackage.eINSTANCE.eClass();
		ModifierPackage.eINSTANCE.eClass();
		ScenarioPackage.eINSTANCE.eClass();
		SequencerPackage.eINSTANCE.eClass();
		SolverPackage.eINSTANCE.eClass();
		LoggerPackage.eINSTANCE.eClass();

		// Create package meta-data objects
		theFoodproductionPackage.createPackageContents();

		// Initialize created meta-data
		theFoodproductionPackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theFoodproductionPackage.freeze();

  
		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(FoodproductionPackage.eNS_URI, theFoodproductionPackage);
		return theFoodproductionPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getFoodTransformer() {
		return foodTransformerEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodTransformer_SourcePopulationName() {
		return (EAttribute)foodTransformerEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodTransformer_TargetPopulationName() {
		return (EAttribute)foodTransformerEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodTransformer_TargetURI() {
		return (EAttribute)foodTransformerEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodTransformer_TimePeriod() {
		return (EAttribute)foodTransformerEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getFoodProducer() {
		return foodProducerEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodProducer_FoodYieldPopulationMultiplier() {
		return (EAttribute)foodProducerEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodProducer_SourceProcessingRate() {
		return (EAttribute)foodProducerEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getSlaughterHouse() {
		return slaughterHouseEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getDiseaseCarryingTransformer() {
		return diseaseCarryingTransformerEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDiseaseCarryingTransformer_SourceDecorator() {
		return (EReference)diseaseCarryingTransformerEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDiseaseCarryingTransformer_TargetDecorator() {
		return (EReference)diseaseCarryingTransformerEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDiseaseCarryingTransformer_StateTransitionsMap() {
		return (EReference)diseaseCarryingTransformerEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDiseaseCarryingTransformer_SourceAttributes() {
		return (EReference)diseaseCarryingTransformerEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDiseaseCarryingTransformer_TargetAttributes() {
		return (EReference)diseaseCarryingTransformerEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getFoodConsumer() {
		return foodConsumerEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodConsumer_ConsumptionRate() {
		return (EAttribute)foodConsumerEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodConsumer_ConsumptionType() {
		return (EAttribute)foodConsumerEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodConsumer_WasteRate() {
		return (EAttribute)foodConsumerEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getFoodConsumer_MaxVolumeOfStocks() {
		return (EAttribute)foodConsumerEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getConsumptionType() {
		return consumptionTypeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FoodproductionFactory getFoodproductionFactory() {
		return (FoodproductionFactory)getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated) return;
		isCreated = true;

		// Create classes and their features
		foodTransformerEClass = createEClass(FOOD_TRANSFORMER);
		createEAttribute(foodTransformerEClass, FOOD_TRANSFORMER__SOURCE_POPULATION_NAME);
		createEAttribute(foodTransformerEClass, FOOD_TRANSFORMER__TARGET_POPULATION_NAME);
		createEAttribute(foodTransformerEClass, FOOD_TRANSFORMER__TARGET_URI);
		createEAttribute(foodTransformerEClass, FOOD_TRANSFORMER__TIME_PERIOD);

		foodProducerEClass = createEClass(FOOD_PRODUCER);
		createEAttribute(foodProducerEClass, FOOD_PRODUCER__FOOD_YIELD_POPULATION_MULTIPLIER);
		createEAttribute(foodProducerEClass, FOOD_PRODUCER__SOURCE_PROCESSING_RATE);

		slaughterHouseEClass = createEClass(SLAUGHTER_HOUSE);

		diseaseCarryingTransformerEClass = createEClass(DISEASE_CARRYING_TRANSFORMER);
		createEReference(diseaseCarryingTransformerEClass, DISEASE_CARRYING_TRANSFORMER__SOURCE_DECORATOR);
		createEReference(diseaseCarryingTransformerEClass, DISEASE_CARRYING_TRANSFORMER__TARGET_DECORATOR);
		createEReference(diseaseCarryingTransformerEClass, DISEASE_CARRYING_TRANSFORMER__STATE_TRANSITIONS_MAP);
		createEReference(diseaseCarryingTransformerEClass, DISEASE_CARRYING_TRANSFORMER__SOURCE_ATTRIBUTES);
		createEReference(diseaseCarryingTransformerEClass, DISEASE_CARRYING_TRANSFORMER__TARGET_ATTRIBUTES);

		foodConsumerEClass = createEClass(FOOD_CONSUMER);
		createEAttribute(foodConsumerEClass, FOOD_CONSUMER__CONSUMPTION_RATE);
		createEAttribute(foodConsumerEClass, FOOD_CONSUMER__CONSUMPTION_TYPE);
		createEAttribute(foodConsumerEClass, FOOD_CONSUMER__WASTE_RATE);
		createEAttribute(foodConsumerEClass, FOOD_CONSUMER__MAX_VOLUME_OF_STOCKS);

		// Create enums
		consumptionTypeEEnum = createEEnum(CONSUMPTION_TYPE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		ModelPackage theModelPackage = (ModelPackage)EPackage.Registry.INSTANCE.getEPackage(ModelPackage.eNS_URI);
		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
		CommonPackage theCommonPackage = (CommonPackage)EPackage.Registry.INSTANCE.getEPackage(CommonPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		foodTransformerEClass.getESuperTypes().add(theModelPackage.getTransformationDecorator());
		foodProducerEClass.getESuperTypes().add(this.getFoodTransformer());
		slaughterHouseEClass.getESuperTypes().add(this.getFoodProducer());
		slaughterHouseEClass.getESuperTypes().add(this.getDiseaseCarryingTransformer());
		foodConsumerEClass.getESuperTypes().add(this.getFoodTransformer());
		foodConsumerEClass.getESuperTypes().add(this.getDiseaseCarryingTransformer());

		// Initialize classes and features; add operations and parameters
		initEClass(foodTransformerEClass, FoodTransformer.class, "FoodTransformer", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFoodTransformer_SourcePopulationName(), theEcorePackage.getEString(), "sourcePopulationName", "cattle", 0, 1, FoodTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFoodTransformer_TargetPopulationName(), theEcorePackage.getEString(), "targetPopulationName", "beef", 0, 1, FoodTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFoodTransformer_TargetURI(), theCommonPackage.getURI(), "targetURI", null, 0, 1, FoodTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFoodTransformer_TimePeriod(), theEcorePackage.getELong(), "timePeriod", "86400000", 0, 1, FoodTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(foodProducerEClass, FoodProducer.class, "FoodProducer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFoodProducer_FoodYieldPopulationMultiplier(), theEcorePackage.getEDouble(), "foodYieldPopulationMultiplier", "100", 0, 1, FoodProducer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFoodProducer_SourceProcessingRate(), theEcorePackage.getEDouble(), "sourceProcessingRate", "1.0", 0, 1, FoodProducer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(slaughterHouseEClass, SlaughterHouse.class, "SlaughterHouse", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(diseaseCarryingTransformerEClass, DiseaseCarryingTransformer.class, "DiseaseCarryingTransformer", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDiseaseCarryingTransformer_SourceDecorator(), theModelPackage.getIntegrationDecorator(), null, "sourceDecorator", null, 0, 1, DiseaseCarryingTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDiseaseCarryingTransformer_TargetDecorator(), theModelPackage.getIntegrationDecorator(), null, "targetDecorator", null, 0, 1, DiseaseCarryingTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDiseaseCarryingTransformer_StateTransitionsMap(), theCommonPackage.getDoubleValueMatrix(), null, "stateTransitionsMap", null, 0, 1, DiseaseCarryingTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDiseaseCarryingTransformer_SourceAttributes(), theEcorePackage.getEAttribute(), null, "sourceAttributes", null, 0, -1, DiseaseCarryingTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDiseaseCarryingTransformer_TargetAttributes(), theEcorePackage.getEAttribute(), null, "targetAttributes", null, 0, -1, DiseaseCarryingTransformer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(foodConsumerEClass, FoodConsumer.class, "FoodConsumer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getFoodConsumer_ConsumptionRate(), theEcorePackage.getEDouble(), "consumptionRate", "0.1", 0, 1, FoodConsumer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFoodConsumer_ConsumptionType(), this.getConsumptionType(), "consumptionType", "1", 0, 1, FoodConsumer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFoodConsumer_WasteRate(), theEcorePackage.getEDouble(), "wasteRate", "0.0", 0, 1, FoodConsumer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getFoodConsumer_MaxVolumeOfStocks(), theEcorePackage.getEDouble(), "maxVolumeOfStocks", "1000000", 0, 1, FoodConsumer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(consumptionTypeEEnum, ConsumptionType.class, "ConsumptionType");
		addEEnumLiteral(consumptionTypeEEnum, ConsumptionType.RELATIVE_CONSUMPTION);
		addEEnumLiteral(consumptionTypeEEnum, ConsumptionType.ABSOLUTE_CONSUMPTION);
		addEEnumLiteral(consumptionTypeEEnum, ConsumptionType.CONSUMPTION_PER_PERSON);

		// Create resource
		createResource(eNS_URI);
	}

} //FoodproductionPackageImpl
