/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0 
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 * 
 *  SPDX-License-Identifier: EPL-2.0
 *  
 *  Contributors:                                                      
 *     Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *  
 *  generated from ActionDSL.xcore
 * 
 *  
 */
package org.eclipse.osbp.xtext.action.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.action.ActionBase;
import org.eclipse.osbp.xtext.action.ActionButton;
import org.eclipse.osbp.xtext.action.ActionChart;
import org.eclipse.osbp.xtext.action.ActionCommand;
import org.eclipse.osbp.xtext.action.ActionDSLFactory;
import org.eclipse.osbp.xtext.action.ActionDSLPackage;
import org.eclipse.osbp.xtext.action.ActionDatainterchange;
import org.eclipse.osbp.xtext.action.ActionDialog;
import org.eclipse.osbp.xtext.action.ActionFunction;
import org.eclipse.osbp.xtext.action.ActionLazyResolver;
import org.eclipse.osbp.xtext.action.ActionModel;
import org.eclipse.osbp.xtext.action.ActionPackage;
import org.eclipse.osbp.xtext.action.ActionParameter;
import org.eclipse.osbp.xtext.action.ActionReport;
import org.eclipse.osbp.xtext.action.ActionSelectWorkload;
import org.eclipse.osbp.xtext.action.ActionSpacer;
import org.eclipse.osbp.xtext.action.ActionTask;
import org.eclipse.osbp.xtext.action.ActionToolbar;
import org.eclipse.osbp.xtext.action.ActionToolbarItem;
import org.eclipse.osbp.xtext.action.ActionType;
import org.eclipse.osbp.xtext.action.ActionUI;
import org.eclipse.osbp.xtext.action.ActionWorkflow;
import org.eclipse.osbp.xtext.action.ChartActionEnum;
import org.eclipse.osbp.xtext.action.DatainterchangeActionEnum;
import org.eclipse.osbp.xtext.action.DialogActionEnum;
import org.eclipse.osbp.xtext.action.ReportActionEnum;
import org.eclipse.osbp.xtext.action.SelectWorkloadActionEnum;
import org.eclipse.osbp.xtext.action.TaskActionEnum;
import org.eclipse.osbp.xtext.action.UIActionEnum;
import org.eclipse.osbp.xtext.action.WorkflowActionEnum;

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

import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDSLPackage;

import org.eclipse.osbp.xtext.messagedsl.MessageDSLPackage;

