/**
 * 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;

import org.eclipse.emf.ecore.EFactory;

/**
 * <!-- begin-user-doc -->
 * The <b>Factory</b> for the model.
 * It provides a create method for each non-abstract class of the model.
 * <!-- end-user-doc -->
 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage
 * @generated
 */
public interface DataDSLFactory extends EFactory {
	/**
	 * The singleton instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	DataDSLFactory eINSTANCE = org.eclipse.osbp.xtext.datainterchange.impl.DataDSLFactoryImpl.init();

	/**
	 * Returns a new object of class '<em>Data Interchange Model</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Model</em>'.
	 * @generated
	 */
	DataInterchangeModel createDataInterchangeModel();

	/**
	 * Returns a new object of class '<em>Data Interchange Lazy Resolver</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Lazy Resolver</em>'.
	 * @generated
	 */
	DataInterchangeLazyResolver createDataInterchangeLazyResolver();

	/**
	 * Returns a new object of class '<em>Data Interchange Package</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Package</em>'.
	 * @generated
	 */
	DataInterchangePackage createDataInterchangePackage();

	/**
	 * Returns a new object of class '<em>Data Interchange Base</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Base</em>'.
	 * @generated
	 */
	DataInterchangeBase createDataInterchangeBase();

	/**
	 * Returns a new object of class '<em>Data Interchange Group</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Group</em>'.
	 * @generated
	 */
	DataInterchangeGroup createDataInterchangeGroup();

	/**
	 * Returns a new object of class '<em>Data Interchange</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange</em>'.
	 * @generated
	 */
	DataInterchange createDataInterchange();

	/**
	 * Returns a new object of class '<em>Data Interchange File XML</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange File XML</em>'.
	 * @generated
	 */
	DataInterchangeFileXML createDataInterchangeFileXML();

	/**
	 * Returns a new object of class '<em>Data Interchange File CSV</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange File CSV</em>'.
	 * @generated
	 */
	DataInterchangeFileCSV createDataInterchangeFileCSV();

	/**
	 * Returns a new object of class '<em>Data Interchange File EDI</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange File EDI</em>'.
	 * @generated
	 */
	DataInterchangeFileEDI createDataInterchangeFileEDI();

	/**
	 * Returns a new object of class '<em>Data Interchange File Fixed</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange File Fixed</em>'.
	 * @generated
	 */
	DataInterchangeFileFixed createDataInterchangeFileFixed();

	/**
	 * Returns a new object of class '<em>Data Interchange Bean</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Bean</em>'.
	 * @generated
	 */
	DataInterchangeBean createDataInterchangeBean();

	/**
	 * Returns a new object of class '<em>Data Interchange Key</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Key</em>'.
	 * @generated
	 */
	DataInterchangeKey createDataInterchangeKey();

	/**
	 * Returns a new object of class '<em>Data Interchange Format</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Format</em>'.
	 * @generated
	 */
	DataInterchangeFormat createDataInterchangeFormat();

	/**
	 * Returns a new object of class '<em>Data Interchange Entity Expression</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Entity Expression</em>'.
	 * @generated
	 */
	DataInterchangeEntityExpression createDataInterchangeEntityExpression();

	/**
	 * Returns a new object of class '<em>Data Interchange Predefined Expression</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Predefined Expression</em>'.
	 * @generated
	 */
	DataInterchangePredefinedExpression createDataInterchangePredefinedExpression();

	/**
	 * Returns a new object of class '<em>Data Interchange Lookup</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Lookup</em>'.
	 * @generated
	 */
	DataInterchangeLookup createDataInterchangeLookup();

	/**
	 * Returns a new object of class '<em>Data Interchange Expose</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Expose</em>'.
	 * @generated
	 */
	DataInterchangeExpose createDataInterchangeExpose();

	/**
	 * Returns a new object of class '<em>Data Interchange Export Filter</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Export Filter</em>'.
	 * @generated
	 */
	DataInterchangeExportFilter createDataInterchangeExportFilter();

	/**
	 * Returns a new object of class '<em>Data Interchange Export Filter Condition</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Export Filter Condition</em>'.
	 * @generated
	 */
	DataInterchangeExportFilterCondition createDataInterchangeExportFilterCondition();

	/**
	 * Returns a new object of class '<em>Data Interchange Lookup Filter Condition</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Lookup Filter Condition</em>'.
	 * @generated
	 */
	DataInterchangeLookupFilterCondition createDataInterchangeLookupFilterCondition();

	/**
	 * Returns a new object of class '<em>Data Interchange Lookup Filter Operand String</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Lookup Filter Operand String</em>'.
	 * @generated
	 */
	DataInterchangeLookupFilterOperandString createDataInterchangeLookupFilterOperandString();

	/**
	 * Returns a new object of class '<em>Data Interchange Lookup Filter Operand Property</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Lookup Filter Operand Property</em>'.
	 * @generated
	 */
	DataInterchangeLookupFilterOperandProperty createDataInterchangeLookupFilterOperandProperty();

	/**
	 * Returns a new object of class '<em>Data Interchange Export Hide</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Export Hide</em>'.
	 * @generated
	 */
	DataInterchangeExportHide createDataInterchangeExportHide();

	/**
	 * Returns a new object of class '<em>Data Interchange Marker Path</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Marker Path</em>'.
	 * @generated
	 */
	DataInterchangeMarkerPath createDataInterchangeMarkerPath();

	/**
	 * Returns a new object of class '<em>Data Interchange Marker Entity</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Marker Entity</em>'.
	 * @generated
	 */
	DataInterchangeMarkerEntity createDataInterchangeMarkerEntity();

	/**
	 * Returns a new object of class '<em>Data Interchange Value Mapping</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Value Mapping</em>'.
	 * @generated
	 */
	DataInterchangeValueMapping createDataInterchangeValueMapping();

	/**
	 * Returns a new object of class '<em>Data Interchange Blob Mapping</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Blob Mapping</em>'.
	 * @generated
	 */
	DataInterchangeBlobMapping createDataInterchangeBlobMapping();

	/**
	 * Returns a new object of class '<em>Data Interchange Fixed Column Mapping</em>'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return a new object of class '<em>Data Interchange Fixed Column Mapping</em>'.
	 * @generated
	 */
	DataInterchangeFixedColumnMapping createDataInterchangeFixedColumnMapping();

	/**
	 * Returns the package supported by this factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the package supported by this factory.
	 * @generated
	 */
	DataDSLPackage getDataDSLPackage();

} //DataDSLFactory
