/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  which accompanies this distribution, and is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *  
 *  Contributors:                                                      
 *     Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 *  
 *  generated from AuthoritarionDSL.xcore
 * 
 *  
 */
package org.eclipse.osbp.xtext.authorizationdsl.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.dto.OSBPDtoPackage;

import org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage;

import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationBase;
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLFactory;
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLPackage;
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationLazyResolver;
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationModel;
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationPackage;
import org.eclipse.osbp.xtext.authorizationdsl.Role;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBean;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBeanAttribute;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBeanFeature;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBeanReference;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipAllUserTasks;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipProcess;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipProcessEnum;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipUserTask;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipUserTaskEnum;
import org.eclipse.osbp.xtext.authorizationdsl.RoleDto;
import org.eclipse.osbp.xtext.authorizationdsl.RoleDtoAttribute;
import org.eclipse.osbp.xtext.authorizationdsl.RoleDtoFeature;
import org.eclipse.osbp.xtext.authorizationdsl.RoleDtoReference;
import org.eclipse.osbp.xtext.authorizationdsl.RoleElement;
import org.eclipse.osbp.xtext.authorizationdsl.RoleEntity;
import org.eclipse.osbp.xtext.authorizationdsl.RoleEntityAttribute;
import org.eclipse.osbp.xtext.authorizationdsl.RoleEntityFeature;
import org.eclipse.osbp.xtext.authorizationdsl.RoleEntityReference;
import org.eclipse.osbp.xtext.authorizationdsl.RoleEnum;
import org.eclipse.osbp.xtext.authorizationdsl.RolePropertyEnum;

import org.eclipse.osbp.xtext.blip.BlipDSLPackage;

