/**
 * 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 
 * 
 *  Based on ideas from Xtext, Xtend, Xcore
 *   
 *  Contributors:  
 *  		Christophe Loetz  (Loetz GmbH&Co.KG) - Initial implementation 
 *  
 */
package org.eclipse.osbp.xtext.entitymock.impl;

import java.util.Collection;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;

import org.eclipse.emf.common.util.EList;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;

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

import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;

import org.eclipse.osbp.xtext.entitymock.EntityMockDSLPackage;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectArrayValue;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectEnum;
import org.eclipse.osbp.xtext.entitymock.EntityMockObjectItemValue;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Entity Mock Object Array Value</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectArrayValueImpl#getEnumeration <em>Enumeration</em>}</li>
 *   <li>{@link org.eclipse.osbp.xtext.entitymock.impl.EntityMockObjectArrayValueImpl#getItems <em>Items</em>}</li>
 * </ul>
 *
 * @generated
 */
public class EntityMockObjectArrayValueImpl extends IEntityMockObjectAttributeImpl implements EntityMockObjectArrayValue {
	/**
	 * The cached value of the '{@link #getEnumeration() <em>Enumeration</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getEnumeration()
	 * @generated
	 * @ordered
	 */
	protected EntityMockObjectEnum enumeration;

	/**
	 * The cached value of the '{@link #getItems() <em>Items</em>}' containment reference list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getItems()
	 * @generated
	 * @ordered
	 */
	protected EList<EntityMockObjectItemValue> items;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected EntityMockObjectArrayValueImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return EntityMockDSLPackage.Literals.ENTITY_MOCK_OBJECT_ARRAY_VALUE;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectEnum getEnumeration() {
		if (enumeration != null && enumeration.eIsProxy()) {
			InternalEObject oldEnumeration = (InternalEObject)enumeration;
			enumeration = (EntityMockObjectEnum)eResolveProxy(oldEnumeration);
			if (enumeration != oldEnumeration) {
				if (eNotificationRequired())
					eNotify(new ENotificationImpl(this, Notification.RESOLVE, EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION, oldEnumeration, enumeration));
			}
		}
		return enumeration;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EntityMockObjectEnum basicGetEnumeration() {
		return enumeration;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setEnumeration(EntityMockObjectEnum newEnumeration) {
		EntityMockObjectEnum oldEnumeration = enumeration;
		enumeration = newEnumeration;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION, oldEnumeration, enumeration));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<EntityMockObjectItemValue> getItems() {
		if (items == null) {
			items = new EObjectContainmentEList<EntityMockObjectItemValue>(EntityMockObjectItemValue.class, this, EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS);
		}
		return items;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
		switch (featureID) {
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS:
				return ((InternalEList<?>)getItems()).basicRemove(otherEnd, msgs);
		}
		return super.eInverseRemove(otherEnd, featureID, msgs);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION:
				if (resolve) return getEnumeration();
				return basicGetEnumeration();
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS:
				return getItems();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION:
				setEnumeration((EntityMockObjectEnum)newValue);
				return;
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS:
				getItems().clear();
				getItems().addAll((Collection<? extends EntityMockObjectItemValue>)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION:
				setEnumeration((EntityMockObjectEnum)null);
				return;
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS:
				getItems().clear();
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ENUMERATION:
				return enumeration != null;
			case EntityMockDSLPackage.ENTITY_MOCK_OBJECT_ARRAY_VALUE__ITEMS:
				return items != null && !items.isEmpty();
		}
		return super.eIsSet(featureID);
	}

} //EntityMockObjectArrayValueImpl
