/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  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 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.entitymock.impl;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.InternalEObject;

import org.eclipse.emf.ecore.impl.EPackageImpl;

import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;

import org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage;

import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;

import org.eclipse.osbp.xtext.entitymock.Date;
import org.eclipse.osbp.xtext.entitymock.DateIterate;
import org.eclipse.osbp.xtext.entitymock.EDateStepType;
import org.eclipse.osbp.xtext.entitymock.EntityMock;
import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByObject;
import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeByReference;
import org.eclipse.osbp.xtext.entitymock.EntityMockAttributeFiller;
import org.eclipse.osbp.xtext.entitymock.EntityMockByResourceAttribute;
import org.eclipse.osbp.xtext.entitymock.EntityMockDSLFactory;
import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntities;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntity;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunction;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntityFunctionParameter;
import org.eclipse.osbp.xtext.entitymock.EntityMockEntityNestedAttribute;
import org.eclipse.osbp.xtext.entitymock.EntityMockLazyResolver;
import org.eclipse.osbp.xtext.entitymock.EntityMockModel;
import org.eclipse.osbp.xtext.entitymock.EntityMockObject;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEmbed;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectFill;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunction;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectFunctionParameter;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectPlainValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectResourceValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjects;
import org.eclipse.osbp.xtext.entitymock.EntityMockPackage;
import org.eclipse.osbp.xtext.entitymock.EntityMockReferencedObjectAttribute;
import org.eclipse.osbp.xtext.entitymock.EntityMockResource;
import org.eclipse.osbp.xtext.entitymock.EntityMockResourceAttribute;
import org.eclipse.osbp.xtext.entitymock.EntityMockResourceDataRow;
import org.eclipse.osbp.xtext.entitymock.EntityMockResources;
import org.eclipse.osbp.xtext.entitymock.EntityMockTemplate;
import org.eclipse.osbp.xtext.entitymock.IEntityMockAttribute;
import org.eclipse.osbp.xtext.entitymock.IEntityMockEntityUsable;
import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectAttribute;
import org.eclipse.osbp.xtext.entitymock.IEntityMockObjectUsable;
import org.eclipse.osbp.xtext.entitymock.IIterate;
import org.eclipse.osbp.xtext.entitymock.IntegerIterate;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerBoolean;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateFuture;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerDatePast;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateRange;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerDateType;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerDoubleType;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerIntegerType;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedDoubleRange;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerSignedIntegerRange;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextParagraphs;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextSentences;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextType;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerTextWords;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerType;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedDoubleRange;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRandom;
import org.eclipse.osbp.xtext.entitymock.PropertyFillerUnsignedIntegerRange;
import org.eclipse.osbp.xtext.entitymock.RunningDataInterchange;
import org.eclipse.osbp.xtext.entitymock.RunningDataInterchanges;

import org.eclipse.xtext.common.types.TypesPackage;

import org.eclipse.xtext.xbase.XbasePackage;

