/**
 * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
 *  All rights reserved. This program and the accompanying materials 
 *  are made available under the terms of the Eclipse Public License 2.0  
 *  which accompanies this distribution, and is available at 
 *  https://www.eclipse.org/legal/epl-2.0/ 
 *  
 *  SPDX-License-Identifier: EPL-2.0 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Joerg Riegel - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.datainterchange.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.ConditionAndOperator1;
import org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2;
import org.eclipse.osbp.xtext.datainterchange.DataDSLFactory;
import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
import org.eclipse.osbp.xtext.datainterchange.DataInterchange;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBase;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBlobMapping;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeEntityExpression;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilter;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportHide;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExpose;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExpression;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFile;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileCSV;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileEDI;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileXML;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFormat;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeKey;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLazyResolver;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMapping;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerEntity;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerPath;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeModel;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangePredefinedExpression;
import org.eclipse.osbp.xtext.datainterchange.DataInterchangeValueMapping;
import org.eclipse.osbp.xtext.datainterchange.EntityManagerMode;
import org.eclipse.osbp.xtext.datainterchange.PredefinedBeanEnum;
import org.eclipse.osbp.xtext.datainterchange.PredefinedBeanTypeEnum;
import org.eclipse.osbp.xtext.datainterchange.PredefinedBlobMimeTypeEnum;

import org.eclipse.xtext.xtype.XtypePackage;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum conditionAndOperator2EEnum = 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.datainterchange.DataDSLPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private DataDSLPackageImpl() {
		super(eNS_URI, DataDSLFactory.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 DataDSLPackage#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 DataDSLPackage init() {
		if (isInited) return (DataDSLPackage)EPackage.Registry.INSTANCE.getEPackage(DataDSLPackage.eNS_URI);

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

		isInited = true;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDataInterchange_DeleteFileAfterImport() {
		return (EAttribute)dataInterchangeEClass.getEStructuralFeatures().get(9);
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDataInterchangeBean_Mappings() {
		return (EReference)dataInterchangeBeanEClass.getEStructuralFeatures().get(11);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDataInterchangeBean_LookupKeys() {
		return (EReference)dataInterchangeBeanEClass.getEStructuralFeatures().get(12);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDataInterchangeBean_ExportExposes() {
		return (EReference)dataInterchangeBeanEClass.getEStructuralFeatures().get(13);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EReference getDataInterchangeBean_ExportFilter() {
		return (EReference)dataInterchangeBeanEClass.getEStructuralFeatures().get(14);
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EAttribute getDataInterchangeLookup_CacheSize() {
		return (EAttribute)dataInterchangeLookupEClass.getEStructuralFeatures().get(8);
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public DataDSLFactory getDataDSLFactory() {
		return (DataDSLFactory)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
		dataInterchangeModelEClass = createEClass(DATA_INTERCHANGE_MODEL);
		createEReference(dataInterchangeModelEClass, DATA_INTERCHANGE_MODEL__IMPORT_SECTION);
		createEReference(dataInterchangeModelEClass, DATA_INTERCHANGE_MODEL__PACKAGES);

		dataInterchangeLazyResolverEClass = createEClass(DATA_INTERCHANGE_LAZY_RESOLVER);
		createEOperation(dataInterchangeLazyResolverEClass, DATA_INTERCHANGE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);

		dataInterchangePackageEClass = createEClass(DATA_INTERCHANGE_PACKAGE);
		createEReference(dataInterchangePackageEClass, DATA_INTERCHANGE_PACKAGE__GROUPS);

		dataInterchangeBaseEClass = createEClass(DATA_INTERCHANGE_BASE);
		createEAttribute(dataInterchangeBaseEClass, DATA_INTERCHANGE_BASE__NAME);

		dataInterchangeGroupEClass = createEClass(DATA_INTERCHANGE_GROUP);
		createEReference(dataInterchangeGroupEClass, DATA_INTERCHANGE_GROUP__DAT_INTS);

		dataInterchangeEClass = createEClass(DATA_INTERCHANGE);
		createEAttribute(dataInterchangeEClass, DATA_INTERCHANGE__DESCRIPTION);
		createEAttribute(dataInterchangeEClass, DATA_INTERCHANGE__DESCRIPTION_VALUE);
		createEAttribute(dataInterchangeEClass, DATA_INTERCHANGE__VECTOR_NAME);
		createEAttribute(dataInterchangeEClass, DATA_INTERCHANGE__HAS_VECTOR_NAME);
		createEAttribute(dataInterchangeEClass, DATA_INTERCHANGE__CREATE_REPORT);
		createEAttribute(dataInterchangeEClass, DATA_INTERCHANGE__ELEMENT_SIZE);
		createEAttribute(dataInterchangeEClass, DATA_INTERCHANGE__MODE);
		createEReference(dataInterchangeEClass, DATA_INTERCHANGE__FILE_ENDPOINT);
		createEReference(dataInterchangeEClass, DATA_INTERCHANGE__PATH);
		createEAttribute(dataInterchangeEClass, DATA_INTERCHANGE__DELETE_FILE_AFTER_IMPORT);

		dataInterchangeFileEClass = createEClass(DATA_INTERCHANGE_FILE);
		createEAttribute(dataInterchangeFileEClass, DATA_INTERCHANGE_FILE__ENCODING);
		createEAttribute(dataInterchangeFileEClass, DATA_INTERCHANGE_FILE__LOCALE);

		dataInterchangeFileXMLEClass = createEClass(DATA_INTERCHANGE_FILE_XML);
		createEAttribute(dataInterchangeFileXMLEClass, DATA_INTERCHANGE_FILE_XML__FILE_URL);
		createEAttribute(dataInterchangeFileXMLEClass, DATA_INTERCHANGE_FILE_XML__BY_ATTRIBUTE);

		dataInterchangeFileCSVEClass = createEClass(DATA_INTERCHANGE_FILE_CSV);
		createEAttribute(dataInterchangeFileCSVEClass, DATA_INTERCHANGE_FILE_CSV__FILE_URL);
		createEAttribute(dataInterchangeFileCSVEClass, DATA_INTERCHANGE_FILE_CSV__DELIMITER);
		createEAttribute(dataInterchangeFileCSVEClass, DATA_INTERCHANGE_FILE_CSV__QUOTE_CHARACTER);
		createEAttribute(dataInterchangeFileCSVEClass, DATA_INTERCHANGE_FILE_CSV__SKIP_LINES);
		createEAttribute(dataInterchangeFileCSVEClass, DATA_INTERCHANGE_FILE_CSV__INDENT);

		dataInterchangeFileEDIEClass = createEClass(DATA_INTERCHANGE_FILE_EDI);
		createEAttribute(dataInterchangeFileEDIEClass, DATA_INTERCHANGE_FILE_EDI__FILE_URL);
		createEAttribute(dataInterchangeFileEDIEClass, DATA_INTERCHANGE_FILE_EDI__MAPPING_MODEL);
		createEAttribute(dataInterchangeFileEDIEClass, DATA_INTERCHANGE_FILE_EDI__VALIDATE);

		dataInterchangeBeanEClass = createEClass(DATA_INTERCHANGE_BEAN);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__ENTITY);
		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__MARK_LATEST_IMPORT);
		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT);
		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__LATEST_PROPERTY);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__LATEST_EXP_PROPERTY);
		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__ELEMENT_MAP);
		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__NODE_NAME);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__LOOKUP);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__FORMAT);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__EXPRESSION);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__MAPPINGS);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__LOOKUP_KEYS);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__EXPORT_EXPOSES);
		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__EXPORT_FILTER);

		dataInterchangeKeyEClass = createEClass(DATA_INTERCHANGE_KEY);
		createEReference(dataInterchangeKeyEClass, DATA_INTERCHANGE_KEY__PROPERTY);

		dataInterchangeFormatEClass = createEClass(DATA_INTERCHANGE_FORMAT);
		createEReference(dataInterchangeFormatEClass, DATA_INTERCHANGE_FORMAT__TARGET_PROPERTY);
		createEAttribute(dataInterchangeFormatEClass, DATA_INTERCHANGE_FORMAT__FORMAT);

		dataInterchangeExpressionEClass = createEClass(DATA_INTERCHANGE_EXPRESSION);
		createEReference(dataInterchangeExpressionEClass, DATA_INTERCHANGE_EXPRESSION__TARGET_PROPERTY);

		dataInterchangeEntityExpressionEClass = createEClass(DATA_INTERCHANGE_ENTITY_EXPRESSION);
		createEReference(dataInterchangeEntityExpressionEClass, DATA_INTERCHANGE_ENTITY_EXPRESSION__ENTITY);
		createEReference(dataInterchangeEntityExpressionEClass, DATA_INTERCHANGE_ENTITY_EXPRESSION__PROPERTY);

		dataInterchangePredefinedExpressionEClass = createEClass(DATA_INTERCHANGE_PREDEFINED_EXPRESSION);
		createEAttribute(dataInterchangePredefinedExpressionEClass, DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN);
		createEAttribute(dataInterchangePredefinedExpressionEClass, DATA_INTERCHANGE_PREDEFINED_EXPRESSION__BEAN_TYPE);

		dataInterchangeLookupEClass = createEClass(DATA_INTERCHANGE_LOOKUP);
		createEReference(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__ENTITY);
		createEReference(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__TARGET_PROPERTY);
		createEReference(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__QUERY_PROPERTY);
		createEAttribute(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__ELEMENT_MAP);
		createEAttribute(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__DATA_MAP);
		createEAttribute(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__ALLOW_NO_RESULT);
		createEAttribute(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__ALLOW_NONUNIQUE_RESULT);
		createEAttribute(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__CACHED);
		createEAttribute(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__CACHE_SIZE);
		createEReference(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__MARKER_PATH);

		dataInterchangeExposeEClass = createEClass(DATA_INTERCHANGE_EXPOSE);
		createEReference(dataInterchangeExposeEClass, DATA_INTERCHANGE_EXPOSE__REF_ENTITY);
		createEReference(dataInterchangeExposeEClass, DATA_INTERCHANGE_EXPOSE__REF_PROPERTY);
		createEReference(dataInterchangeExposeEClass, DATA_INTERCHANGE_EXPOSE__SUB_EXPOSE);

		dataInterchangeExportFilterEClass = createEClass(DATA_INTERCHANGE_EXPORT_FILTER);
		createEReference(dataInterchangeExportFilterEClass, DATA_INTERCHANGE_EXPORT_FILTER__CONDITION);
		createEReference(dataInterchangeExportFilterEClass, DATA_INTERCHANGE_EXPORT_FILTER__HIDDENPROPERTIES);

		dataInterchangeFilterConditionEClass = createEClass(DATA_INTERCHANGE_FILTER_CONDITION);
		createEReference(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY);
		createEAttribute(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR);
		createEAttribute(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__VALUE);
		createEAttribute(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2);
		createEReference(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION);

		dataInterchangeExportHideEClass = createEClass(DATA_INTERCHANGE_EXPORT_HIDE);
		createEReference(dataInterchangeExportHideEClass, DATA_INTERCHANGE_EXPORT_HIDE__PROPERTY);

		dataInterchangeMarkerPathEClass = createEClass(DATA_INTERCHANGE_MARKER_PATH);
		createEReference(dataInterchangeMarkerPathEClass, DATA_INTERCHANGE_MARKER_PATH__PATH);

		dataInterchangeMarkerEntityEClass = createEClass(DATA_INTERCHANGE_MARKER_ENTITY);
		createEAttribute(dataInterchangeMarkerEntityEClass, DATA_INTERCHANGE_MARKER_ENTITY__MARK_LATEST);
		createEReference(dataInterchangeMarkerEntityEClass, DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY);
		createEReference(dataInterchangeMarkerEntityEClass, DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY);

		dataInterchangeMappingEClass = createEClass(DATA_INTERCHANGE_MAPPING);
		createEReference(dataInterchangeMappingEClass, DATA_INTERCHANGE_MAPPING__PROPERTY);
		createEAttribute(dataInterchangeMappingEClass, DATA_INTERCHANGE_MAPPING__DATA);

		dataInterchangeValueMappingEClass = createEClass(DATA_INTERCHANGE_VALUE_MAPPING);

		dataInterchangeBlobMappingEClass = createEClass(DATA_INTERCHANGE_BLOB_MAPPING);
		createEAttribute(dataInterchangeBlobMappingEClass, DATA_INTERCHANGE_BLOB_MAPPING__BLOB_FILE_EXTENSION);
		createEAttribute(dataInterchangeBlobMappingEClass, DATA_INTERCHANGE_BLOB_MAPPING__BLOB_PATH);
		createEAttribute(dataInterchangeBlobMappingEClass, DATA_INTERCHANGE_BLOB_MAPPING__MIME_TYPE);

		// Create enums
		predefinedBlobMimeTypeEnumEEnum = createEEnum(PREDEFINED_BLOB_MIME_TYPE_ENUM);
		predefinedBeanEnumEEnum = createEEnum(PREDEFINED_BEAN_ENUM);
		predefinedBeanTypeEnumEEnum = createEEnum(PREDEFINED_BEAN_TYPE_ENUM);
		entityManagerModeEEnum = createEEnum(ENTITY_MANAGER_MODE);
		conditionAndOperator1EEnum = createEEnum(CONDITION_AND_OPERATOR1);
		conditionAndOperator2EEnum = createEEnum(CONDITION_AND_OPERATOR2);

		// 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);
		OSBPEntityPackage theOSBPEntityPackage = (OSBPEntityPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPEntityPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		dataInterchangePackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
		dataInterchangeBaseEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeGroupEClass.getESuperTypes().add(this.getDataInterchangeBase());
		dataInterchangeEClass.getESuperTypes().add(this.getDataInterchangeBase());
		dataInterchangeFileEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeFileXMLEClass.getESuperTypes().add(this.getDataInterchangeFile());
		dataInterchangeFileCSVEClass.getESuperTypes().add(this.getDataInterchangeFile());
		dataInterchangeFileEDIEClass.getESuperTypes().add(this.getDataInterchangeFile());
		dataInterchangeBeanEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeKeyEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeFormatEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeExpressionEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeEntityExpressionEClass.getESuperTypes().add(this.getDataInterchangeExpression());
		dataInterchangePredefinedExpressionEClass.getESuperTypes().add(this.getDataInterchangeExpression());
		dataInterchangeLookupEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeExposeEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeExportFilterEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeFilterConditionEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeExportHideEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeMarkerPathEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeMarkerEntityEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeMappingEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
		dataInterchangeValueMappingEClass.getESuperTypes().add(this.getDataInterchangeMapping());
		dataInterchangeBlobMappingEClass.getESuperTypes().add(this.getDataInterchangeMapping());

		// Initialize classes, features, and operations; add parameters
		initEClass(dataInterchangeModelEClass, DataInterchangeModel.class, "DataInterchangeModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, DataInterchangeModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeModel_Packages(), this.getDataInterchangePackage(), null, "packages", null, 0, -1, DataInterchangeModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeLazyResolverEClass, DataInterchangeLazyResolver.class, "DataInterchangeLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

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

		initEClass(dataInterchangePackageEClass, DataInterchangePackage.class, "DataInterchangePackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangePackage_Groups(), this.getDataInterchangeGroup(), null, "groups", null, 0, -1, DataInterchangePackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

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

		initEClass(dataInterchangeGroupEClass, DataInterchangeGroup.class, "DataInterchangeGroup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeGroup_DatInts(), this.getDataInterchange(), null, "datInts", null, 0, -1, DataInterchangeGroup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeEClass, DataInterchange.class, "DataInterchange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDataInterchange_Description(), theEcorePackage.getEBoolean(), "description", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchange_DescriptionValue(), theEcorePackage.getEString(), "descriptionValue", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchange_VectorName(), theEcorePackage.getEString(), "vectorName", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchange_HasVectorName(), theEcorePackage.getEBoolean(), "hasVectorName", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchange_CreateReport(), theEcorePackage.getEBoolean(), "createReport", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchange_ElementSize(), theEcorePackage.getEInt(), "elementSize", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchange_Mode(), this.getEntityManagerMode(), "mode", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchange_FileEndpoint(), this.getDataInterchangeFile(), null, "fileEndpoint", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchange_Path(), this.getDataInterchangeBean(), null, "path", null, 0, -1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchange_DeleteFileAfterImport(), theEcorePackage.getEBoolean(), "deleteFileAfterImport", null, 0, 1, DataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeFileEClass, DataInterchangeFile.class, "DataInterchangeFile", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDataInterchangeFile_Encoding(), theEcorePackage.getEString(), "encoding", null, 0, 1, DataInterchangeFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFile_Locale(), theEcorePackage.getEString(), "locale", null, 0, 1, DataInterchangeFile.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeFileXMLEClass, DataInterchangeFileXML.class, "DataInterchangeFileXML", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDataInterchangeFileXML_FileURL(), theEcorePackage.getEString(), "fileURL", null, 0, 1, DataInterchangeFileXML.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFileXML_ByAttribute(), theEcorePackage.getEBoolean(), "byAttribute", null, 0, 1, DataInterchangeFileXML.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeFileCSVEClass, DataInterchangeFileCSV.class, "DataInterchangeFileCSV", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDataInterchangeFileCSV_FileURL(), theEcorePackage.getEString(), "fileURL", null, 0, 1, DataInterchangeFileCSV.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFileCSV_Delimiter(), theEcorePackage.getEString(), "delimiter", null, 0, 1, DataInterchangeFileCSV.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFileCSV_QuoteCharacter(), theEcorePackage.getEString(), "quoteCharacter", null, 0, 1, DataInterchangeFileCSV.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFileCSV_SkipLines(), theEcorePackage.getEInt(), "skipLines", null, 0, 1, DataInterchangeFileCSV.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFileCSV_Indent(), theEcorePackage.getEBoolean(), "indent", null, 0, 1, DataInterchangeFileCSV.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeFileEDIEClass, DataInterchangeFileEDI.class, "DataInterchangeFileEDI", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDataInterchangeFileEDI_FileURL(), theEcorePackage.getEString(), "fileURL", null, 0, 1, DataInterchangeFileEDI.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFileEDI_MappingModel(), theEcorePackage.getEString(), "mappingModel", null, 0, 1, DataInterchangeFileEDI.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFileEDI_Validate(), theEcorePackage.getEBoolean(), "validate", null, 0, 1, DataInterchangeFileEDI.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeBeanEClass, DataInterchangeBean.class, "DataInterchangeBean", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeBean_Entity(), theOSBPEntityPackage.getLEntity(), null, "entity", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeBean_MarkLatestImport(), theEcorePackage.getEBoolean(), "markLatestImport", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeBean_MarkLatestExport(), theEcorePackage.getEBoolean(), "markLatestExport", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeBean_HasBlobMapping(), theEcorePackage.getEBoolean(), "hasBlobMapping", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_LatestProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "latestProperty", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_LatestExpProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "latestExpProperty", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeBean_ElementMap(), theEcorePackage.getEString(), "elementMap", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeBean_NodeName(), theEcorePackage.getEString(), "nodeName", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_Lookup(), this.getDataInterchangeLookup(), null, "lookup", null, 0, -1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_Format(), this.getDataInterchangeFormat(), null, "format", null, 0, -1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_Expression(), this.getDataInterchangeExpression(), null, "expression", null, 0, -1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_Mappings(), this.getDataInterchangeMapping(), null, "mappings", null, 0, -1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_LookupKeys(), this.getDataInterchangeKey(), null, "lookupKeys", null, 0, -1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_ExportExposes(), this.getDataInterchangeExpose(), null, "exportExposes", null, 0, -1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeBean_ExportFilter(), this.getDataInterchangeExportFilter(), null, "exportFilter", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeKeyEClass, DataInterchangeKey.class, "DataInterchangeKey", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeKey_Property(), theOSBPEntityPackage.getLEntityAttribute(), null, "property", null, 0, 1, DataInterchangeKey.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeFormatEClass, DataInterchangeFormat.class, "DataInterchangeFormat", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeFormat_TargetProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "targetProperty", null, 0, 1, DataInterchangeFormat.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFormat_Format(), theEcorePackage.getEString(), "format", null, 0, 1, DataInterchangeFormat.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeExpressionEClass, DataInterchangeExpression.class, "DataInterchangeExpression", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeExpression_TargetProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "targetProperty", null, 0, 1, DataInterchangeExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeEntityExpressionEClass, DataInterchangeEntityExpression.class, "DataInterchangeEntityExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeEntityExpression_Entity(), theOSBPEntityPackage.getLEntity(), null, "entity", null, 0, 1, DataInterchangeEntityExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeEntityExpression_Property(), theOSBPEntityPackage.getLEntityAttribute(), null, "property", null, 0, 1, DataInterchangeEntityExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangePredefinedExpressionEClass, DataInterchangePredefinedExpression.class, "DataInterchangePredefinedExpression", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDataInterchangePredefinedExpression_Bean(), this.getPredefinedBeanEnum(), "bean", null, 0, 1, DataInterchangePredefinedExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangePredefinedExpression_BeanType(), this.getPredefinedBeanTypeEnum(), "beanType", null, 0, 1, DataInterchangePredefinedExpression.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeLookupEClass, DataInterchangeLookup.class, "DataInterchangeLookup", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeLookup_Entity(), theOSBPEntityPackage.getLEntity(), null, "entity", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeLookup_TargetProperty(), theOSBPEntityPackage.getLEntityReference(), null, "targetProperty", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeLookup_QueryProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "queryProperty", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeLookup_ElementMap(), theEcorePackage.getEString(), "elementMap", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeLookup_DataMap(), theEcorePackage.getEString(), "dataMap", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeLookup_AllowNoResult(), theEcorePackage.getEBoolean(), "allowNoResult", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeLookup_AllowNonuniqueResult(), theEcorePackage.getEBoolean(), "allowNonuniqueResult", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeLookup_Cached(), theEcorePackage.getEBoolean(), "cached", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeLookup_CacheSize(), theEcorePackage.getEInt(), "cacheSize", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeLookup_MarkerPath(), this.getDataInterchangeMarkerPath(), null, "markerPath", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeExposeEClass, DataInterchangeExpose.class, "DataInterchangeExpose", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeExpose_RefEntity(), theOSBPEntityPackage.getLEntityReference(), null, "refEntity", null, 0, 1, DataInterchangeExpose.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeExpose_RefProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "refProperty", null, 0, 1, DataInterchangeExpose.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeExpose_SubExpose(), this.getDataInterchangeExpose(), null, "subExpose", null, 0, 1, DataInterchangeExpose.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeExportFilterEClass, DataInterchangeExportFilter.class, "DataInterchangeExportFilter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeExportFilter_Condition(), this.getDataInterchangeFilterCondition(), null, "condition", null, 0, 1, DataInterchangeExportFilter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeExportFilter_Hiddenproperties(), this.getDataInterchangeExportHide(), null, "hiddenproperties", null, 0, -1, DataInterchangeExportFilter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeFilterConditionEClass, DataInterchangeFilterCondition.class, "DataInterchangeFilterCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeFilterCondition_RefProperty(), theOSBPEntityPackage.getLEntityFeature(), null, "refProperty", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFilterCondition_Operator(), this.getConditionAndOperator1(), "operator", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFilterCondition_Value(), theEcorePackage.getEString(), "value", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeFilterCondition_Operator2(), this.getConditionAndOperator2(), "operator2", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeFilterCondition_Subcondition(), this.getDataInterchangeFilterCondition(), null, "subcondition", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeExportHideEClass, DataInterchangeExportHide.class, "DataInterchangeExportHide", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeExportHide_Property(), theOSBPEntityPackage.getLEntityFeature(), null, "property", null, 0, 1, DataInterchangeExportHide.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeMarkerPathEClass, DataInterchangeMarkerPath.class, "DataInterchangeMarkerPath", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeMarkerPath_Path(), this.getDataInterchangeMarkerEntity(), null, "path", null, 0, -1, DataInterchangeMarkerPath.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeMarkerEntityEClass, DataInterchangeMarkerEntity.class, "DataInterchangeMarkerEntity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDataInterchangeMarkerEntity_MarkLatest(), theEcorePackage.getEBoolean(), "markLatest", null, 0, 1, DataInterchangeMarkerEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeMarkerEntity_MarkerEntity(), theOSBPEntityPackage.getLEntity(), null, "markerEntity", null, 0, 1, DataInterchangeMarkerEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getDataInterchangeMarkerEntity_MarkerProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "markerProperty", null, 0, 1, DataInterchangeMarkerEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeMappingEClass, DataInterchangeMapping.class, "DataInterchangeMapping", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getDataInterchangeMapping_Property(), theOSBPEntityPackage.getLEntityAttribute(), null, "property", null, 0, 1, DataInterchangeMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeMapping_Data(), theEcorePackage.getEString(), "data", null, 0, 1, DataInterchangeMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataInterchangeValueMappingEClass, DataInterchangeValueMapping.class, "DataInterchangeValueMapping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(dataInterchangeBlobMappingEClass, DataInterchangeBlobMapping.class, "DataInterchangeBlobMapping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getDataInterchangeBlobMapping_BlobFileExtension(), theEcorePackage.getEString(), "blobFileExtension", null, 0, 1, DataInterchangeBlobMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeBlobMapping_BlobPath(), theEcorePackage.getEString(), "blobPath", null, 0, 1, DataInterchangeBlobMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getDataInterchangeBlobMapping_MimeType(), this.getPredefinedBlobMimeTypeEnum(), "mimeType", null, 0, 1, DataInterchangeBlobMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.class, "PredefinedBlobMimeTypeEnum");
		addEEnumLiteral(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.PLAIN);
		addEEnumLiteral(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.JPG);
		addEEnumLiteral(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.PNG);
		addEEnumLiteral(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.MPEG);
		addEEnumLiteral(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.OCTETSTREAM);
		addEEnumLiteral(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.PDF);

		initEEnum(predefinedBeanEnumEEnum, PredefinedBeanEnum.class, "PredefinedBeanEnum");
		addEEnumLiteral(predefinedBeanEnumEEnum, PredefinedBeanEnum.NOW);
		addEEnumLiteral(predefinedBeanEnumEEnum, PredefinedBeanEnum.START);
		addEEnumLiteral(predefinedBeanEnumEEnum, PredefinedBeanEnum.UUID);

		initEEnum(predefinedBeanTypeEnumEEnum, PredefinedBeanTypeEnum.class, "PredefinedBeanTypeEnum");
		addEEnumLiteral(predefinedBeanTypeEnumEEnum, PredefinedBeanTypeEnum.DATE);
		addEEnumLiteral(predefinedBeanTypeEnumEEnum, PredefinedBeanTypeEnum.MILLIS);
		addEEnumLiteral(predefinedBeanTypeEnumEEnum, PredefinedBeanTypeEnum.NANOS);
		addEEnumLiteral(predefinedBeanTypeEnumEEnum, PredefinedBeanTypeEnum.RANDOM);
		addEEnumLiteral(predefinedBeanTypeEnumEEnum, PredefinedBeanTypeEnum.EXEC_CONTEXT);

		initEEnum(entityManagerModeEEnum, EntityManagerMode.class, "EntityManagerMode");
		addEEnumLiteral(entityManagerModeEEnum, EntityManagerMode.PERSIST);
		addEEnumLiteral(entityManagerModeEEnum, EntityManagerMode.MERGE);
		addEEnumLiteral(entityManagerModeEEnum, EntityManagerMode.REMOVE);

		initEEnum(conditionAndOperator1EEnum, ConditionAndOperator1.class, "ConditionAndOperator1");
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.EQUALS);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.NOTEQUALS);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.GREATERTHEN);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.GREATERTHENOREQUALTO);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.LESSTHEN);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.LESSTHENOREQUALTO);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.IN);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.BETWEEN);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.LIKE);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.NOT);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.ISNULL);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.ISNOTNULL);
		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.EXISTS);

		initEEnum(conditionAndOperator2EEnum, ConditionAndOperator2.class, "ConditionAndOperator2");
		addEEnumLiteral(conditionAndOperator2EEnum, ConditionAndOperator2.AND);
		addEEnumLiteral(conditionAndOperator2EEnum, ConditionAndOperator2.OR);

		// 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", "datadsl"
		   });
	}

} //DataDSLPackageImpl