import org.eclipse.xtext.xtype.XtypePackage;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum uiActionEnumEEnum = 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.action.ActionDSLPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private ActionDSLPackageImpl() {
		super(eNS_URI, ActionDSLFactory.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 ActionDSLPackage#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 ActionDSLPackage init() {
		if (isInited) return (ActionDSLPackage)EPackage.Registry.INSTANCE.getEPackage(ActionDSLPackage.eNS_URI);

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

		isInited = true;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ActionDSLFactory getActionDSLFactory() {
		return (ActionDSLFactory)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
		actionModelEClass = createEClass(ACTION_MODEL);
		createEReference(actionModelEClass, ACTION_MODEL__IMPORT_SECTION);
		createEReference(actionModelEClass, ACTION_MODEL__PACKAGES);

		actionLazyResolverEClass = createEClass(ACTION_LAZY_RESOLVER);
		createEOperation(actionLazyResolverEClass, ACTION_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);

		actionPackageEClass = createEClass(ACTION_PACKAGE);
		createEAttribute(actionPackageEClass, ACTION_PACKAGE__WITHOU_COMMAND_PROVIDER);
		createEReference(actionPackageEClass, ACTION_PACKAGE__COMMANDS);
		createEReference(actionPackageEClass, ACTION_PACKAGE__TOOLBARS);

		actionBaseEClass = createEClass(ACTION_BASE);
		createEAttribute(actionBaseEClass, ACTION_BASE__NAME);

		actionCommandEClass = createEClass(ACTION_COMMAND);
		createEReference(actionCommandEClass, ACTION_COMMAND__ACTION_TYPE);
		createEAttribute(actionCommandEClass, ACTION_COMMAND__HAS_KEY_BINDING);
		createEAttribute(actionCommandEClass, ACTION_COMMAND__KEY_BINDING);
		createEAttribute(actionCommandEClass, ACTION_COMMAND__HAS_DESCRIPTION);
		createEAttribute(actionCommandEClass, ACTION_COMMAND__DESCRIPTION);

		actionToolbarEClass = createEClass(ACTION_TOOLBAR);
		createEAttribute(actionToolbarEClass, ACTION_TOOLBAR__DESCRIPTION);
		createEAttribute(actionToolbarEClass, ACTION_TOOLBAR__DESCRIPTION_VALUE);
		createEReference(actionToolbarEClass, ACTION_TOOLBAR__ACTIONS);

		actionToolbarItemEClass = createEClass(ACTION_TOOLBAR_ITEM);

		actionButtonEClass = createEClass(ACTION_BUTTON);
		createEAttribute(actionButtonEClass, ACTION_BUTTON__DESCRIPTION);
		createEAttribute(actionButtonEClass, ACTION_BUTTON__DESCRIPTION_VALUE);
		createEAttribute(actionButtonEClass, ACTION_BUTTON__ICON_URI);
		createEReference(actionButtonEClass, ACTION_BUTTON__COMMAND);

		actionSpacerEClass = createEClass(ACTION_SPACER);
		createEAttribute(actionSpacerEClass, ACTION_SPACER__STRETCH);

		actionTypeEClass = createEClass(ACTION_TYPE);

		actionTaskEClass = createEClass(ACTION_TASK);
		createEAttribute(actionTaskEClass, ACTION_TASK__ACTION);

		actionSelectWorkloadEClass = createEClass(ACTION_SELECT_WORKLOAD);
		createEAttribute(actionSelectWorkloadEClass, ACTION_SELECT_WORKLOAD__ACTION);

		actionDialogEClass = createEClass(ACTION_DIALOG);
		createEAttribute(actionDialogEClass, ACTION_DIALOG__ACTION);

		actionReportEClass = createEClass(ACTION_REPORT);
		createEAttribute(actionReportEClass, ACTION_REPORT__ACTION);

		actionChartEClass = createEClass(ACTION_CHART);
		createEAttribute(actionChartEClass, ACTION_CHART__ACTION);

		actionWorkflowEClass = createEClass(ACTION_WORKFLOW);
		createEAttribute(actionWorkflowEClass, ACTION_WORKFLOW__ACTION);

		actionDatainterchangeEClass = createEClass(ACTION_DATAINTERCHANGE);
		createEAttribute(actionDatainterchangeEClass, ACTION_DATAINTERCHANGE__ACTION);
		createEReference(actionDatainterchangeEClass, ACTION_DATAINTERCHANGE__DATA_REF);

		actionUIEClass = createEClass(ACTION_UI);
		createEAttribute(actionUIEClass, ACTION_UI__ACTION);

		actionFunctionEClass = createEClass(ACTION_FUNCTION);
		createEReference(actionFunctionEClass, ACTION_FUNCTION__ACTION_GROUP);
		createEReference(actionFunctionEClass, ACTION_FUNCTION__CAN_EXECUTE);
		createEAttribute(actionFunctionEClass, ACTION_FUNCTION__HAS_EXECUTE_IMMEDIATE);
		createEAttribute(actionFunctionEClass, ACTION_FUNCTION__HAS_EXECUTE_LATER);
		createEReference(actionFunctionEClass, ACTION_FUNCTION__EXECUTE_IMMEDIATE);
		createEReference(actionFunctionEClass, ACTION_FUNCTION__EXECUTE_LATER);
		createEAttribute(actionFunctionEClass, ACTION_FUNCTION__HAS_MESSAGE);
		createEReference(actionFunctionEClass, ACTION_FUNCTION__MESSAGE_CATEGORY);
		createEReference(actionFunctionEClass, ACTION_FUNCTION__ON_FAIL_MESSAGE);
		createEAttribute(actionFunctionEClass, ACTION_FUNCTION__HAS_SUCCESS_MESSAGE);
		createEReference(actionFunctionEClass, ACTION_FUNCTION__ON_SUCCESS_MESSAGE);
		createEAttribute(actionFunctionEClass, ACTION_FUNCTION__HAS_STARTED_MESSAGE);
		createEReference(actionFunctionEClass, ACTION_FUNCTION__ON_STARTED_MESSAGE);

		actionParameterEClass = createEClass(ACTION_PARAMETER);
		createEReference(actionParameterEClass, ACTION_PARAMETER__PARAMETER);

		// Create enums
		taskActionEnumEEnum = createEEnum(TASK_ACTION_ENUM);
		selectWorkloadActionEnumEEnum = createEEnum(SELECT_WORKLOAD_ACTION_ENUM);
		dialogActionEnumEEnum = createEEnum(DIALOG_ACTION_ENUM);
		reportActionEnumEEnum = createEEnum(REPORT_ACTION_ENUM);
		chartActionEnumEEnum = createEEnum(CHART_ACTION_ENUM);
		workflowActionEnumEEnum = createEEnum(WORKFLOW_ACTION_ENUM);
		datainterchangeActionEnumEEnum = createEEnum(DATAINTERCHANGE_ACTION_ENUM);
		uiActionEnumEEnum = createEEnum(UI_ACTION_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);
		FunctionLibraryDSLPackage theFunctionLibraryDSLPackage = (FunctionLibraryDSLPackage)EPackage.Registry.INSTANCE.getEPackage(FunctionLibraryDSLPackage.eNS_URI);
		MessageDSLPackage theMessageDSLPackage = (MessageDSLPackage)EPackage.Registry.INSTANCE.getEPackage(MessageDSLPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		actionPackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
		actionBaseEClass.getESuperTypes().add(this.getActionLazyResolver());
		actionCommandEClass.getESuperTypes().add(this.getActionBase());
		actionToolbarEClass.getESuperTypes().add(this.getActionBase());
		actionToolbarItemEClass.getESuperTypes().add(this.getActionBase());
		actionButtonEClass.getESuperTypes().add(this.getActionToolbarItem());
		actionSpacerEClass.getESuperTypes().add(this.getActionToolbarItem());
		actionTypeEClass.getESuperTypes().add(this.getActionLazyResolver());
		actionTaskEClass.getESuperTypes().add(this.getActionType());
		actionSelectWorkloadEClass.getESuperTypes().add(this.getActionType());
		actionDialogEClass.getESuperTypes().add(this.getActionType());
		actionReportEClass.getESuperTypes().add(this.getActionType());
		actionChartEClass.getESuperTypes().add(this.getActionType());
		actionWorkflowEClass.getESuperTypes().add(this.getActionType());
		actionDatainterchangeEClass.getESuperTypes().add(this.getActionType());
		actionUIEClass.getESuperTypes().add(this.getActionType());
		actionFunctionEClass.getESuperTypes().add(this.getActionType());
		actionParameterEClass.getESuperTypes().add(this.getActionBase());

		// Initialize classes, features, and operations; add parameters
		initEClass(actionModelEClass, ActionModel.class, "ActionModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getActionModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, ActionModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionModel_Packages(), this.getActionPackage(), null, "packages", null, 0, -1, ActionModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionLazyResolverEClass, ActionLazyResolver.class, "ActionLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

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

		initEClass(actionPackageEClass, ActionPackage.class, "ActionPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionPackage_WithouCommandProvider(), theEcorePackage.getEBoolean(), "withouCommandProvider", null, 0, 1, ActionPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionPackage_Commands(), this.getActionCommand(), null, "commands", null, 0, -1, ActionPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionPackage_Toolbars(), this.getActionToolbar(), null, "toolbars", null, 0, -1, ActionPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

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

		initEClass(actionCommandEClass, ActionCommand.class, "ActionCommand", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getActionCommand_ActionType(), this.getActionType(), null, "actionType", null, 0, 1, ActionCommand.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionCommand_HasKeyBinding(), theEcorePackage.getEBoolean(), "hasKeyBinding", null, 0, 1, ActionCommand.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionCommand_KeyBinding(), theEcorePackage.getEString(), "keyBinding", null, 0, 1, ActionCommand.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionCommand_HasDescription(), theEcorePackage.getEBoolean(), "hasDescription", null, 0, 1, ActionCommand.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionCommand_Description(), theEcorePackage.getEString(), "description", null, 0, 1, ActionCommand.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionToolbarEClass, ActionToolbar.class, "ActionToolbar", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionToolbar_Description(), theEcorePackage.getEBoolean(), "description", null, 0, 1, ActionToolbar.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionToolbar_DescriptionValue(), theEcorePackage.getEString(), "descriptionValue", null, 0, 1, ActionToolbar.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionToolbar_Actions(), this.getActionToolbarItem(), null, "actions", null, 0, -1, ActionToolbar.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionToolbarItemEClass, ActionToolbarItem.class, "ActionToolbarItem", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(actionButtonEClass, ActionButton.class, "ActionButton", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionButton_Description(), theEcorePackage.getEBoolean(), "description", null, 0, 1, ActionButton.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionButton_DescriptionValue(), theEcorePackage.getEString(), "descriptionValue", null, 0, 1, ActionButton.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionButton_IconURI(), theEcorePackage.getEString(), "iconURI", null, 0, 1, ActionButton.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionButton_Command(), this.getActionCommand(), null, "command", null, 0, 1, ActionButton.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionSpacerEClass, ActionSpacer.class, "ActionSpacer", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionSpacer_Stretch(), theEcorePackage.getEBoolean(), "stretch", null, 0, 1, ActionSpacer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionTypeEClass, ActionType.class, "ActionType", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(actionTaskEClass, ActionTask.class, "ActionTask", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionTask_Action(), this.getTaskActionEnum(), "action", null, 0, 1, ActionTask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionSelectWorkloadEClass, ActionSelectWorkload.class, "ActionSelectWorkload", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionSelectWorkload_Action(), this.getSelectWorkloadActionEnum(), "action", null, 0, 1, ActionSelectWorkload.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionDialogEClass, ActionDialog.class, "ActionDialog", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionDialog_Action(), this.getDialogActionEnum(), "action", null, 0, 1, ActionDialog.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionReportEClass, ActionReport.class, "ActionReport", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionReport_Action(), this.getReportActionEnum(), "action", null, 0, 1, ActionReport.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionChartEClass, ActionChart.class, "ActionChart", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionChart_Action(), this.getChartActionEnum(), "action", null, 0, 1, ActionChart.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionWorkflowEClass, ActionWorkflow.class, "ActionWorkflow", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionWorkflow_Action(), this.getWorkflowActionEnum(), "action", null, 0, 1, ActionWorkflow.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionDatainterchangeEClass, ActionDatainterchange.class, "ActionDatainterchange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionDatainterchange_Action(), this.getDatainterchangeActionEnum(), "action", null, 0, 1, ActionDatainterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionDatainterchange_DataRef(), theDataDSLPackage.getDataInterchange(), null, "dataRef", null, 0, 1, ActionDatainterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionUIEClass, ActionUI.class, "ActionUI", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getActionUI_Action(), this.getUIActionEnum(), "action", null, 0, 1, ActionUI.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionFunctionEClass, ActionFunction.class, "ActionFunction", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getActionFunction_ActionGroup(), theFunctionLibraryDSLPackage.getFunctionLibraryActionGroup(), null, "actionGroup", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionFunction_CanExecute(), theFunctionLibraryDSLPackage.getFunctionLibraryCanExecute(), null, "canExecute", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionFunction_HasExecuteImmediate(), theEcorePackage.getEBoolean(), "hasExecuteImmediate", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionFunction_HasExecuteLater(), theEcorePackage.getEBoolean(), "hasExecuteLater", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionFunction_ExecuteImmediate(), theFunctionLibraryDSLPackage.getFunctionLibraryExecute(), null, "executeImmediate", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionFunction_ExecuteLater(), theFunctionLibraryDSLPackage.getFunctionLibraryExecute(), null, "executeLater", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionFunction_HasMessage(), theEcorePackage.getEBoolean(), "hasMessage", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionFunction_MessageCategory(), theMessageDSLPackage.getMessageCategory(), null, "messageCategory", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionFunction_OnFailMessage(), theMessageDSLPackage.getMessageItem(), null, "onFailMessage", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionFunction_HasSuccessMessage(), theEcorePackage.getEBoolean(), "hasSuccessMessage", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionFunction_OnSuccessMessage(), theMessageDSLPackage.getMessageItem(), null, "onSuccessMessage", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getActionFunction_HasStartedMessage(), theEcorePackage.getEBoolean(), "hasStartedMessage", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getActionFunction_OnStartedMessage(), theMessageDSLPackage.getMessageItem(), null, "onStartedMessage", null, 0, 1, ActionFunction.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(actionParameterEClass, ActionParameter.class, "ActionParameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getActionParameter_Parameter(), theFunctionLibraryDSLPackage.getFunctionLibraryParameter(), null, "parameter", null, 0, 1, ActionParameter.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(taskActionEnumEEnum, TaskActionEnum.class, "TaskActionEnum");
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_CLAIM);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_START);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_STOP);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_RELEASE);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_SUSPEND);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_RESUME);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_SKIP);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_COMPLETE);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_DELEGATE);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_FORWARD);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_FAIL);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_REGISTER);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_REMOVE);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_ACTIVATE);
		addEEnumLiteral(taskActionEnumEEnum, TaskActionEnum.TASK_ACTION_EXIT);

		initEEnum(selectWorkloadActionEnumEEnum, SelectWorkloadActionEnum.class, "SelectWorkloadActionEnum");
		addEEnumLiteral(selectWorkloadActionEnumEEnum, SelectWorkloadActionEnum.WORKLOAD_SELECT_ACTION_REMOVE_ALL);
		addEEnumLiteral(selectWorkloadActionEnumEEnum, SelectWorkloadActionEnum.WORKLOAD_SELECT_ACTION_ADD_ALL);

		initEEnum(dialogActionEnumEEnum, DialogActionEnum.class, "DialogActionEnum");
		addEEnumLiteral(dialogActionEnumEEnum, DialogActionEnum.DIALOG_ACTION_NEW);
		addEEnumLiteral(dialogActionEnumEEnum, DialogActionEnum.DIALOG_ACTION_SAVE);
		addEEnumLiteral(dialogActionEnumEEnum, DialogActionEnum.DIALOG_ACTION_DELETE);
		addEEnumLiteral(dialogActionEnumEEnum, DialogActionEnum.DIALOG_ACTION_CANCEL);
		addEEnumLiteral(dialogActionEnumEEnum, DialogActionEnum.DIALOG_ACTION_SAVE_AND_NEW);
		addEEnumLiteral(dialogActionEnumEEnum, DialogActionEnum.DIALOG_ACTION_SAVE_AS_NEW);

		initEEnum(reportActionEnumEEnum, ReportActionEnum.class, "ReportActionEnum");
		addEEnumLiteral(reportActionEnumEEnum, ReportActionEnum.REPORT_ACTION_PRINT_ON_SERVER_PDF);
		addEEnumLiteral(reportActionEnumEEnum, ReportActionEnum.REPORT_ACTION_DOWNLOAD_PDF);

		initEEnum(chartActionEnumEEnum, ChartActionEnum.class, "ChartActionEnum");
		addEEnumLiteral(chartActionEnumEEnum, ChartActionEnum.CHART_ACTION_DOWNLOAD);

		initEEnum(workflowActionEnumEEnum, WorkflowActionEnum.class, "WorkflowActionEnum");
		addEEnumLiteral(workflowActionEnumEEnum, WorkflowActionEnum.WORKFLOW_ACTION_START);

		initEEnum(datainterchangeActionEnumEEnum, DatainterchangeActionEnum.class, "DatainterchangeActionEnum");
		addEEnumLiteral(datainterchangeActionEnumEEnum, DatainterchangeActionEnum.DATAINTERCHANGE_ACTION_IMPORT);
		addEEnumLiteral(datainterchangeActionEnumEEnum, DatainterchangeActionEnum.DATAINTERCHANGE_ACTION_EXPORT);

		initEEnum(uiActionEnumEEnum, UIActionEnum.class, "UIActionEnum");
		addEEnumLiteral(uiActionEnumEEnum, UIActionEnum.NEXT_PART);
		addEEnumLiteral(uiActionEnumEEnum, UIActionEnum.PREVIOUS_PART);
		addEEnumLiteral(uiActionEnumEEnum, UIActionEnum.DATABASE_INFO);
		addEEnumLiteral(uiActionEnumEEnum, UIActionEnum.MDX_QUERY);

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

} //ActionDSLPackageImpl
