/*******************************************************************************
 * Copyright (c) 2003, 2005 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 Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jem.internal.instantiation.impl;
/*
 *  $RCSfile: InstantiationFactoryImpl.java,v $
 *  $Revision: 1.11 $  $Date: 2005/10/03 19:20:41 $ 
 */

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;

import java.util.List;

import org.eclipse.jem.internal.instantiation.*;
import org.eclipse.jem.internal.instantiation.base.IJavaInstance;

import org.eclipse.emf.ecore.*;
import org.eclipse.emf.ecore.impl.EFactoryImpl;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class InstantiationFactoryImpl extends EFactoryImpl implements InstantiationFactory {
	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InstantiationFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case InstantiationPackage.INIT_STRING_ALLOCATION: return createInitStringAllocation();
			case InstantiationPackage.IMPLICIT_ALLOCATION: return createImplicitAllocation();
			case InstantiationPackage.PARSE_TREE_ALLOCATION: return createParseTreeAllocation();
			case InstantiationPackage.PT_ARRAY_ACCESS: return createPTArrayAccess();
			case InstantiationPackage.PT_ARRAY_CREATION: return createPTArrayCreation();
			case InstantiationPackage.PT_ARRAY_INITIALIZER: return createPTArrayInitializer();
			case InstantiationPackage.PT_BOOLEAN_LITERAL: return createPTBooleanLiteral();
			case InstantiationPackage.PT_CAST_EXPRESSION: return createPTCastExpression();
			case InstantiationPackage.PT_CHARACTER_LITERAL: return createPTCharacterLiteral();
			case InstantiationPackage.PT_CLASS_INSTANCE_CREATION: return createPTClassInstanceCreation();
			case InstantiationPackage.PT_CONDITIONAL_EXPRESSION: return createPTConditionalExpression();
			case InstantiationPackage.PT_FIELD_ACCESS: return createPTFieldAccess();
			case InstantiationPackage.PT_INFIX_EXPRESSION: return createPTInfixExpression();
			case InstantiationPackage.PT_INSTANCEOF: return createPTInstanceof();
			case InstantiationPackage.PT_METHOD_INVOCATION: return createPTMethodInvocation();
			case InstantiationPackage.PT_NAME: return createPTName();
			case InstantiationPackage.PT_NULL_LITERAL: return createPTNullLiteral();
			case InstantiationPackage.PT_NUMBER_LITERAL: return createPTNumberLiteral();
			case InstantiationPackage.PT_PARENTHESIZED_EXPRESSION: return createPTParenthesizedExpression();
			case InstantiationPackage.PT_PREFIX_EXPRESSION: return createPTPrefixExpression();
			case InstantiationPackage.PT_STRING_LITERAL: return createPTStringLiteral();
			case InstantiationPackage.PT_THIS_LITERAL: return createPTThisLiteral();
			case InstantiationPackage.PT_TYPE_LITERAL: return createPTTypeLiteral();
			case InstantiationPackage.PT_INVALID_EXPRESSION: return createPTInvalidExpression();
			case InstantiationPackage.PT_INSTANCE_REFERENCE: return createPTInstanceReference();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Object createFromString(EDataType eDataType, String initialValue) {
		switch (eDataType.getClassifierID()) {
			case InstantiationPackage.PT_INFIX_OPERATOR: {
				PTInfixOperator result = PTInfixOperator.get(initialValue);
				if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
				return result;
			}
			case InstantiationPackage.PT_PREFIX_OPERATOR: {
				PTPrefixOperator result = PTPrefixOperator.get(initialValue);
				if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
				return result;
			}
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertToString(EDataType eDataType, Object instanceValue) {
		switch (eDataType.getClassifierID()) {
			case InstantiationPackage.PT_INFIX_OPERATOR:
				return instanceValue == null ? null : instanceValue.toString();
			case InstantiationPackage.PT_PREFIX_OPERATOR:
				return instanceValue == null ? null : instanceValue.toString();
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InitStringAllocation createInitStringAllocation() {
		InitStringAllocationImpl initStringAllocation = new InitStringAllocationImpl();
		return initStringAllocation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ImplicitAllocation createImplicitAllocation() {
		ImplicitAllocationImpl implicitAllocation = new ImplicitAllocationImpl();
		return implicitAllocation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ParseTreeAllocation createParseTreeAllocation() {
		ParseTreeAllocationImpl parseTreeAllocation = new ParseTreeAllocationImpl();
		return parseTreeAllocation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTArrayAccess createPTArrayAccess() {
		PTArrayAccessImpl ptArrayAccess = new PTArrayAccessImpl();
		return ptArrayAccess;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTArrayCreation createPTArrayCreation() {
		PTArrayCreationImpl ptArrayCreation = new PTArrayCreationImpl();
		return ptArrayCreation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTArrayInitializer createPTArrayInitializer() {
		PTArrayInitializerImpl ptArrayInitializer = new PTArrayInitializerImpl();
		return ptArrayInitializer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTBooleanLiteral createPTBooleanLiteral() {
		PTBooleanLiteralImpl ptBooleanLiteral = new PTBooleanLiteralImpl();
		return ptBooleanLiteral;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTCastExpression createPTCastExpression() {
		PTCastExpressionImpl ptCastExpression = new PTCastExpressionImpl();
		return ptCastExpression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTCharacterLiteral createPTCharacterLiteral() {
		PTCharacterLiteralImpl ptCharacterLiteral = new PTCharacterLiteralImpl();
		return ptCharacterLiteral;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTClassInstanceCreation createPTClassInstanceCreation() {
		PTClassInstanceCreationImpl ptClassInstanceCreation = new PTClassInstanceCreationImpl();
		return ptClassInstanceCreation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTConditionalExpression createPTConditionalExpression() {
		PTConditionalExpressionImpl ptConditionalExpression = new PTConditionalExpressionImpl();
		return ptConditionalExpression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTFieldAccess createPTFieldAccess() {
		PTFieldAccessImpl ptFieldAccess = new PTFieldAccessImpl();
		return ptFieldAccess;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTInfixExpression createPTInfixExpression() {
		PTInfixExpressionImpl ptInfixExpression = new PTInfixExpressionImpl();
		return ptInfixExpression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTInstanceof createPTInstanceof() {
		PTInstanceofImpl ptInstanceof = new PTInstanceofImpl();
		return ptInstanceof;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTMethodInvocation createPTMethodInvocation() {
		PTMethodInvocationImpl ptMethodInvocation = new PTMethodInvocationImpl();
		return ptMethodInvocation;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTName createPTName() {
		PTNameImpl ptName = new PTNameImpl();
		return ptName;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTNullLiteral createPTNullLiteral() {
		PTNullLiteralImpl ptNullLiteral = new PTNullLiteralImpl();
		return ptNullLiteral;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTNumberLiteral createPTNumberLiteral() {
		PTNumberLiteralImpl ptNumberLiteral = new PTNumberLiteralImpl();
		return ptNumberLiteral;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTParenthesizedExpression createPTParenthesizedExpression() {
		PTParenthesizedExpressionImpl ptParenthesizedExpression = new PTParenthesizedExpressionImpl();
		return ptParenthesizedExpression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTPrefixExpression createPTPrefixExpression() {
		PTPrefixExpressionImpl ptPrefixExpression = new PTPrefixExpressionImpl();
		return ptPrefixExpression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTStringLiteral createPTStringLiteral() {
		PTStringLiteralImpl ptStringLiteral = new PTStringLiteralImpl();
		return ptStringLiteral;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTThisLiteral createPTThisLiteral() {
		PTThisLiteralImpl ptThisLiteral = new PTThisLiteralImpl();
		return ptThisLiteral;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTTypeLiteral createPTTypeLiteral() {
		PTTypeLiteralImpl ptTypeLiteral = new PTTypeLiteralImpl();
		return ptTypeLiteral;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTInvalidExpression createPTInvalidExpression() {
		PTInvalidExpressionImpl ptInvalidExpression = new PTInvalidExpressionImpl();
		return ptInvalidExpression;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PTInstanceReference createPTInstanceReference() {
		PTInstanceReferenceImpl ptInstanceReference = new PTInstanceReferenceImpl();
		return ptInstanceReference;
	}

	public PTInstanceReference createPTInstanceReference(IJavaInstance instance) {
		PTInstanceReference ptInstanceReference = createPTInstanceReference();
		ptInstanceReference.setReference(instance);
		return ptInstanceReference;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InstantiationPackage getInstantiationPackage() {
		return (InstantiationPackage)getEPackage();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @deprecated
	 * @generated
	 */
	public static InstantiationPackage getPackage() {
		return InstantiationPackage.eINSTANCE;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createImplicitAllocation(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature)
	 */
	public ImplicitAllocation createImplicitAllocation(EObject parent, EStructuralFeature sf) {
		ImplicitAllocation alloc = createImplicitAllocation();
		alloc.setParent(parent);
		alloc.setFeature(sf);
		return alloc;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createInitStringAllocation(java.lang.String)
	 */
	public InitStringAllocation createInitStringAllocation(String initString) {
		InitStringAllocation alloc = createInitStringAllocation();
		alloc.setInitString(initString);
		return alloc;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createParseTreeAllocation(org.eclipse.jem.internal.instantiation.PTExpression)
	 */
	public ParseTreeAllocation createParseTreeAllocation(PTExpression expression) {
		ParseTreeAllocation a = createParseTreeAllocation();
		a.setExpression(expression);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTArrayAccess(org.eclipse.jem.internal.instantiation.PTExpression, java.util.List)
	 */
	public PTArrayAccess createPTArrayAccess(PTExpression array, List indexes) {
		PTArrayAccess a = createPTArrayAccess();
		a.setArray(array);
		a.getIndexes().addAll(indexes);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTArrayCreation(java.lang.String, java.util.List, org.eclipse.jem.internal.instantiation.PTArrayInitializer)
	 */
	public PTArrayCreation createPTArrayCreation(String type, List dimensions, PTArrayInitializer initializer) {
		PTArrayCreation a = createPTArrayCreation();
		a.setType(type);
		if (dimensions != null)
			a.getDimensions().addAll(dimensions);
		a.setInitializer(initializer);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTArrayInitializer(java.util.List)
	 */
	public PTArrayInitializer createPTArrayInitializer(List expressions) {
		PTArrayInitializer a = createPTArrayInitializer();
		if (expressions != null)
			a.getExpressions().addAll(expressions);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTBooleanLiteral(boolean)
	 */
	public PTBooleanLiteral createPTBooleanLiteral(boolean booleanValue) {
		PTBooleanLiteral a = createPTBooleanLiteral();
		a.setBooleanValue(booleanValue);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTCastExpression(java.lang.String, org.eclipse.jem.internal.instantiation.PTExpression)
	 */
	public PTCastExpression createPTCastExpression(String type, PTExpression expression) {
		PTCastExpression a = createPTCastExpression();
		a.setType(type);
		a.setExpression(expression);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTCharacterLiteral(java.lang.String)
	 */
	public PTCharacterLiteral createPTCharacterLiteral(String escapedValue) {
		PTCharacterLiteral a = createPTCharacterLiteral();
		a.setEscapedValue(escapedValue);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTClassInstanceCreation(java.lang.String, java.util.List)
	 */
	public PTClassInstanceCreation createPTClassInstanceCreation(String type, List arguments) {
		PTClassInstanceCreation a = createPTClassInstanceCreation();
		a.setType(type);
		if (arguments != null)
			a.getArguments().addAll(arguments);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTConditionalExpression(org.eclipse.jem.internal.instantiation.PTExpression, org.eclipse.jem.internal.instantiation.PTExpression, org.eclipse.jem.internal.instantiation.PTExpression)
	 */
	public PTConditionalExpression createPTConditionalExpression(
		PTExpression condition,
		PTExpression trueExpressoin,
		PTExpression falseExpression) {
		PTConditionalExpression a = createPTConditionalExpression();
		a.setCondition(condition);
		a.setTrue(trueExpressoin);
		a.setFalse(falseExpression);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTFieldAccess(org.eclipse.jem.internal.instantiation.PTExpression, java.lang.String)
	 */
	public PTFieldAccess createPTFieldAccess(PTExpression receiver, String field) {
		PTFieldAccess a = createPTFieldAccess();
		a.setReceiver(receiver);
		a.setField(field);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTInfixExpression(org.eclipse.jem.internal.instantiation.PTExpression, org.eclipse.jem.internal.instantiation.PTInfixOperator, org.eclipse.jem.internal.instantiation.PTExpression, java.util.List)
	 */
	public PTInfixExpression createPTInfixExpression(
		PTExpression leftOperand,
		PTInfixOperator operator,
		PTExpression rightOperand,
		List extendedOperands) {
		PTInfixExpression a = createPTInfixExpression();
		a.setLeftOperand(leftOperand);
		a.setOperator(operator);
		a.setRightOperand(rightOperand);
		if (extendedOperands != null)
			a.getExtendedOperands().addAll(extendedOperands);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTInstanceof(org.eclipse.jem.internal.instantiation.PTExpression, java.lang.String)
	 */
	public PTInstanceof createPTInstanceof(PTExpression operand, String type) {
		PTInstanceof a = createPTInstanceof();
		a.setOperand(operand);
		a.setType(type);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTInvalidExpression(java.lang.String)
	 */
	public PTInvalidExpression createPTInvalidExpression(String message) {
		PTInvalidExpression a = createPTInvalidExpression();
		a.setMessage(message);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTMethodInvocation(org.eclipse.jem.internal.instantiation.PTExpression, java.lang.String, java.util.List)
	 */
	public PTMethodInvocation createPTMethodInvocation(PTExpression receiver, String name, List arguments) {
		PTMethodInvocation a = createPTMethodInvocation();
		a.setReceiver(receiver);
		a.setName(name);
		if (arguments != null)
			a.getArguments().addAll(arguments);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTName(java.lang.String)
	 */
	public PTName createPTName(String name) {
		PTName a = createPTName();
		a.setName(name);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTNumberLiteral(java.lang.String)
	 */
	public PTNumberLiteral createPTNumberLiteral(String token) {
		PTNumberLiteral a = createPTNumberLiteral();
		a.setToken(token);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTParenthesizedExpression(org.eclipse.jem.internal.instantiation.PTExpression)
	 */
	public PTParenthesizedExpression createPTParenthesizedExpression(PTExpression expression) {
		PTParenthesizedExpression a = createPTParenthesizedExpression();
		a.setExpression(expression);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTPrefixExpression(org.eclipse.jem.internal.instantiation.PTPrefixOperator, org.eclipse.jem.internal.instantiation.PTExpression)
	 */
	public PTPrefixExpression createPTPrefixExpression(PTPrefixOperator operator, PTExpression expression) {
		PTPrefixExpression a = createPTPrefixExpression();
		a.setOperator(operator);
		a.setExpression(expression);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTStringLiteral(java.lang.String)
	 */
	public PTStringLiteral createPTStringLiteral(String escapeLiteral) {
		PTStringLiteral a = createPTStringLiteral();
		a.setEscapedValue(escapeLiteral);
		return a;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.jem.internal.instantiation.InstantiationFactory#createPTTypeLiteral(java.lang.String)
	 */
	public PTTypeLiteral createPTTypeLiteral(String type) {
		PTTypeLiteral a = createPTTypeLiteral();
		a.setType(type);
		return a;
	}

} //InstantiationFactoryImpl
