/**
 * Copyright (c) 2011, 2018 - 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
 *  
 *  Contributors:                                                      
 *     Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *  
 *  generated from SignalDSL.xcore
 * 
 *  
 */
package org.eclipse.osbp.xtext.signal.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.xtext.datainterchange.DataDSLPackage;

import org.eclipse.osbp.xtext.signal.DataTransfer;
import org.eclipse.osbp.xtext.signal.ListTransfer;
import org.eclipse.osbp.xtext.signal.SignalActionEnum;
import org.eclipse.osbp.xtext.signal.SignalBase;
import org.eclipse.osbp.xtext.signal.SignalDSLFactory;
import org.eclipse.osbp.xtext.signal.SignalDSLPackage;
import org.eclipse.osbp.xtext.signal.SignalDatainterchange;
import org.eclipse.osbp.xtext.signal.SignalExecutionTypeEnum;
import org.eclipse.osbp.xtext.signal.SignalHandler;
import org.eclipse.osbp.xtext.signal.SignalHandlerTypeEnum;
import org.eclipse.osbp.xtext.signal.SignalLazyResolver;
import org.eclipse.osbp.xtext.signal.SignalModel;
import org.eclipse.osbp.xtext.signal.SignalPackage;
import org.eclipse.osbp.xtext.signal.SignalProcessor;
import org.eclipse.osbp.xtext.signal.SignalTypeEnum;
import org.eclipse.osbp.xtext.signal.SignalWatcher;
import org.eclipse.osbp.xtext.signal.SingleTransfer;

