/**
 * 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.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.InternalEObject;

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

import org.eclipse.emf.ecore.plugin.EcorePlugin;

import org.eclipse.osbp.xtext.entitymock.*;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class EntityMockDSLFactoryImpl extends EFactoryImpl implements EntityMockDSLFactory {
	/**
	 * Creates the default factory implementation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static EntityMockDSLFactory init() {
		try {
			EntityMockDSLFactory theEntityMockDSLFactory = (EntityMockDSLFactory)EPackage.Registry.INSTANCE.getEFactory(EntityMockDSLPackage.eNS_URI);
			if (theEntityMockDSLFactory != null) {
				return theEntityMockDSLFactory;
			}
		}
		catch (Exception exception) {
			EcorePlugin.INSTANCE.log(exception);
		}
		return new EntityMockDSLFactoryImpl();
	}

	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockDSLFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case EntityMockDSLPackage.ENTITY_MOCK_MODEL: return createEntityMockModel();
			case EntityMockDSLPackage.ENTITY_MOCK_LAZY_RESOLVER: return createEntityMockLazyResolver();
			case EntityMockDSLPackage.ENTITY_MOCK_PACKAGE: return createEntityMockPackage();
			case EntityMockDSLPackage.ENTITY_MOCK: return createEntityMock();
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGES: return createRunningDataInterchanges();
			case EntityMockDSLPackage.RUNNING_DATA_INTERCHANGE: return createRunningDataInterchange();
			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCES: return createEntityMockResources();
			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCE: return createEntityMockResource();
			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCE_ATTRIBUTE: return createEntityMockResourceAttribute();
			case EntityMockDSLPackage.ENTITY_MOCK_RESOURCE_DATA_ROW: return createEntityMockResourceDataRow();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECTS: return createEntityMockObjects();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT: return createEntityMockObject();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ENUM: return createEntityMockObjectEnum();
			case EntityMockDSLPackage.IENTITY_MOCK_OBJECT_ATTRIBUTE: return createIEntityMockObjectAttribute();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_PLAIN_VALUE: return createEntityMockObjectPlainValue();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_RESOURCE_VALUE: return createEntityMockObjectResourceValue();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE: return createEntityMockObjectArrayValue();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ITEM_VALUE: return createEntityMockObjectItemValue();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_EMBED: return createEntityMockObjectEmbed();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_FUNCTION: return createEntityMockObjectFunction();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_FUNCTION_PARAMETER: return createEntityMockObjectFunctionParameter();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_FILL: return createEntityMockObjectFill();
			case EntityMockDSLPackage.PROPERTY_FILLER_TYPE: return createPropertyFillerType();
			case EntityMockDSLPackage.PROPERTY_FILLER_DATE_TYPE: return createPropertyFillerDateType();
			case EntityMockDSLPackage.PROPERTY_FILLER_BOOLEAN: return createPropertyFillerBoolean();
			case EntityMockDSLPackage.PROPERTY_FILLER_DOUBLE_TYPE: return createPropertyFillerDoubleType();
			case EntityMockDSLPackage.PROPERTY_FILLER_INTEGER_TYPE: return createPropertyFillerIntegerType();
			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_TYPE: return createPropertyFillerTextType();
			case EntityMockDSLPackage.PROPERTY_FILLER_DATE_FUTURE: return createPropertyFillerDateFuture();
			case EntityMockDSLPackage.PROPERTY_FILLER_DATE_PAST: return createPropertyFillerDatePast();
			case EntityMockDSLPackage.PROPERTY_FILLER_DATE_RANGE: return createPropertyFillerDateRange();
			case EntityMockDSLPackage.PROPERTY_FILLER_SIGNED_DOUBLE_RANGE: return createPropertyFillerSignedDoubleRange();
			case EntityMockDSLPackage.PROPERTY_FILLER_SIGNED_DOUBLE_RANDOM: return createPropertyFillerSignedDoubleRandom();
			case EntityMockDSLPackage.PROPERTY_FILLER_SIGNED_INTEGER_RANGE: return createPropertyFillerSignedIntegerRange();
			case EntityMockDSLPackage.PROPERTY_FILLER_SIGNED_INTEGER_RANDOM: return createPropertyFillerSignedIntegerRandom();
			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_RANDOM: return createPropertyFillerTextRandom();
			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_PARAGRAPHS: return createPropertyFillerTextParagraphs();
			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_SENTENCES: return createPropertyFillerTextSentences();
			case EntityMockDSLPackage.PROPERTY_FILLER_TEXT_WORDS: return createPropertyFillerTextWords();
			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_DOUBLE_RANGE: return createPropertyFillerUnsignedDoubleRange();
			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_DOUBLE_RANDOM: return createPropertyFillerUnsignedDoubleRandom();
			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_INTEGER_RANGE: return createPropertyFillerUnsignedIntegerRange();
			case EntityMockDSLPackage.PROPERTY_FILLER_UNSIGNED_INTEGER_RANDOM: return createPropertyFillerUnsignedIntegerRandom();
			case EntityMockDSLPackage.ENTITY_MOCK_ENTITIES: return createEntityMockEntities();
			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY: return createEntityMockEntity();
			case EntityMockDSLPackage.IITERATE: return createIIterate();
			case EntityMockDSLPackage.INTEGER_ITERATE: return createIntegerIterate();
			case EntityMockDSLPackage.DATE_ITERATE: return createDateIterate();
			case EntityMockDSLPackage.DATE: return createDate();
			case EntityMockDSLPackage.ENTITY_MOCK_BY_RESOURCE_ATTRIBUTE: return createEntityMockByResourceAttribute();
			case EntityMockDSLPackage.ENTITY_MOCK_TEMPLATE: return createEntityMockTemplate();
			case EntityMockDSLPackage.IENTITY_MOCK_OBJECT_USABLE: return createIEntityMockObjectUsable();
			case EntityMockDSLPackage.IENTITY_MOCK_ENTITY_USABLE: return createIEntityMockEntityUsable();
			case EntityMockDSLPackage.IENTITY_MOCK_ATTRIBUTE: return createIEntityMockAttribute();
			case EntityMockDSLPackage.ENTITY_MOCK_REFERENCED_OBJECT_ATTRIBUTE: return createEntityMockReferencedObjectAttribute();
			case EntityMockDSLPackage.ENTITY_MOCK_ATTRIBUTE_BY_OBJECT: return createEntityMockAttributeByObject();
			case EntityMockDSLPackage.ENTITY_MOCK_ATTRIBUTE_FILLER: return createEntityMockAttributeFiller();
			case EntityMockDSLPackage.ENTITY_MOCK_ATTRIBUTE_BY_REFERENCE: return createEntityMockAttributeByReference();
			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION: return createEntityMockEntityFunction();
			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_NESTED_ATTRIBUTE: return createEntityMockEntityNestedAttribute();
			case EntityMockDSLPackage.ENTITY_MOCK_ENTITY_FUNCTION_PARAMETER: return createEntityMockEntityFunctionParameter();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object createFromString(EDataType eDataType, String initialValue) {
		switch (eDataType.getClassifierID()) {
			case EntityMockDSLPackage.EDATE_STEP_TYPE:
				return createEDateStepTypeFromString(eDataType, initialValue);
			case EntityMockDSLPackage.INTERNAL_EOBJECT:
				return createInternalEObjectFromString(eDataType, initialValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String convertToString(EDataType eDataType, Object instanceValue) {
		switch (eDataType.getClassifierID()) {
			case EntityMockDSLPackage.EDATE_STEP_TYPE:
				return convertEDateStepTypeToString(eDataType, instanceValue);
			case EntityMockDSLPackage.INTERNAL_EOBJECT:
				return convertInternalEObjectToString(eDataType, instanceValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockModel createEntityMockModel() {
		EntityMockModelImpl entityMockModel = new EntityMockModelImpl();
		return entityMockModel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockLazyResolver createEntityMockLazyResolver() {
		EntityMockLazyResolverImpl entityMockLazyResolver = new EntityMockLazyResolverImpl();
		return entityMockLazyResolver;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockPackage createEntityMockPackage() {
		EntityMockPackageImpl entityMockPackage = new EntityMockPackageImpl();
		return entityMockPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMock createEntityMock() {
		EntityMockImpl entityMock = new EntityMockImpl();
		return entityMock;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RunningDataInterchanges createRunningDataInterchanges() {
		RunningDataInterchangesImpl runningDataInterchanges = new RunningDataInterchangesImpl();
		return runningDataInterchanges;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RunningDataInterchange createRunningDataInterchange() {
		RunningDataInterchangeImpl runningDataInterchange = new RunningDataInterchangeImpl();
		return runningDataInterchange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockResources createEntityMockResources() {
		EntityMockResourcesImpl entityMockResources = new EntityMockResourcesImpl();
		return entityMockResources;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockResource createEntityMockResource() {
		EntityMockResourceImpl entityMockResource = new EntityMockResourceImpl();
		return entityMockResource;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockResourceAttribute createEntityMockResourceAttribute() {
		EntityMockResourceAttributeImpl entityMockResourceAttribute = new EntityMockResourceAttributeImpl();
		return entityMockResourceAttribute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockResourceDataRow createEntityMockResourceDataRow() {
		EntityMockResourceDataRowImpl entityMockResourceDataRow = new EntityMockResourceDataRowImpl();
		return entityMockResourceDataRow;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjects createEntityMockObjects() {
		EntityMockObjectsImpl entityMockObjects = new EntityMockObjectsImpl();
		return entityMockObjects;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObject createEntityMockObject() {
		EntityMockObjectImpl entityMockObject = new EntityMockObjectImpl();
		return entityMockObject;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectEnum createEntityMockObjectEnum() {
		EntityMockObjectEnumImpl entityMockObjectEnum = new EntityMockObjectEnumImpl();
		return entityMockObjectEnum;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IEntityMockObjectAttribute createIEntityMockObjectAttribute() {
		IEntityMockObjectAttributeImpl iEntityMockObjectAttribute = new IEntityMockObjectAttributeImpl();
		return iEntityMockObjectAttribute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectPlainValue createEntityMockObjectPlainValue() {
		EntityMockObjectPlainValueImpl entityMockObjectPlainValue = new EntityMockObjectPlainValueImpl();
		return entityMockObjectPlainValue;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectResourceValue createEntityMockObjectResourceValue() {
		EntityMockObjectResourceValueImpl entityMockObjectResourceValue = new EntityMockObjectResourceValueImpl();
		return entityMockObjectResourceValue;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectArrayValue createEntityMockObjectArrayValue() {
		EntityMockObjectArrayValueImpl entityMockObjectArrayValue = new EntityMockObjectArrayValueImpl();
		return entityMockObjectArrayValue;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectItemValue createEntityMockObjectItemValue() {
		EntityMockObjectItemValueImpl entityMockObjectItemValue = new EntityMockObjectItemValueImpl();
		return entityMockObjectItemValue;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectEmbed createEntityMockObjectEmbed() {
		EntityMockObjectEmbedImpl entityMockObjectEmbed = new EntityMockObjectEmbedImpl();
		return entityMockObjectEmbed;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectFunction createEntityMockObjectFunction() {
		EntityMockObjectFunctionImpl entityMockObjectFunction = new EntityMockObjectFunctionImpl();
		return entityMockObjectFunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectFunctionParameter createEntityMockObjectFunctionParameter() {
		EntityMockObjectFunctionParameterImpl entityMockObjectFunctionParameter = new EntityMockObjectFunctionParameterImpl();
		return entityMockObjectFunctionParameter;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectFill createEntityMockObjectFill() {
		EntityMockObjectFillImpl entityMockObjectFill = new EntityMockObjectFillImpl();
		return entityMockObjectFill;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerType createPropertyFillerType() {
		PropertyFillerTypeImpl propertyFillerType = new PropertyFillerTypeImpl();
		return propertyFillerType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDateType createPropertyFillerDateType() {
		PropertyFillerDateTypeImpl propertyFillerDateType = new PropertyFillerDateTypeImpl();
		return propertyFillerDateType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerBoolean createPropertyFillerBoolean() {
		PropertyFillerBooleanImpl propertyFillerBoolean = new PropertyFillerBooleanImpl();
		return propertyFillerBoolean;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDoubleType createPropertyFillerDoubleType() {
		PropertyFillerDoubleTypeImpl propertyFillerDoubleType = new PropertyFillerDoubleTypeImpl();
		return propertyFillerDoubleType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerIntegerType createPropertyFillerIntegerType() {
		PropertyFillerIntegerTypeImpl propertyFillerIntegerType = new PropertyFillerIntegerTypeImpl();
		return propertyFillerIntegerType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextType createPropertyFillerTextType() {
		PropertyFillerTextTypeImpl propertyFillerTextType = new PropertyFillerTextTypeImpl();
		return propertyFillerTextType;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDateFuture createPropertyFillerDateFuture() {
		PropertyFillerDateFutureImpl propertyFillerDateFuture = new PropertyFillerDateFutureImpl();
		return propertyFillerDateFuture;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDatePast createPropertyFillerDatePast() {
		PropertyFillerDatePastImpl propertyFillerDatePast = new PropertyFillerDatePastImpl();
		return propertyFillerDatePast;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerDateRange createPropertyFillerDateRange() {
		PropertyFillerDateRangeImpl propertyFillerDateRange = new PropertyFillerDateRangeImpl();
		return propertyFillerDateRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerSignedDoubleRange createPropertyFillerSignedDoubleRange() {
		PropertyFillerSignedDoubleRangeImpl propertyFillerSignedDoubleRange = new PropertyFillerSignedDoubleRangeImpl();
		return propertyFillerSignedDoubleRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerSignedDoubleRandom createPropertyFillerSignedDoubleRandom() {
		PropertyFillerSignedDoubleRandomImpl propertyFillerSignedDoubleRandom = new PropertyFillerSignedDoubleRandomImpl();
		return propertyFillerSignedDoubleRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerSignedIntegerRange createPropertyFillerSignedIntegerRange() {
		PropertyFillerSignedIntegerRangeImpl propertyFillerSignedIntegerRange = new PropertyFillerSignedIntegerRangeImpl();
		return propertyFillerSignedIntegerRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerSignedIntegerRandom createPropertyFillerSignedIntegerRandom() {
		PropertyFillerSignedIntegerRandomImpl propertyFillerSignedIntegerRandom = new PropertyFillerSignedIntegerRandomImpl();
		return propertyFillerSignedIntegerRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextRandom createPropertyFillerTextRandom() {
		PropertyFillerTextRandomImpl propertyFillerTextRandom = new PropertyFillerTextRandomImpl();
		return propertyFillerTextRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextParagraphs createPropertyFillerTextParagraphs() {
		PropertyFillerTextParagraphsImpl propertyFillerTextParagraphs = new PropertyFillerTextParagraphsImpl();
		return propertyFillerTextParagraphs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextSentences createPropertyFillerTextSentences() {
		PropertyFillerTextSentencesImpl propertyFillerTextSentences = new PropertyFillerTextSentencesImpl();
		return propertyFillerTextSentences;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerTextWords createPropertyFillerTextWords() {
		PropertyFillerTextWordsImpl propertyFillerTextWords = new PropertyFillerTextWordsImpl();
		return propertyFillerTextWords;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerUnsignedDoubleRange createPropertyFillerUnsignedDoubleRange() {
		PropertyFillerUnsignedDoubleRangeImpl propertyFillerUnsignedDoubleRange = new PropertyFillerUnsignedDoubleRangeImpl();
		return propertyFillerUnsignedDoubleRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerUnsignedDoubleRandom createPropertyFillerUnsignedDoubleRandom() {
		PropertyFillerUnsignedDoubleRandomImpl propertyFillerUnsignedDoubleRandom = new PropertyFillerUnsignedDoubleRandomImpl();
		return propertyFillerUnsignedDoubleRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerUnsignedIntegerRange createPropertyFillerUnsignedIntegerRange() {
		PropertyFillerUnsignedIntegerRangeImpl propertyFillerUnsignedIntegerRange = new PropertyFillerUnsignedIntegerRangeImpl();
		return propertyFillerUnsignedIntegerRange;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PropertyFillerUnsignedIntegerRandom createPropertyFillerUnsignedIntegerRandom() {
		PropertyFillerUnsignedIntegerRandomImpl propertyFillerUnsignedIntegerRandom = new PropertyFillerUnsignedIntegerRandomImpl();
		return propertyFillerUnsignedIntegerRandom;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockEntities createEntityMockEntities() {
		EntityMockEntitiesImpl entityMockEntities = new EntityMockEntitiesImpl();
		return entityMockEntities;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockEntity createEntityMockEntity() {
		EntityMockEntityImpl entityMockEntity = new EntityMockEntityImpl();
		return entityMockEntity;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IIterate createIIterate() {
		IIterateImpl iIterate = new IIterateImpl();
		return iIterate;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IntegerIterate createIntegerIterate() {
		IntegerIterateImpl integerIterate = new IntegerIterateImpl();
		return integerIterate;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DateIterate createDateIterate() {
		DateIterateImpl dateIterate = new DateIterateImpl();
		return dateIterate;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Date createDate() {
		DateImpl date = new DateImpl();
		return date;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockByResourceAttribute createEntityMockByResourceAttribute() {
		EntityMockByResourceAttributeImpl entityMockByResourceAttribute = new EntityMockByResourceAttributeImpl();
		return entityMockByResourceAttribute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockTemplate createEntityMockTemplate() {
		EntityMockTemplateImpl entityMockTemplate = new EntityMockTemplateImpl();
		return entityMockTemplate;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IEntityMockObjectUsable createIEntityMockObjectUsable() {
		IEntityMockObjectUsableImpl iEntityMockObjectUsable = new IEntityMockObjectUsableImpl();
		return iEntityMockObjectUsable;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IEntityMockEntityUsable createIEntityMockEntityUsable() {
		IEntityMockEntityUsableImpl iEntityMockEntityUsable = new IEntityMockEntityUsableImpl();
		return iEntityMockEntityUsable;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IEntityMockAttribute createIEntityMockAttribute() {
		IEntityMockAttributeImpl iEntityMockAttribute = new IEntityMockAttributeImpl();
		return iEntityMockAttribute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockReferencedObjectAttribute createEntityMockReferencedObjectAttribute() {
		EntityMockReferencedObjectAttributeImpl entityMockReferencedObjectAttribute = new EntityMockReferencedObjectAttributeImpl();
		return entityMockReferencedObjectAttribute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockAttributeByObject createEntityMockAttributeByObject() {
		EntityMockAttributeByObjectImpl entityMockAttributeByObject = new EntityMockAttributeByObjectImpl();
		return entityMockAttributeByObject;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockAttributeFiller createEntityMockAttributeFiller() {
		EntityMockAttributeFillerImpl entityMockAttributeFiller = new EntityMockAttributeFillerImpl();
		return entityMockAttributeFiller;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockAttributeByReference createEntityMockAttributeByReference() {
		EntityMockAttributeByReferenceImpl entityMockAttributeByReference = new EntityMockAttributeByReferenceImpl();
		return entityMockAttributeByReference;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockEntityFunction createEntityMockEntityFunction() {
		EntityMockEntityFunctionImpl entityMockEntityFunction = new EntityMockEntityFunctionImpl();
		return entityMockEntityFunction;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockEntityNestedAttribute createEntityMockEntityNestedAttribute() {
		EntityMockEntityNestedAttributeImpl entityMockEntityNestedAttribute = new EntityMockEntityNestedAttributeImpl();
		return entityMockEntityNestedAttribute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockEntityFunctionParameter createEntityMockEntityFunctionParameter() {
		EntityMockEntityFunctionParameterImpl entityMockEntityFunctionParameter = new EntityMockEntityFunctionParameterImpl();
		return entityMockEntityFunctionParameter;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EDateStepType createEDateStepTypeFromString(EDataType eDataType, String initialValue) {
		EDateStepType result = EDateStepType.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertEDateStepTypeToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InternalEObject createInternalEObjectFromString(EDataType eDataType, String initialValue) {
		return (InternalEObject)super.createFromString(eDataType, initialValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertInternalEObjectToString(EDataType eDataType, Object instanceValue) {
		return super.convertToString(eDataType, instanceValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockDSLPackage getEntityMockDSLPackage() {
		return (EntityMockDSLPackage)getEPackage();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @deprecated
	 * @generated
	 */
	@Deprecated
	public static EntityMockDSLPackage getPackage() {
		return EntityMockDSLPackage.eINSTANCE;
	}

} //EntityMockDSLFactoryImpl
