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