import org.eclipse.xtext.xtype.XtypePackage;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum signalExecutionTypeEnumEEnum = 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.signal.SignalDSLPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private SignalDSLPackageImpl() {
		super(eNS_URI, SignalDSLFactory.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 SignalDSLPackage#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 SignalDSLPackage init() {
		if (isInited) return (SignalDSLPackage)EPackage.Registry.INSTANCE.getEPackage(SignalDSLPackage.eNS_URI);

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

		isInited = true;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SignalDSLFactory getSignalDSLFactory() {
		return (SignalDSLFactory)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
		signalModelEClass = createEClass(SIGNAL_MODEL);
		createEReference(signalModelEClass, SIGNAL_MODEL__IMPORT_SECTION);
		createEReference(signalModelEClass, SIGNAL_MODEL__PACKAGES);

		signalLazyResolverEClass = createEClass(SIGNAL_LAZY_RESOLVER);
		createEOperation(signalLazyResolverEClass, SIGNAL_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);

		signalPackageEClass = createEClass(SIGNAL_PACKAGE);
		createEReference(signalPackageEClass, SIGNAL_PACKAGE__WATCHERS);
		createEReference(signalPackageEClass, SIGNAL_PACKAGE__HANDLERS);

		signalBaseEClass = createEClass(SIGNAL_BASE);
		createEAttribute(signalBaseEClass, SIGNAL_BASE__NAME);

		signalWatcherEClass = createEClass(SIGNAL_WATCHER);
		createEAttribute(signalWatcherEClass, SIGNAL_WATCHER__NAME);
		createEAttribute(signalWatcherEClass, SIGNAL_WATCHER__DIRECTORY);
		createEAttribute(signalWatcherEClass, SIGNAL_WATCHER__SIGNAL);
		createEReference(signalWatcherEClass, SIGNAL_WATCHER__HANDLERS);

		signalHandlerEClass = createEClass(SIGNAL_HANDLER);
		createEAttribute(signalHandlerEClass, SIGNAL_HANDLER__NAME);
		createEAttribute(signalHandlerEClass, SIGNAL_HANDLER__ACTION_TYPE);
		createEAttribute(signalHandlerEClass, SIGNAL_HANDLER__FILEMASK);
		createEReference(signalHandlerEClass, SIGNAL_HANDLER__DATAINTERCHANGES);
		createEReference(signalHandlerEClass, SIGNAL_HANDLER__DATA);

		signalProcessorEClass = createEClass(SIGNAL_PROCESSOR);

		signalDatainterchangeEClass = createEClass(SIGNAL_DATAINTERCHANGE);
		createEAttribute(signalDatainterchangeEClass, SIGNAL_DATAINTERCHANGE__DATA_ACTION);
		createEReference(signalDatainterchangeEClass, SIGNAL_DATAINTERCHANGE__DATA_REF);

		dataTransferEClass = createEClass(DATA_TRANSFER);

		singleTransferEClass = createEClass(SINGLE_TRANSFER);
		createEReference(singleTransferEClass, SINGLE_TRANSFER__INTERCHANGE);

		listTransferEClass = createEClass(LIST_TRANSFER);
		createEAttribute(listTransferEClass, LIST_TRANSFER__EXECUTIONTYPE);
		createEReference(listTransferEClass, LIST_TRANSFER__INTERCHANGES);

		// Create enums
		signalHandlerTypeEnumEEnum = createEEnum(SIGNAL_HANDLER_TYPE_ENUM);
		signalTypeEnumEEnum = createEEnum(SIGNAL_TYPE_ENUM);
		signalActionEnumEEnum = createEEnum(SIGNAL_ACTION_ENUM);
		signalExecutionTypeEnumEEnum = createEEnum(SIGNAL_EXECUTION_TYPE_ENUM);

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContents() {
		if (isInitialized) return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		XtypePackage theXtypePackage = (XtypePackage)EPackage.Registry.INSTANCE.getEPackage(XtypePackage.eNS_URI);
		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
		OSBPTypesPackage theOSBPTypesPackage = (OSBPTypesPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPTypesPackage.eNS_URI);
		DataDSLPackage theDataDSLPackage = (DataDSLPackage)EPackage.Registry.INSTANCE.getEPackage(DataDSLPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		signalPackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
		signalBaseEClass.getESuperTypes().add(this.getSignalLazyResolver());
		signalWatcherEClass.getESuperTypes().add(this.getSignalLazyResolver());
		signalHandlerEClass.getESuperTypes().add(this.getSignalLazyResolver());
		signalProcessorEClass.getESuperTypes().add(this.getSignalLazyResolver());
		signalDatainterchangeEClass.getESuperTypes().add(this.getSignalProcessor());
		dataTransferEClass.getESuperTypes().add(this.getSignalLazyResolver());
		singleTransferEClass.getESuperTypes().add(this.getDataTransfer());
		listTransferEClass.getESuperTypes().add(this.getDataTransfer());

		// Initialize classes, features, and operations; add parameters
		initEClass(signalModelEClass, SignalModel.class, "SignalModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getSignalModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, SignalModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSignalModel_Packages(), this.getSignalPackage(), null, "packages", null, 0, -1, SignalModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(signalLazyResolverEClass, SignalLazyResolver.class, "SignalLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

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

		initEClass(signalPackageEClass, SignalPackage.class, "SignalPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getSignalPackage_Watchers(), this.getSignalWatcher(), null, "watchers", null, 0, -1, SignalPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSignalPackage_Handlers(), this.getSignalHandler(), null, "handlers", null, 0, -1, SignalPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

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

		initEClass(signalWatcherEClass, SignalWatcher.class, "SignalWatcher", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getSignalWatcher_Name(), theEcorePackage.getEString(), "name", null, 0, 1, SignalWatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSignalWatcher_Directory(), theEcorePackage.getEString(), "directory", null, 0, 1, SignalWatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSignalWatcher_Signal(), this.getSignalTypeEnum(), "signal", null, 0, 1, SignalWatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSignalWatcher_Handlers(), this.getSignalHandler(), null, "handlers", null, 0, -1, SignalWatcher.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(signalHandlerEClass, SignalHandler.class, "SignalHandler", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getSignalHandler_Name(), theEcorePackage.getEString(), "name", null, 0, 1, SignalHandler.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSignalHandler_ActionType(), this.getSignalHandlerTypeEnum(), "actionType", null, 0, 1, SignalHandler.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getSignalHandler_Filemask(), theEcorePackage.getEString(), "filemask", null, 0, 1, SignalHandler.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSignalHandler_Datainterchanges(), this.getSignalDatainterchange(), null, "datainterchanges", null, 0, -1, SignalHandler.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSignalHandler_Data(), this.getDataTransfer(), null, "data", null, 0, 1, SignalHandler.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(signalProcessorEClass, SignalProcessor.class, "SignalProcessor", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(signalDatainterchangeEClass, SignalDatainterchange.class, "SignalDatainterchange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getSignalDatainterchange_DataAction(), this.getSignalActionEnum(), "dataAction", null, 0, 1, SignalDatainterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getSignalDatainterchange_DataRef(), theDataDSLPackage.getDataInterchange(), null, "dataRef", null, 0, 1, SignalDatainterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(dataTransferEClass, DataTransfer.class, "DataTransfer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(singleTransferEClass, SingleTransfer.class, "SingleTransfer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getSingleTransfer_Interchange(), this.getSignalDatainterchange(), null, "interchange", null, 0, 1, SingleTransfer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(listTransferEClass, ListTransfer.class, "ListTransfer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getListTransfer_Executiontype(), this.getSignalExecutionTypeEnum(), "executiontype", null, 0, 1, ListTransfer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getListTransfer_Interchanges(), this.getSignalDatainterchange(), null, "interchanges", null, 0, -1, ListTransfer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(signalHandlerTypeEnumEEnum, SignalHandlerTypeEnum.class, "SignalHandlerTypeEnum");
		addEEnumLiteral(signalHandlerTypeEnumEEnum, SignalHandlerTypeEnum.DOAFTER);
		addEEnumLiteral(signalHandlerTypeEnumEEnum, SignalHandlerTypeEnum.DOAFTERMODIFY);
		addEEnumLiteral(signalHandlerTypeEnumEEnum, SignalHandlerTypeEnum.DOAFTERCREATE);
		addEEnumLiteral(signalHandlerTypeEnumEEnum, SignalHandlerTypeEnum.DOAFTERDELETE);

		initEEnum(signalTypeEnumEEnum, SignalTypeEnum.class, "SignalTypeEnum");
		addEEnumLiteral(signalTypeEnumEEnum, SignalTypeEnum.ALL);
		addEEnumLiteral(signalTypeEnumEEnum, SignalTypeEnum.CREATESIGNALS);
		addEEnumLiteral(signalTypeEnumEEnum, SignalTypeEnum.DELETESIGNALS);
		addEEnumLiteral(signalTypeEnumEEnum, SignalTypeEnum.MODIFYSIGNALS);

		initEEnum(signalActionEnumEEnum, SignalActionEnum.class, "SignalActionEnum");
		addEEnumLiteral(signalActionEnumEEnum, SignalActionEnum.DATAIMPORT);
		addEEnumLiteral(signalActionEnumEEnum, SignalActionEnum.DATAEXPORT);
		addEEnumLiteral(signalActionEnumEEnum, SignalActionEnum.NONE);

		initEEnum(signalExecutionTypeEnumEEnum, SignalExecutionTypeEnum.class, "SignalExecutionTypeEnum");
		addEEnumLiteral(signalExecutionTypeEnumEEnum, SignalExecutionTypeEnum.SYNC);
		addEEnumLiteral(signalExecutionTypeEnumEEnum, SignalExecutionTypeEnum.ASYNC);

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

} //SignalDSLPackageImpl
