/**
 *                                                                            
 *  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.serializer;

import com.google.inject.Inject;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationDSLPackage;
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationModel;
import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationPackage;
import org.eclipse.osbp.xtext.authorizationdsl.Role;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBean;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBeanAttribute;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBeanReference;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipAllUserTasks;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipProcess;
import org.eclipse.osbp.xtext.authorizationdsl.RoleBlipUserTask;
import org.eclipse.osbp.xtext.authorizationdsl.RoleDto;
import org.eclipse.osbp.xtext.authorizationdsl.RoleDtoAttribute;
import org.eclipse.osbp.xtext.authorizationdsl.RoleDtoReference;
import org.eclipse.osbp.xtext.authorizationdsl.RoleEntity;
import org.eclipse.osbp.xtext.authorizationdsl.RoleEntityAttribute;
import org.eclipse.osbp.xtext.authorizationdsl.RoleEntityReference;
import org.eclipse.osbp.xtext.authorizationdsl.services.AuthorizationDSLGrammarAccess;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXImportDeclaration;
import org.eclipse.osbp.xtext.oxtype.oxtype.OXtypePackage;
import org.eclipse.osbp.xtext.oxtype.serializer.OXtypeSemanticSequencer;
import org.eclipse.xtext.Action;
import org.eclipse.xtext.Parameter;
import org.eclipse.xtext.ParserRule;
import org.eclipse.xtext.common.types.JvmFormalParameter;
import org.eclipse.xtext.common.types.JvmGenericArrayTypeReference;
import org.eclipse.xtext.common.types.JvmInnerTypeReference;
import org.eclipse.xtext.common.types.JvmLowerBound;
import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
import org.eclipse.xtext.common.types.JvmTypeParameter;
import org.eclipse.xtext.common.types.JvmUpperBound;
import org.eclipse.xtext.common.types.JvmWildcardTypeReference;
import org.eclipse.xtext.common.types.TypesPackage;
import org.eclipse.xtext.serializer.ISerializationContext;
import org.eclipse.xtext.serializer.acceptor.SequenceFeeder;
import org.eclipse.xtext.serializer.sequencer.ITransientValueService.ValueTransient;
import org.eclipse.xtext.xbase.XAssignment;
import org.eclipse.xtext.xbase.XBasicForLoopExpression;
import org.eclipse.xtext.xbase.XBinaryOperation;
import org.eclipse.xtext.xbase.XBlockExpression;
import org.eclipse.xtext.xbase.XBooleanLiteral;
import org.eclipse.xtext.xbase.XCasePart;
import org.eclipse.xtext.xbase.XCastedExpression;
import org.eclipse.xtext.xbase.XCatchClause;
import org.eclipse.xtext.xbase.XClosure;
import org.eclipse.xtext.xbase.XConstructorCall;
import org.eclipse.xtext.xbase.XDoWhileExpression;
import org.eclipse.xtext.xbase.XFeatureCall;
import org.eclipse.xtext.xbase.XForLoopExpression;
import org.eclipse.xtext.xbase.XIfExpression;
import org.eclipse.xtext.xbase.XInstanceOfExpression;
import org.eclipse.xtext.xbase.XListLiteral;
import org.eclipse.xtext.xbase.XMemberFeatureCall;
import org.eclipse.xtext.xbase.XNullLiteral;
import org.eclipse.xtext.xbase.XNumberLiteral;
import org.eclipse.xtext.xbase.XPostfixOperation;
import org.eclipse.xtext.xbase.XReturnExpression;
import org.eclipse.xtext.xbase.XSetLiteral;
import org.eclipse.xtext.xbase.XStringLiteral;
import org.eclipse.xtext.xbase.XSwitchExpression;
import org.eclipse.xtext.xbase.XSynchronizedExpression;
import org.eclipse.xtext.xbase.XThrowExpression;
import org.eclipse.xtext.xbase.XTryCatchFinallyExpression;
import org.eclipse.xtext.xbase.XTypeLiteral;
import org.eclipse.xtext.xbase.XUnaryOperation;
import org.eclipse.xtext.xbase.XVariableDeclaration;
import org.eclipse.xtext.xbase.XWhileExpression;
import org.eclipse.xtext.xbase.XbasePackage;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotation;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationElementValuePair;
import org.eclipse.xtext.xbase.annotations.xAnnotations.XAnnotationsPackage;
import org.eclipse.xtext.xtype.XFunctionTypeRef;
import org.eclipse.xtext.xtype.XImportSection;
import org.eclipse.xtext.xtype.XtypePackage;

@SuppressWarnings("all")
public class AuthorizationDSLSemanticSequencer extends OXtypeSemanticSequencer {

	@Inject
	private AuthorizationDSLGrammarAccess grammarAccess;
	
	@Override
	public void sequence(ISerializationContext context, EObject semanticObject) {
		EPackage epackage = semanticObject.eClass().getEPackage();
		ParserRule rule = context.getParserRule();
		Action action = context.getAssignedAction();
		Set<Parameter> parameters = context.getEnabledBooleanParameters();
		if (epackage == AuthorizationDSLPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case AuthorizationDSLPackage.AUTHORIZATION_MODEL:
				sequence_AuthorizationModel(context, (AuthorizationModel) semanticObject); 
				return; 
			case AuthorizationDSLPackage.AUTHORIZATION_PACKAGE:
				sequence_AuthorizationPackage(context, (AuthorizationPackage) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE:
				sequence_Role(context, (Role) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_BEAN:
				sequence_RoleBean(context, (RoleBean) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_BEAN_ATTRIBUTE:
				sequence_RoleBeanAttribute(context, (RoleBeanAttribute) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_BEAN_REFERENCE:
				sequence_RoleBeanReference(context, (RoleBeanReference) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_BLIP_ALL_USER_TASKS:
				sequence_RoleBlipAllUserTasks(context, (RoleBlipAllUserTasks) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_BLIP_PROCESS:
				sequence_RoleBlipProcess(context, (RoleBlipProcess) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_BLIP_USER_TASK:
				sequence_RoleBlipUserTask(context, (RoleBlipUserTask) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_DTO:
				sequence_RoleDto(context, (RoleDto) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_DTO_ATTRIBUTE:
				sequence_RoleDtoAttribute(context, (RoleDtoAttribute) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_DTO_REFERENCE:
				sequence_RoleDtoReference(context, (RoleDtoReference) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_ENTITY:
				sequence_RoleEntity(context, (RoleEntity) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_ENTITY_ATTRIBUTE:
				sequence_RoleEntityAttribute(context, (RoleEntityAttribute) semanticObject); 
				return; 
			case AuthorizationDSLPackage.ROLE_ENTITY_REFERENCE:
				sequence_RoleEntityReference(context, (RoleEntityReference) semanticObject); 
				return; 
			}
		else if (epackage == OXtypePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case OXtypePackage.OX_IMPORT_DECLARATION:
				sequence_XImportDeclaration(context, (OXImportDeclaration) semanticObject); 
				return; 
			}
		else if (epackage == TypesPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case TypesPackage.JVM_FORMAL_PARAMETER:
				if (rule == grammarAccess.getFullJvmFormalParameterRule()) {
					sequence_FullJvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmFormalParameterRule()) {
					sequence_JvmFormalParameter(context, (JvmFormalParameter) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_GENERIC_ARRAY_TYPE_REFERENCE:
				sequence_JvmTypeReference(context, (JvmGenericArrayTypeReference) semanticObject); 
				return; 
			case TypesPackage.JVM_INNER_TYPE_REFERENCE:
				sequence_JvmParameterizedTypeReference(context, (JvmInnerTypeReference) semanticObject); 
				return; 
			case TypesPackage.JVM_LOWER_BOUND:
				if (rule == grammarAccess.getJvmLowerBoundAndedRule()) {
					sequence_JvmLowerBoundAnded(context, (JvmLowerBound) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmLowerBoundRule()) {
					sequence_JvmLowerBound(context, (JvmLowerBound) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_PARAMETERIZED_TYPE_REFERENCE:
				if (action == grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()) {
					sequence_JvmParameterizedTypeReference_JvmInnerTypeReference_1_4_0_0_0(context, (JvmParameterizedTypeReference) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmTypeReferenceRule()
						|| action == grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()
						|| rule == grammarAccess.getJvmParameterizedTypeReferenceRule()
						|| rule == grammarAccess.getJvmArgumentTypeReferenceRule()) {
					sequence_JvmParameterizedTypeReference(context, (JvmParameterizedTypeReference) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_TYPE_PARAMETER:
				sequence_JvmTypeParameter(context, (JvmTypeParameter) semanticObject); 
				return; 
			case TypesPackage.JVM_UPPER_BOUND:
				if (rule == grammarAccess.getJvmUpperBoundAndedRule()) {
					sequence_JvmUpperBoundAnded(context, (JvmUpperBound) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getJvmUpperBoundRule()) {
					sequence_JvmUpperBound(context, (JvmUpperBound) semanticObject); 
					return; 
				}
				else break;
			case TypesPackage.JVM_WILDCARD_TYPE_REFERENCE:
				sequence_JvmWildcardTypeReference(context, (JvmWildcardTypeReference) semanticObject); 
				return; 
			}
		else if (epackage == XAnnotationsPackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XAnnotationsPackage.XANNOTATION:
				sequence_XAnnotation(context, (XAnnotation) semanticObject); 
				return; 
			case XAnnotationsPackage.XANNOTATION_ELEMENT_VALUE_PAIR:
				sequence_XAnnotationElementValuePair(context, (XAnnotationElementValuePair) semanticObject); 
				return; 
			}
		else if (epackage == XbasePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XbasePackage.XASSIGNMENT:
				sequence_XAssignment_XMemberFeatureCall(context, (XAssignment) semanticObject); 
				return; 
			case XbasePackage.XBASIC_FOR_LOOP_EXPRESSION:
				sequence_XBasicForLoopExpression(context, (XBasicForLoopExpression) semanticObject); 
				return; 
			case XbasePackage.XBINARY_OPERATION:
				sequence_XAdditiveExpression_XAndExpression_XAssignment_XEqualityExpression_XMultiplicativeExpression_XOrExpression_XOtherOperatorExpression_XRelationalExpression(context, (XBinaryOperation) semanticObject); 
				return; 
			case XbasePackage.XBLOCK_EXPRESSION:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()
						|| action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationElementValueRule()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXBlockExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XBlockExpression(context, (XBlockExpression) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXExpressionInClosureRule()) {
					sequence_XExpressionInClosure(context, (XBlockExpression) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XBOOLEAN_LITERAL:
				sequence_XBooleanLiteral(context, (XBooleanLiteral) semanticObject); 
				return; 
			case XbasePackage.XCASE_PART:
				sequence_XCasePart(context, (XCasePart) semanticObject); 
				return; 
			case XbasePackage.XCASTED_EXPRESSION:
				sequence_XCastedExpression(context, (XCastedExpression) semanticObject); 
				return; 
			case XbasePackage.XCATCH_CLAUSE:
				sequence_XCatchClause(context, (XCatchClause) semanticObject); 
				return; 
			case XbasePackage.XCLOSURE:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()
						|| action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationElementValueRule()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXLiteralRule()
						|| rule == grammarAccess.getXClosureRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XClosure(context, (XClosure) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXShortClosureRule()) {
					sequence_XShortClosure(context, (XClosure) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XCONSTRUCTOR_CALL:
				sequence_XConstructorCall(context, (XConstructorCall) semanticObject); 
				return; 
			case XbasePackage.XDO_WHILE_EXPRESSION:
				sequence_XDoWhileExpression(context, (XDoWhileExpression) semanticObject); 
				return; 
			case XbasePackage.XFEATURE_CALL:
				sequence_XFeatureCall(context, (XFeatureCall) semanticObject); 
				return; 
			case XbasePackage.XFOR_LOOP_EXPRESSION:
				sequence_XForLoopExpression(context, (XForLoopExpression) semanticObject); 
				return; 
			case XbasePackage.XIF_EXPRESSION:
				sequence_XIfExpression(context, (XIfExpression) semanticObject); 
				return; 
			case XbasePackage.XINSTANCE_OF_EXPRESSION:
				sequence_XRelationalExpression(context, (XInstanceOfExpression) semanticObject); 
				return; 
			case XbasePackage.XLIST_LITERAL:
				if (rule == grammarAccess.getXAnnotationElementValueOrCommaListRule()) {
					sequence_XAnnotationElementValueOrCommaList_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else if (rule == grammarAccess.getXAnnotationElementValueRule()) {
					sequence_XAnnotationElementValue_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else if (action == grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()
						|| rule == grammarAccess.getXAnnotationOrExpressionRule()
						|| rule == grammarAccess.getXExpressionRule()
						|| rule == grammarAccess.getXAssignmentRule()
						|| action == grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOrExpressionRule()
						|| action == grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAndExpressionRule()
						|| action == grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXEqualityExpressionRule()
						|| action == grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXRelationalExpressionRule()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()
						|| action == grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()
						|| rule == grammarAccess.getXOtherOperatorExpressionRule()
						|| action == grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXAdditiveExpressionRule()
						|| action == grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXMultiplicativeExpressionRule()
						|| action == grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()
						|| rule == grammarAccess.getXUnaryOperationRule()
						|| rule == grammarAccess.getXCastedExpressionRule()
						|| action == grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()
						|| rule == grammarAccess.getXPostfixOperationRule()
						|| action == grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()
						|| rule == grammarAccess.getXMemberFeatureCallRule()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()
						|| action == grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()
						|| rule == grammarAccess.getXPrimaryExpressionRule()
						|| rule == grammarAccess.getXLiteralRule()
						|| rule == grammarAccess.getXCollectionLiteralRule()
						|| rule == grammarAccess.getXListLiteralRule()
						|| rule == grammarAccess.getXParenthesizedExpressionRule()
						|| rule == grammarAccess.getXExpressionOrVarDeclarationRule()) {
					sequence_XListLiteral(context, (XListLiteral) semanticObject); 
					return; 
				}
				else break;
			case XbasePackage.XMEMBER_FEATURE_CALL:
				sequence_XMemberFeatureCall(context, (XMemberFeatureCall) semanticObject); 
				return; 
			case XbasePackage.XNULL_LITERAL:
				sequence_XNullLiteral(context, (XNullLiteral) semanticObject); 
				return; 
			case XbasePackage.XNUMBER_LITERAL:
				sequence_XNumberLiteral(context, (XNumberLiteral) semanticObject); 
				return; 
			case XbasePackage.XPOSTFIX_OPERATION:
				sequence_XPostfixOperation(context, (XPostfixOperation) semanticObject); 
				return; 
			case XbasePackage.XRETURN_EXPRESSION:
				sequence_XReturnExpression(context, (XReturnExpression) semanticObject); 
				return; 
			case XbasePackage.XSET_LITERAL:
				sequence_XSetLiteral(context, (XSetLiteral) semanticObject); 
				return; 
			case XbasePackage.XSTRING_LITERAL:
				sequence_XStringLiteral(context, (XStringLiteral) semanticObject); 
				return; 
			case XbasePackage.XSWITCH_EXPRESSION:
				sequence_XSwitchExpression(context, (XSwitchExpression) semanticObject); 
				return; 
			case XbasePackage.XSYNCHRONIZED_EXPRESSION:
				sequence_XSynchronizedExpression(context, (XSynchronizedExpression) semanticObject); 
				return; 
			case XbasePackage.XTHROW_EXPRESSION:
				sequence_XThrowExpression(context, (XThrowExpression) semanticObject); 
				return; 
			case XbasePackage.XTRY_CATCH_FINALLY_EXPRESSION:
				sequence_XTryCatchFinallyExpression(context, (XTryCatchFinallyExpression) semanticObject); 
				return; 
			case XbasePackage.XTYPE_LITERAL:
				sequence_XTypeLiteral(context, (XTypeLiteral) semanticObject); 
				return; 
			case XbasePackage.XUNARY_OPERATION:
				sequence_XUnaryOperation(context, (XUnaryOperation) semanticObject); 
				return; 
			case XbasePackage.XVARIABLE_DECLARATION:
				sequence_XVariableDeclaration(context, (XVariableDeclaration) semanticObject); 
				return; 
			case XbasePackage.XWHILE_EXPRESSION:
				sequence_XWhileExpression(context, (XWhileExpression) semanticObject); 
				return; 
			}
		else if (epackage == XtypePackage.eINSTANCE)
			switch (semanticObject.eClass().getClassifierID()) {
			case XtypePackage.XFUNCTION_TYPE_REF:
				sequence_XFunctionTypeRef(context, (XFunctionTypeRef) semanticObject); 
				return; 
			case XtypePackage.XIMPORT_SECTION:
				sequence_XImportSection(context, (XImportSection) semanticObject); 
				return; 
			}
		if (errorAcceptor != null)
			errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
	}
	
	/**
	 * Contexts:
	 *     AuthorizationModel returns AuthorizationModel
	 *
	 * Constraint:
	 *     (importSection=XImportSection? pckg=AuthorizationPackage)
	 */
	protected void sequence_AuthorizationModel(ISerializationContext context, AuthorizationModel semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     AuthorizationPackage returns AuthorizationPackage
	 *
	 * Constraint:
	 *     (name=QualifiedName roles+=Role*)
	 */
	protected void sequence_AuthorizationPackage(ISerializationContext context, AuthorizationPackage semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     RoleBeanFeature returns RoleBeanAttribute
	 *     RoleBeanAttribute returns RoleBeanAttribute
	 *
	 * Constraint:
	 *     (beanAttriCol=[LBeanAttribute|ID] beanAttriUnauthorized=RolePropertyEnum)
	 */
	protected void sequence_RoleBeanAttribute(ISerializationContext context, RoleBeanAttribute semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL));
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BEAN_ATTRIBUTE__BEAN_ATTRI_UNAUTHORIZED) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BEAN_ATTRIBUTE__BEAN_ATTRI_UNAUTHORIZED));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getRoleBeanAttributeAccess().getBeanAttriColLBeanAttributeIDTerminalRuleCall_1_0_1(), semanticObject.eGet(AuthorizationDSLPackage.Literals.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL, false));
		feeder.accept(grammarAccess.getRoleBeanAttributeAccess().getBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0(), semanticObject.getBeanAttriUnauthorized());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     RoleBeanFeature returns RoleBeanReference
	 *     RoleBeanReference returns RoleBeanReference
	 *
	 * Constraint:
	 *     (beanAttriCol=[LBeanReference|ID] beanAttriUnauthorized=RolePropertyEnum)
	 */
	protected void sequence_RoleBeanReference(ISerializationContext context, RoleBeanReference semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL));
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BEAN_REFERENCE__BEAN_ATTRI_UNAUTHORIZED) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BEAN_REFERENCE__BEAN_ATTRI_UNAUTHORIZED));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getRoleBeanReferenceAccess().getBeanAttriColLBeanReferenceIDTerminalRuleCall_1_0_1(), semanticObject.eGet(AuthorizationDSLPackage.Literals.ROLE_BEAN_FEATURE__BEAN_ATTRI_COL, false));
		feeder.accept(grammarAccess.getRoleBeanReferenceAccess().getBeanAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0(), semanticObject.getBeanAttriUnauthorized());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     RoleElement returns RoleBean
	 *     RoleBean returns RoleBean
	 *
	 * Constraint:
	 *     (beanRef=[LBean|ID] beanAuthorized+=RoleEnum+ beanFeatures+=RoleBeanFeature*)
	 */
	protected void sequence_RoleBean(ISerializationContext context, RoleBean semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     RoleBlipAllUserTasks returns RoleBlipAllUserTasks
	 *
	 * Constraint:
	 *     authorized=RoleBlipUserTaskEnum
	 */
	protected void sequence_RoleBlipAllUserTasks(ISerializationContext context, RoleBlipAllUserTasks semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BLIP_ALL_USER_TASKS__AUTHORIZED) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BLIP_ALL_USER_TASKS__AUTHORIZED));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getRoleBlipAllUserTasksAccess().getAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0(), semanticObject.getAuthorized());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     RoleElement returns RoleBlipProcess
	 *     RoleBlipProcess returns RoleBlipProcess
	 *
	 * Constraint:
	 *     (process=[Blip|ID] processStartAuthorized=RoleBlipProcessEnum? allUserTasks=RoleBlipAllUserTasks? userTasks+=RoleBlipUserTask*)
	 */
	protected void sequence_RoleBlipProcess(ISerializationContext context, RoleBlipProcess semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     RoleBlipUserTask returns RoleBlipUserTask
	 *
	 * Constraint:
	 *     (userTask=[BlipUserTask|QualifiedName] authorized=RoleBlipUserTaskEnum)
	 */
	protected void sequence_RoleBlipUserTask(ISerializationContext context, RoleBlipUserTask semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BLIP_USER_TASK__USER_TASK) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BLIP_USER_TASK__USER_TASK));
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BLIP_USER_TASK__AUTHORIZED) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_BLIP_USER_TASK__AUTHORIZED));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getRoleBlipUserTaskAccess().getUserTaskBlipUserTaskQualifiedNameParserRuleCall_2_0_1(), semanticObject.eGet(AuthorizationDSLPackage.Literals.ROLE_BLIP_USER_TASK__USER_TASK, false));
		feeder.accept(grammarAccess.getRoleBlipUserTaskAccess().getAuthorizedRoleBlipUserTaskEnumEnumRuleCall_3_0(), semanticObject.getAuthorized());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     RoleDtoFeature returns RoleDtoAttribute
	 *     RoleDtoAttribute returns RoleDtoAttribute
	 *
	 * Constraint:
	 *     (dtoAttriCol=[LDtoAttribute|ID] dtoAttriUnauthorized=RolePropertyEnum)
	 */
	protected void sequence_RoleDtoAttribute(ISerializationContext context, RoleDtoAttribute semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_DTO_FEATURE__DTO_ATTRI_COL) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_DTO_FEATURE__DTO_ATTRI_COL));
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_DTO_ATTRIBUTE__DTO_ATTRI_UNAUTHORIZED) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_DTO_ATTRIBUTE__DTO_ATTRI_UNAUTHORIZED));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getRoleDtoAttributeAccess().getDtoAttriColLDtoAttributeIDTerminalRuleCall_1_0_1(), semanticObject.eGet(AuthorizationDSLPackage.Literals.ROLE_DTO_FEATURE__DTO_ATTRI_COL, false));
		feeder.accept(grammarAccess.getRoleDtoAttributeAccess().getDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0(), semanticObject.getDtoAttriUnauthorized());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     RoleDtoFeature returns RoleDtoReference
	 *     RoleDtoReference returns RoleDtoReference
	 *
	 * Constraint:
	 *     (dtoAttriCol=[LDtoReference|ID] dtoAttriUnauthorized=RolePropertyEnum)
	 */
	protected void sequence_RoleDtoReference(ISerializationContext context, RoleDtoReference semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_DTO_FEATURE__DTO_ATTRI_COL) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_DTO_FEATURE__DTO_ATTRI_COL));
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_DTO_REFERENCE__DTO_ATTRI_UNAUTHORIZED) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_DTO_REFERENCE__DTO_ATTRI_UNAUTHORIZED));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getRoleDtoReferenceAccess().getDtoAttriColLDtoReferenceIDTerminalRuleCall_1_0_1(), semanticObject.eGet(AuthorizationDSLPackage.Literals.ROLE_DTO_FEATURE__DTO_ATTRI_COL, false));
		feeder.accept(grammarAccess.getRoleDtoReferenceAccess().getDtoAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0(), semanticObject.getDtoAttriUnauthorized());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     RoleElement returns RoleDto
	 *     RoleDto returns RoleDto
	 *
	 * Constraint:
	 *     (dtoRef=[LDto|ID] dtoAuthorized+=RoleEnum+ dtoFeatures+=RoleDtoFeature*)
	 */
	protected void sequence_RoleDto(ISerializationContext context, RoleDto semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     RoleEntityFeature returns RoleEntityAttribute
	 *     RoleEntityAttribute returns RoleEntityAttribute
	 *
	 * Constraint:
	 *     (entityAttriCol=[LEntityAttribute|ID] entityAttriUnauthorized=RolePropertyEnum)
	 */
	protected void sequence_RoleEntityAttribute(ISerializationContext context, RoleEntityAttribute semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_ENTITY_FEATURE__ENTITY_ATTRI_COL) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_ENTITY_FEATURE__ENTITY_ATTRI_COL));
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_ENTITY_ATTRIBUTE__ENTITY_ATTRI_UNAUTHORIZED) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_ENTITY_ATTRIBUTE__ENTITY_ATTRI_UNAUTHORIZED));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getRoleEntityAttributeAccess().getEntityAttriColLEntityAttributeIDTerminalRuleCall_1_0_1(), semanticObject.eGet(AuthorizationDSLPackage.Literals.ROLE_ENTITY_FEATURE__ENTITY_ATTRI_COL, false));
		feeder.accept(grammarAccess.getRoleEntityAttributeAccess().getEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0(), semanticObject.getEntityAttriUnauthorized());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     RoleEntityFeature returns RoleEntityReference
	 *     RoleEntityReference returns RoleEntityReference
	 *
	 * Constraint:
	 *     (entityAttriCol=[LEntityReference|ID] entityAttriUnauthorized=RolePropertyEnum)
	 */
	protected void sequence_RoleEntityReference(ISerializationContext context, RoleEntityReference semanticObject) {
		if (errorAcceptor != null) {
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_ENTITY_FEATURE__ENTITY_ATTRI_COL) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_ENTITY_FEATURE__ENTITY_ATTRI_COL));
			if (transientValues.isValueTransient(semanticObject, AuthorizationDSLPackage.Literals.ROLE_ENTITY_REFERENCE__ENTITY_ATTRI_UNAUTHORIZED) == ValueTransient.YES)
				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, AuthorizationDSLPackage.Literals.ROLE_ENTITY_REFERENCE__ENTITY_ATTRI_UNAUTHORIZED));
		}
		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
		feeder.accept(grammarAccess.getRoleEntityReferenceAccess().getEntityAttriColLEntityReferenceIDTerminalRuleCall_1_0_1(), semanticObject.eGet(AuthorizationDSLPackage.Literals.ROLE_ENTITY_FEATURE__ENTITY_ATTRI_COL, false));
		feeder.accept(grammarAccess.getRoleEntityReferenceAccess().getEntityAttriUnauthorizedRolePropertyEnumEnumRuleCall_2_0(), semanticObject.getEntityAttriUnauthorized());
		feeder.finish();
	}
	
	
	/**
	 * Contexts:
	 *     RoleElement returns RoleEntity
	 *     RoleEntity returns RoleEntity
	 *
	 * Constraint:
	 *     (entityRef=[LEntity|ID] entityAuthorized+=RoleEnum+ entityFeatures+=RoleEntityFeature*)
	 */
	protected void sequence_RoleEntity(ISerializationContext context, RoleEntity semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
	/**
	 * Contexts:
	 *     Role returns Role
	 *
	 * Constraint:
	 *     (name=TRANSLATABLEID roleElements+=RoleElement*)
	 */
	protected void sequence_Role(ISerializationContext context, Role semanticObject) {
		genericSequencer.createSequence(context, semanticObject);
	}
	
	
}