import org.eclipse.xtext.xtype.XtypePackage;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private EEnum roleBlipUserTaskEnumEEnum = 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.authorizationdsl.AuthorizationDSLPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private AuthorizationDSLPackageImpl() {
		super(eNS_URI, AuthorizationDSLFactory.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 AuthorizationDSLPackage#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 AuthorizationDSLPackage init() {
		if (isInited) return (AuthorizationDSLPackage)EPackage.Registry.INSTANCE.getEPackage(AuthorizationDSLPackage.eNS_URI);

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

		isInited = true;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AuthorizationDSLFactory getAuthorizationDSLFactory() {
		return (AuthorizationDSLFactory)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
		authorizationModelEClass = createEClass(AUTHORIZATION_MODEL);
		createEReference(authorizationModelEClass, AUTHORIZATION_MODEL__IMPORT_SECTION);
		createEReference(authorizationModelEClass, AUTHORIZATION_MODEL__PCKG);

		authorizationLazyResolverEClass = createEClass(AUTHORIZATION_LAZY_RESOLVER);
		createEOperation(authorizationLazyResolverEClass, AUTHORIZATION_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT);

		authorizationPackageEClass = createEClass(AUTHORIZATION_PACKAGE);
		createEReference(authorizationPackageEClass, AUTHORIZATION_PACKAGE__ROLES);

		authorizationBaseEClass = createEClass(AUTHORIZATION_BASE);
		createEAttribute(authorizationBaseEClass, AUTHORIZATION_BASE__NAME);

		roleEClass = createEClass(ROLE);
		createEReference(roleEClass, ROLE__ROLE_ELEMENTS);

		roleElementEClass = createEClass(ROLE_ELEMENT);

		roleEntityEClass = createEClass(ROLE_ENTITY);
		createEAttribute(roleEntityEClass, ROLE_ENTITY__ENTITY_AUTHORIZED);
		createEReference(roleEntityEClass, ROLE_ENTITY__ENTITY_FEATURES);
		createEReference(roleEntityEClass, ROLE_ENTITY__ENTITY_REF);

		roleBeanEClass = createEClass(ROLE_BEAN);
		createEAttribute(roleBeanEClass, ROLE_BEAN__BEAN_AUTHORIZED);
		createEReference(roleBeanEClass, ROLE_BEAN__BEAN_FEATURES);
		createEReference(roleBeanEClass, ROLE_BEAN__BEAN_REF);

		roleDtoEClass = createEClass(ROLE_DTO);
		createEAttribute(roleDtoEClass, ROLE_DTO__DTO_AUTHORIZED);
		createEReference(roleDtoEClass, ROLE_DTO__DTO_FEATURES);
		createEReference(roleDtoEClass, ROLE_DTO__DTO_REF);

		roleBlipAllUserTasksEClass = createEClass(ROLE_BLIP_ALL_USER_TASKS);
		createEAttribute(roleBlipAllUserTasksEClass, ROLE_BLIP_ALL_USER_TASKS__AUTHORIZED);

		roleBlipUserTaskEClass = createEClass(ROLE_BLIP_USER_TASK);
		createEReference(roleBlipUserTaskEClass, ROLE_BLIP_USER_TASK__USER_TASK);
		createEAttribute(roleBlipUserTaskEClass, ROLE_BLIP_USER_TASK__AUTHORIZED);

		roleBlipProcessEClass = createEClass(ROLE_BLIP_PROCESS);
		createEReference(roleBlipProcessEClass, ROLE_BLIP_PROCESS__PROCESS);
		createEAttribute(roleBlipProcessEClass, ROLE_BLIP_PROCESS__PROCESS_START_AUTHORIZED);
		createEReference(roleBlipProcessEClass, ROLE_BLIP_PROCESS__ALL_USER_TASKS);
		createEReference(roleBlipProcessEClass, ROLE_BLIP_PROCESS__USER_TASKS);

		roleEntityFeatureEClass = createEClass(ROLE_ENTITY_FEATURE);
		createEReference(roleEntityFeatureEClass, ROLE_ENTITY_FEATURE__ENTITY_ATTRI_COL);

		roleEntityAttributeEClass = createEClass(ROLE_ENTITY_ATTRIBUTE);
		createEAttribute(roleEntityAttributeEClass, ROLE_ENTITY_ATTRIBUTE__ENTITY_ATTRI_UNAUTHORIZED);

		roleEntityReferenceEClass = createEClass(ROLE_ENTITY_REFERENCE);
		createEAttribute(roleEntityReferenceEClass, ROLE_ENTITY_REFERENCE__ENTITY_ATTRI_UNAUTHORIZED);

		roleBeanFeatureEClass = createEClass(ROLE_BEAN_FEATURE);
		createEReference(roleBeanFeatureEClass, ROLE_BEAN_FEATURE__BEAN_ATTRI_COL);

		roleBeanAttributeEClass = createEClass(ROLE_BEAN_ATTRIBUTE);
		createEAttribute(roleBeanAttributeEClass, ROLE_BEAN_ATTRIBUTE__BEAN_ATTRI_UNAUTHORIZED);

		roleBeanReferenceEClass = createEClass(ROLE_BEAN_REFERENCE);
		createEAttribute(roleBeanReferenceEClass, ROLE_BEAN_REFERENCE__BEAN_ATTRI_UNAUTHORIZED);

		roleDtoFeatureEClass = createEClass(ROLE_DTO_FEATURE);
		createEReference(roleDtoFeatureEClass, ROLE_DTO_FEATURE__DTO_ATTRI_COL);

		roleDtoAttributeEClass = createEClass(ROLE_DTO_ATTRIBUTE);
		createEAttribute(roleDtoAttributeEClass, ROLE_DTO_ATTRIBUTE__DTO_ATTRI_UNAUTHORIZED);

		roleDtoReferenceEClass = createEClass(ROLE_DTO_REFERENCE);
		createEAttribute(roleDtoReferenceEClass, ROLE_DTO_REFERENCE__DTO_ATTRI_UNAUTHORIZED);

		// Create enums
		roleEnumEEnum = createEEnum(ROLE_ENUM);
		rolePropertyEnumEEnum = createEEnum(ROLE_PROPERTY_ENUM);
		roleBlipProcessEnumEEnum = createEEnum(ROLE_BLIP_PROCESS_ENUM);
		roleBlipUserTaskEnumEEnum = createEEnum(ROLE_BLIP_USER_TASK_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);
		OSBPEntityPackage theOSBPEntityPackage = (OSBPEntityPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPEntityPackage.eNS_URI);
		OSBPDtoPackage theOSBPDtoPackage = (OSBPDtoPackage)EPackage.Registry.INSTANCE.getEPackage(OSBPDtoPackage.eNS_URI);
		BlipDSLPackage theBlipDSLPackage = (BlipDSLPackage)EPackage.Registry.INSTANCE.getEPackage(BlipDSLPackage.eNS_URI);

		// Create type parameters

		// Set bounds for type parameters

		// Add supertypes to classes
		authorizationPackageEClass.getESuperTypes().add(theOSBPTypesPackage.getLPackage());
		authorizationBaseEClass.getESuperTypes().add(this.getAuthorizationLazyResolver());
		roleEClass.getESuperTypes().add(this.getAuthorizationBase());
		roleElementEClass.getESuperTypes().add(this.getAuthorizationLazyResolver());
		roleEntityEClass.getESuperTypes().add(this.getRoleElement());
		roleBeanEClass.getESuperTypes().add(this.getRoleElement());
		roleDtoEClass.getESuperTypes().add(this.getRoleElement());
		roleBlipAllUserTasksEClass.getESuperTypes().add(this.getRoleElement());
		roleBlipUserTaskEClass.getESuperTypes().add(this.getRoleElement());
		roleBlipProcessEClass.getESuperTypes().add(this.getRoleElement());
		roleEntityFeatureEClass.getESuperTypes().add(this.getAuthorizationLazyResolver());
		roleEntityAttributeEClass.getESuperTypes().add(this.getRoleEntityFeature());
		roleEntityReferenceEClass.getESuperTypes().add(this.getRoleEntityFeature());
		roleBeanFeatureEClass.getESuperTypes().add(this.getAuthorizationLazyResolver());
		roleBeanAttributeEClass.getESuperTypes().add(this.getRoleBeanFeature());
		roleBeanReferenceEClass.getESuperTypes().add(this.getRoleBeanFeature());
		roleDtoFeatureEClass.getESuperTypes().add(this.getAuthorizationLazyResolver());
		roleDtoAttributeEClass.getESuperTypes().add(this.getRoleDtoFeature());
		roleDtoReferenceEClass.getESuperTypes().add(this.getRoleDtoFeature());

		// Initialize classes, features, and operations; add parameters
		initEClass(authorizationModelEClass, AuthorizationModel.class, "AuthorizationModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getAuthorizationModel_ImportSection(), theXtypePackage.getXImportSection(), null, "importSection", null, 0, 1, AuthorizationModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getAuthorizationModel_Pckg(), this.getAuthorizationPackage(), null, "pckg", null, 0, 1, AuthorizationModel.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(authorizationLazyResolverEClass, AuthorizationLazyResolver.class, "AuthorizationLazyResolver", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

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

		initEClass(authorizationPackageEClass, AuthorizationPackage.class, "AuthorizationPackage", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getAuthorizationPackage_Roles(), this.getRole(), null, "roles", null, 0, -1, AuthorizationPackage.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

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

		initEClass(roleEClass, Role.class, "Role", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRole_RoleElements(), this.getRoleElement(), null, "roleElements", null, 0, -1, Role.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleElementEClass, RoleElement.class, "RoleElement", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);

		initEClass(roleEntityEClass, RoleEntity.class, "RoleEntity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleEntity_EntityAuthorized(), this.getRoleEnum(), "entityAuthorized", null, 0, -1, RoleEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRoleEntity_EntityFeatures(), this.getRoleEntityFeature(), null, "entityFeatures", null, 0, -1, RoleEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRoleEntity_EntityRef(), theOSBPEntityPackage.getLEntity(), null, "entityRef", null, 0, 1, RoleEntity.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleBeanEClass, RoleBean.class, "RoleBean", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleBean_BeanAuthorized(), this.getRoleEnum(), "beanAuthorized", null, 0, -1, RoleBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRoleBean_BeanFeatures(), this.getRoleBeanFeature(), null, "beanFeatures", null, 0, -1, RoleBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRoleBean_BeanRef(), theOSBPEntityPackage.getLBean(), null, "beanRef", null, 0, 1, RoleBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleDtoEClass, RoleDto.class, "RoleDto", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleDto_DtoAuthorized(), this.getRoleEnum(), "dtoAuthorized", null, 0, -1, RoleDto.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRoleDto_DtoFeatures(), this.getRoleDtoFeature(), null, "dtoFeatures", null, 0, -1, RoleDto.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRoleDto_DtoRef(), theOSBPDtoPackage.getLDto(), null, "dtoRef", null, 0, 1, RoleDto.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleBlipAllUserTasksEClass, RoleBlipAllUserTasks.class, "RoleBlipAllUserTasks", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleBlipAllUserTasks_Authorized(), this.getRoleBlipUserTaskEnum(), "authorized", null, 0, 1, RoleBlipAllUserTasks.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleBlipUserTaskEClass, RoleBlipUserTask.class, "RoleBlipUserTask", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRoleBlipUserTask_UserTask(), theBlipDSLPackage.getBlipUserTask(), null, "userTask", null, 0, 1, RoleBlipUserTask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getRoleBlipUserTask_Authorized(), this.getRoleBlipUserTaskEnum(), "authorized", null, 0, 1, RoleBlipUserTask.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleBlipProcessEClass, RoleBlipProcess.class, "RoleBlipProcess", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRoleBlipProcess_Process(), theBlipDSLPackage.getBlip(), null, "process", null, 0, 1, RoleBlipProcess.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEAttribute(getRoleBlipProcess_ProcessStartAuthorized(), this.getRoleBlipProcessEnum(), "processStartAuthorized", null, 0, 1, RoleBlipProcess.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRoleBlipProcess_AllUserTasks(), this.getRoleBlipAllUserTasks(), null, "allUserTasks", null, 0, 1, RoleBlipProcess.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
		initEReference(getRoleBlipProcess_UserTasks(), this.getRoleBlipUserTask(), null, "userTasks", null, 0, -1, RoleBlipProcess.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleEntityFeatureEClass, RoleEntityFeature.class, "RoleEntityFeature", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRoleEntityFeature_EntityAttriCol(), theOSBPEntityPackage.getLEntityFeature(), null, "entityAttriCol", null, 0, 1, RoleEntityFeature.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleEntityAttributeEClass, RoleEntityAttribute.class, "RoleEntityAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleEntityAttribute_EntityAttriUnauthorized(), this.getRolePropertyEnum(), "entityAttriUnauthorized", null, 0, 1, RoleEntityAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleEntityReferenceEClass, RoleEntityReference.class, "RoleEntityReference", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleEntityReference_EntityAttriUnauthorized(), this.getRolePropertyEnum(), "entityAttriUnauthorized", null, 0, 1, RoleEntityReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleBeanFeatureEClass, RoleBeanFeature.class, "RoleBeanFeature", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRoleBeanFeature_BeanAttriCol(), theOSBPEntityPackage.getLBeanFeature(), null, "beanAttriCol", null, 0, 1, RoleBeanFeature.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleBeanAttributeEClass, RoleBeanAttribute.class, "RoleBeanAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleBeanAttribute_BeanAttriUnauthorized(), this.getRolePropertyEnum(), "beanAttriUnauthorized", null, 0, 1, RoleBeanAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleBeanReferenceEClass, RoleBeanReference.class, "RoleBeanReference", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleBeanReference_BeanAttriUnauthorized(), this.getRolePropertyEnum(), "beanAttriUnauthorized", null, 0, 1, RoleBeanReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleDtoFeatureEClass, RoleDtoFeature.class, "RoleDtoFeature", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEReference(getRoleDtoFeature_DtoAttriCol(), theOSBPDtoPackage.getLDtoFeature(), null, "dtoAttriCol", null, 0, 1, RoleDtoFeature.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleDtoAttributeEClass, RoleDtoAttribute.class, "RoleDtoAttribute", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleDtoAttribute_DtoAttriUnauthorized(), this.getRolePropertyEnum(), "dtoAttriUnauthorized", null, 0, 1, RoleDtoAttribute.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		initEClass(roleDtoReferenceEClass, RoleDtoReference.class, "RoleDtoReference", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
		initEAttribute(getRoleDtoReference_DtoAttriUnauthorized(), this.getRolePropertyEnum(), "dtoAttriUnauthorized", null, 0, 1, RoleDtoReference.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);

		// Initialize enums and add enum literals
		initEEnum(roleEnumEEnum, RoleEnum.class, "RoleEnum");
		addEEnumLiteral(roleEnumEEnum, RoleEnum.ANY);
		addEEnumLiteral(roleEnumEEnum, RoleEnum.CREATABLE);
		addEEnumLiteral(roleEnumEEnum, RoleEnum.READABLE);
		addEEnumLiteral(roleEnumEEnum, RoleEnum.UPDATABLE);
		addEEnumLiteral(roleEnumEEnum, RoleEnum.DELETABLE);

		initEEnum(rolePropertyEnumEEnum, RolePropertyEnum.class, "RolePropertyEnum");
		addEEnumLiteral(rolePropertyEnumEEnum, RolePropertyEnum.INVISIBLE);
		addEEnumLiteral(rolePropertyEnumEEnum, RolePropertyEnum.DISABLED);
		addEEnumLiteral(rolePropertyEnumEEnum, RolePropertyEnum.NONEDITABLE);

		initEEnum(roleBlipProcessEnumEEnum, RoleBlipProcessEnum.class, "RoleBlipProcessEnum");
		addEEnumLiteral(roleBlipProcessEnumEEnum, RoleBlipProcessEnum.STARTABLE);

		initEEnum(roleBlipUserTaskEnumEEnum, RoleBlipUserTaskEnum.class, "RoleBlipUserTaskEnum");
		addEEnumLiteral(roleBlipUserTaskEnumEEnum, RoleBlipUserTaskEnum.EXECUTABLE);

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

} //AuthorizationDSLPackageImpl