import org.eclipse.xtext.xtype.XtypePackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class EntityMockDSLPackageImpl extends EPackageImpl implements EntityMockDSLPackage {
	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockModelEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockLazyResolverEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockPackageEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass runningDataInterchangesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass runningDataInterchangeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockResourcesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockResourceEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockResourceAttributeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockResourceDataRowEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectEnumEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass iEntityMockObjectAttributeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectPlainValueEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectResourceValueEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectArrayValueEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectItemValueEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectEmbedEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectFunctionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectFunctionParameterEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockObjectFillEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerTypeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerDateTypeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerBooleanEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerDoubleTypeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerIntegerTypeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerTextTypeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerDateFutureEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerDatePastEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerDateRangeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerSignedDoubleRangeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerSignedDoubleRandomEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerSignedIntegerRangeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerSignedIntegerRandomEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerTextRandomEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerTextParagraphsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerTextSentencesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerTextWordsEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerUnsignedDoubleRangeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerUnsignedDoubleRandomEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerUnsignedIntegerRangeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass propertyFillerUnsignedIntegerRandomEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockEntitiesEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockEntityEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass iIterateEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass integerIterateEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dateIterateEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass dateEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockByResourceAttributeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockTemplateEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass iEntityMockObjectUsableEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass iEntityMockEntityUsableEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass iEntityMockAttributeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockReferencedObjectAttributeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockAttributeByObjectEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockAttributeFillerEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockAttributeByReferenceEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockEntityFunctionEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockEntityNestedAttributeEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EClass entityMockEntityFunctionParameterEClass = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum eDateStepTypeEEnum = null;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EDataType internalEObjectEDataType = 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.osbp.xtext.entitymock.EntityMockDSLPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private EntityMockDSLPackageImpl() {
		super(eNS_URI, EntityMockDSLFactory.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 EntityMockDSLPackage#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 EntityMockDSLPackage init() {
		if (isInited) return (EntityMockDSLPackage)EPackage.Registry.INSTANCE.getEPackage(EntityMockDSLPackage.eNS_URI);

		// Obtain or create and register package
		EntityMockDSLPackageImpl theEntityMockDSLPackage = (EntityMockDSLPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof EntityMockDSLPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new EntityMockDSLPackageImpl());

		isInited = true;

		// Initialize simple dependencies
		DataDSLPackage.eINSTANCE.eClass();

		// Create package meta-data objects
		theEntityMockDSLPackage.createPackageContents();

		// Initialize created meta-data
		theEntityMockDSLPackage.initializePackageContents();

		// Mark meta-data to indicate it can't be changed
		theEntityMockDSLPackage.freeze();

  
		// Update the registry and return the package
		EPackage.Registry.INSTANCE.put(EntityMockDSLPackage.eNS_URI, theEntityMockDSLPackage);
		return theEntityMockDSLPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockModel() {
		return entityMockModelEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockModel_ImportSection() {
		return (EReference)entityMockModelEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockModel_Packages() {
		return (EReference)entityMockModelEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockLazyResolver() {
		return entityMockLazyResolverEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EOperation getEntityMockLazyResolver__EResolveProxy__InternalEObject() {
		return entityMockLazyResolverEClass.getEOperations().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockPackage() {
		return entityMockPackageEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockPackage_Mocks() {
		return (EReference)entityMockPackageEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMock() {
		return entityMockEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMock_Name() {
		return (EAttribute)entityMockEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMock_Description() {
		return (EAttribute)entityMockEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMock_DescriptionValue() {
		return (EAttribute)entityMockEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMock_RunPriority() {
		return (EAttribute)entityMockEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMock_Datainterchanges() {
		return (EReference)entityMockEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMock_Resources() {
		return (EReference)entityMockEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMock_Objects() {
		return (EReference)entityMockEClass.getEStructuralFeatures().get(6);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMock_Entities() {
		return (EReference)entityMockEClass.getEStructuralFeatures().get(7);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getRunningDataInterchanges() {
		return runningDataInterchangesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getRunningDataInterchanges_Datainterchanges() {
		return (EReference)runningDataInterchangesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getRunningDataInterchange() {
		return runningDataInterchangeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getRunningDataInterchange_DatainterchangeRef() {
		return (EReference)runningDataInterchangeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getRunningDataInterchange_FileURL() {
		return (EAttribute)runningDataInterchangeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockResources() {
		return entityMockResourcesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockResources_Resources() {
		return (EReference)entityMockResourcesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockResource() {
		return entityMockResourceEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockResource_Attributes() {
		return (EReference)entityMockResourceEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockResource_Datarows() {
		return (EReference)entityMockResourceEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockResourceAttribute() {
		return entityMockResourceAttributeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockResourceDataRow() {
		return entityMockResourceDataRowEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockResourceDataRow_Values() {
		return (EAttribute)entityMockResourceDataRowEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjects() {
		return entityMockObjectsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjects_Objects() {
		return (EReference)entityMockObjectsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObject() {
		return entityMockObjectEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockObject_Name() {
		return (EAttribute)entityMockObjectEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObject_Enumerations() {
		return (EReference)entityMockObjectEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObject_Attributes() {
		return (EReference)entityMockObjectEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObject_Calculations() {
		return (EReference)entityMockObjectEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectEnum() {
		return entityMockObjectEnumEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockObjectEnum_Name() {
		return (EAttribute)entityMockObjectEnumEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectEnum_UsingResource() {
		return (EReference)entityMockObjectEnumEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getIEntityMockObjectAttribute() {
		return iEntityMockObjectAttributeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getIEntityMockObjectAttribute_Name() {
		return (EAttribute)iEntityMockObjectAttributeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectPlainValue() {
		return entityMockObjectPlainValueEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockObjectPlainValue_Values() {
		return (EAttribute)entityMockObjectPlainValueEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectResourceValue() {
		return entityMockObjectResourceValueEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectResourceValue_ResourceEnum() {
		return (EReference)entityMockObjectResourceValueEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectResourceValue_ResourceAttribute() {
		return (EReference)entityMockObjectResourceValueEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectArrayValue() {
		return entityMockObjectArrayValueEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectArrayValue_Enumeration() {
		return (EReference)entityMockObjectArrayValueEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectArrayValue_Items() {
		return (EReference)entityMockObjectArrayValueEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectItemValue() {
		return entityMockObjectItemValueEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectItemValue_Datarow() {
		return (EReference)entityMockObjectItemValueEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockObjectItemValue_Values() {
		return (EAttribute)entityMockObjectItemValueEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectEmbed() {
		return entityMockObjectEmbedEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectEmbed_Object() {
		return (EReference)entityMockObjectEmbedEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectFunction() {
		return entityMockObjectFunctionEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectFunction_Oftype() {
		return (EReference)entityMockObjectFunctionEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectFunction_Params() {
		return (EReference)entityMockObjectFunctionEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectFunction_Body() {
		return (EReference)entityMockObjectFunctionEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectFunctionParameter() {
		return entityMockObjectFunctionParameterEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectFunctionParameter_ParameterType() {
		return (EReference)entityMockObjectFunctionParameterEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectFunctionParameter_Name() {
		return (EReference)entityMockObjectFunctionParameterEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockObjectFill() {
		return entityMockObjectFillEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockObjectFill_FillerType() {
		return (EReference)entityMockObjectFillEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerType() {
		return propertyFillerTypeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerDateType() {
		return propertyFillerDateTypeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerBoolean() {
		return propertyFillerBooleanEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerDoubleType() {
		return propertyFillerDoubleTypeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerIntegerType() {
		return propertyFillerIntegerTypeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerTextType() {
		return propertyFillerTextTypeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerDateFuture() {
		return propertyFillerDateFutureEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerDateFuture_DateFutureYears() {
		return (EAttribute)propertyFillerDateFutureEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerDatePast() {
		return propertyFillerDatePastEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerDatePast_DatePastYears() {
		return (EAttribute)propertyFillerDatePastEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerDateRange() {
		return propertyFillerDateRangeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerDateRange_DateBeginYears() {
		return (EAttribute)propertyFillerDateRangeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerDateRange_DateEndYears() {
		return (EAttribute)propertyFillerDateRangeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerSignedDoubleRange() {
		return propertyFillerSignedDoubleRangeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedDoubleRange_Decimals() {
		return (EAttribute)propertyFillerSignedDoubleRangeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedDoubleRange_BeginRange() {
		return (EAttribute)propertyFillerSignedDoubleRangeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedDoubleRange_EndRange() {
		return (EAttribute)propertyFillerSignedDoubleRangeEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPropertyFillerSignedDoubleRange_BeginRangeRef() {
		return (EReference)propertyFillerSignedDoubleRangeEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPropertyFillerSignedDoubleRange_EndRangeRef() {
		return (EReference)propertyFillerSignedDoubleRangeEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedDoubleRange_Rounded() {
		return (EAttribute)propertyFillerSignedDoubleRangeEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerSignedDoubleRandom() {
		return propertyFillerSignedDoubleRandomEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedDoubleRandom_Items() {
		return (EAttribute)propertyFillerSignedDoubleRandomEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerSignedIntegerRange() {
		return propertyFillerSignedIntegerRangeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedIntegerRange_BeginRange() {
		return (EAttribute)propertyFillerSignedIntegerRangeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedIntegerRange_EndRange() {
		return (EAttribute)propertyFillerSignedIntegerRangeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPropertyFillerSignedIntegerRange_BeginRangeRef() {
		return (EReference)propertyFillerSignedIntegerRangeEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPropertyFillerSignedIntegerRange_EndRangeRef() {
		return (EReference)propertyFillerSignedIntegerRangeEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedIntegerRange_Rounded() {
		return (EAttribute)propertyFillerSignedIntegerRangeEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerSignedIntegerRandom() {
		return propertyFillerSignedIntegerRandomEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerSignedIntegerRandom_Items() {
		return (EAttribute)propertyFillerSignedIntegerRandomEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerTextRandom() {
		return propertyFillerTextRandomEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerTextRandom_Items() {
		return (EAttribute)propertyFillerTextRandomEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerTextParagraphs() {
		return propertyFillerTextParagraphsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerTextParagraphs_Count() {
		return (EAttribute)propertyFillerTextParagraphsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerTextSentences() {
		return propertyFillerTextSentencesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerTextSentences_Count() {
		return (EAttribute)propertyFillerTextSentencesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerTextWords() {
		return propertyFillerTextWordsEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerTextWords_Count() {
		return (EAttribute)propertyFillerTextWordsEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerUnsignedDoubleRange() {
		return propertyFillerUnsignedDoubleRangeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedDoubleRange_Decimals() {
		return (EAttribute)propertyFillerUnsignedDoubleRangeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedDoubleRange_BeginRange() {
		return (EAttribute)propertyFillerUnsignedDoubleRangeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedDoubleRange_EndRange() {
		return (EAttribute)propertyFillerUnsignedDoubleRangeEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPropertyFillerUnsignedDoubleRange_BeginRangeRef() {
		return (EReference)propertyFillerUnsignedDoubleRangeEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPropertyFillerUnsignedDoubleRange_EndRangeRef() {
		return (EReference)propertyFillerUnsignedDoubleRangeEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedDoubleRange_Rounded() {
		return (EAttribute)propertyFillerUnsignedDoubleRangeEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerUnsignedDoubleRandom() {
		return propertyFillerUnsignedDoubleRandomEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedDoubleRandom_Items() {
		return (EAttribute)propertyFillerUnsignedDoubleRandomEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerUnsignedIntegerRange() {
		return propertyFillerUnsignedIntegerRangeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedIntegerRange_BeginRange() {
		return (EAttribute)propertyFillerUnsignedIntegerRangeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedIntegerRange_EndRange() {
		return (EAttribute)propertyFillerUnsignedIntegerRangeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPropertyFillerUnsignedIntegerRange_BeginRangeRef() {
		return (EReference)propertyFillerUnsignedIntegerRangeEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getPropertyFillerUnsignedIntegerRange_EndRangeRef() {
		return (EReference)propertyFillerUnsignedIntegerRangeEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedIntegerRange_Rounded() {
		return (EAttribute)propertyFillerUnsignedIntegerRangeEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getPropertyFillerUnsignedIntegerRandom() {
		return propertyFillerUnsignedIntegerRandomEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getPropertyFillerUnsignedIntegerRandom_Items() {
		return (EAttribute)propertyFillerUnsignedIntegerRandomEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockEntities() {
		return entityMockEntitiesEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntities_Entities() {
		return (EReference)entityMockEntitiesEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockEntity() {
		return entityMockEntityEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockEntity_Name() {
		return (EAttribute)entityMockEntityEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntity_EntityRef() {
		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockEntity_MinRows() {
		return (EAttribute)entityMockEntityEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockEntity_MaxRows() {
		return (EAttribute)entityMockEntityEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntity_Iterate() {
		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntity_Iterator() {
		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntity_Templates() {
		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(6);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntity_Attributes() {
		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(7);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntity_Calculations() {
		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(8);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntity_ByResource() {
		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(9);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntity_ByResourceAttributes() {
		return (EReference)entityMockEntityEClass.getEStructuralFeatures().get(10);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockEntity_CreateBlobMapping() {
		return (EAttribute)entityMockEntityEClass.getEStructuralFeatures().get(11);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getIIterate() {
		return iIterateEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getIntegerIterate() {
		return integerIterateEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getIntegerIterate_From() {
		return (EAttribute)integerIterateEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getIntegerIterate_Until() {
		return (EAttribute)integerIterateEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getIntegerIterate_Step() {
		return (EAttribute)integerIterateEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getDateIterate() {
		return dateIterateEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDateIterate_From() {
		return (EReference)dateIterateEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDateIterate_Until() {
		return (EReference)dateIterateEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDateIterate_StepCount() {
		return (EAttribute)dateIterateEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDateIterate_StepType() {
		return (EAttribute)dateIterateEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getDate() {
		return dateEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDate_Yesterday() {
		return (EAttribute)dateEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDate_Today() {
		return (EAttribute)dateEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDate_Tomorrow() {
		return (EAttribute)dateEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDate_OffsetCount() {
		return (EAttribute)dateEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDate_OffsetType() {
		return (EAttribute)dateEClass.getEStructuralFeatures().get(4);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDate_Year() {
		return (EAttribute)dateEClass.getEStructuralFeatures().get(5);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDate_Month() {
		return (EAttribute)dateEClass.getEStructuralFeatures().get(6);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDate_Day() {
		return (EAttribute)dateEClass.getEStructuralFeatures().get(7);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockByResourceAttribute() {
		return entityMockByResourceAttributeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockByResourceAttribute_AttributeRef() {
		return (EReference)entityMockByResourceAttributeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockByResourceAttribute_ResourceAttribute() {
		return (EReference)entityMockByResourceAttributeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockTemplate() {
		return entityMockTemplateEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockTemplate_Name() {
		return (EAttribute)entityMockTemplateEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockTemplate_Object() {
		return (EReference)entityMockTemplateEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getIEntityMockObjectUsable() {
		return iEntityMockObjectUsableEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getIEntityMockEntityUsable() {
		return iEntityMockEntityUsableEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getIEntityMockAttribute() {
		return iEntityMockAttributeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockReferencedObjectAttribute() {
		return entityMockReferencedObjectAttributeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockReferencedObjectAttribute_Template() {
		return (EReference)entityMockReferencedObjectAttributeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockReferencedObjectAttribute_Embedded() {
		return (EReference)entityMockReferencedObjectAttributeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockReferencedObjectAttribute_Attribute() {
		return (EReference)entityMockReferencedObjectAttributeEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockAttributeByObject() {
		return entityMockAttributeByObjectEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockAttributeByObject_AttributeRef() {
		return (EReference)entityMockAttributeByObjectEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockAttributeByObject_Reference() {
		return (EReference)entityMockAttributeByObjectEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockAttributeByObject_ResourceEnum() {
		return (EReference)entityMockAttributeByObjectEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockAttributeByObject_ResourceAttribute() {
		return (EReference)entityMockAttributeByObjectEClass.getEStructuralFeatures().get(3);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockAttributeFiller() {
		return entityMockAttributeFillerEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockAttributeFiller_AttributeRef() {
		return (EReference)entityMockAttributeFillerEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockAttributeFiller_FillerType() {
		return (EReference)entityMockAttributeFillerEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockAttributeByReference() {
		return entityMockAttributeByReferenceEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockAttributeByReference_AttributeRef() {
		return (EReference)entityMockAttributeByReferenceEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockAttributeByReference_MockedEntity() {
		return (EReference)entityMockAttributeByReferenceEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getEntityMockAttributeByReference_OptionalFor() {
		return (EAttribute)entityMockAttributeByReferenceEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockEntityFunction() {
		return entityMockEntityFunctionEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntityFunction_AttributeRef() {
		return (EReference)entityMockEntityFunctionEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntityFunction_Params() {
		return (EReference)entityMockEntityFunctionEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntityFunction_Body() {
		return (EReference)entityMockEntityFunctionEClass.getEStructuralFeatures().get(2);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockEntityNestedAttribute() {
		return entityMockEntityNestedAttributeEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntityNestedAttribute_Reference() {
		return (EReference)entityMockEntityNestedAttributeEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntityNestedAttribute_Attribute() {
		return (EReference)entityMockEntityNestedAttributeEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EClass getEntityMockEntityFunctionParameter() {
		return entityMockEntityFunctionParameterEClass;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntityFunctionParameter_AttributeRef() {
		return (EReference)entityMockEntityFunctionParameterEClass.getEStructuralFeatures().get(0);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getEntityMockEntityFunctionParameter_NestedAttribute() {
		return (EReference)entityMockEntityFunctionParameterEClass.getEStructuralFeatures().get(1);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EEnum getEDateStepType() {
		return eDateStepTypeEEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EDataType getInternalEObject() {
		return internalEObjectEDataType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockDSLFactory getEntityMockDSLFactory() {
		return (EntityMockDSLFactory)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
		entityMockModelEClass = createEClass(ENTITY_MOCK_MODEL);
		createEReference(entityMockModelEClass, ENTITY_MOCK_MODEL__IMPORT_SECTION);
		createEReference(entityMockModelEClass, ENTITY_MOCK_MODEL__PACKAGES);

		entityMockLazyResolverEClass = createEClass(ENTITY_MOCK_LAZY_RESOLVER);
		createEOperation(entityMockLazyResolverEClass, ENTITY_MOCK_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);

		entityMockPackageEClass = createEClass(ENTITY_MOCK_PACKAGE);
		createEReference(entityMockPackageEClass, ENTITY_MOCK_PACKAGE__MOCKS);

		entityMockEClass = createEClass(ENTITY_MOCK);
		createEAttribute(entityMockEClass, ENTITY_MOCK__NAME);
		createEAttribute(entityMockEClass, ENTITY_MOCK__DESCRIPTION);
		createEAttribute(entityMockEClass, ENTITY_MOCK__DESCRIPTION_VALUE);
		createEAttribute(entityMockEClass, ENTITY_MOCK__RUN_PRIORITY);
		createEReference(entityMockEClass, ENTITY_MOCK__DATAINTERCHANGES);
		createEReference(entityMockEClass, ENTITY_MOCK__RESOURCES);
		createEReference(entityMockEClass, ENTITY_MOCK__OBJECTS);
		createEReference(entityMockEClass, ENTITY_MOCK__ENTITIES);

		runningDataInterchangesEClass = createEClass(RUNNING_DATA_INTERCHANGES);
		createEReference(runningDataInterchangesEClass, RUNNING_DATA_INTERCHANGES__DATAINTERCHANGES);

		runningDataInterchangeEClass = createEClass(RUNNING_DATA_INTERCHANGE);
		createEReference(runningDataInterchangeEClass, RUNNING_DATA_INTERCHANGE__DATAINTERCHANGE_REF);
		createEAttribute(runningDataInterchangeEClass, RUNNING_DATA_INTERCHANGE__FILE_URL);

		entityMockResourcesEClass = createEClass(ENTITY_MOCK_RESOURCES);
		createEReference(entityMockResourcesEClass, ENTITY_MOCK_RESOURCES__RESOURCES);

		entityMockResourceEClass = createEClass(ENTITY_MOCK_RESOURCE);
		createEReference(entityMockResourceEClass, ENTITY_MOCK_RESOURCE__ATTRIBUTES);
		createEReference(entityMockResourceEClass, ENTITY_MOCK_RESOURCE__DATAROWS);

		entityMockResourceAttributeEClass = createEClass(ENTITY_MOCK_RESOURCE_ATTRIBUTE);

		entityMockResourceDataRowEClass = createEClass(ENTITY_MOCK_RESOURCE_DATA_ROW);
		createEAttribute(entityMockResourceDataRowEClass, ENTITY_MOCK_RESOURCE_DATA_ROW__VALUES);

		entityMockObjectsEClass = createEClass(ENTITY_MOCK_OBJECTS);
		createEReference(entityMockObjectsEClass, ENTITY_MOCK_OBJECTS__OBJECTS);

		entityMockObjectEClass = createEClass(ENTITY_MOCK_OBJECT);
		createEAttribute(entityMockObjectEClass, ENTITY_MOCK_OBJECT__NAME);
		createEReference(entityMockObjectEClass, ENTITY_MOCK_OBJECT__ENUMERATIONS);
		createEReference(entityMockObjectEClass, ENTITY_MOCK_OBJECT__ATTRIBUTES);
		createEReference(entityMockObjectEClass, ENTITY_MOCK_OBJECT__CALCULATIONS);

		entityMockObjectEnumEClass = createEClass(ENTITY_MOCK_OBJECT_ENUM);
		createEAttribute(entityMockObjectEnumEClass, ENTITY_MOCK_OBJECT_ENUM__NAME);
		createEReference(entityMockObjectEnumEClass, ENTITY_MOCK_OBJECT_ENUM__USING_RESOURCE);

		iEntityMockObjectAttributeEClass = createEClass(IENTITY_MOCK_OBJECT_ATTRIBUTE);
		createEAttribute(iEntityMockObjectAttributeEClass, IENTITY_MOCK_OBJECT_ATTRIBUTE__NAME);

		entityMockObjectPlainValueEClass = createEClass(ENTITY_MOCK_OBJECT_PLAIN_VALUE);
		createEAttribute(entityMockObjectPlainValueEClass, ENTITY_MOCK_OBJECT_PLAIN_VALUE__VALUES);

		entityMockObjectResourceValueEClass = createEClass(ENTITY_MOCK_OBJECT_RESOURCE_VALUE);
		createEReference(entityMockObjectResourceValueEClass, ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ENUM);
		createEReference(entityMockObjectResourceValueEClass, ENTITY_MOCK_OBJECT_RESOURCE_VALUE__RESOURCE_ATTRIBUTE);

		entityMockObjectArrayValueEClass = createEClass(ENTITY_MOCK_OBJECT_ARRAY_VALUE);
		createEReference(entityMockObjectArrayValueEClass, ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION);
		createEReference(entityMockObjectArrayValueEClass, ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS);

		entityMockObjectItemValueEClass = createEClass(ENTITY_MOCK_OBJECT_ITEM_VALUE);
		createEReference(entityMockObjectItemValueEClass, ENTITY_MOCK_OBJECT_ITEM_VALUE__DATAROW);
		createEAttribute(entityMockObjectItemValueEClass, ENTITY_MOCK_OBJECT_ITEM_VALUE__VALUES);

		entityMockObjectEmbedEClass = createEClass(ENTITY_MOCK_OBJECT_EMBED);
		createEReference(entityMockObjectEmbedEClass, ENTITY_MOCK_OBJECT_EMBED__OBJECT);

		entityMockObjectFunctionEClass = createEClass(ENTITY_MOCK_OBJECT_FUNCTION);
		createEReference(entityMockObjectFunctionEClass, ENTITY_MOCK_OBJECT_FUNCTION__OFTYPE);
		createEReference(entityMockObjectFunctionEClass, ENTITY_MOCK_OBJECT_FUNCTION__PARAMS);
		createEReference(entityMockObjectFunctionEClass, ENTITY_MOCK_OBJECT_FUNCTION__BODY);

		entityMockObjectFunctionParameterEClass = createEClass(ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER);
		createEReference(entityMockObjectFunctionParameterEClass, ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__PARAMETER_TYPE);
		createEReference(entityMockObjectFunctionParameterEClass, ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER__NAME);

		entityMockObjectFillEClass = createEClass(ENTITY_MOCK_OBJECT_FILL);
		createEReference(entityMockObjectFillEClass, ENTITY_MOCK_OBJECT_FILL__FILLER_TYPE);

		propertyFillerTypeEClass = createEClass(PROPERTY_FILLER_TYPE);

		propertyFillerDateTypeEClass = createEClass(PROPERTY_FILLER_DATE_TYPE);

		propertyFillerBooleanEClass = createEClass(PROPERTY_FILLER_BOOLEAN);

		propertyFillerDoubleTypeEClass = createEClass(PROPERTY_FILLER_DOUBLE_TYPE);

		propertyFillerIntegerTypeEClass = createEClass(PROPERTY_FILLER_INTEGER_TYPE);

		propertyFillerTextTypeEClass = createEClass(PROPERTY_FILLER_TEXT_TYPE);

		propertyFillerDateFutureEClass = createEClass(PROPERTY_FILLER_DATE_FUTURE);
		createEAttribute(propertyFillerDateFutureEClass, PROPERTY_FILLER_DATE_FUTURE__DATE_FUTURE_YEARS);

		propertyFillerDatePastEClass = createEClass(PROPERTY_FILLER_DATE_PAST);
		createEAttribute(propertyFillerDatePastEClass, PROPERTY_FILLER_DATE_PAST__DATE_PAST_YEARS);

		propertyFillerDateRangeEClass = createEClass(PROPERTY_FILLER_DATE_RANGE);
		createEAttribute(propertyFillerDateRangeEClass, PROPERTY_FILLER_DATE_RANGE__DATE_BEGIN_YEARS);
		createEAttribute(propertyFillerDateRangeEClass, PROPERTY_FILLER_DATE_RANGE__DATE_END_YEARS);

		propertyFillerSignedDoubleRangeEClass = createEClass(PROPERTY_FILLER_SIGNED_DOUBLE_RANGE);
		createEAttribute(propertyFillerSignedDoubleRangeEClass, PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__DECIMALS);
		createEAttribute(propertyFillerSignedDoubleRangeEClass, PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__BEGIN_RANGE);
		createEAttribute(propertyFillerSignedDoubleRangeEClass, PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__END_RANGE);
		createEReference(propertyFillerSignedDoubleRangeEClass, PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__BEGIN_RANGE_REF);
		createEReference(propertyFillerSignedDoubleRangeEClass, PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__END_RANGE_REF);
		createEAttribute(propertyFillerSignedDoubleRangeEClass, PROPERTY_FILLER_SIGNED_DOUBLE_RANGE__ROUNDED);

		propertyFillerSignedDoubleRandomEClass = createEClass(PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM);
		createEAttribute(propertyFillerSignedDoubleRandomEClass, PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM__ITEMS);

		propertyFillerSignedIntegerRangeEClass = createEClass(PROPERTY_FILLER_SIGNED_INTEGER_RANGE);
		createEAttribute(propertyFillerSignedIntegerRangeEClass, PROPERTY_FILLER_SIGNED_INTEGER_RANGE__BEGIN_RANGE);
		createEAttribute(propertyFillerSignedIntegerRangeEClass, PROPERTY_FILLER_SIGNED_INTEGER_RANGE__END_RANGE);
		createEReference(propertyFillerSignedIntegerRangeEClass, PROPERTY_FILLER_SIGNED_INTEGER_RANGE__BEGIN_RANGE_REF);
		createEReference(propertyFillerSignedIntegerRangeEClass, PROPERTY_FILLER_SIGNED_INTEGER_RANGE__END_RANGE_REF);
		createEAttribute(propertyFillerSignedIntegerRangeEClass, PROPERTY_FILLER_SIGNED_INTEGER_RANGE__ROUNDED);

		propertyFillerSignedIntegerRandomEClass = createEClass(PROPERTY_FILLER_SIGNED_INTEGER_RANDOM);
		createEAttribute(propertyFillerSignedIntegerRandomEClass, PROPERTY_FILLER_SIGNED_INTEGER_RANDOM__ITEMS);

		propertyFillerTextRandomEClass = createEClass(PROPERTY_FILLER_TEXT_RANDOM);
		createEAttribute(propertyFillerTextRandomEClass, PROPERTY_FILLER_TEXT_RANDOM__ITEMS);

		propertyFillerTextParagraphsEClass = createEClass(PROPERTY_FILLER_TEXT_PARAGRAPHS);
		createEAttribute(propertyFillerTextParagraphsEClass, PROPERTY_FILLER_TEXT_PARAGRAPHS__COUNT);

		propertyFillerTextSentencesEClass = createEClass(PROPERTY_FILLER_TEXT_SENTENCES);
		createEAttribute(propertyFillerTextSentencesEClass, PROPERTY_FILLER_TEXT_SENTENCES__COUNT);

		propertyFillerTextWordsEClass = createEClass(PROPERTY_FILLER_TEXT_WORDS);
		createEAttribute(propertyFillerTextWordsEClass, PROPERTY_FILLER_TEXT_WORDS__COUNT);

		propertyFillerUnsignedDoubleRangeEClass = createEClass(PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE);
		createEAttribute(propertyFillerUnsignedDoubleRangeEClass, PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__DECIMALS);
		createEAttribute(propertyFillerUnsignedDoubleRangeEClass, PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__BEGIN_RANGE);
		createEAttribute(propertyFillerUnsignedDoubleRangeEClass, PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__END_RANGE);
		createEReference(propertyFillerUnsignedDoubleRangeEClass, PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__BEGIN_RANGE_REF);
		createEReference(propertyFillerUnsignedDoubleRangeEClass, PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__END_RANGE_REF);
		createEAttribute(propertyFillerUnsignedDoubleRangeEClass, PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE__ROUNDED);

		propertyFillerUnsignedDoubleRandomEClass = createEClass(PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM);
		createEAttribute(propertyFillerUnsignedDoubleRandomEClass, PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM__ITEMS);

		propertyFillerUnsignedIntegerRangeEClass = createEClass(PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE);
		createEAttribute(propertyFillerUnsignedIntegerRangeEClass, PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__BEGIN_RANGE);
		createEAttribute(propertyFillerUnsignedIntegerRangeEClass, PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__END_RANGE);
		createEReference(propertyFillerUnsignedIntegerRangeEClass, PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__BEGIN_RANGE_REF);
		createEReference(propertyFillerUnsignedIntegerRangeEClass, PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__END_RANGE_REF);
		createEAttribute(propertyFillerUnsignedIntegerRangeEClass, PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE__ROUNDED);

		propertyFillerUnsignedIntegerRandomEClass = createEClass(PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM);
		createEAttribute(propertyFillerUnsignedIntegerRandomEClass, PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM__ITEMS);

		entityMockEntitiesEClass = createEClass(ENTITY_MOCK_ENTITIES);
		createEReference(entityMockEntitiesEClass, ENTITY_MOCK_ENTITIES__ENTITIES);

		entityMockEntityEClass = createEClass(ENTITY_MOCK_ENTITY);
		createEAttribute(entityMockEntityEClass, ENTITY_MOCK_ENTITY__NAME);
		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__ENTITY_REF);
		createEAttribute(entityMockEntityEClass, ENTITY_MOCK_ENTITY__MIN_ROWS);
		createEAttribute(entityMockEntityEClass, ENTITY_MOCK_ENTITY__MAX_ROWS);
		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__ITERATE);
		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__ITERATOR);
		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__TEMPLATES);
		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__ATTRIBUTES);
		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__CALCULATIONS);
		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__BY_RESOURCE);
		createEReference(entityMockEntityEClass, ENTITY_MOCK_ENTITY__BY_RESOURCE_ATTRIBUTES);
		createEAttribute(entityMockEntityEClass, ENTITY_MOCK_ENTITY__CREATE_BLOB_MAPPING);

		iIterateEClass = createEClass(IITERATE);

		integerIterateEClass = createEClass(INTEGER_ITERATE);
		createEAttribute(integerIterateEClass, INTEGER_ITERATE__FROM);
		createEAttribute(integerIterateEClass, INTEGER_ITERATE__UNTIL);
		createEAttribute(integerIterateEClass, INTEGER_ITERATE__STEP);

		dateIterateEClass = createEClass(DATE_ITERATE);
		createEReference(dateIterateEClass, DATE_ITERATE__FROM);
		createEReference(dateIterateEClass, DATE_ITERATE__UNTIL);
		createEAttribute(dateIterateEClass, DATE_ITERATE__STEP_COUNT);
		createEAttribute(dateIterateEClass, DATE_ITERATE__STEP_TYPE);

		dateEClass = createEClass(DATE);
		createEAttribute(dateEClass, DATE__YESTERDAY);
		createEAttribute(dateEClass, DATE__TODAY);
		createEAttribute(dateEClass, DATE__TOMORROW);
		createEAttribute(dateEClass, DATE__OFFSET_COUNT);
		createEAttribute(dateEClass, DATE__OFFSET_TYPE);
		createEAttribute(dateEClass, DATE__YEAR);
		createEAttribute(dateEClass, DATE__MONTH);
		createEAttribute(dateEClass, DATE__DAY);

		entityMockByResourceAttributeEClass = createEClass(ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE);
		createEReference(entityMockByResourceAttributeEClass, ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__ATTRIBUTE_REF);
		createEReference(entityMockByResourceAttributeEClass, ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE__RESOURCE_ATTRIBUTE);

		entityMockTemplateEClass = createEClass(ENTITY_MOCK_TEMPLATE);
		createEAttribute(entityMockTemplateEClass, ENTITY_MOCK_TEMPLATE__NAME);
		createEReference(entityMockTemplateEClass, ENTITY_MOCK_TEMPLATE__OBJECT);

		iEntityMockObjectUsableEClass = createEClass(IENTITY_MOCK_OBJECT_USABLE);

		iEntityMockEntityUsableEClass = createEClass(IENTITY_MOCK_ENTITY_USABLE);

		iEntityMockAttributeEClass = createEClass(IENTITY_MOCK_ATTRIBUTE);

		entityMockReferencedObjectAttributeEClass = createEClass(ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE);
		createEReference(entityMockReferencedObjectAttributeEClass, ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__TEMPLATE);
		createEReference(entityMockReferencedObjectAttributeEClass, ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__EMBEDDED);
		createEReference(entityMockReferencedObjectAttributeEClass, ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE__ATTRIBUTE);

		entityMockAttributeByObjectEClass = createEClass(ENTITY_MOCK_ATTRIBUTE_BY_OBJECT);
		createEReference(entityMockAttributeByObjectEClass, ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__ATTRIBUTE_REF);
		createEReference(entityMockAttributeByObjectEClass, ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__REFERENCE);
		createEReference(entityMockAttributeByObjectEClass, ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__RESOURCE_ENUM);
		createEReference(entityMockAttributeByObjectEClass, ENTITY_MOCK_ATTRIBUTE_BY_OBJECT__RESOURCE_ATTRIBUTE);

		entityMockAttributeFillerEClass = createEClass(ENTITY_MOCK_ATTRIBUTE_FILLER);
		createEReference(entityMockAttributeFillerEClass, ENTITY_MOCK_ATTRIBUTE_FILLER__ATTRIBUTE_REF);
		createEReference(entityMockAttributeFillerEClass, ENTITY_MOCK_ATTRIBUTE_FILLER__FILLER_TYPE);

		entityMockAttributeByReferenceEClass = createEClass(ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE);
		createEReference(entityMockAttributeByReferenceEClass, ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__ATTRIBUTE_REF);
		createEReference(entityMockAttributeByReferenceEClass, ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__MOCKED_ENTITY);
		createEAttribute(entityMockAttributeByReferenceEClass, ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE__OPTIONAL_FOR);

		entityMockEntityFunctionEClass = createEClass(ENTITY_MOCK_ENTITY_FUNCTION);
		createEReference(entityMockEntityFunctionEClass, ENTITY_MOCK_ENTITY_FUNCTION__ATTRIBUTE_REF);
		createEReference(entityMockEntityFunctionEClass, ENTITY_MOCK_ENTITY_FUNCTION__PARAMS);
		createEReference(entityMockEntityFunctionEClass, ENTITY_MOCK_ENTITY_FUNCTION__BODY);

		entityMockEntityNestedAttributeEClass = createEClass(ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE);
		createEReference(entityMockEntityNestedAttributeEClass, ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__REFERENCE);
		createEReference(entityMockEntityNestedAttributeEClass, ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE__ATTRIBUTE);

		entityMockEntityFunctionParameterEClass = createEClass(ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER);
		createEReference(entityMockEntityFunctionParameterEClass, ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__ATTRIBUTE_REF);
		createEReference(entityMockEntityFunctionParameterEClass, ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER__NESTED_ATTRIBUTE);

		// Create enums
		eDateStepTypeEEnum = createEEnum(EDATE_STEP_TYPE);

		// Create data types
		internalEObjectEDataType = createEDataType(INTERNAL_EOBJECT);
	}

	/**
	 * <!-- 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
		XtypePackage theXtypePackage = (XtypePackage)EPackage.Registry.INSTANCE.getEPackage(XtypePackage.eNS_URI);
		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
		OSBPTypesPackage theOSBPTypesPackage = (OSBPTypesPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPTypesPackage.eNS_URI);
		DataDSLPackage theDataDSLPackage = (DataDSLPackage)EPackage.Registry.INSTANCE.getEPackage(DataDSLPackage.eNS_URI);
		TypesPackage theTypesPackage = (TypesPackage)EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI);
		XbasePackage theXbasePackage = (XbasePackage)EPackage.Registry.INSTANCE.getEPackage(XbasePackage.eNS_URI);
		OSBPEntityPackage theOSBPEntityPackage = (OSBPEntityPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPEntityPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		entityMockPackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
		entityMockResourceEClass.getESuperTypes().add(theOSBPTypesPackage.getLEnum());
		entityMockResourceAttributeEClass.getESuperTypes().add(theOSBPTypesPackage.getLEnum());
		entityMockResourceDataRowEClass.getESuperTypes().add(theOSBPTypesPackage.getLEnumLiteral());
		entityMockObjectEnumEClass.getESuperTypes().add(this.getIEntityMockObjectUsable());
		iEntityMockObjectAttributeEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
		entityMockObjectPlainValueEClass.getESuperTypes().add(this.getIEntityMockObjectAttribute());
		entityMockObjectPlainValueEClass.getESuperTypes().add(this.getIEntityMockObjectUsable());
		entityMockObjectResourceValueEClass.getESuperTypes().add(this.getIEntityMockObjectAttribute());
		entityMockObjectResourceValueEClass.getESuperTypes().add(this.getIEntityMockObjectUsable());
		entityMockObjectArrayValueEClass.getESuperTypes().add(this.getIEntityMockObjectAttribute());
		entityMockObjectArrayValueEClass.getESuperTypes().add(this.getIEntityMockObjectUsable());
		entityMockObjectEmbedEClass.getESuperTypes().add(this.getIEntityMockObjectAttribute());
		entityMockObjectEmbedEClass.getESuperTypes().add(this.getIEntityMockObjectUsable());
		entityMockObjectEmbedEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
		entityMockObjectFunctionEClass.getESuperTypes().add(this.getIEntityMockObjectAttribute());
		entityMockObjectFunctionEClass.getESuperTypes().add(this.getIEntityMockObjectUsable());
		entityMockObjectFillEClass.getESuperTypes().add(this.getIEntityMockObjectAttribute());
		entityMockObjectFillEClass.getESuperTypes().add(this.getIEntityMockObjectUsable());
		propertyFillerTypeEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
		propertyFillerDateTypeEClass.getESuperTypes().add(this.getPropertyFillerType());
		propertyFillerBooleanEClass.getESuperTypes().add(this.getPropertyFillerType());
		propertyFillerDoubleTypeEClass.getESuperTypes().add(this.getPropertyFillerType());
		propertyFillerIntegerTypeEClass.getESuperTypes().add(this.getPropertyFillerType());
		propertyFillerTextTypeEClass.getESuperTypes().add(this.getPropertyFillerType());
		propertyFillerDateFutureEClass.getESuperTypes().add(this.getPropertyFillerDateType());
		propertyFillerDatePastEClass.getESuperTypes().add(this.getPropertyFillerDateType());
		propertyFillerDateRangeEClass.getESuperTypes().add(this.getPropertyFillerDateType());
		propertyFillerSignedDoubleRangeEClass.getESuperTypes().add(this.getPropertyFillerDoubleType());
		propertyFillerSignedDoubleRandomEClass.getESuperTypes().add(this.getPropertyFillerDoubleType());
		propertyFillerSignedIntegerRangeEClass.getESuperTypes().add(this.getPropertyFillerIntegerType());
		propertyFillerSignedIntegerRandomEClass.getESuperTypes().add(this.getPropertyFillerIntegerType());
		propertyFillerTextRandomEClass.getESuperTypes().add(this.getPropertyFillerTextType());
		propertyFillerTextParagraphsEClass.getESuperTypes().add(this.getPropertyFillerTextType());
		propertyFillerTextSentencesEClass.getESuperTypes().add(this.getPropertyFillerTextType());
		propertyFillerTextWordsEClass.getESuperTypes().add(this.getPropertyFillerTextType());
		propertyFillerUnsignedDoubleRangeEClass.getESuperTypes().add(this.getPropertyFillerDoubleType());
		propertyFillerUnsignedDoubleRandomEClass.getESuperTypes().add(this.getPropertyFillerDoubleType());
		propertyFillerUnsignedIntegerRangeEClass.getESuperTypes().add(this.getPropertyFillerIntegerType());
		propertyFillerUnsignedIntegerRandomEClass.getESuperTypes().add(this.getPropertyFillerIntegerType());
		entityMockEntityEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
		integerIterateEClass.getESuperTypes().add(this.getIIterate());
		dateIterateEClass.getESuperTypes().add(this.getIIterate());
		entityMockTemplateEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
		iEntityMockObjectUsableEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
		iEntityMockEntityUsableEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
		iEntityMockAttributeEClass.getESuperTypes().add(this.getIEntityMockEntityUsable());
		entityMockReferencedObjectAttributeEClass.getESuperTypes().add(this.getEntityMockLazyResolver());
		entityMockAttributeByObjectEClass.getESuperTypes().add(this.getIEntityMockAttribute());
		entityMockAttributeFillerEClass.getESuperTypes().add(this.getIEntityMockAttribute());
		entityMockAttributeByReferenceEClass.getESuperTypes().add(this.getIEntityMockAttribute());
		entityMockEntityFunctionEClass.getESuperTypes().add(this.getIEntityMockEntityUsable());

		// Initialize classes, features, and operations; add parameters
		initEClass(entityMockModelEClass, EntityMockModel.class, "EntityMockModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, EntityMockModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockModel_Packages(), this.getEntityMockPackage(), null, "packages", null, 0, -1, EntityMockModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockLazyResolverEClass, EntityMockLazyResolver.class, "EntityMockLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		EOperation op = initEOperation(getEntityMockLazyResolver__EResolveProxy__InternalEObject(), theEcorePackage.getEObject(), "eResolveProxy", 0, 1, !IS_UNIQUE, IS_ORDERED);
		addEParameter(op, this.getInternalEObject(), "proxy", 0, 1, !IS_UNIQUE, IS_ORDERED);

		initEClass(entityMockPackageEClass, EntityMockPackage.class, "EntityMockPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockPackage_Mocks(), this.getEntityMock(), null, "mocks", null, 0, -1, EntityMockPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockEClass, EntityMock.class, "EntityMock", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getEntityMock_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getEntityMock_Description(), theEcorePackage.getEBoolean(), "description", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getEntityMock_DescriptionValue(), theEcorePackage.getEString(), "descriptionValue", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getEntityMock_RunPriority(), theEcorePackage.getEInt(), "runPriority", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMock_Datainterchanges(), this.getRunningDataInterchanges(), null, "datainterchanges", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMock_Resources(), this.getEntityMockResources(), null, "resources", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMock_Objects(), this.getEntityMockObjects(), null, "objects", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMock_Entities(), this.getEntityMockEntities(), null, "entities", null, 0, 1, EntityMock.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(runningDataInterchangesEClass, RunningDataInterchanges.class, "RunningDataInterchanges", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRunningDataInterchanges_Datainterchanges(), this.getRunningDataInterchange(), null, "datainterchanges", null, 0, -1, RunningDataInterchanges.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(runningDataInterchangeEClass, RunningDataInterchange.class, "RunningDataInterchange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRunningDataInterchange_DatainterchangeRef(), theDataDSLPackage.getDataInterchange(), null, "datainterchangeRef", null, 0, 1, RunningDataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getRunningDataInterchange_FileURL(), theEcorePackage.getEString(), "fileURL", null, 0, 1, RunningDataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockResourcesEClass, EntityMockResources.class, "EntityMockResources", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockResources_Resources(), this.getEntityMockResource(), null, "resources", null, 0, -1, EntityMockResources.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockResourceEClass, EntityMockResource.class, "EntityMockResource", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockResource_Attributes(), this.getEntityMockResourceAttribute(), null, "attributes", null, 0, -1, EntityMockResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockResource_Datarows(), this.getEntityMockResourceDataRow(), null, "datarows", null, 0, -1, EntityMockResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockResourceAttributeEClass, EntityMockResourceAttribute.class, "EntityMockResourceAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(entityMockResourceDataRowEClass, EntityMockResourceDataRow.class, "EntityMockResourceDataRow", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getEntityMockResourceDataRow_Values(), theEcorePackage.getEString(), "values", null, 0, -1, EntityMockResourceDataRow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectsEClass, EntityMockObjects.class, "EntityMockObjects", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockObjects_Objects(), this.getEntityMockObject(), null, "objects", null, 0, -1, EntityMockObjects.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectEClass, EntityMockObject.class, "EntityMockObject", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getEntityMockObject_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMockObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObject_Enumerations(), this.getEntityMockObjectEnum(), null, "enumerations", null, 0, -1, EntityMockObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObject_Attributes(), this.getIEntityMockObjectAttribute(), null, "attributes", null, 0, -1, EntityMockObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObject_Calculations(), this.getEntityMockObjectFunction(), null, "calculations", null, 0, -1, EntityMockObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectEnumEClass, EntityMockObjectEnum.class, "EntityMockObjectEnum", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getEntityMockObjectEnum_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMockObjectEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObjectEnum_UsingResource(), theOSBPTypesPackage.getLEnum(), null, "usingResource", null, 0, 1, EntityMockObjectEnum.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(iEntityMockObjectAttributeEClass, IEntityMockObjectAttribute.class, "IEntityMockObjectAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getIEntityMockObjectAttribute_Name(), theEcorePackage.getEString(), "name", null, 0, 1, IEntityMockObjectAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectPlainValueEClass, EntityMockObjectPlainValue.class, "EntityMockObjectPlainValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getEntityMockObjectPlainValue_Values(), theEcorePackage.getEString(), "values", null, 0, -1, EntityMockObjectPlainValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectResourceValueEClass, EntityMockObjectResourceValue.class, "EntityMockObjectResourceValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockObjectResourceValue_ResourceEnum(), this.getEntityMockObjectEnum(), null, "resourceEnum", null, 0, 1, EntityMockObjectResourceValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObjectResourceValue_ResourceAttribute(), this.getEntityMockResourceAttribute(), null, "resourceAttribute", null, 0, 1, EntityMockObjectResourceValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectArrayValueEClass, EntityMockObjectArrayValue.class, "EntityMockObjectArrayValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockObjectArrayValue_Enumeration(), this.getEntityMockObjectEnum(), null, "enumeration", null, 0, 1, EntityMockObjectArrayValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObjectArrayValue_Items(), this.getEntityMockObjectItemValue(), null, "items", null, 0, -1, EntityMockObjectArrayValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectItemValueEClass, EntityMockObjectItemValue.class, "EntityMockObjectItemValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockObjectItemValue_Datarow(), theOSBPTypesPackage.getLEnumLiteral(), null, "datarow", null, 0, 1, EntityMockObjectItemValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getEntityMockObjectItemValue_Values(), theEcorePackage.getEString(), "values", null, 0, -1, EntityMockObjectItemValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectEmbedEClass, EntityMockObjectEmbed.class, "EntityMockObjectEmbed", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockObjectEmbed_Object(), this.getEntityMockObject(), null, "object", null, 0, 1, EntityMockObjectEmbed.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectFunctionEClass, EntityMockObjectFunction.class, "EntityMockObjectFunction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockObjectFunction_Oftype(), theTypesPackage.getJvmTypeReference(), null, "oftype", null, 0, 1, EntityMockObjectFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObjectFunction_Params(), this.getEntityMockObjectFunctionParameter(), null, "params", null, 0, -1, EntityMockObjectFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObjectFunction_Body(), theXbasePackage.getXExpression(), null, "body", null, 0, 1, EntityMockObjectFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectFunctionParameterEClass, EntityMockObjectFunctionParameter.class, "EntityMockObjectFunctionParameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockObjectFunctionParameter_ParameterType(), theTypesPackage.getJvmTypeReference(), null, "parameterType", null, 0, 1, EntityMockObjectFunctionParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockObjectFunctionParameter_Name(), this.getIEntityMockObjectUsable(), null, "name", null, 0, 1, EntityMockObjectFunctionParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockObjectFillEClass, EntityMockObjectFill.class, "EntityMockObjectFill", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockObjectFill_FillerType(), this.getPropertyFillerType(), null, "fillerType", null, 0, 1, EntityMockObjectFill.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerTypeEClass, PropertyFillerType.class, "PropertyFillerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(propertyFillerDateTypeEClass, PropertyFillerDateType.class, "PropertyFillerDateType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(propertyFillerBooleanEClass, PropertyFillerBoolean.class, "PropertyFillerBoolean", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(propertyFillerDoubleTypeEClass, PropertyFillerDoubleType.class, "PropertyFillerDoubleType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(propertyFillerIntegerTypeEClass, PropertyFillerIntegerType.class, "PropertyFillerIntegerType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(propertyFillerTextTypeEClass, PropertyFillerTextType.class, "PropertyFillerTextType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(propertyFillerDateFutureEClass, PropertyFillerDateFuture.class, "PropertyFillerDateFuture", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerDateFuture_DateFutureYears(), theEcorePackage.getEInt(), "dateFutureYears", null, 0, 1, PropertyFillerDateFuture.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerDatePastEClass, PropertyFillerDatePast.class, "PropertyFillerDatePast", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerDatePast_DatePastYears(), theEcorePackage.getEInt(), "datePastYears", null, 0, 1, PropertyFillerDatePast.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerDateRangeEClass, PropertyFillerDateRange.class, "PropertyFillerDateRange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerDateRange_DateBeginYears(), theEcorePackage.getEInt(), "dateBeginYears", null, 0, 1, PropertyFillerDateRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerDateRange_DateEndYears(), theEcorePackage.getEInt(), "dateEndYears", null, 0, 1, PropertyFillerDateRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerSignedDoubleRangeEClass, PropertyFillerSignedDoubleRange.class, "PropertyFillerSignedDoubleRange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerSignedDoubleRange_Decimals(), theEcorePackage.getEInt(), "decimals", null, 0, 1, PropertyFillerSignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerSignedDoubleRange_BeginRange(), theEcorePackage.getEDouble(), "beginRange", null, 0, 1, PropertyFillerSignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerSignedDoubleRange_EndRange(), theEcorePackage.getEDouble(), "endRange", null, 0, 1, PropertyFillerSignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPropertyFillerSignedDoubleRange_BeginRangeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "beginRangeRef", null, 0, 1, PropertyFillerSignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPropertyFillerSignedDoubleRange_EndRangeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "endRangeRef", null, 0, 1, PropertyFillerSignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerSignedDoubleRange_Rounded(), theEcorePackage.getEDouble(), "rounded", null, 0, 1, PropertyFillerSignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerSignedDoubleRandomEClass, PropertyFillerSignedDoubleRandom.class, "PropertyFillerSignedDoubleRandom", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerSignedDoubleRandom_Items(), theEcorePackage.getEDouble(), "items", null, 0, -1, PropertyFillerSignedDoubleRandom.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerSignedIntegerRangeEClass, PropertyFillerSignedIntegerRange.class, "PropertyFillerSignedIntegerRange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerSignedIntegerRange_BeginRange(), theEcorePackage.getEInt(), "beginRange", null, 0, 1, PropertyFillerSignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerSignedIntegerRange_EndRange(), theEcorePackage.getEInt(), "endRange", null, 0, 1, PropertyFillerSignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPropertyFillerSignedIntegerRange_BeginRangeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "beginRangeRef", null, 0, 1, PropertyFillerSignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPropertyFillerSignedIntegerRange_EndRangeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "endRangeRef", null, 0, 1, PropertyFillerSignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerSignedIntegerRange_Rounded(), theEcorePackage.getEInt(), "rounded", null, 0, 1, PropertyFillerSignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerSignedIntegerRandomEClass, PropertyFillerSignedIntegerRandom.class, "PropertyFillerSignedIntegerRandom", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerSignedIntegerRandom_Items(), theEcorePackage.getEInt(), "items", null, 0, -1, PropertyFillerSignedIntegerRandom.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerTextRandomEClass, PropertyFillerTextRandom.class, "PropertyFillerTextRandom", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerTextRandom_Items(), theEcorePackage.getEString(), "items", null, 0, -1, PropertyFillerTextRandom.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerTextParagraphsEClass, PropertyFillerTextParagraphs.class, "PropertyFillerTextParagraphs", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerTextParagraphs_Count(), theEcorePackage.getEInt(), "count", null, 0, 1, PropertyFillerTextParagraphs.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerTextSentencesEClass, PropertyFillerTextSentences.class, "PropertyFillerTextSentences", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerTextSentences_Count(), theEcorePackage.getEInt(), "count", null, 0, 1, PropertyFillerTextSentences.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerTextWordsEClass, PropertyFillerTextWords.class, "PropertyFillerTextWords", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerTextWords_Count(), theEcorePackage.getEInt(), "count", null, 0, 1, PropertyFillerTextWords.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerUnsignedDoubleRangeEClass, PropertyFillerUnsignedDoubleRange.class, "PropertyFillerUnsignedDoubleRange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerUnsignedDoubleRange_Decimals(), theEcorePackage.getEInt(), "decimals", null, 0, 1, PropertyFillerUnsignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerUnsignedDoubleRange_BeginRange(), theEcorePackage.getEDouble(), "beginRange", null, 0, 1, PropertyFillerUnsignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerUnsignedDoubleRange_EndRange(), theEcorePackage.getEDouble(), "endRange", null, 0, 1, PropertyFillerUnsignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPropertyFillerUnsignedDoubleRange_BeginRangeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "beginRangeRef", null, 0, 1, PropertyFillerUnsignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPropertyFillerUnsignedDoubleRange_EndRangeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "endRangeRef", null, 0, 1, PropertyFillerUnsignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerUnsignedDoubleRange_Rounded(), theEcorePackage.getEDouble(), "rounded", null, 0, 1, PropertyFillerUnsignedDoubleRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerUnsignedDoubleRandomEClass, PropertyFillerUnsignedDoubleRandom.class, "PropertyFillerUnsignedDoubleRandom", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerUnsignedDoubleRandom_Items(), theEcorePackage.getEDouble(), "items", null, 0, -1, PropertyFillerUnsignedDoubleRandom.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerUnsignedIntegerRangeEClass, PropertyFillerUnsignedIntegerRange.class, "PropertyFillerUnsignedIntegerRange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerUnsignedIntegerRange_BeginRange(), theEcorePackage.getEInt(), "beginRange", null, 0, 1, PropertyFillerUnsignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerUnsignedIntegerRange_EndRange(), theEcorePackage.getEInt(), "endRange", null, 0, 1, PropertyFillerUnsignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPropertyFillerUnsignedIntegerRange_BeginRangeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "beginRangeRef", null, 0, 1, PropertyFillerUnsignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getPropertyFillerUnsignedIntegerRange_EndRangeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "endRangeRef", null, 0, 1, PropertyFillerUnsignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getPropertyFillerUnsignedIntegerRange_Rounded(), theEcorePackage.getEInt(), "rounded", null, 0, 1, PropertyFillerUnsignedIntegerRange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(propertyFillerUnsignedIntegerRandomEClass, PropertyFillerUnsignedIntegerRandom.class, "PropertyFillerUnsignedIntegerRandom", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getPropertyFillerUnsignedIntegerRandom_Items(), theEcorePackage.getEInt(), "items", null, 0, -1, PropertyFillerUnsignedIntegerRandom.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockEntitiesEClass, EntityMockEntities.class, "EntityMockEntities", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockEntities_Entities(), this.getEntityMockEntity(), null, "entities", null, 0, -1, EntityMockEntities.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockEntityEClass, EntityMockEntity.class, "EntityMockEntity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getEntityMockEntity_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntity_EntityRef(), theOSBPEntityPackage.getLEntity(), null, "entityRef", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getEntityMockEntity_MinRows(), theEcorePackage.getEInt(), "minRows", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getEntityMockEntity_MaxRows(), theEcorePackage.getEInt(), "maxRows", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntity_Iterate(), this.getIIterate(), null, "iterate", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntity_Iterator(), theOSBPEntityPackage.getLEntityAttribute(), null, "iterator", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntity_Templates(), this.getEntityMockTemplate(), null, "templates", null, 0, -1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntity_Attributes(), this.getIEntityMockAttribute(), null, "attributes", null, 0, -1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntity_Calculations(), this.getEntityMockEntityFunction(), null, "calculations", null, 0, -1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntity_ByResource(), this.getEntityMockResource(), null, "byResource", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntity_ByResourceAttributes(), this.getEntityMockByResourceAttribute(), null, "byResourceAttributes", null, 0, -1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getEntityMockEntity_CreateBlobMapping(), theEcorePackage.getEBoolean(), "createBlobMapping", null, 0, 1, EntityMockEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(iIterateEClass, IIterate.class, "IIterate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(integerIterateEClass, IntegerIterate.class, "IntegerIterate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getIntegerIterate_From(), theEcorePackage.getEInt(), "from", null, 0, 1, IntegerIterate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getIntegerIterate_Until(), theEcorePackage.getEInt(), "until", null, 0, 1, IntegerIterate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getIntegerIterate_Step(), theEcorePackage.getEInt(), "step", null, 0, 1, IntegerIterate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dateIterateEClass, DateIterate.class, "DateIterate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDateIterate_From(), this.getDate(), null, "from", null, 0, 1, DateIterate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDateIterate_Until(), this.getDate(), null, "until", null, 0, 1, DateIterate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDateIterate_StepCount(), theEcorePackage.getEInt(), "stepCount", null, 0, 1, DateIterate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDateIterate_StepType(), this.getEDateStepType(), "stepType", null, 0, 1, DateIterate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dateEClass, Date.class, "Date", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDate_Yesterday(), theEcorePackage.getEBoolean(), "yesterday", null, 0, 1, Date.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDate_Today(), theEcorePackage.getEBoolean(), "today", null, 0, 1, Date.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDate_Tomorrow(), theEcorePackage.getEBoolean(), "tomorrow", null, 0, 1, Date.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDate_OffsetCount(), theEcorePackage.getEInt(), "offsetCount", null, 0, 1, Date.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDate_OffsetType(), this.getEDateStepType(), "offsetType", null, 0, 1, Date.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDate_Year(), theEcorePackage.getEInt(), "year", null, 0, 1, Date.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDate_Month(), theEcorePackage.getEInt(), "month", null, 0, 1, Date.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDate_Day(), theEcorePackage.getEInt(), "day", null, 0, 1, Date.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockByResourceAttributeEClass, EntityMockByResourceAttribute.class, "EntityMockByResourceAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockByResourceAttribute_AttributeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "attributeRef", null, 0, 1, EntityMockByResourceAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockByResourceAttribute_ResourceAttribute(), this.getEntityMockResourceAttribute(), null, "resourceAttribute", null, 0, 1, EntityMockByResourceAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockTemplateEClass, EntityMockTemplate.class, "EntityMockTemplate", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getEntityMockTemplate_Name(), theEcorePackage.getEString(), "name", null, 0, 1, EntityMockTemplate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockTemplate_Object(), this.getEntityMockObject(), null, "object", null, 0, 1, EntityMockTemplate.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(iEntityMockObjectUsableEClass, IEntityMockObjectUsable.class, "IEntityMockObjectUsable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(iEntityMockEntityUsableEClass, IEntityMockEntityUsable.class, "IEntityMockEntityUsable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(iEntityMockAttributeEClass, IEntityMockAttribute.class, "IEntityMockAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(entityMockReferencedObjectAttributeEClass, EntityMockReferencedObjectAttribute.class, "EntityMockReferencedObjectAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockReferencedObjectAttribute_Template(), this.getEntityMockTemplate(), null, "template", null, 0, 1, EntityMockReferencedObjectAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockReferencedObjectAttribute_Embedded(), this.getEntityMockObjectEmbed(), null, "embedded", null, 0, -1, EntityMockReferencedObjectAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockReferencedObjectAttribute_Attribute(), this.getIEntityMockObjectUsable(), null, "attribute", null, 0, 1, EntityMockReferencedObjectAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockAttributeByObjectEClass, EntityMockAttributeByObject.class, "EntityMockAttributeByObject", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockAttributeByObject_AttributeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "attributeRef", null, 0, 1, EntityMockAttributeByObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockAttributeByObject_Reference(), this.getEntityMockReferencedObjectAttribute(), null, "reference", null, 0, 1, EntityMockAttributeByObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockAttributeByObject_ResourceEnum(), this.getEntityMockObjectEnum(), null, "resourceEnum", null, 0, 1, EntityMockAttributeByObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockAttributeByObject_ResourceAttribute(), this.getEntityMockResourceAttribute(), null, "resourceAttribute", null, 0, 1, EntityMockAttributeByObject.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockAttributeFillerEClass, EntityMockAttributeFiller.class, "EntityMockAttributeFiller", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockAttributeFiller_AttributeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "attributeRef", null, 0, 1, EntityMockAttributeFiller.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockAttributeFiller_FillerType(), this.getPropertyFillerType(), null, "fillerType", null, 0, 1, EntityMockAttributeFiller.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockAttributeByReferenceEClass, EntityMockAttributeByReference.class, "EntityMockAttributeByReference", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockAttributeByReference_AttributeRef(), theOSBPEntityPackage.getLEntityReference(), null, "attributeRef", null, 0, 1, EntityMockAttributeByReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockAttributeByReference_MockedEntity(), this.getEntityMockEntity(), null, "mockedEntity", null, 0, 1, EntityMockAttributeByReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getEntityMockAttributeByReference_OptionalFor(), theEcorePackage.getEInt(), "optionalFor", null, 0, 1, EntityMockAttributeByReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockEntityFunctionEClass, EntityMockEntityFunction.class, "EntityMockEntityFunction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockEntityFunction_AttributeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "attributeRef", null, 0, 1, EntityMockEntityFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntityFunction_Params(), this.getEntityMockEntityFunctionParameter(), null, "params", null, 0, -1, EntityMockEntityFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntityFunction_Body(), theXbasePackage.getXExpression(), null, "body", null, 0, 1, EntityMockEntityFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockEntityNestedAttributeEClass, EntityMockEntityNestedAttribute.class, "EntityMockEntityNestedAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockEntityNestedAttribute_Reference(), theOSBPEntityPackage.getLEntityReference(), null, "reference", null, 0, 1, EntityMockEntityNestedAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntityNestedAttribute_Attribute(), theOSBPEntityPackage.getLEntityAttribute(), null, "attribute", null, 0, 1, EntityMockEntityNestedAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(entityMockEntityFunctionParameterEClass, EntityMockEntityFunctionParameter.class, "EntityMockEntityFunctionParameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getEntityMockEntityFunctionParameter_AttributeRef(), theOSBPEntityPackage.getLEntityAttribute(), null, "attributeRef", null, 0, 1, EntityMockEntityFunctionParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getEntityMockEntityFunctionParameter_NestedAttribute(), this.getEntityMockEntityNestedAttribute(), null, "nestedAttribute", null, 0, 1, EntityMockEntityFunctionParameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(eDateStepTypeEEnum, EDateStepType.class, "EDateStepType");
		addEEnumLiteral(eDateStepTypeEEnum, EDateStepType.DAYS);
		addEEnumLiteral(eDateStepTypeEEnum, EDateStepType.WEEKS);
		addEEnumLiteral(eDateStepTypeEEnum, EDateStepType.MONTHS);
		addEEnumLiteral(eDateStepTypeEEnum, EDateStepType.YEARS);

		// Initialize data types
		initEDataType(internalEObjectEDataType, InternalEObject.class, "InternalEObject", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);

		// Create resource
		createResource(eNS_URI);

		// Create annotations
		// http://www.eclipse.org/emf/2002/Ecore
		createEcoreAnnotations();
	}

	/**
	 * Initializes the annotations for <b>http://www.eclipse.org/emf/2002/Ecore</b>.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void createEcoreAnnotations() {
		String source = "http://www.eclipse.org/emf/2002/Ecore";	
		addAnnotation
		  (this, 
		   source, 
		   new String[] {
			 "rootPackage", "entitymockdsl"
		   });
	}

} //EntityMockDSLPackageImpl
