/**
 *                                                                            
 *  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 by Xtext 2.11.0
 *
 */

package org.eclipse.osbp.xtext.authorizationdsl.services;

import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.util.List;
import org.eclipse.osbp.xtext.oxtype.services.OXtypeGrammarAccess;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Alternatives;
import org.eclipse.xtext.Assignment;
import org.eclipse.xtext.CrossReference;
import org.eclipse.xtext.EnumLiteralDeclaration;
import org.eclipse.xtext.EnumRule;
import org.eclipse.xtext.Grammar;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.Group;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.TerminalRule;
import org.eclipse.xtext.service.AbstractElementFinder.AbstractEnumRuleElementFinder;
import org.eclipse.xtext.service.AbstractElementFinder.AbstractGrammarElementFinder;
import org.eclipse.xtext.service.GrammarProvider;
import org.eclipse.xtext.xbase.annotations.services.XbaseWithAnnotationsGrammarAccess;
import org.eclipse.xtext.xbase.services.XbaseGrammarAccess;
import org.eclipse.xtext.xbase.services.XtypeGrammarAccess;

@Singleton
public class AuthorizationDSLGrammarAccess extends AbstractGrammarElementFinder {
	
	public class AuthorizationModelElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.AuthorizationModel");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Assignment cImportSectionAssignment_0 = (Assignment)cGroup.eContents().get(0);
		private final RuleCall cImportSectionXImportSectionParserRuleCall_0_0 = (RuleCall)cImportSectionAssignment_0.eContents().get(0);
		private final Assignment cPckgAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cPckgAuthorizationPackageParserRuleCall_1_0 = (RuleCall)cPckgAssignment_1.eContents().get(0);
		
		//AuthorizationModel:
		//	importSection=XImportSection?
		//	pckg=AuthorizationPackage;
		@Override public ParserRule getRule() { return rule; }
		
		//importSection=XImportSection? pckg=AuthorizationPackage
		public Group getGroup() { return cGroup; }
		
		//importSection=XImportSection?
		public Assignment getImportSectionAssignment_0() { return cImportSectionAssignment_0; }
		
		//XImportSection
		public RuleCall getImportSectionXImportSectionParserRuleCall_0_0() { return cImportSectionXImportSectionParserRuleCall_0_0; }
		
		//pckg=AuthorizationPackage
		public Assignment getPckgAssignment_1() { return cPckgAssignment_1; }
		
