/**
 */
package simpleuml2rdbms.uml2rdbms.impl;

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

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

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

import simpleuml2rdbms.uml2rdbms.*;

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public EObject create(EClass eClass) {
		switch (eClass.getClassifierID()) {
			case UML2RDBMSPackage.ATTRIBUTE_TO_COLUMN: return createAttributeToColumn();
			case UML2RDBMSPackage.ASSOCIATION_TO_FOREIGN_KEY: return createAssociationToForeignKey();
			case UML2RDBMSPackage.BOOLEAN_TO_BOOLEAN: return createBooleanToBoolean();
			case UML2RDBMSPackage.CLASS_TO_TABLE: return createClassToTable();
			case UML2RDBMSPackage.INTEGER_TO_NUMBER: return createIntegerToNumber();
			case UML2RDBMSPackage.NON_LEAF_ATTRIBUTE: return createNonLeafAttribute();
			case UML2RDBMSPackage.PACKAGE_TO_SCHEMA: return createPackageToSchema();
			case UML2RDBMSPackage.STRING_TO_VARCHAR: return createStringToVarchar();
			default:
				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AttributeToColumn createAttributeToColumn() {
		AttributeToColumnImpl attributeToColumn = new AttributeToColumnImpl();
		return attributeToColumn;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public AssociationToForeignKey createAssociationToForeignKey() {
		AssociationToForeignKeyImpl associationToForeignKey = new AssociationToForeignKeyImpl();
		return associationToForeignKey;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BooleanToBoolean createBooleanToBoolean() {
		BooleanToBooleanImpl booleanToBoolean = new BooleanToBooleanImpl();
		return booleanToBoolean;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ClassToTable createClassToTable() {
		ClassToTableImpl classToTable = new ClassToTableImpl();
		return classToTable;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public IntegerToNumber createIntegerToNumber() {
		IntegerToNumberImpl integerToNumber = new IntegerToNumberImpl();
		return integerToNumber;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NonLeafAttribute createNonLeafAttribute() {
		NonLeafAttributeImpl nonLeafAttribute = new NonLeafAttributeImpl();
		return nonLeafAttribute;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public PackageToSchema createPackageToSchema() {
		PackageToSchemaImpl packageToSchema = new PackageToSchemaImpl();
		return packageToSchema;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public StringToVarchar createStringToVarchar() {
		StringToVarcharImpl stringToVarchar = new StringToVarcharImpl();
		return stringToVarchar;
	}

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

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

} //UML2RDBMSFactoryImpl
