/**
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *  All rights reserved. This program and the accompanying materials 
 *  are made available under the terms of the Eclipse Public License 2.0  
 *  which accompanies this distribution, and is available at 
 *  https://www.eclipse.org/legal/epl-2.0/ 
 *  
 *  SPDX-License-Identifier: EPL-2.0 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 * 		Loetz GmbH&Co.KG - Initial implementation
 *  		Jose C. Dominguez - ongoing development 
 *  
 */
package org.eclipse.osbp.xtext.strategy.impl;

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

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

import org.eclipse.emf.ecore.plugin.EcorePlugin;

import org.eclipse.osbp.xtext.strategy.*;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model <b>Factory</b>.
 * <!-- end-user-doc -->
 * @generated
 */
public class StrategyDSLFactoryImpl extends EFactoryImpl implements StrategyDSLFactory {
	/**
	 * Creates the default factory implementation.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public static StrategyDSLFactory init() {
		try {
			StrategyDSLFactory theStrategyDSLFactory = (StrategyDSLFactory)EPackage.Registry.INSTANCE.getEFactory(StrategyDSLPackage.eNS_URI);
			if (theStrategyDSLFactory != null) {
				return theStrategyDSLFactory;
			}
		}
		catch (Exception exception) {
			EcorePlugin.INSTANCE.log(exception);
		}
		return new StrategyDSLFactoryImpl();
	}

	/**
	 * Creates an instance of the factory.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyDSLFactoryImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case StrategyDSLPackage.STRATEGY_MODEL: return createStrategyModel();
			case StrategyDSLPackage.STRATEGY_LAZY_RESOLVER: return createStrategyLazyResolver();
			case StrategyDSLPackage.STRATEGY_BASE: return createStrategyBase();
			case StrategyDSLPackage.STRATEGY_PACKAGE: return createStrategyPackage();
			case StrategyDSLPackage.STRATEGY: return createStrategy();
			case StrategyDSLPackage.STRATEGY_TARGET: return createStrategyTarget();
			case StrategyDSLPackage.LAYOUTING_STRATEGY: return createLayoutingStrategy();
			case StrategyDSLPackage.FOCUSING_STRATEGY: return createFocusingStrategy();
			case StrategyDSLPackage.FOCUSING_ENHANCER: return createFocusingEnhancer();
			case StrategyDSLPackage.STRATEGY_DEFAULT: return createStrategyDefault();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object createFromString(EDataType eDataType, String initialValue) {
		switch (eDataType.getClassifierID()) {
			case StrategyDSLPackage.LAYOUTING_ENUM:
				return createLayoutingEnumFromString(eDataType, initialValue);
			case StrategyDSLPackage.FOCUSING_ENUM:
				return createFocusingEnumFromString(eDataType, initialValue);
			case StrategyDSLPackage.INTERNAL_EOBJECT:
				return createInternalEObjectFromString(eDataType, initialValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String convertToString(EDataType eDataType, Object instanceValue) {
		switch (eDataType.getClassifierID()) {
			case StrategyDSLPackage.LAYOUTING_ENUM:
				return convertLayoutingEnumToString(eDataType, instanceValue);
			case StrategyDSLPackage.FOCUSING_ENUM:
				return convertFocusingEnumToString(eDataType, instanceValue);
			case StrategyDSLPackage.INTERNAL_EOBJECT:
				return convertInternalEObjectToString(eDataType, instanceValue);
			default:
				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyModel createStrategyModel() {
		StrategyModelImpl strategyModel = new StrategyModelImpl();
		return strategyModel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyLazyResolver createStrategyLazyResolver() {
		StrategyLazyResolverImpl strategyLazyResolver = new StrategyLazyResolverImpl();
		return strategyLazyResolver;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyBase createStrategyBase() {
		StrategyBaseImpl strategyBase = new StrategyBaseImpl();
		return strategyBase;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyPackage createStrategyPackage() {
		StrategyPackageImpl strategyPackage = new StrategyPackageImpl();
		return strategyPackage;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public Strategy createStrategy() {
		StrategyImpl strategy = new StrategyImpl();
		return strategy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyTarget createStrategyTarget() {
		StrategyTargetImpl strategyTarget = new StrategyTargetImpl();
		return strategyTarget;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LayoutingStrategy createLayoutingStrategy() {
		LayoutingStrategyImpl layoutingStrategy = new LayoutingStrategyImpl();
		return layoutingStrategy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FocusingStrategy createFocusingStrategy() {
		FocusingStrategyImpl focusingStrategy = new FocusingStrategyImpl();
		return focusingStrategy;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FocusingEnhancer createFocusingEnhancer() {
		FocusingEnhancerImpl focusingEnhancer = new FocusingEnhancerImpl();
		return focusingEnhancer;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StrategyDefault createStrategyDefault() {
		StrategyDefaultImpl strategyDefault = new StrategyDefaultImpl();
		return strategyDefault;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LayoutingEnum createLayoutingEnumFromString(EDataType eDataType, String initialValue) {
		LayoutingEnum result = LayoutingEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertLayoutingEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public FocusingEnum createFocusingEnumFromString(EDataType eDataType, String initialValue) {
		FocusingEnum result = FocusingEnum.get(initialValue);
		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
		return result;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertFocusingEnumToString(EDataType eDataType, Object instanceValue) {
		return instanceValue == null ? null : instanceValue.toString();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public InternalEObject createInternalEObjectFromString(EDataType eDataType, String initialValue) {
		return (InternalEObject)super.createFromString(eDataType, initialValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String convertInternalEObjectToString(EDataType eDataType, Object instanceValue) {
		return super.convertToString(eDataType, instanceValue);
	}

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

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

} //StrategyDSLFactoryImpl
