/**
 * <copyright>
 * 
 * Copyright (c) 2006, 2008 IBM Corporation and others.
 * 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:
 *   IBM - Initial API and implementation
 * 
 * </copyright>
 *
 * $Id: UtilitiesPackageImpl.java,v 1.12 2010/01/14 12:44:33 ewillink Exp $
 */
package org.eclipse.ocl.utilities.impl;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EGenericType;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.ETypeParameter;
import org.eclipse.emf.ecore.impl.EPackageImpl;
import org.eclipse.ocl.expressions.ExpressionsPackage;
import org.eclipse.ocl.expressions.impl.ExpressionsPackageImpl;
import org.eclipse.ocl.types.TypesPackage;
import org.eclipse.ocl.types.impl.TypesPackageImpl;
import org.eclipse.ocl.utilities.ASTNode;
import org.eclipse.ocl.utilities.CallingASTNode;
import org.eclipse.ocl.utilities.ExpressionInOCL;
import org.eclipse.ocl.utilities.PredefinedType;
import org.eclipse.ocl.utilities.TypedASTNode;
import org.eclipse.ocl.utilities.TypedElement;
import org.eclipse.ocl.utilities.UtilitiesFactory;
import org.eclipse.ocl.utilities.UtilitiesPackage;
import org.eclipse.ocl.utilities.Visitable;
import org.eclipse.ocl.utilities.Visitor;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Package</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class UtilitiesPackageImpl
		extends EPackageImpl
		implements UtilitiesPackage {

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

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

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

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

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

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

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

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

	/**
	 * Creates an instance of the model <b>Package</b>, registered with
	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
	 * package URI value.
	 * <p>Note: the correct way to create the package is via the static
	 * factory method {@link #init init()}, which also performs
	 * initialization of the package, or returns the registered package,
	 * if one already exists.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.emf.ecore.EPackage.Registry
	 * @see org.eclipse.ocl.utilities.UtilitiesPackage#eNS_URI
	 * @see #init()
	 * @generated
	 */
	private UtilitiesPackageImpl() {
		super(eNS_URI, UtilitiesFactory.eINSTANCE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private static boolean isInited = false;

	/**
	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
	 * 
	 * <p>This method is used to initialize {@link UtilitiesPackage#eINSTANCE} when that field is accessed.
	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #eNS_URI
	 * @see #createPackageContents()
	 * @see #initializePackageContents()
	 * @generated
	 */
	public static UtilitiesPackage init() {
		if (isInited)
			return (UtilitiesPackage) EPackage.Registry.INSTANCE
				.getEPackage(UtilitiesPackage.eNS_URI);

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

		isInited = true;

		// Obtain or create and register interdependencies
		TypesPackageImpl theTypesPackage = (TypesPackageImpl) (EPackage.Registry.INSTANCE
			.getEPackage(TypesPackage.eNS_URI) instanceof TypesPackageImpl
			? EPackage.Registry.INSTANCE.getEPackage(TypesPackage.eNS_URI)
			: TypesPackage.eINSTANCE);
		ExpressionsPackageImpl theExpressionsPackage = (ExpressionsPackageImpl) (EPackage.Registry.INSTANCE
			.getEPackage(ExpressionsPackage.eNS_URI) instanceof ExpressionsPackageImpl
			? EPackage.Registry.INSTANCE
				.getEPackage(ExpressionsPackage.eNS_URI)
			: ExpressionsPackage.eINSTANCE);

		// Create package meta-data objects
		theUtilitiesPackage.createPackageContents();
		theTypesPackage.createPackageContents();
		theExpressionsPackage.createPackageContents();

		// Initialize created meta-data
		theUtilitiesPackage.initializePackageContents();
		theTypesPackage.initializePackageContents();
		theExpressionsPackage.initializePackageContents();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public UtilitiesFactory getUtilitiesFactory() {
		return (UtilitiesFactory) getEFactoryInstance();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isCreated = false;

	/**
	 * Creates the meta-model objects for the package.  This method is
	 * guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void createPackageContents() {
		if (isCreated)
			return;
		isCreated = true;

		// Create classes and their features
		astNodeEClass = createEClass(AST_NODE);
		createEAttribute(astNodeEClass, AST_NODE__START_POSITION);
		createEAttribute(astNodeEClass, AST_NODE__END_POSITION);

		callingASTNodeEClass = createEClass(CALLING_AST_NODE);
		createEAttribute(callingASTNodeEClass,
			CALLING_AST_NODE__PROPERTY_START_POSITION);
		createEAttribute(callingASTNodeEClass,
			CALLING_AST_NODE__PROPERTY_END_POSITION);

		typedASTNodeEClass = createEClass(TYPED_AST_NODE);
		createEAttribute(typedASTNodeEClass,
			TYPED_AST_NODE__TYPE_START_POSITION);
		createEAttribute(typedASTNodeEClass, TYPED_AST_NODE__TYPE_END_POSITION);

		visitableEClass = createEClass(VISITABLE);

		visitorEClass = createEClass(VISITOR);

		typedElementEClass = createEClass(TYPED_ELEMENT);

		expressionInOCLEClass = createEClass(EXPRESSION_IN_OCL);
		createEReference(expressionInOCLEClass,
			EXPRESSION_IN_OCL__BODY_EXPRESSION);
		createEReference(expressionInOCLEClass,
			EXPRESSION_IN_OCL__CONTEXT_VARIABLE);
		createEReference(expressionInOCLEClass,
			EXPRESSION_IN_OCL__RESULT_VARIABLE);
		createEReference(expressionInOCLEClass,
			EXPRESSION_IN_OCL__PARAMETER_VARIABLE);
		createEReference(expressionInOCLEClass,
			EXPRESSION_IN_OCL__GENERATED_TYPE);

		predefinedTypeEClass = createEClass(PREDEFINED_TYPE);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	private boolean isInitialized = false;

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <p>
	 * The generated implementation is extended by adding me as a child of
	 * the empty root <tt>OCL</tt> package.
	 * </p>
	 */
	public void initializePackageContents() {
		if (!isInitialized) {
			// create my own resource first, before adding me to my parent
			// package.  Otherwise, I will already be in a resource when
			// createResource() is called, and it will not create a new one
			initializePackageContentsGen();

			ExpressionsPackageImpl.OCL_ROOT_PACKAGE.getESubpackages().add(this);
		}
	}

	/**
	 * Complete the initialization of the package and its meta-model.  This
	 * method is guarded to have no affect on any invocation but its first.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void initializePackageContentsGen() {
		if (isInitialized)
			return;
		isInitialized = true;

		// Initialize package
		setName(eNAME);
		setNsPrefix(eNS_PREFIX);
		setNsURI(eNS_URI);

		// Obtain other dependent packages
		ExpressionsPackage theExpressionsPackage = (ExpressionsPackage) EPackage.Registry.INSTANCE
			.getEPackage(ExpressionsPackage.eNS_URI);

		// Create type parameters
		ETypeParameter visitorEClass_T = addETypeParameter(visitorEClass, "T"); //$NON-NLS-1$
		ETypeParameter visitorEClass_C = addETypeParameter(visitorEClass, "C"); //$NON-NLS-1$
		ETypeParameter visitorEClass_O = addETypeParameter(visitorEClass, "O"); //$NON-NLS-1$
		ETypeParameter visitorEClass_P = addETypeParameter(visitorEClass, "P"); //$NON-NLS-1$
		ETypeParameter visitorEClass_EL = addETypeParameter(visitorEClass, "EL"); //$NON-NLS-1$
		ETypeParameter visitorEClass_PM = addETypeParameter(visitorEClass, "PM"); //$NON-NLS-1$
		ETypeParameter visitorEClass_S = addETypeParameter(visitorEClass, "S"); //$NON-NLS-1$
		ETypeParameter visitorEClass_COA = addETypeParameter(visitorEClass,
			"COA"); //$NON-NLS-1$
		ETypeParameter visitorEClass_SSA = addETypeParameter(visitorEClass,
			"SSA"); //$NON-NLS-1$
		ETypeParameter visitorEClass_CT = addETypeParameter(visitorEClass, "CT"); //$NON-NLS-1$
		ETypeParameter typedElementEClass_C = addETypeParameter(
			typedElementEClass, "C"); //$NON-NLS-1$
		ETypeParameter expressionInOCLEClass_C = addETypeParameter(
			expressionInOCLEClass, "C"); //$NON-NLS-1$
		ETypeParameter expressionInOCLEClass_PM = addETypeParameter(
			expressionInOCLEClass, "PM"); //$NON-NLS-1$
		ETypeParameter predefinedTypeEClass_O = addETypeParameter(
			predefinedTypeEClass, "O"); //$NON-NLS-1$

		// Set bounds for type parameters

		// Add supertypes to classes
		callingASTNodeEClass.getESuperTypes().add(this.getASTNode());
		typedASTNodeEClass.getESuperTypes().add(this.getASTNode());
		expressionInOCLEClass.getESuperTypes().add(this.getVisitable());

		// Initialize classes and features; add operations and parameters
		initEClass(astNodeEClass, ASTNode.class,
			"ASTNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(
			getASTNode_StartPosition(),
			ecorePackage.getEInt(),
			"startPosition", "-1", 0, 1, ASTNode.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
		initEAttribute(
			getASTNode_EndPosition(),
			ecorePackage.getEInt(),
			"endPosition", "-1", 0, 1, ASTNode.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$

		initEClass(
			callingASTNodeEClass,
			CallingASTNode.class,
			"CallingASTNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(
			getCallingASTNode_PropertyStartPosition(),
			ecorePackage.getEInt(),
			"propertyStartPosition", "-1", 0, 1, CallingASTNode.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
		initEAttribute(
			getCallingASTNode_PropertyEndPosition(),
			ecorePackage.getEInt(),
			"propertyEndPosition", "-1", 0, 1, CallingASTNode.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$

		initEClass(
			typedASTNodeEClass,
			TypedASTNode.class,
			"TypedASTNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		initEAttribute(
			getTypedASTNode_TypeStartPosition(),
			ecorePackage.getEInt(),
			"typeStartPosition", "-1", 0, 1, TypedASTNode.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$
		initEAttribute(
			getTypedASTNode_TypeEndPosition(),
			ecorePackage.getEInt(),
			"typeEndPosition", "-1", 0, 1, TypedASTNode.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$ //$NON-NLS-2$

		initEClass(visitableEClass, Visitable.class,
			"Visitable", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		EOperation op = addEOperation(visitableEClass, null,
			"accept", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		ETypeParameter t1 = addETypeParameter(op, "T"); //$NON-NLS-1$
		ETypeParameter t2 = addETypeParameter(op, "U"); //$NON-NLS-1$
		EGenericType g1 = createEGenericType(this.getVisitor());
		EGenericType g2 = createEGenericType(t1);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType();
		g1.getETypeArguments().add(g2);
		t2.getEBounds().add(g1);
		g1 = createEGenericType(t2);
		addEParameter(op, g1, "v", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(t1);
		initEOperation(op, g1);

		initEClass(visitorEClass, Visitor.class,
			"Visitor", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		op = addEOperation(visitorEClass, null,
			"visitVariableExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getVariableExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_PM);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "variableExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitLetExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getLetExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_PM);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "letExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitIfExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getIfExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "ifExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitTypeExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getTypeExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "typeExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitPropertyCallExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getPropertyCallExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_P);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "callExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitOperationCallExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getOperationCallExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_O);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "callExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitAssociationClassCallExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage
			.getAssociationClassCallExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_P);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "callExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitIteratorExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getIteratorExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_PM);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "callExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitIterateExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getIterateExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_PM);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "callExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitUnspecifiedValueExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getUnspecifiedValueExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "unspecExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitIntegerLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getIntegerLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitUnlimitedNaturalLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage
			.getUnlimitedNaturalLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitRealLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getRealLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitStringLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getStringLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitBooleanLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getBooleanLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitEnumLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getEnumLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_EL);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitCollectionLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getCollectionLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitCollectionItem", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getCollectionItem());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "item", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitCollectionRange", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getCollectionRange());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "range", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitTupleLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getTupleLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_P);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitTupleLiteralPart", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getTupleLiteralPart());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_P);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "part", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitInvalidLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getInvalidLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitNullLiteralExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getNullLiteralExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "literalExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitStateExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getStateExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_S);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "stateExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitMessageExp", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getMessageExp());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_COA);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_SSA);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "messageExp", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitVariable", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getVariable());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_PM);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "variable", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitExpressionInOCL", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(this.getExpressionInOCL());
		g2 = createEGenericType(visitorEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(visitorEClass_PM);
		g1.getETypeArguments().add(g2);
		addEParameter(op, g1, "expression", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		op = addEOperation(visitorEClass, null,
			"visitConstraint", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_CT);
		addEParameter(op, g1, "constraint", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(visitorEClass_T);
		initEOperation(op, g1);

		initEClass(
			typedElementEClass,
			TypedElement.class,
			"TypedElement", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		addEOperation(typedElementEClass, ecorePackage.getEString(),
			"getName", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$

		op = addEOperation(typedElementEClass, null,
			"getType", 0, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(typedElementEClass_C);
		initEOperation(op, g1);

		op = addEOperation(typedElementEClass, null,
			"setName", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
		addEParameter(op, ecorePackage.getEString(),
			"name", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$

		op = addEOperation(typedElementEClass, null,
			"setType", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(typedElementEClass_C);
		addEParameter(op, g1, "type", 1, 1, IS_UNIQUE, !IS_ORDERED); //$NON-NLS-1$

		initEClass(
			expressionInOCLEClass,
			ExpressionInOCL.class,
			"ExpressionInOCL", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getOCLExpression());
		g2 = createEGenericType(expressionInOCLEClass_C);
		g1.getETypeArguments().add(g2);
		initEReference(
			getExpressionInOCL_BodyExpression(),
			g1,
			null,
			"bodyExpression", null, 1, 1, ExpressionInOCL.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getVariable());
		g2 = createEGenericType(expressionInOCLEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(expressionInOCLEClass_PM);
		g1.getETypeArguments().add(g2);
		initEReference(
			getExpressionInOCL_ContextVariable(),
			g1,
			null,
			"contextVariable", null, 1, 1, ExpressionInOCL.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getVariable());
		g2 = createEGenericType(expressionInOCLEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(expressionInOCLEClass_PM);
		g1.getETypeArguments().add(g2);
		initEReference(
			getExpressionInOCL_ResultVariable(),
			g1,
			null,
			"resultVariable", null, 0, 1, ExpressionInOCL.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(theExpressionsPackage.getVariable());
		g2 = createEGenericType(expressionInOCLEClass_C);
		g1.getETypeArguments().add(g2);
		g2 = createEGenericType(expressionInOCLEClass_PM);
		g1.getETypeArguments().add(g2);
		initEReference(
			getExpressionInOCL_ParameterVariable(),
			g1,
			null,
			"parameterVariable", null, 0, -1, ExpressionInOCL.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(expressionInOCLEClass_C);
		initEReference(
			getExpressionInOCL_GeneratedType(),
			g1,
			null,
			"generatedType", null, 0, -1, ExpressionInOCL.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$

		initEClass(
			predefinedTypeEClass,
			PredefinedType.class,
			"PredefinedType", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$

		addEOperation(predefinedTypeEClass, ecorePackage.getEString(),
			"getName", 1, 1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$

		op = addEOperation(predefinedTypeEClass, null,
			"oclOperations", 0, -1, IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
		g1 = createEGenericType(predefinedTypeEClass_O);
		initEOperation(op, g1);

		// Create resource
		createResource(eNS_URI);

		// Create annotations
		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
		createExtendedMetaDataAnnotations();
	}

	/**
	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected void createExtendedMetaDataAnnotations() {
		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData"; //$NON-NLS-1$		
		addAnnotation(expressionInOCLEClass, source, new String[]{
			"name", "ExpressionInOcl" //$NON-NLS-1$ //$NON-NLS-2$
		});
	}

} //UtilitiesPackageImpl