		//AuthorizationPackage
		public RuleCall getPckgAuthorizationPackageParserRuleCall_1_0() { return cPckgAuthorizationPackageParserRuleCall_1_0; }
	}
	public class AuthorizationPackageElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.AuthorizationPackage");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cAuthorizationPackageAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cPackageKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cNameAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cNameQualifiedNameParserRuleCall_2_0 = (RuleCall)cNameAssignment_2.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Assignment cRolesAssignment_4 = (Assignment)cGroup.eContents().get(4);
		private final RuleCall cRolesRoleParserRuleCall_4_0 = (RuleCall)cRolesAssignment_4.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
		
		//AuthorizationPackage:
		//	{AuthorizationPackage} 'package' name=QualifiedName '{' roles+=Role* '}';
		@Override public ParserRule getRule() { return rule; }
		
		//{AuthorizationPackage} 'package' name=QualifiedName '{' roles+=Role* '}'
		public Group getGroup() { return cGroup; }
		
		//{AuthorizationPackage}
		public Action getAuthorizationPackageAction_0() { return cAuthorizationPackageAction_0; }
		
		//'package'
		public Keyword getPackageKeyword_1() { return cPackageKeyword_1; }
		
		//name=QualifiedName
		public Assignment getNameAssignment_2() { return cNameAssignment_2; }
		
		//QualifiedName
		public RuleCall getNameQualifiedNameParserRuleCall_2_0() { return cNameQualifiedNameParserRuleCall_2_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//roles+=Role*
		public Assignment getRolesAssignment_4() { return cRolesAssignment_4; }
		
		//Role
		public RuleCall getRolesRoleParserRuleCall_4_0() { return cRolesRoleParserRuleCall_4_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
	}
	public class RoleElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.Role");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cRoleKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cNameAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final RuleCall cNameTRANSLATABLEIDParserRuleCall_1_0 = (RuleCall)cNameAssignment_1.eContents().get(0);
		private final Keyword cLeftCurlyBracketKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cRoleElementsAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cRoleElementsRoleElementParserRuleCall_3_0 = (RuleCall)cRoleElementsAssignment_3.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
		
		//Role:
		//	'role' name=TRANSLATABLEID '{' roleElements+=RoleElement* '}';
		@Override public ParserRule getRule() { return rule; }
		
		//'role' name=TRANSLATABLEID '{' roleElements+=RoleElement* '}'
		public Group getGroup() { return cGroup; }
		
		//'role'
		public Keyword getRoleKeyword_0() { return cRoleKeyword_0; }
		
		//name=TRANSLATABLEID
		public Assignment getNameAssignment_1() { return cNameAssignment_1; }
		
		//TRANSLATABLEID
		public RuleCall getNameTRANSLATABLEIDParserRuleCall_1_0() { return cNameTRANSLATABLEIDParserRuleCall_1_0; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_2() { return cLeftCurlyBracketKeyword_2; }
		
		//roleElements+=RoleElement*
		public Assignment getRoleElementsAssignment_3() { return cRoleElementsAssignment_3; }
		
		//RoleElement
		public RuleCall getRoleElementsRoleElementParserRuleCall_3_0() { return cRoleElementsRoleElementParserRuleCall_3_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4() { return cRightCurlyBracketKeyword_4; }
	}
	public class RoleElementElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleElement");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cRoleEntityParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cRoleBeanParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		private final RuleCall cRoleDtoParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
		private final RuleCall cRoleBlipProcessParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
		
		//RoleElement:
		//	RoleEntity | RoleBean | RoleDto | RoleBlipProcess;
		@Override public ParserRule getRule() { return rule; }
		
		//RoleEntity | RoleBean | RoleDto | RoleBlipProcess
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//RoleEntity
		public RuleCall getRoleEntityParserRuleCall_0() { return cRoleEntityParserRuleCall_0; }
		
		//RoleBean
		public RuleCall getRoleBeanParserRuleCall_1() { return cRoleBeanParserRuleCall_1; }
		
		//RoleDto
		public RuleCall getRoleDtoParserRuleCall_2() { return cRoleDtoParserRuleCall_2; }
		
		//RoleBlipProcess
		public RuleCall getRoleBlipProcessParserRuleCall_3() { return cRoleBlipProcessParserRuleCall_3; }
	}
	public class RoleEntityElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleEntity");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleEntityAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cEntityKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cEntityRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cEntityRefLEntityCrossReference_2_0 = (CrossReference)cEntityRefAssignment_2.eContents().get(0);
		private final RuleCall cEntityRefLEntityIDTerminalRuleCall_2_0_1 = (RuleCall)cEntityRefLEntityCrossReference_2_0.eContents().get(1);
		private final Assignment cEntityAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cEntityAuthorizedRoleEnumEnumRuleCall_3_0 = (RuleCall)cEntityAuthorizedAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cEntityFeaturesAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cEntityFeaturesRoleEntityFeatureParserRuleCall_4_1_0 = (RuleCall)cEntityFeaturesAssignment_4_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		
		//RoleEntity:
		//	{RoleEntity} 'entity' entityRef=[entity::LEntity] entityAuthorized+=RoleEnum+ ('{' entityFeatures+=RoleEntityFeature+
		//	'}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{RoleEntity} 'entity' entityRef=[entity::LEntity] entityAuthorized+=RoleEnum+ ('{' entityFeatures+=RoleEntityFeature+
		//'}')?
		public Group getGroup() { return cGroup; }
		
		//{RoleEntity}
		public Action getRoleEntityAction_0() { return cRoleEntityAction_0; }
		
		//'entity'
		public Keyword getEntityKeyword_1() { return cEntityKeyword_1; }
		
		//entityRef=[entity::LEntity]
		public Assignment getEntityRefAssignment_2() { return cEntityRefAssignment_2; }
		
		//[entity::LEntity]
		public CrossReference getEntityRefLEntityCrossReference_2_0() { return cEntityRefLEntityCrossReference_2_0; }
		
		//ID
		public RuleCall getEntityRefLEntityIDTerminalRuleCall_2_0_1() { return cEntityRefLEntityIDTerminalRuleCall_2_0_1; }
		
		//entityAuthorized+=RoleEnum+
		public Assignment getEntityAuthorizedAssignment_3() { return cEntityAuthorizedAssignment_3; }
		
		//RoleEnum
		public RuleCall getEntityAuthorizedRoleEnumEnumRuleCall_3_0() { return cEntityAuthorizedRoleEnumEnumRuleCall_3_0; }
		
		//('{' entityFeatures+=RoleEntityFeature+ '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//entityFeatures+=RoleEntityFeature+
		public Assignment getEntityFeaturesAssignment_4_1() { return cEntityFeaturesAssignment_4_1; }
		
		//RoleEntityFeature
		public RuleCall getEntityFeaturesRoleEntityFeatureParserRuleCall_4_1_0() { return cEntityFeaturesRoleEntityFeatureParserRuleCall_4_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_2() { return cRightCurlyBracketKeyword_4_2; }
	}
	public class RoleBeanElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBean");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleBeanAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cBeanKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cBeanRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cBeanRefLBeanCrossReference_2_0 = (CrossReference)cBeanRefAssignment_2.eContents().get(0);
		private final RuleCall cBeanRefLBeanIDTerminalRuleCall_2_0_1 = (RuleCall)cBeanRefLBeanCrossReference_2_0.eContents().get(1);
		private final Assignment cBeanAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cBeanAuthorizedRoleEnumEnumRuleCall_3_0 = (RuleCall)cBeanAuthorizedAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cBeanFeaturesAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cBeanFeaturesRoleBeanFeatureParserRuleCall_4_1_0 = (RuleCall)cBeanFeaturesAssignment_4_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		
		//RoleBean:
		//	{RoleBean} 'bean' beanRef=[entity::LBean] beanAuthorized+=RoleEnum+ ('{' beanFeatures+=RoleBeanFeature+ '}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{RoleBean} 'bean' beanRef=[entity::LBean] beanAuthorized+=RoleEnum+ ('{' beanFeatures+=RoleBeanFeature+ '}')?
		public Group getGroup() { return cGroup; }
		
		//{RoleBean}
		public Action getRoleBeanAction_0() { return cRoleBeanAction_0; }
		
		//'bean'
		public Keyword getBeanKeyword_1() { return cBeanKeyword_1; }
		
		//beanRef=[entity::LBean]
		public Assignment getBeanRefAssignment_2() { return cBeanRefAssignment_2; }
		
		//[entity::LBean]
		public CrossReference getBeanRefLBeanCrossReference_2_0() { return cBeanRefLBeanCrossReference_2_0; }
		
		//ID
		public RuleCall getBeanRefLBeanIDTerminalRuleCall_2_0_1() { return cBeanRefLBeanIDTerminalRuleCall_2_0_1; }
		
		//beanAuthorized+=RoleEnum+
		public Assignment getBeanAuthorizedAssignment_3() { return cBeanAuthorizedAssignment_3; }
		
		//RoleEnum
		public RuleCall getBeanAuthorizedRoleEnumEnumRuleCall_3_0() { return cBeanAuthorizedRoleEnumEnumRuleCall_3_0; }
		
		//('{' beanFeatures+=RoleBeanFeature+ '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//beanFeatures+=RoleBeanFeature+
		public Assignment getBeanFeaturesAssignment_4_1() { return cBeanFeaturesAssignment_4_1; }
		
		//RoleBeanFeature
		public RuleCall getBeanFeaturesRoleBeanFeatureParserRuleCall_4_1_0() { return cBeanFeaturesRoleBeanFeatureParserRuleCall_4_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_2() { return cRightCurlyBracketKeyword_4_2; }
	}
	public class RoleDtoElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleDto");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleDtoAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cDtoKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cDtoRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cDtoRefLDtoCrossReference_2_0 = (CrossReference)cDtoRefAssignment_2.eContents().get(0);
		private final RuleCall cDtoRefLDtoIDTerminalRuleCall_2_0_1 = (RuleCall)cDtoRefLDtoCrossReference_2_0.eContents().get(1);
		private final Assignment cDtoAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cDtoAuthorizedRoleEnumEnumRuleCall_3_0 = (RuleCall)cDtoAuthorizedAssignment_3.eContents().get(0);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cLeftCurlyBracketKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cDtoFeaturesAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cDtoFeaturesRoleDtoFeatureParserRuleCall_4_1_0 = (RuleCall)cDtoFeaturesAssignment_4_1.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_4_2 = (Keyword)cGroup_4.eContents().get(2);
		
		//RoleDto:
		//	{RoleDto} 'dto' dtoRef=[dto::LDto] dtoAuthorized+=RoleEnum+ ('{' dtoFeatures+=RoleDtoFeature+ '}')?;
		@Override public ParserRule getRule() { return rule; }
		
		//{RoleDto} 'dto' dtoRef=[dto::LDto] dtoAuthorized+=RoleEnum+ ('{' dtoFeatures+=RoleDtoFeature+ '}')?
		public Group getGroup() { return cGroup; }
		
		//{RoleDto}
		public Action getRoleDtoAction_0() { return cRoleDtoAction_0; }
		
		//'dto'
		public Keyword getDtoKeyword_1() { return cDtoKeyword_1; }
		
		//dtoRef=[dto::LDto]
		public Assignment getDtoRefAssignment_2() { return cDtoRefAssignment_2; }
		
		//[dto::LDto]
		public CrossReference getDtoRefLDtoCrossReference_2_0() { return cDtoRefLDtoCrossReference_2_0; }
		
		//ID
		public RuleCall getDtoRefLDtoIDTerminalRuleCall_2_0_1() { return cDtoRefLDtoIDTerminalRuleCall_2_0_1; }
		
		//dtoAuthorized+=RoleEnum+
		public Assignment getDtoAuthorizedAssignment_3() { return cDtoAuthorizedAssignment_3; }
		
		//RoleEnum
		public RuleCall getDtoAuthorizedRoleEnumEnumRuleCall_3_0() { return cDtoAuthorizedRoleEnumEnumRuleCall_3_0; }
		
		//('{' dtoFeatures+=RoleDtoFeature+ '}')?
		public Group getGroup_4() { return cGroup_4; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_4_0() { return cLeftCurlyBracketKeyword_4_0; }
		
		//dtoFeatures+=RoleDtoFeature+
		public Assignment getDtoFeaturesAssignment_4_1() { return cDtoFeaturesAssignment_4_1; }
		
		//RoleDtoFeature
		public RuleCall getDtoFeaturesRoleDtoFeatureParserRuleCall_4_1_0() { return cDtoFeaturesRoleDtoFeatureParserRuleCall_4_1_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_4_2() { return cRightCurlyBracketKeyword_4_2; }
	}
	public class RoleBlipAllUserTasksElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBlipAllUserTasks");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleBlipAllUserTasksAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cAllKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Keyword cUsertasksKeyword_2 = (Keyword)cGroup.eContents().get(2);
		private final Assignment cAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0 = (RuleCall)cAuthorizedAssignment_3.eContents().get(0);
		
		//RoleBlipAllUserTasks:
		//	{RoleBlipAllUserTasks} 'all' 'usertasks' authorized=RoleBlipUserTaskEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//{RoleBlipAllUserTasks} 'all' 'usertasks' authorized=RoleBlipUserTaskEnum
		public Group getGroup() { return cGroup; }
		
		//{RoleBlipAllUserTasks}
		public Action getRoleBlipAllUserTasksAction_0() { return cRoleBlipAllUserTasksAction_0; }
		
		//'all'
		public Keyword getAllKeyword_1() { return cAllKeyword_1; }
		
		//'usertasks'
		public Keyword getUsertasksKeyword_2() { return cUsertasksKeyword_2; }
		
		//authorized=RoleBlipUserTaskEnum
		public Assignment getAuthorizedAssignment_3() { return cAuthorizedAssignment_3; }
		
		//RoleBlipUserTaskEnum
		public RuleCall getAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0() { return cAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0; }
	}
	public class RoleBlipUserTaskElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBlipUserTask");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleBlipUserTaskAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cUsertaskKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cUserTaskAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cUserTaskBlipUserTaskCrossReference_2_0 = (CrossReference)cUserTaskAssignment_2.eContents().get(0);
		private final RuleCall cUserTaskBlipUserTaskQualifiedNameParserRuleCall_2_0_1 = (RuleCall)cUserTaskBlipUserTaskCrossReference_2_0.eContents().get(1);
		private final Assignment cAuthorizedAssignment_3 = (Assignment)cGroup.eContents().get(3);
		private final RuleCall cAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0 = (RuleCall)cAuthorizedAssignment_3.eContents().get(0);
		
		//RoleBlipUserTask:
		//	{RoleBlipUserTask} 'usertask' userTask=[blip::BlipUserTask|QualifiedName] authorized=RoleBlipUserTaskEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//{RoleBlipUserTask} 'usertask' userTask=[blip::BlipUserTask|QualifiedName] authorized=RoleBlipUserTaskEnum
		public Group getGroup() { return cGroup; }
		
		//{RoleBlipUserTask}
		public Action getRoleBlipUserTaskAction_0() { return cRoleBlipUserTaskAction_0; }
		
		//'usertask'
		public Keyword getUsertaskKeyword_1() { return cUsertaskKeyword_1; }
		
		//userTask=[blip::BlipUserTask|QualifiedName]
		public Assignment getUserTaskAssignment_2() { return cUserTaskAssignment_2; }
		
		//[blip::BlipUserTask|QualifiedName]
		public CrossReference getUserTaskBlipUserTaskCrossReference_2_0() { return cUserTaskBlipUserTaskCrossReference_2_0; }
		
		//QualifiedName
		public RuleCall getUserTaskBlipUserTaskQualifiedNameParserRuleCall_2_0_1() { return cUserTaskBlipUserTaskQualifiedNameParserRuleCall_2_0_1; }
		
		//authorized=RoleBlipUserTaskEnum
		public Assignment getAuthorizedAssignment_3() { return cAuthorizedAssignment_3; }
		
		//RoleBlipUserTaskEnum
		public RuleCall getAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0() { return cAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0; }
	}
	public class RoleBlipProcessElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBlipProcess");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Action cRoleBlipProcessAction_0 = (Action)cGroup.eContents().get(0);
		private final Keyword cProcessKeyword_1 = (Keyword)cGroup.eContents().get(1);
		private final Assignment cProcessAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final CrossReference cProcessBlipCrossReference_2_0 = (CrossReference)cProcessAssignment_2.eContents().get(0);
		private final RuleCall cProcessBlipIDTerminalRuleCall_2_0_1 = (RuleCall)cProcessBlipCrossReference_2_0.eContents().get(1);
		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
		private final Keyword cIsKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
		private final Assignment cProcessStartAuthorizedAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
		private final RuleCall cProcessStartAuthorizedRoleBlipProcessEnumEnumRuleCall_4_1_0 = (RuleCall)cProcessStartAuthorizedAssignment_4_1.eContents().get(0);
		private final Assignment cAllUserTasksAssignment_5 = (Assignment)cGroup.eContents().get(5);
		private final RuleCall cAllUserTasksRoleBlipAllUserTasksParserRuleCall_5_0 = (RuleCall)cAllUserTasksAssignment_5.eContents().get(0);
		private final Assignment cUserTasksAssignment_6 = (Assignment)cGroup.eContents().get(6);
		private final RuleCall cUserTasksRoleBlipUserTaskParserRuleCall_6_0 = (RuleCall)cUserTasksAssignment_6.eContents().get(0);
		private final Keyword cRightCurlyBracketKeyword_7 = (Keyword)cGroup.eContents().get(7);
		
		//RoleBlipProcess:
		//	{RoleBlipProcess} 'process' process=[blip::Blip] '{' ('is' processStartAuthorized=RoleBlipProcessEnum)?
		//	allUserTasks=RoleBlipAllUserTasks?
		//	userTasks+=RoleBlipUserTask*
		//	'}';
		@Override public ParserRule getRule() { return rule; }
		
		//{RoleBlipProcess} 'process' process=[blip::Blip] '{' ('is' processStartAuthorized=RoleBlipProcessEnum)?
		//allUserTasks=RoleBlipAllUserTasks? userTasks+=RoleBlipUserTask* '}'
		public Group getGroup() { return cGroup; }
		
		//{RoleBlipProcess}
		public Action getRoleBlipProcessAction_0() { return cRoleBlipProcessAction_0; }
		
		//'process'
		public Keyword getProcessKeyword_1() { return cProcessKeyword_1; }
		
		//process=[blip::Blip]
		public Assignment getProcessAssignment_2() { return cProcessAssignment_2; }
		
		//[blip::Blip]
		public CrossReference getProcessBlipCrossReference_2_0() { return cProcessBlipCrossReference_2_0; }
		
		//ID
		public RuleCall getProcessBlipIDTerminalRuleCall_2_0_1() { return cProcessBlipIDTerminalRuleCall_2_0_1; }
		
		//'{'
		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
		
		//('is' processStartAuthorized=RoleBlipProcessEnum)?
		public Group getGroup_4() { return cGroup_4; }
		
		//'is'
		public Keyword getIsKeyword_4_0() { return cIsKeyword_4_0; }
		
		//processStartAuthorized=RoleBlipProcessEnum
		public Assignment getProcessStartAuthorizedAssignment_4_1() { return cProcessStartAuthorizedAssignment_4_1; }
		
		//RoleBlipProcessEnum
		public RuleCall getProcessStartAuthorizedRoleBlipProcessEnumEnumRuleCall_4_1_0() { return cProcessStartAuthorizedRoleBlipProcessEnumEnumRuleCall_4_1_0; }
		
		//allUserTasks=RoleBlipAllUserTasks?
		public Assignment getAllUserTasksAssignment_5() { return cAllUserTasksAssignment_5; }
		
		//RoleBlipAllUserTasks
		public RuleCall getAllUserTasksRoleBlipAllUserTasksParserRuleCall_5_0() { return cAllUserTasksRoleBlipAllUserTasksParserRuleCall_5_0; }
		
		//userTasks+=RoleBlipUserTask*
		public Assignment getUserTasksAssignment_6() { return cUserTasksAssignment_6; }
		
		//RoleBlipUserTask
		public RuleCall getUserTasksRoleBlipUserTaskParserRuleCall_6_0() { return cUserTasksRoleBlipUserTaskParserRuleCall_6_0; }
		
		//'}'
		public Keyword getRightCurlyBracketKeyword_7() { return cRightCurlyBracketKeyword_7; }
	}
	public class RoleEntityFeatureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleEntityFeature");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cRoleEntityAttributeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cRoleEntityReferenceParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//RoleEntityFeature:
		//	RoleEntityAttribute | RoleEntityReference;
		@Override public ParserRule getRule() { return rule; }
		
		//RoleEntityAttribute | RoleEntityReference
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//RoleEntityAttribute
		public RuleCall getRoleEntityAttributeParserRuleCall_0() { return cRoleEntityAttributeParserRuleCall_0; }
		
		//RoleEntityReference
		public RuleCall getRoleEntityReferenceParserRuleCall_1() { return cRoleEntityReferenceParserRuleCall_1; }
	}
	public class RoleEntityAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleEntityAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cAttributeKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cEntityAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cEntityAttriColLEntityAttributeCrossReference_1_0 = (CrossReference)cEntityAttriColAssignment_1.eContents().get(0);
		private final RuleCall cEntityAttriColLEntityAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cEntityAttriColLEntityAttributeCrossReference_1_0.eContents().get(1);
		private final Assignment cEntityAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cEntityAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleEntityAttribute:
		//	'attribute' entityAttriCol=[entity::LEntityAttribute] entityAttriUnauthorized=RolePropertyEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'attribute' entityAttriCol=[entity::LEntityAttribute] entityAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }
		
		//'attribute'
		public Keyword getAttributeKeyword_0() { return cAttributeKeyword_0; }
		
		//entityAttriCol=[entity::LEntityAttribute]
		public Assignment getEntityAttriColAssignment_1() { return cEntityAttriColAssignment_1; }
		
		//[entity::LEntityAttribute]
		public CrossReference getEntityAttriColLEntityAttributeCrossReference_1_0() { return cEntityAttriColLEntityAttributeCrossReference_1_0; }
		
		//ID
		public RuleCall getEntityAttriColLEntityAttributeIDTerminalRuleCall_1_0_1() { return cEntityAttriColLEntityAttributeIDTerminalRuleCall_1_0_1; }
		
		//entityAttriUnauthorized=RolePropertyEnum
		public Assignment getEntityAttriUnauthorizedAssignment_2() { return cEntityAttriUnauthorizedAssignment_2; }
		
		//RolePropertyEnum
		public RuleCall getEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}
	public class RoleEntityReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleEntityReference");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cRelationKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cEntityAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cEntityAttriColLEntityReferenceCrossReference_1_0 = (CrossReference)cEntityAttriColAssignment_1.eContents().get(0);
		private final RuleCall cEntityAttriColLEntityReferenceIDTerminalRuleCall_1_0_1 = (RuleCall)cEntityAttriColLEntityReferenceCrossReference_1_0.eContents().get(1);
		private final Assignment cEntityAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cEntityAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleEntityReference:
		//	'relation' entityAttriCol=[entity::LEntityReference] entityAttriUnauthorized=RolePropertyEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'relation' entityAttriCol=[entity::LEntityReference] entityAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }
		
		//'relation'
		public Keyword getRelationKeyword_0() { return cRelationKeyword_0; }
		
		//entityAttriCol=[entity::LEntityReference]
		public Assignment getEntityAttriColAssignment_1() { return cEntityAttriColAssignment_1; }
		
		//[entity::LEntityReference]
		public CrossReference getEntityAttriColLEntityReferenceCrossReference_1_0() { return cEntityAttriColLEntityReferenceCrossReference_1_0; }
		
		//ID
		public RuleCall getEntityAttriColLEntityReferenceIDTerminalRuleCall_1_0_1() { return cEntityAttriColLEntityReferenceIDTerminalRuleCall_1_0_1; }
		
		//entityAttriUnauthorized=RolePropertyEnum
		public Assignment getEntityAttriUnauthorizedAssignment_2() { return cEntityAttriUnauthorizedAssignment_2; }
		
		//RolePropertyEnum
		public RuleCall getEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}
	public class RoleBeanFeatureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBeanFeature");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cRoleBeanAttributeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cRoleBeanReferenceParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//RoleBeanFeature:
		//	RoleBeanAttribute | RoleBeanReference;
		@Override public ParserRule getRule() { return rule; }
		
		//RoleBeanAttribute | RoleBeanReference
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//RoleBeanAttribute
		public RuleCall getRoleBeanAttributeParserRuleCall_0() { return cRoleBeanAttributeParserRuleCall_0; }
		
		//RoleBeanReference
		public RuleCall getRoleBeanReferenceParserRuleCall_1() { return cRoleBeanReferenceParserRuleCall_1; }
	}
	public class RoleBeanAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBeanAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cAttributeKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cBeanAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cBeanAttriColLBeanAttributeCrossReference_1_0 = (CrossReference)cBeanAttriColAssignment_1.eContents().get(0);
		private final RuleCall cBeanAttriColLBeanAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cBeanAttriColLBeanAttributeCrossReference_1_0.eContents().get(1);
		private final Assignment cBeanAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cBeanAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleBeanAttribute:
		//	'attribute' beanAttriCol=[entity::LBeanAttribute] beanAttriUnauthorized=RolePropertyEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'attribute' beanAttriCol=[entity::LBeanAttribute] beanAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }
		
		//'attribute'
		public Keyword getAttributeKeyword_0() { return cAttributeKeyword_0; }
		
		//beanAttriCol=[entity::LBeanAttribute]
		public Assignment getBeanAttriColAssignment_1() { return cBeanAttriColAssignment_1; }
		
		//[entity::LBeanAttribute]
		public CrossReference getBeanAttriColLBeanAttributeCrossReference_1_0() { return cBeanAttriColLBeanAttributeCrossReference_1_0; }
		
		//ID
		public RuleCall getBeanAttriColLBeanAttributeIDTerminalRuleCall_1_0_1() { return cBeanAttriColLBeanAttributeIDTerminalRuleCall_1_0_1; }
		
		//beanAttriUnauthorized=RolePropertyEnum
		public Assignment getBeanAttriUnauthorizedAssignment_2() { return cBeanAttriUnauthorizedAssignment_2; }
		
		//RolePropertyEnum
		public RuleCall getBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}
	public class RoleBeanReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBeanReference");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cRelationKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cBeanAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cBeanAttriColLBeanReferenceCrossReference_1_0 = (CrossReference)cBeanAttriColAssignment_1.eContents().get(0);
		private final RuleCall cBeanAttriColLBeanReferenceIDTerminalRuleCall_1_0_1 = (RuleCall)cBeanAttriColLBeanReferenceCrossReference_1_0.eContents().get(1);
		private final Assignment cBeanAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cBeanAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleBeanReference:
		//	'relation' beanAttriCol=[entity::LBeanReference] beanAttriUnauthorized=RolePropertyEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'relation' beanAttriCol=[entity::LBeanReference] beanAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }
		
		//'relation'
		public Keyword getRelationKeyword_0() { return cRelationKeyword_0; }
		
		//beanAttriCol=[entity::LBeanReference]
		public Assignment getBeanAttriColAssignment_1() { return cBeanAttriColAssignment_1; }
		
		//[entity::LBeanReference]
		public CrossReference getBeanAttriColLBeanReferenceCrossReference_1_0() { return cBeanAttriColLBeanReferenceCrossReference_1_0; }
		
		//ID
		public RuleCall getBeanAttriColLBeanReferenceIDTerminalRuleCall_1_0_1() { return cBeanAttriColLBeanReferenceIDTerminalRuleCall_1_0_1; }
		
		//beanAttriUnauthorized=RolePropertyEnum
		public Assignment getBeanAttriUnauthorizedAssignment_2() { return cBeanAttriUnauthorizedAssignment_2; }
		
		//RolePropertyEnum
		public RuleCall getBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}
	public class RoleDtoFeatureElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleDtoFeature");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final RuleCall cRoleDtoAttributeParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
		private final RuleCall cRoleDtoReferenceParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
		
		//RoleDtoFeature:
		//	RoleDtoAttribute | RoleDtoReference;
		@Override public ParserRule getRule() { return rule; }
		
		//RoleDtoAttribute | RoleDtoReference
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//RoleDtoAttribute
		public RuleCall getRoleDtoAttributeParserRuleCall_0() { return cRoleDtoAttributeParserRuleCall_0; }
		
		//RoleDtoReference
		public RuleCall getRoleDtoReferenceParserRuleCall_1() { return cRoleDtoReferenceParserRuleCall_1; }
	}
	public class RoleDtoAttributeElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleDtoAttribute");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cAttributeKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cDtoAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cDtoAttriColLDtoAttributeCrossReference_1_0 = (CrossReference)cDtoAttriColAssignment_1.eContents().get(0);
		private final RuleCall cDtoAttriColLDtoAttributeIDTerminalRuleCall_1_0_1 = (RuleCall)cDtoAttriColLDtoAttributeCrossReference_1_0.eContents().get(1);
		private final Assignment cDtoAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cDtoAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleDtoAttribute:
		//	'attribute' dtoAttriCol=[dto::LDtoAttribute] dtoAttriUnauthorized=RolePropertyEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'attribute' dtoAttriCol=[dto::LDtoAttribute] dtoAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }
		
		//'attribute'
		public Keyword getAttributeKeyword_0() { return cAttributeKeyword_0; }
		
		//dtoAttriCol=[dto::LDtoAttribute]
		public Assignment getDtoAttriColAssignment_1() { return cDtoAttriColAssignment_1; }
		
		//[dto::LDtoAttribute]
		public CrossReference getDtoAttriColLDtoAttributeCrossReference_1_0() { return cDtoAttriColLDtoAttributeCrossReference_1_0; }
		
		//ID
		public RuleCall getDtoAttriColLDtoAttributeIDTerminalRuleCall_1_0_1() { return cDtoAttriColLDtoAttributeIDTerminalRuleCall_1_0_1; }
		
		//dtoAttriUnauthorized=RolePropertyEnum
		public Assignment getDtoAttriUnauthorizedAssignment_2() { return cDtoAttriUnauthorizedAssignment_2; }
		
		//RolePropertyEnum
		public RuleCall getDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}
	public class RoleDtoReferenceElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleDtoReference");
		private final Group cGroup = (Group)rule.eContents().get(1);
		private final Keyword cRelationKeyword_0 = (Keyword)cGroup.eContents().get(0);
		private final Assignment cDtoAttriColAssignment_1 = (Assignment)cGroup.eContents().get(1);
		private final CrossReference cDtoAttriColLDtoReferenceCrossReference_1_0 = (CrossReference)cDtoAttriColAssignment_1.eContents().get(0);
		private final RuleCall cDtoAttriColLDtoReferenceIDTerminalRuleCall_1_0_1 = (RuleCall)cDtoAttriColLDtoReferenceCrossReference_1_0.eContents().get(1);
		private final Assignment cDtoAttriUnauthorizedAssignment_2 = (Assignment)cGroup.eContents().get(2);
		private final RuleCall cDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0 = (RuleCall)cDtoAttriUnauthorizedAssignment_2.eContents().get(0);
		
		//RoleDtoReference:
		//	'relation' dtoAttriCol=[dto::LDtoReference] dtoAttriUnauthorized=RolePropertyEnum;
		@Override public ParserRule getRule() { return rule; }
		
		//'relation' dtoAttriCol=[dto::LDtoReference] dtoAttriUnauthorized=RolePropertyEnum
		public Group getGroup() { return cGroup; }
		
		//'relation'
		public Keyword getRelationKeyword_0() { return cRelationKeyword_0; }
		
		//dtoAttriCol=[dto::LDtoReference]
		public Assignment getDtoAttriColAssignment_1() { return cDtoAttriColAssignment_1; }
		
		//[dto::LDtoReference]
		public CrossReference getDtoAttriColLDtoReferenceCrossReference_1_0() { return cDtoAttriColLDtoReferenceCrossReference_1_0; }
		
		//ID
		public RuleCall getDtoAttriColLDtoReferenceIDTerminalRuleCall_1_0_1() { return cDtoAttriColLDtoReferenceIDTerminalRuleCall_1_0_1; }
		
		//dtoAttriUnauthorized=RolePropertyEnum
		public Assignment getDtoAttriUnauthorizedAssignment_2() { return cDtoAttriUnauthorizedAssignment_2; }
		
		//RolePropertyEnum
		public RuleCall getDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0() { return cDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0; }
	}
	public class TRANSLATABLEIDElements extends AbstractParserRuleElementFinder {
		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.TRANSLATABLEID");
		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
		
		//TRANSLATABLEID:
		//	ID;
		@Override public ParserRule getRule() { return rule; }
		
		//ID
		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
	}
	
	public class RoleEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cAnyEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cAnyANYKeyword_0_0 = (Keyword)cAnyEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cCreatableEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cCreatableCREATABLEKeyword_1_0 = (Keyword)cCreatableEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cReadableEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cReadableREADABLEKeyword_2_0 = (Keyword)cReadableEnumLiteralDeclaration_2.eContents().get(0);
		private final EnumLiteralDeclaration cUpdatableEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
		private final Keyword cUpdatableUPDATABLEKeyword_3_0 = (Keyword)cUpdatableEnumLiteralDeclaration_3.eContents().get(0);
		private final EnumLiteralDeclaration cDeletableEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
		private final Keyword cDeletableDELETABLEKeyword_4_0 = (Keyword)cDeletableEnumLiteralDeclaration_4.eContents().get(0);
		
		//enum RoleEnum:
		//	any='ANY' | creatable='CREATABLE' | readable='READABLE' | updatable='UPDATABLE' | deletable='DELETABLE';
		public EnumRule getRule() { return rule; }
		
		//any='ANY' | creatable='CREATABLE' | readable='READABLE' | updatable='UPDATABLE' | deletable='DELETABLE'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//any='ANY'
		public EnumLiteralDeclaration getAnyEnumLiteralDeclaration_0() { return cAnyEnumLiteralDeclaration_0; }
		
		//'ANY'
		public Keyword getAnyANYKeyword_0_0() { return cAnyANYKeyword_0_0; }
		
		//creatable='CREATABLE'
		public EnumLiteralDeclaration getCreatableEnumLiteralDeclaration_1() { return cCreatableEnumLiteralDeclaration_1; }
		
		//'CREATABLE'
		public Keyword getCreatableCREATABLEKeyword_1_0() { return cCreatableCREATABLEKeyword_1_0; }
		
		//readable='READABLE'
		public EnumLiteralDeclaration getReadableEnumLiteralDeclaration_2() { return cReadableEnumLiteralDeclaration_2; }
		
		//'READABLE'
		public Keyword getReadableREADABLEKeyword_2_0() { return cReadableREADABLEKeyword_2_0; }
		
		//updatable='UPDATABLE'
		public EnumLiteralDeclaration getUpdatableEnumLiteralDeclaration_3() { return cUpdatableEnumLiteralDeclaration_3; }
		
		//'UPDATABLE'
		public Keyword getUpdatableUPDATABLEKeyword_3_0() { return cUpdatableUPDATABLEKeyword_3_0; }
		
		//deletable='DELETABLE'
		public EnumLiteralDeclaration getDeletableEnumLiteralDeclaration_4() { return cDeletableEnumLiteralDeclaration_4; }
		
		//'DELETABLE'
		public Keyword getDeletableDELETABLEKeyword_4_0() { return cDeletableDELETABLEKeyword_4_0; }
	}
	public class RolePropertyEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RolePropertyEnum");
		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
		private final EnumLiteralDeclaration cInvisibleEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
		private final Keyword cInvisibleINVISIBLEKeyword_0_0 = (Keyword)cInvisibleEnumLiteralDeclaration_0.eContents().get(0);
		private final EnumLiteralDeclaration cDisabledEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
		private final Keyword cDisabledDISABLEDKeyword_1_0 = (Keyword)cDisabledEnumLiteralDeclaration_1.eContents().get(0);
		private final EnumLiteralDeclaration cNoneditableEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
		private final Keyword cNoneditableNONEDITABLEKeyword_2_0 = (Keyword)cNoneditableEnumLiteralDeclaration_2.eContents().get(0);
		
		//enum RolePropertyEnum:
		//	invisible='INVISIBLE' | disabled='DISABLED' | noneditable='NONEDITABLE';
		public EnumRule getRule() { return rule; }
		
		//invisible='INVISIBLE' | disabled='DISABLED' | noneditable='NONEDITABLE'
		public Alternatives getAlternatives() { return cAlternatives; }
		
		//invisible='INVISIBLE'
		public EnumLiteralDeclaration getInvisibleEnumLiteralDeclaration_0() { return cInvisibleEnumLiteralDeclaration_0; }
		
		//'INVISIBLE'
		public Keyword getInvisibleINVISIBLEKeyword_0_0() { return cInvisibleINVISIBLEKeyword_0_0; }
		
		//disabled='DISABLED'
		public EnumLiteralDeclaration getDisabledEnumLiteralDeclaration_1() { return cDisabledEnumLiteralDeclaration_1; }
		
		//'DISABLED'
		public Keyword getDisabledDISABLEDKeyword_1_0() { return cDisabledDISABLEDKeyword_1_0; }
		
		//noneditable='NONEDITABLE'
		public EnumLiteralDeclaration getNoneditableEnumLiteralDeclaration_2() { return cNoneditableEnumLiteralDeclaration_2; }
		
		//'NONEDITABLE'
		public Keyword getNoneditableNONEDITABLEKeyword_2_0() { return cNoneditableNONEDITABLEKeyword_2_0; }
	}
	public class RoleBlipProcessEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBlipProcessEnum");
		private final EnumLiteralDeclaration cStartableEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cStartableSTARTABLEKeyword_0 = (Keyword)cStartableEnumLiteralDeclaration.eContents().get(0);
		
		//enum RoleBlipProcessEnum:
		//	startable='STARTABLE';
		public EnumRule getRule() { return rule; }
		
		//startable='STARTABLE'
		public EnumLiteralDeclaration getStartableEnumLiteralDeclaration() { return cStartableEnumLiteralDeclaration; }
		
		//'STARTABLE'
		public Keyword getStartableSTARTABLEKeyword_0() { return cStartableSTARTABLEKeyword_0; }
	}
	public class RoleBlipUserTaskEnumElements extends AbstractEnumRuleElementFinder {
		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL.RoleBlipUserTaskEnum");
		private final EnumLiteralDeclaration cExecutableEnumLiteralDeclaration = (EnumLiteralDeclaration)rule.eContents().get(1);
		private final Keyword cExecutableTASKABLEKeyword_0 = (Keyword)cExecutableEnumLiteralDeclaration.eContents().get(0);
		
		//enum RoleBlipUserTaskEnum:
		//	executable='TASKABLE';
		public EnumRule getRule() { return rule; }
		
		//executable='TASKABLE'
		public EnumLiteralDeclaration getExecutableEnumLiteralDeclaration() { return cExecutableEnumLiteralDeclaration; }
		
		//'TASKABLE'
		public Keyword getExecutableTASKABLEKeyword_0() { return cExecutableTASKABLEKeyword_0; }
	}
	
	private final AuthorizationModelElements pAuthorizationModel;
	private final AuthorizationPackageElements pAuthorizationPackage;
	private final RoleElements pRole;
	private final RoleElementElements pRoleElement;
	private final RoleEntityElements pRoleEntity;
	private final RoleBeanElements pRoleBean;
	private final RoleDtoElements pRoleDto;
	private final RoleBlipAllUserTasksElements pRoleBlipAllUserTasks;
	private final RoleBlipUserTaskElements pRoleBlipUserTask;
	private final RoleBlipProcessElements pRoleBlipProcess;
	private final RoleEntityFeatureElements pRoleEntityFeature;
	private final RoleEntityAttributeElements pRoleEntityAttribute;
	private final RoleEntityReferenceElements pRoleEntityReference;
	private final RoleBeanFeatureElements pRoleBeanFeature;
	private final RoleBeanAttributeElements pRoleBeanAttribute;
	private final RoleBeanReferenceElements pRoleBeanReference;
	private final RoleDtoFeatureElements pRoleDtoFeature;
	private final RoleDtoAttributeElements pRoleDtoAttribute;
	private final RoleDtoReferenceElements pRoleDtoReference;
	private final RoleEnumElements eRoleEnum;
	private final RolePropertyEnumElements eRolePropertyEnum;
	private final RoleBlipProcessEnumElements eRoleBlipProcessEnum;
	private final RoleBlipUserTaskEnumElements eRoleBlipUserTaskEnum;
	private final TRANSLATABLEIDElements pTRANSLATABLEID;
	
	private final Grammar grammar;
	
	private final OXtypeGrammarAccess gaOXtype;
	
	private final XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations;
	
	private final XbaseGrammarAccess gaXbase;
	
	private final XtypeGrammarAccess gaXtype;

	@Inject
	public AuthorizationDSLGrammarAccess(GrammarProvider grammarProvider,
			OXtypeGrammarAccess gaOXtype,
			XbaseWithAnnotationsGrammarAccess gaXbaseWithAnnotations,
			XbaseGrammarAccess gaXbase,
			XtypeGrammarAccess gaXtype) {
		this.grammar = internalFindGrammar(grammarProvider);
		this.gaOXtype = gaOXtype;
		this.gaXbaseWithAnnotations = gaXbaseWithAnnotations;
		this.gaXbase = gaXbase;
		this.gaXtype = gaXtype;
		this.pAuthorizationModel = new AuthorizationModelElements();
		this.pAuthorizationPackage = new AuthorizationPackageElements();
		this.pRole = new RoleElements();
		this.pRoleElement = new RoleElementElements();
		this.pRoleEntity = new RoleEntityElements();
		this.pRoleBean = new RoleBeanElements();
		this.pRoleDto = new RoleDtoElements();
		this.pRoleBlipAllUserTasks = new RoleBlipAllUserTasksElements();
		this.pRoleBlipUserTask = new RoleBlipUserTaskElements();
		this.pRoleBlipProcess = new RoleBlipProcessElements();
		this.pRoleEntityFeature = new RoleEntityFeatureElements();
		this.pRoleEntityAttribute = new RoleEntityAttributeElements();
		this.pRoleEntityReference = new RoleEntityReferenceElements();
		this.pRoleBeanFeature = new RoleBeanFeatureElements();
		this.pRoleBeanAttribute = new RoleBeanAttributeElements();
		this.pRoleBeanReference = new RoleBeanReferenceElements();
		this.pRoleDtoFeature = new RoleDtoFeatureElements();
		this.pRoleDtoAttribute = new RoleDtoAttributeElements();
		this.pRoleDtoReference = new RoleDtoReferenceElements();
		this.eRoleEnum = new RoleEnumElements();
		this.eRolePropertyEnum = new RolePropertyEnumElements();
		this.eRoleBlipProcessEnum = new RoleBlipProcessEnumElements();
		this.eRoleBlipUserTaskEnum = new RoleBlipUserTaskEnumElements();
		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
	}
	
	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
		Grammar grammar = grammarProvider.getGrammar(this);
		while (grammar != null) {
			if ("org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSL".equals(grammar.getName())) {
				return grammar;
			}
			List<Grammar> grammars = grammar.getUsedGrammars();
			if (!grammars.isEmpty()) {
				grammar = grammars.iterator().next();
			} else {
				return null;
			}
		}
		return grammar;
	}
	
	@Override
	public Grammar getGrammar() {
		return grammar;
	}
	
	
	public OXtypeGrammarAccess getOXtypeGrammarAccess() {
		return gaOXtype;
	}
	
	public XbaseWithAnnotationsGrammarAccess getXbaseWithAnnotationsGrammarAccess() {
		return gaXbaseWithAnnotations;
	}
	
	public XbaseGrammarAccess getXbaseGrammarAccess() {
		return gaXbase;
	}
	
	public XtypeGrammarAccess getXtypeGrammarAccess() {
		return gaXtype;
	}

	
	//AuthorizationModel:
	//	importSection=XImportSection?
	//	pckg=AuthorizationPackage;
	public AuthorizationModelElements getAuthorizationModelAccess() {
		return pAuthorizationModel;
	}
	
	public ParserRule getAuthorizationModelRule() {
		return getAuthorizationModelAccess().getRule();
	}
	
	//AuthorizationPackage:
	//	{AuthorizationPackage} 'package' name=QualifiedName '{' roles+=Role* '}';
	public AuthorizationPackageElements getAuthorizationPackageAccess() {
		return pAuthorizationPackage;
	}
	
	public ParserRule getAuthorizationPackageRule() {
		return getAuthorizationPackageAccess().getRule();
	}
	
	//Role:
	//	'role' name=TRANSLATABLEID '{' roleElements+=RoleElement* '}';
	public RoleElements getRoleAccess() {
		return pRole;
	}
	
	public ParserRule getRoleRule() {
		return getRoleAccess().getRule();
	}
	
	//RoleElement:
	//	RoleEntity | RoleBean | RoleDto | RoleBlipProcess;
	public RoleElementElements getRoleElementAccess() {
		return pRoleElement;
	}
	
	public ParserRule getRoleElementRule() {
		return getRoleElementAccess().getRule();
	}
	
	//RoleEntity:
	//	{RoleEntity} 'entity' entityRef=[entity::LEntity] entityAuthorized+=RoleEnum+ ('{' entityFeatures+=RoleEntityFeature+
	//	'}')?;
	public RoleEntityElements getRoleEntityAccess() {
		return pRoleEntity;
	}
	
	public ParserRule getRoleEntityRule() {
		return getRoleEntityAccess().getRule();
	}
	
	//RoleBean:
	//	{RoleBean} 'bean' beanRef=[entity::LBean] beanAuthorized+=RoleEnum+ ('{' beanFeatures+=RoleBeanFeature+ '}')?;
	public RoleBeanElements getRoleBeanAccess() {
		return pRoleBean;
	}
	
	public ParserRule getRoleBeanRule() {
		return getRoleBeanAccess().getRule();
	}
	
	//RoleDto:
	//	{RoleDto} 'dto' dtoRef=[dto::LDto] dtoAuthorized+=RoleEnum+ ('{' dtoFeatures+=RoleDtoFeature+ '}')?;
	public RoleDtoElements getRoleDtoAccess() {
		return pRoleDto;
	}
	
	public ParserRule getRoleDtoRule() {
		return getRoleDtoAccess().getRule();
	}
	
	//RoleBlipAllUserTasks:
	//	{RoleBlipAllUserTasks} 'all' 'usertasks' authorized=RoleBlipUserTaskEnum;
	public RoleBlipAllUserTasksElements getRoleBlipAllUserTasksAccess() {
		return pRoleBlipAllUserTasks;
	}
	
	public ParserRule getRoleBlipAllUserTasksRule() {
		return getRoleBlipAllUserTasksAccess().getRule();
	}
	
	//RoleBlipUserTask:
	//	{RoleBlipUserTask} 'usertask' userTask=[blip::BlipUserTask|QualifiedName] authorized=RoleBlipUserTaskEnum;
	public RoleBlipUserTaskElements getRoleBlipUserTaskAccess() {
		return pRoleBlipUserTask;
	}
	
	public ParserRule getRoleBlipUserTaskRule() {
		return getRoleBlipUserTaskAccess().getRule();
	}
	
	//RoleBlipProcess:
	//	{RoleBlipProcess} 'process' process=[blip::Blip] '{' ('is' processStartAuthorized=RoleBlipProcessEnum)?
	//	allUserTasks=RoleBlipAllUserTasks?
	//	userTasks+=RoleBlipUserTask*
	//	'}';
	public RoleBlipProcessElements getRoleBlipProcessAccess() {
		return pRoleBlipProcess;
	}
	
	public ParserRule getRoleBlipProcessRule() {
		return getRoleBlipProcessAccess().getRule();
	}
	
	//RoleEntityFeature:
	//	RoleEntityAttribute | RoleEntityReference;
	public RoleEntityFeatureElements getRoleEntityFeatureAccess() {
		return pRoleEntityFeature;
	}
	
	public ParserRule getRoleEntityFeatureRule() {
		return getRoleEntityFeatureAccess().getRule();
	}
	
	//RoleEntityAttribute:
	//	'attribute' entityAttriCol=[entity::LEntityAttribute] entityAttriUnauthorized=RolePropertyEnum;
	public RoleEntityAttributeElements getRoleEntityAttributeAccess() {
		return pRoleEntityAttribute;
	}
	
	public ParserRule getRoleEntityAttributeRule() {
		return getRoleEntityAttributeAccess().getRule();
	}
	
	//RoleEntityReference:
	//	'relation' entityAttriCol=[entity::LEntityReference] entityAttriUnauthorized=RolePropertyEnum;
	public RoleEntityReferenceElements getRoleEntityReferenceAccess() {
		return pRoleEntityReference;
	}
	
	public ParserRule getRoleEntityReferenceRule() {
		return getRoleEntityReferenceAccess().getRule();
	}
	
	//RoleBeanFeature:
	//	RoleBeanAttribute | RoleBeanReference;
	public RoleBeanFeatureElements getRoleBeanFeatureAccess() {
		return pRoleBeanFeature;
	}
	
	public ParserRule getRoleBeanFeatureRule() {
		return getRoleBeanFeatureAccess().getRule();
	}
	
	//RoleBeanAttribute:
	//	'attribute' beanAttriCol=[entity::LBeanAttribute] beanAttriUnauthorized=RolePropertyEnum;
	public RoleBeanAttributeElements getRoleBeanAttributeAccess() {
		return pRoleBeanAttribute;
	}
	
	public ParserRule getRoleBeanAttributeRule() {
		return getRoleBeanAttributeAccess().getRule();
	}
	
	//RoleBeanReference:
	//	'relation' beanAttriCol=[entity::LBeanReference] beanAttriUnauthorized=RolePropertyEnum;
	public RoleBeanReferenceElements getRoleBeanReferenceAccess() {
		return pRoleBeanReference;
	}
	
	public ParserRule getRoleBeanReferenceRule() {
		return getRoleBeanReferenceAccess().getRule();
	}
	
	//RoleDtoFeature:
	//	RoleDtoAttribute | RoleDtoReference;
	public RoleDtoFeatureElements getRoleDtoFeatureAccess() {
		return pRoleDtoFeature;
	}
	
	public ParserRule getRoleDtoFeatureRule() {
		return getRoleDtoFeatureAccess().getRule();
	}
	
	//RoleDtoAttribute:
	//	'attribute' dtoAttriCol=[dto::LDtoAttribute] dtoAttriUnauthorized=RolePropertyEnum;
	public RoleDtoAttributeElements getRoleDtoAttributeAccess() {
		return pRoleDtoAttribute;
	}
	
	public ParserRule getRoleDtoAttributeRule() {
		return getRoleDtoAttributeAccess().getRule();
	}
	
	//RoleDtoReference:
	//	'relation' dtoAttriCol=[dto::LDtoReference] dtoAttriUnauthorized=RolePropertyEnum;
	public RoleDtoReferenceElements getRoleDtoReferenceAccess() {
		return pRoleDtoReference;
	}
	
	public ParserRule getRoleDtoReferenceRule() {
		return getRoleDtoReferenceAccess().getRule();
	}
	
	//enum RoleEnum:
	//	any='ANY' | creatable='CREATABLE' | readable='READABLE' | updatable='UPDATABLE' | deletable='DELETABLE';
	public RoleEnumElements getRoleEnumAccess() {
		return eRoleEnum;
	}
	
	public EnumRule getRoleEnumRule() {
		return getRoleEnumAccess().getRule();
	}
	
	//enum RolePropertyEnum:
	//	invisible='INVISIBLE' | disabled='DISABLED' | noneditable='NONEDITABLE';
	public RolePropertyEnumElements getRolePropertyEnumAccess() {
		return eRolePropertyEnum;
	}
	
	public EnumRule getRolePropertyEnumRule() {
		return getRolePropertyEnumAccess().getRule();
	}
	
	//enum RoleBlipProcessEnum:
	//	startable='STARTABLE';
	public RoleBlipProcessEnumElements getRoleBlipProcessEnumAccess() {
		return eRoleBlipProcessEnum;
	}
	
	public EnumRule getRoleBlipProcessEnumRule() {
		return getRoleBlipProcessEnumAccess().getRule();
	}
	
	//enum RoleBlipUserTaskEnum:
	//	executable='TASKABLE';
	public RoleBlipUserTaskEnumElements getRoleBlipUserTaskEnumAccess() {
		return eRoleBlipUserTaskEnum;
	}
	
	public EnumRule getRoleBlipUserTaskEnumRule() {
		return getRoleBlipUserTaskEnumAccess().getRule();
	}
	
	//TRANSLATABLEID:
	//	ID;
	public TRANSLATABLEIDElements getTRANSLATABLEIDAccess() {
		return pTRANSLATABLEID;
	}
	
	public ParserRule getTRANSLATABLEIDRule() {
		return getTRANSLATABLEIDAccess().getRule();
	}
	
	//@ Override XImportDeclaration OXImportDeclaration:
	//	{OXImportDeclaration}
	//	'import' (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
	//	(wildcard?='*' | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
	//	importedNamespace=QualifiedNameWithWildcard
	//	| fqnImport?='ns' importedFullyQualifiedName=QualifiedName) ';'?;
	public OXtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
		return gaOXtype.getXImportDeclarationAccess();
	}
	
	public ParserRule getXImportDeclarationRule() {
		return getXImportDeclarationAccess().getRule();
	}
	
	//XAnnotation:
	//	{XAnnotation}
	//	'@' annotationType=[types::JvmAnnotationType|QualifiedName] (=> '(' (elementValuePairs+=XAnnotationElementValuePair
	//	(',' elementValuePairs+=XAnnotationElementValuePair)*
	//	| value=XAnnotationElementValueOrCommaList)?
	//	')')?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElements getXAnnotationAccess() {
		return gaXbaseWithAnnotations.getXAnnotationAccess();
	}
	
	public ParserRule getXAnnotationRule() {
		return getXAnnotationAccess().getRule();
	}
	
	//XAnnotationElementValuePair:
	//	=> (element=[types::JvmOperation|ValidID] '=') value=XAnnotationElementValue;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValuePairElements getXAnnotationElementValuePairAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValuePairAccess();
	}
	
	public ParserRule getXAnnotationElementValuePairRule() {
		return getXAnnotationElementValuePairAccess().getRule();
	}
	
	//XAnnotationElementValueOrCommaList xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression ({xbase::XListLiteral.elements+=current} (',' elements+=XAnnotationOrExpression)+)?;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueOrCommaListElements getXAnnotationElementValueOrCommaListAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueOrCommaListAccess();
	}
	
	public ParserRule getXAnnotationElementValueOrCommaListRule() {
		return getXAnnotationElementValueOrCommaListAccess().getRule();
	}
	
	//XAnnotationElementValue xbase::XExpression:
	//	=> ({xbase::XListLiteral} '#' '[') (elements+=XAnnotationOrExpression (',' elements+=XAnnotationOrExpression)*)? ']'
	//	| XAnnotationOrExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationElementValueElements getXAnnotationElementValueAccess() {
		return gaXbaseWithAnnotations.getXAnnotationElementValueAccess();
	}
	
	public ParserRule getXAnnotationElementValueRule() {
		return getXAnnotationElementValueAccess().getRule();
	}
	
	//XAnnotationOrExpression xbase::XExpression:
	//	XAnnotation | XExpression;
	public XbaseWithAnnotationsGrammarAccess.XAnnotationOrExpressionElements getXAnnotationOrExpressionAccess() {
		return gaXbaseWithAnnotations.getXAnnotationOrExpressionAccess();
	}
	
	public ParserRule getXAnnotationOrExpressionRule() {
		return getXAnnotationOrExpressionAccess().getRule();
	}
	
	//XExpression:
	//	XAssignment;
	public XbaseGrammarAccess.XExpressionElements getXExpressionAccess() {
		return gaXbase.getXExpressionAccess();
	}
	
	public ParserRule getXExpressionRule() {
		return getXExpressionAccess().getRule();
	}
	
	//XAssignment XExpression:
	//	{XAssignment} feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign value=XAssignment | XOrExpression
	//	(=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMultiAssign])
	//	rightOperand=XAssignment)?;
	public XbaseGrammarAccess.XAssignmentElements getXAssignmentAccess() {
		return gaXbase.getXAssignmentAccess();
	}
	
	public ParserRule getXAssignmentRule() {
		return getXAssignmentAccess().getRule();
	}
	
	//OpSingleAssign:
	//	'=';
	public XbaseGrammarAccess.OpSingleAssignElements getOpSingleAssignAccess() {
		return gaXbase.getOpSingleAssignAccess();
	}
	
	public ParserRule getOpSingleAssignRule() {
		return getOpSingleAssignAccess().getRule();
	}
	
	//OpMultiAssign:
	//	'+=' | '-=' | '*=' | '/=' | '%=' |
	//	'<' '<' '=' |
	//	'>' '>'? '>=';
	public XbaseGrammarAccess.OpMultiAssignElements getOpMultiAssignAccess() {
		return gaXbase.getOpMultiAssignAccess();
	}
	
	public ParserRule getOpMultiAssignRule() {
		return getOpMultiAssignAccess().getRule();
	}
	
	//XOrExpression XExpression:
	//	XAndExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOr])
	//	rightOperand=XAndExpression)*;
	public XbaseGrammarAccess.XOrExpressionElements getXOrExpressionAccess() {
		return gaXbase.getXOrExpressionAccess();
	}
	
	public ParserRule getXOrExpressionRule() {
		return getXOrExpressionAccess().getRule();
	}
	
	//OpOr:
	//	'||';
	public XbaseGrammarAccess.OpOrElements getOpOrAccess() {
		return gaXbase.getOpOrAccess();
	}
	
	public ParserRule getOpOrRule() {
		return getOpOrAccess().getRule();
	}
	
	//XAndExpression XExpression:
	//	XEqualityExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAnd])
	//	rightOperand=XEqualityExpression)*;
	public XbaseGrammarAccess.XAndExpressionElements getXAndExpressionAccess() {
		return gaXbase.getXAndExpressionAccess();
	}
	
	public ParserRule getXAndExpressionRule() {
		return getXAndExpressionAccess().getRule();
	}
	
	//OpAnd:
	//	'&&';
	public XbaseGrammarAccess.OpAndElements getOpAndAccess() {
		return gaXbase.getOpAndAccess();
	}
	
	public ParserRule getOpAndRule() {
		return getOpAndAccess().getRule();
	}
	
	//XEqualityExpression XExpression:
	//	XRelationalExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpEquality])
	//	rightOperand=XRelationalExpression)*;
	public XbaseGrammarAccess.XEqualityExpressionElements getXEqualityExpressionAccess() {
		return gaXbase.getXEqualityExpressionAccess();
	}
	
	public ParserRule getXEqualityExpressionRule() {
		return getXEqualityExpressionAccess().getRule();
	}
	
	//OpEquality:
	//	'==' | '!=' | '===' | '!==';
	public XbaseGrammarAccess.OpEqualityElements getOpEqualityAccess() {
		return gaXbase.getOpEqualityAccess();
	}
	
	public ParserRule getOpEqualityRule() {
		return getOpEqualityAccess().getRule();
	}
	
	//XRelationalExpression XExpression:
	//	XOtherOperatorExpression (=> ({XInstanceOfExpression.expression=current} 'instanceof') type=JvmTypeReference |
	//	=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpCompare])
	//	rightOperand=XOtherOperatorExpression)*;
	public XbaseGrammarAccess.XRelationalExpressionElements getXRelationalExpressionAccess() {
		return gaXbase.getXRelationalExpressionAccess();
	}
	
	public ParserRule getXRelationalExpressionRule() {
		return getXRelationalExpressionAccess().getRule();
	}
	
	//OpCompare:
	//	'>=' | '<' '=' | '>' | '<';
	public XbaseGrammarAccess.OpCompareElements getOpCompareAccess() {
		return gaXbase.getOpCompareAccess();
	}
	
	public ParserRule getOpCompareRule() {
		return getOpCompareAccess().getRule();
	}
	
	//XOtherOperatorExpression XExpression:
	//	XAdditiveExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpOther])
	//	rightOperand=XAdditiveExpression)*;
	public XbaseGrammarAccess.XOtherOperatorExpressionElements getXOtherOperatorExpressionAccess() {
		return gaXbase.getXOtherOperatorExpressionAccess();
	}
	
	public ParserRule getXOtherOperatorExpressionRule() {
		return getXOtherOperatorExpressionAccess().getRule();
	}
	
	//OpOther:
	//	'->'
	//	| '..<'
	//	| '>' '..'
	//	| '..'
	//	| '=>'
	//	| '>' (=> ('>' '>') | '>') | '<' (=> ('<' '<') | '<' | '=>') | '<>'
	//	| '?:';
	public XbaseGrammarAccess.OpOtherElements getOpOtherAccess() {
		return gaXbase.getOpOtherAccess();
	}
	
	public ParserRule getOpOtherRule() {
		return getOpOtherAccess().getRule();
	}
	
	//XAdditiveExpression XExpression:
	//	XMultiplicativeExpression (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpAdd])
	//	rightOperand=XMultiplicativeExpression)*;
	public XbaseGrammarAccess.XAdditiveExpressionElements getXAdditiveExpressionAccess() {
		return gaXbase.getXAdditiveExpressionAccess();
	}
	
	public ParserRule getXAdditiveExpressionRule() {
		return getXAdditiveExpressionAccess().getRule();
	}
	
	//OpAdd:
	//	'+' | '-';
	public XbaseGrammarAccess.OpAddElements getOpAddAccess() {
		return gaXbase.getOpAddAccess();
	}
	
	public ParserRule getOpAddRule() {
		return getOpAddAccess().getRule();
	}
	
	//XMultiplicativeExpression XExpression:
	//	XUnaryOperation (=> ({XBinaryOperation.leftOperand=current} feature=[types::JvmIdentifiableElement|OpMulti])
	//	rightOperand=XUnaryOperation)*;
	public XbaseGrammarAccess.XMultiplicativeExpressionElements getXMultiplicativeExpressionAccess() {
		return gaXbase.getXMultiplicativeExpressionAccess();
	}
	
	public ParserRule getXMultiplicativeExpressionRule() {
		return getXMultiplicativeExpressionAccess().getRule();
	}
	
	//OpMulti:
	//	'*' | '**' | '/' | '%';
	public XbaseGrammarAccess.OpMultiElements getOpMultiAccess() {
		return gaXbase.getOpMultiAccess();
	}
	
	public ParserRule getOpMultiRule() {
		return getOpMultiAccess().getRule();
	}
	
	//XUnaryOperation XExpression:
	//	{XUnaryOperation} feature=[types::JvmIdentifiableElement|OpUnary] operand=XUnaryOperation
	//	| XCastedExpression;
	public XbaseGrammarAccess.XUnaryOperationElements getXUnaryOperationAccess() {
		return gaXbase.getXUnaryOperationAccess();
	}
	
	public ParserRule getXUnaryOperationRule() {
		return getXUnaryOperationAccess().getRule();
	}
	
	//OpUnary:
	//	"!" | "-" | "+";
	public XbaseGrammarAccess.OpUnaryElements getOpUnaryAccess() {
		return gaXbase.getOpUnaryAccess();
	}
	
	public ParserRule getOpUnaryRule() {
		return getOpUnaryAccess().getRule();
	}
	
	//XCastedExpression XExpression:
	//	XPostfixOperation (=> ({XCastedExpression.target=current} 'as') type=JvmTypeReference)*;
	public XbaseGrammarAccess.XCastedExpressionElements getXCastedExpressionAccess() {
		return gaXbase.getXCastedExpressionAccess();
	}
	
	public ParserRule getXCastedExpressionRule() {
		return getXCastedExpressionAccess().getRule();
	}
	
	//XPostfixOperation XExpression:
	//	XMemberFeatureCall => ({XPostfixOperation.operand=current} feature=[types::JvmIdentifiableElement|OpPostfix])?;
	public XbaseGrammarAccess.XPostfixOperationElements getXPostfixOperationAccess() {
		return gaXbase.getXPostfixOperationAccess();
	}
	
	public ParserRule getXPostfixOperationRule() {
		return getXPostfixOperationAccess().getRule();
	}
	
	//OpPostfix:
	//	"++" | "--";
	public XbaseGrammarAccess.OpPostfixElements getOpPostfixAccess() {
		return gaXbase.getOpPostfixAccess();
	}
	
	public ParserRule getOpPostfixRule() {
		return getOpPostfixAccess().getRule();
	}
	
	//XMemberFeatureCall XExpression:
	//	XPrimaryExpression (=> ({XAssignment.assignable=current} ('.' | explicitStatic?="::")
	//	feature=[types::JvmIdentifiableElement|FeatureCallID] OpSingleAssign) value=XAssignment
	//	| => ({XMemberFeatureCall.memberCallTarget=current} ("." | nullSafe?="?." | explicitStatic?="::")) ('<'
	//	typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (memberCallArguments+=XShortClosure
	//	| memberCallArguments+=XExpression (',' memberCallArguments+=XExpression)*)?
	//	')')?
	//	memberCallArguments+=XClosure?)*;
	public XbaseGrammarAccess.XMemberFeatureCallElements getXMemberFeatureCallAccess() {
		return gaXbase.getXMemberFeatureCallAccess();
	}
	
	public ParserRule getXMemberFeatureCallRule() {
		return getXMemberFeatureCallAccess().getRule();
	}
	
	//XPrimaryExpression XExpression:
	//	XConstructorCall | XBlockExpression | XSwitchExpression | XSynchronizedExpression | XFeatureCall | XLiteral |
	//	XIfExpression | XForLoopExpression | XBasicForLoopExpression | XWhileExpression | XDoWhileExpression |
	//	XThrowExpression | XReturnExpression | XTryCatchFinallyExpression | XParenthesizedExpression;
	public XbaseGrammarAccess.XPrimaryExpressionElements getXPrimaryExpressionAccess() {
		return gaXbase.getXPrimaryExpressionAccess();
	}
	
	public ParserRule getXPrimaryExpressionRule() {
		return getXPrimaryExpressionAccess().getRule();
	}
	
	//XLiteral XExpression:
	//	XCollectionLiteral | XClosure | XBooleanLiteral | XNumberLiteral | XNullLiteral | XStringLiteral | XTypeLiteral;
	public XbaseGrammarAccess.XLiteralElements getXLiteralAccess() {
		return gaXbase.getXLiteralAccess();
	}
	
	public ParserRule getXLiteralRule() {
		return getXLiteralAccess().getRule();
	}
	
	//XCollectionLiteral:
	//	XSetLiteral | XListLiteral;
	public XbaseGrammarAccess.XCollectionLiteralElements getXCollectionLiteralAccess() {
		return gaXbase.getXCollectionLiteralAccess();
	}
	
	public ParserRule getXCollectionLiteralRule() {
		return getXCollectionLiteralAccess().getRule();
	}
	
	//XSetLiteral:
	//	{XSetLiteral} '#' '{' (elements+=XExpression (',' elements+=XExpression)*)? '}';
	public XbaseGrammarAccess.XSetLiteralElements getXSetLiteralAccess() {
		return gaXbase.getXSetLiteralAccess();
	}
	
	public ParserRule getXSetLiteralRule() {
		return getXSetLiteralAccess().getRule();
	}
	
	//XListLiteral:
	//	{XListLiteral} '#' '[' (elements+=XExpression (',' elements+=XExpression)*)? ']';
	public XbaseGrammarAccess.XListLiteralElements getXListLiteralAccess() {
		return gaXbase.getXListLiteralAccess();
	}
	
	public ParserRule getXListLiteralRule() {
		return getXListLiteralAccess().getRule();
	}
	
	//XClosure XExpression:
	//	=> ({XClosure}
	//	'[')
	//	=> ((declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|')?
	//	expression=XExpressionInClosure
	//	']';
	public XbaseGrammarAccess.XClosureElements getXClosureAccess() {
		return gaXbase.getXClosureAccess();
	}
	
	public ParserRule getXClosureRule() {
		return getXClosureAccess().getRule();
	}
	
	//XExpressionInClosure XExpression:
	//	{XBlockExpression} (expressions+=XExpressionOrVarDeclaration ';'?)*;
	public XbaseGrammarAccess.XExpressionInClosureElements getXExpressionInClosureAccess() {
		return gaXbase.getXExpressionInClosureAccess();
	}
	
	public ParserRule getXExpressionInClosureRule() {
		return getXExpressionInClosureAccess().getRule();
	}
	
	//XShortClosure XExpression:
	//	=> ({XClosure} (declaredFormalParameters+=JvmFormalParameter (',' declaredFormalParameters+=JvmFormalParameter)*)?
	//	explicitSyntax?='|') expression=XExpression;
	public XbaseGrammarAccess.XShortClosureElements getXShortClosureAccess() {
		return gaXbase.getXShortClosureAccess();
	}
	
	public ParserRule getXShortClosureRule() {
		return getXShortClosureAccess().getRule();
	}
	
	//XParenthesizedExpression XExpression:
	//	'(' XExpression ')';
	public XbaseGrammarAccess.XParenthesizedExpressionElements getXParenthesizedExpressionAccess() {
		return gaXbase.getXParenthesizedExpressionAccess();
	}
	
	public ParserRule getXParenthesizedExpressionRule() {
		return getXParenthesizedExpressionAccess().getRule();
	}
	
	//XIfExpression XExpression:
	//	{XIfExpression}
	//	'if' '(' if=XExpression ')'
	//	then=XExpression (=> 'else' else=XExpression)?;
	public XbaseGrammarAccess.XIfExpressionElements getXIfExpressionAccess() {
		return gaXbase.getXIfExpressionAccess();
	}
	
	public ParserRule getXIfExpressionRule() {
		return getXIfExpressionAccess().getRule();
	}
	
	//XSwitchExpression XExpression:
	//	{XSwitchExpression}
	//	'switch' (=> ('(' declaredParam=JvmFormalParameter ':') switch=XExpression ')'
	//	| => (declaredParam=JvmFormalParameter ':')? switch=XExpression) '{'
	//	cases+=XCasePart* ('default' ':' default=XExpression)?
	//	'}';
	public XbaseGrammarAccess.XSwitchExpressionElements getXSwitchExpressionAccess() {
		return gaXbase.getXSwitchExpressionAccess();
	}
	
	public ParserRule getXSwitchExpressionRule() {
		return getXSwitchExpressionAccess().getRule();
	}
	
	//XCasePart:
	//	{XCasePart} typeGuard=JvmTypeReference? ('case' case=XExpression)? (':' then=XExpression | fallThrough?=',');
	public XbaseGrammarAccess.XCasePartElements getXCasePartAccess() {
		return gaXbase.getXCasePartAccess();
	}
	
	public ParserRule getXCasePartRule() {
		return getXCasePartAccess().getRule();
	}
	
	//XForLoopExpression XExpression:
	//	=> ({XForLoopExpression}
	//	'for' '(' declaredParam=JvmFormalParameter ':') forExpression=XExpression ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XForLoopExpressionElements getXForLoopExpressionAccess() {
		return gaXbase.getXForLoopExpressionAccess();
	}
	
	public ParserRule getXForLoopExpressionRule() {
		return getXForLoopExpressionAccess().getRule();
	}
	
	//XBasicForLoopExpression XExpression:
	//	{XBasicForLoopExpression}
	//	'for' '(' (initExpressions+=XExpressionOrVarDeclaration (',' initExpressions+=XExpressionOrVarDeclaration)*)? ';'
	//	expression=XExpression? ';' (updateExpressions+=XExpression (',' updateExpressions+=XExpression)*)? ')'
	//	eachExpression=XExpression;
	public XbaseGrammarAccess.XBasicForLoopExpressionElements getXBasicForLoopExpressionAccess() {
		return gaXbase.getXBasicForLoopExpressionAccess();
	}
	
	public ParserRule getXBasicForLoopExpressionRule() {
		return getXBasicForLoopExpressionAccess().getRule();
	}
	
	//XWhileExpression XExpression:
	//	{XWhileExpression}
	//	'while' '(' predicate=XExpression ')'
	//	body=XExpression;
	public XbaseGrammarAccess.XWhileExpressionElements getXWhileExpressionAccess() {
		return gaXbase.getXWhileExpressionAccess();
	}
	
	public ParserRule getXWhileExpressionRule() {
		return getXWhileExpressionAccess().getRule();
	}
	
	//XDoWhileExpression XExpression:
	//	{XDoWhileExpression}
	//	'do'
	//	body=XExpression
	//	'while' '(' predicate=XExpression ')';
	public XbaseGrammarAccess.XDoWhileExpressionElements getXDoWhileExpressionAccess() {
		return gaXbase.getXDoWhileExpressionAccess();
	}
	
	public ParserRule getXDoWhileExpressionRule() {
		return getXDoWhileExpressionAccess().getRule();
	}
	
	//XBlockExpression XExpression:
	//	{XBlockExpression}
	//	'{' (expressions+=XExpressionOrVarDeclaration ';'?)*
	//	'}';
	public XbaseGrammarAccess.XBlockExpressionElements getXBlockExpressionAccess() {
		return gaXbase.getXBlockExpressionAccess();
	}
	
	public ParserRule getXBlockExpressionRule() {
		return getXBlockExpressionAccess().getRule();
	}
	
	//XExpressionOrVarDeclaration XExpression:
	//	XVariableDeclaration | XExpression;
	public XbaseGrammarAccess.XExpressionOrVarDeclarationElements getXExpressionOrVarDeclarationAccess() {
		return gaXbase.getXExpressionOrVarDeclarationAccess();
	}
	
	public ParserRule getXExpressionOrVarDeclarationRule() {
		return getXExpressionOrVarDeclarationAccess().getRule();
	}
	
	//XVariableDeclaration XExpression:
	//	{XVariableDeclaration} (writeable?='var' | 'val') (=> (type=JvmTypeReference name=ValidID) | name=ValidID) ('='
	//	right=XExpression)?;
	public XbaseGrammarAccess.XVariableDeclarationElements getXVariableDeclarationAccess() {
		return gaXbase.getXVariableDeclarationAccess();
	}
	
	public ParserRule getXVariableDeclarationRule() {
		return getXVariableDeclarationAccess().getRule();
	}
	
	//JvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference? name=ValidID;
	public XbaseGrammarAccess.JvmFormalParameterElements getJvmFormalParameterAccess() {
		return gaXbase.getJvmFormalParameterAccess();
	}
	
	public ParserRule getJvmFormalParameterRule() {
		return getJvmFormalParameterAccess().getRule();
	}
	
	//FullJvmFormalParameter types::JvmFormalParameter:
	//	parameterType=JvmTypeReference name=ValidID;
	public XbaseGrammarAccess.FullJvmFormalParameterElements getFullJvmFormalParameterAccess() {
		return gaXbase.getFullJvmFormalParameterAccess();
	}
	
	public ParserRule getFullJvmFormalParameterRule() {
		return getFullJvmFormalParameterAccess().getRule();
	}
	
	//XFeatureCall XExpression:
	//	{XFeatureCall} ('<' typeArguments+=JvmArgumentTypeReference (',' typeArguments+=JvmArgumentTypeReference)* '>')?
	//	feature=[types::JvmIdentifiableElement|IdOrSuper] (=> explicitOperationCall?='(' (featureCallArguments+=XShortClosure
	//	| featureCallArguments+=XExpression (',' featureCallArguments+=XExpression)*)?
	//	')')?
	//	featureCallArguments+=XClosure?;
	public XbaseGrammarAccess.XFeatureCallElements getXFeatureCallAccess() {
		return gaXbase.getXFeatureCallAccess();
	}
	
	public ParserRule getXFeatureCallRule() {
		return getXFeatureCallAccess().getRule();
	}
	
	//FeatureCallID:
	//	ValidID | 'extends' | 'static' | 'import' | 'extension';
	public XbaseGrammarAccess.FeatureCallIDElements getFeatureCallIDAccess() {
		return gaXbase.getFeatureCallIDAccess();
	}
	
	public ParserRule getFeatureCallIDRule() {
		return getFeatureCallIDAccess().getRule();
	}
	
	//IdOrSuper:
	//	FeatureCallID | 'super';
	public XbaseGrammarAccess.IdOrSuperElements getIdOrSuperAccess() {
		return gaXbase.getIdOrSuperAccess();
	}
	
	public ParserRule getIdOrSuperRule() {
		return getIdOrSuperAccess().getRule();
	}
	
	//XConstructorCall XExpression:
	//	{XConstructorCall}
	//	'new' constructor=[types::JvmConstructor|QualifiedName] (=> '<' typeArguments+=JvmArgumentTypeReference (','
	//	typeArguments+=JvmArgumentTypeReference)* '>')? (=> explicitConstructorCall?='(' (arguments+=XShortClosure
	//	| arguments+=XExpression (',' arguments+=XExpression)*)?
	//	')')?
	//	arguments+=XClosure?;
	public XbaseGrammarAccess.XConstructorCallElements getXConstructorCallAccess() {
		return gaXbase.getXConstructorCallAccess();
	}
	
	public ParserRule getXConstructorCallRule() {
		return getXConstructorCallAccess().getRule();
	}
	
	//XBooleanLiteral XExpression:
	//	{XBooleanLiteral} ('false' | isTrue?='true');
	public XbaseGrammarAccess.XBooleanLiteralElements getXBooleanLiteralAccess() {
		return gaXbase.getXBooleanLiteralAccess();
	}
	
	public ParserRule getXBooleanLiteralRule() {
		return getXBooleanLiteralAccess().getRule();
	}
	
	//XNullLiteral XExpression:
	//	{XNullLiteral} 'null';
	public XbaseGrammarAccess.XNullLiteralElements getXNullLiteralAccess() {
		return gaXbase.getXNullLiteralAccess();
	}
	
	public ParserRule getXNullLiteralRule() {
		return getXNullLiteralAccess().getRule();
	}
	
	//XNumberLiteral XExpression:
	//	{XNumberLiteral} value=Number;
	public XbaseGrammarAccess.XNumberLiteralElements getXNumberLiteralAccess() {
		return gaXbase.getXNumberLiteralAccess();
	}
	
	public ParserRule getXNumberLiteralRule() {
		return getXNumberLiteralAccess().getRule();
	}
	
	//XStringLiteral XExpression:
	//	{XStringLiteral} value=STRING;
	public XbaseGrammarAccess.XStringLiteralElements getXStringLiteralAccess() {
		return gaXbase.getXStringLiteralAccess();
	}
	
	public ParserRule getXStringLiteralRule() {
		return getXStringLiteralAccess().getRule();
	}
	
	//XTypeLiteral XExpression:
	//	{XTypeLiteral} 'typeof' '(' type=[types::JvmType|QualifiedName] arrayDimensions+=ArrayBrackets* ')';
	public XbaseGrammarAccess.XTypeLiteralElements getXTypeLiteralAccess() {
		return gaXbase.getXTypeLiteralAccess();
	}
	
	public ParserRule getXTypeLiteralRule() {
		return getXTypeLiteralAccess().getRule();
	}
	
	//XThrowExpression XExpression:
	//	{XThrowExpression} 'throw' expression=XExpression;
	public XbaseGrammarAccess.XThrowExpressionElements getXThrowExpressionAccess() {
		return gaXbase.getXThrowExpressionAccess();
	}
	
	public ParserRule getXThrowExpressionRule() {
		return getXThrowExpressionAccess().getRule();
	}
	
	//XReturnExpression XExpression:
	//	{XReturnExpression} 'return' -> expression=XExpression?;
	public XbaseGrammarAccess.XReturnExpressionElements getXReturnExpressionAccess() {
		return gaXbase.getXReturnExpressionAccess();
	}
	
	public ParserRule getXReturnExpressionRule() {
		return getXReturnExpressionAccess().getRule();
	}
	
	//XTryCatchFinallyExpression XExpression:
	//	{XTryCatchFinallyExpression}
	//	'try'
	//	expression=XExpression (catchClauses+=XCatchClause+ (=> 'finally' finallyExpression=XExpression)?
	//	| 'finally' finallyExpression=XExpression);
	public XbaseGrammarAccess.XTryCatchFinallyExpressionElements getXTryCatchFinallyExpressionAccess() {
		return gaXbase.getXTryCatchFinallyExpressionAccess();
	}
	
	public ParserRule getXTryCatchFinallyExpressionRule() {
		return getXTryCatchFinallyExpressionAccess().getRule();
	}
	
	//XSynchronizedExpression XExpression:
	//	=> ({XSynchronizedExpression}
	//	'synchronized' '(') param=XExpression ')' expression=XExpression;
	public XbaseGrammarAccess.XSynchronizedExpressionElements getXSynchronizedExpressionAccess() {
		return gaXbase.getXSynchronizedExpressionAccess();
	}
	
	public ParserRule getXSynchronizedExpressionRule() {
		return getXSynchronizedExpressionAccess().getRule();
	}
	
	//XCatchClause:
	//	=> 'catch' '(' declaredParam=FullJvmFormalParameter ')' expression=XExpression;
	public XbaseGrammarAccess.XCatchClauseElements getXCatchClauseAccess() {
		return gaXbase.getXCatchClauseAccess();
	}
	
	public ParserRule getXCatchClauseRule() {
		return getXCatchClauseAccess().getRule();
	}
	
	//QualifiedName:
	//	ValidID (=> '.' ValidID)*;
	public XbaseGrammarAccess.QualifiedNameElements getQualifiedNameAccess() {
		return gaXbase.getQualifiedNameAccess();
	}
	
	public ParserRule getQualifiedNameRule() {
		return getQualifiedNameAccess().getRule();
	}
	
	//Number hidden():
	//	HEX | (INT | DECIMAL) ('.' (INT | DECIMAL))?;
	public XbaseGrammarAccess.NumberElements getNumberAccess() {
		return gaXbase.getNumberAccess();
	}
	
	public ParserRule getNumberRule() {
		return getNumberAccess().getRule();
	}
	
	///**
	// * Dummy rule, for "better" downwards compatibility, since GrammarAccess generates non-static inner classes, 
	// * which makes downstream grammars break on classloading, when a rule is removed.
	// */ StaticQualifier:
	//	(ValidID '::')+;
	public XbaseGrammarAccess.StaticQualifierElements getStaticQualifierAccess() {
		return gaXbase.getStaticQualifierAccess();
	}
	
	public ParserRule getStaticQualifierRule() {
		return getStaticQualifierAccess().getRule();
	}
	
	//terminal HEX:
	//	('0x' | '0X') ('0'..'9' | 'a'..'f' | 'A'..'F' | '_')+ ('#' (('b' | 'B') ('i' | 'I') | ('l' | 'L')))?;
	public TerminalRule getHEXRule() {
		return gaXbase.getHEXRule();
	}
	
	//terminal INT returns ecore::EInt:
	//	'0'..'9' ('0'..'9' | '_')*;
	public TerminalRule getINTRule() {
		return gaXbase.getINTRule();
	}
	
	//terminal DECIMAL:
	//	INT (('e' | 'E') ('+' | '-')? INT)? (('b' | 'B') ('i' | 'I' | 'd' | 'D') | ('l' | 'L' | 'd' | 'D' | 'f' | 'F'))?;
	public TerminalRule getDECIMALRule() {
		return gaXbase.getDECIMALRule();
	}
	
	//JvmTypeReference:
	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
	//	| XFunctionTypeRef;
	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
		return gaXtype.getJvmTypeReferenceAccess();
	}
	
	public ParserRule getJvmTypeReferenceRule() {
		return getJvmTypeReferenceAccess().getRule();
	}
	
	//ArrayBrackets:
	//	'[' ']';
	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
		return gaXtype.getArrayBracketsAccess();
	}
	
	public ParserRule getArrayBracketsRule() {
		return getArrayBracketsAccess().getRule();
	}
	
	//XFunctionTypeRef:
	//	('(' (paramTypes+=JvmTypeReference (',' paramTypes+=JvmTypeReference)*)? ')')? '=>' returnType=JvmTypeReference;
	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
		return gaXtype.getXFunctionTypeRefAccess();
	}
	
	public ParserRule getXFunctionTypeRefRule() {
		return getXFunctionTypeRefAccess().getRule();
	}
	
	//JvmParameterizedTypeReference:
	//	type=[JvmType|super::QualifiedName] (=> '<' arguments+=JvmArgumentTypeReference (','
	//	arguments+=JvmArgumentTypeReference)* '>' (=> ({JvmInnerTypeReference.outer=current} '.') type=[JvmType|ValidID] (=>
	//	'<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)* '>')?)*)?;
	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
		return gaXtype.getJvmParameterizedTypeReferenceAccess();
	}
	
	public ParserRule getJvmParameterizedTypeReferenceRule() {
		return getJvmParameterizedTypeReferenceAccess().getRule();
	}
	
	//JvmArgumentTypeReference JvmTypeReference:
	//	JvmTypeReference | JvmWildcardTypeReference;
	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
		return gaXtype.getJvmArgumentTypeReferenceAccess();
	}
	
	public ParserRule getJvmArgumentTypeReferenceRule() {
		return getJvmArgumentTypeReferenceAccess().getRule();
	}
	
	//JvmWildcardTypeReference:
	//	{JvmWildcardTypeReference} '?' (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*
	//	| constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
		return gaXtype.getJvmWildcardTypeReferenceAccess();
	}
	
	public ParserRule getJvmWildcardTypeReferenceRule() {
		return getJvmWildcardTypeReferenceAccess().getRule();
	}
	
	//JvmUpperBound:
	//	'extends' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
		return gaXtype.getJvmUpperBoundAccess();
	}
	
	public ParserRule getJvmUpperBoundRule() {
		return getJvmUpperBoundAccess().getRule();
	}
	
	//JvmUpperBoundAnded JvmUpperBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
		return gaXtype.getJvmUpperBoundAndedAccess();
	}
	
	public ParserRule getJvmUpperBoundAndedRule() {
		return getJvmUpperBoundAndedAccess().getRule();
	}
	
	//JvmLowerBound:
	//	'super' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
		return gaXtype.getJvmLowerBoundAccess();
	}
	
	public ParserRule getJvmLowerBoundRule() {
		return getJvmLowerBoundAccess().getRule();
	}
	
	//JvmLowerBoundAnded JvmLowerBound:
	//	'&' typeReference=JvmTypeReference;
	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
		return gaXtype.getJvmLowerBoundAndedAccess();
	}
	
	public ParserRule getJvmLowerBoundAndedRule() {
		return getJvmLowerBoundAndedAccess().getRule();
	}
	
	//JvmTypeParameter:
	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
		return gaXtype.getJvmTypeParameterAccess();
	}
	
	public ParserRule getJvmTypeParameterRule() {
		return getJvmTypeParameterAccess().getRule();
	}
	
	//QualifiedNameWithWildcard:
	//	super::QualifiedName '.' '*';
	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
		return gaXtype.getQualifiedNameWithWildcardAccess();
	}
	
	public ParserRule getQualifiedNameWithWildcardRule() {
		return getQualifiedNameWithWildcardAccess().getRule();
	}
	
	//ValidID:
	//	ID;
	public XtypeGrammarAccess.ValidIDElements getValidIDAccess() {
		return gaXtype.getValidIDAccess();
	}
	
	public ParserRule getValidIDRule() {
		return getValidIDAccess().getRule();
	}
	
	//XImportSection:
	//	importDeclarations+=super::XImportDeclaration+;
	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
		return gaXtype.getXImportSectionAccess();
	}
	
	public ParserRule getXImportSectionRule() {
		return getXImportSectionAccess().getRule();
	}
	
	//QualifiedNameInStaticImport:
	//	(ValidID '.')+;
	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
		return gaXtype.getQualifiedNameInStaticImportAccess();
	}
	
	public ParserRule getQualifiedNameInStaticImportRule() {
		return getQualifiedNameInStaticImportAccess().getRule();
	}
	
	//terminal ID:
	//	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
	public TerminalRule getIDRule() {
		return gaXtype.getIDRule();
	}
	
	//terminal STRING:
	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
	public TerminalRule getSTRINGRule() {
		return gaXtype.getSTRINGRule();
	}
	
	//terminal ML_COMMENT:
	//	'/*'->'*/';
	public TerminalRule getML_COMMENTRule() {
		return gaXtype.getML_COMMENTRule();
	}
	
	//terminal SL_COMMENT:
	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
	public TerminalRule getSL_COMMENTRule() {
		return gaXtype.getSL_COMMENTRule();
	}
	
	//terminal WS:
	//	' ' | '\t' | '\r' | '\n'+;
	public TerminalRule getWSRule() {
		return gaXtype.getWSRule();
	}
	
	//terminal ANY_OTHER:
	//	.;
	public TerminalRule getANY_OTHERRule() {
		return gaXtype.getANY_OTHERRule();
	}
}
