/*******************************************************************************
 * Copyright (c) 2009, 2011 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.mdht.uml.cda.impl;

import java.util.HashMap;
import java.util.Stack;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.util.BasicFeatureMap;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.emf.ecore.xml.type.AnyType;
import org.eclipse.mdht.uml.cda.CDAPackage;
import org.eclipse.mdht.uml.cda.StrucDocText;
import org.eclipse.mdht.uml.cda.operations.StrucDocTextOperations;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Struc Doc Text</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.mdht.uml.cda.impl.StrucDocTextImpl#getMixed <em>Mixed</em>}</li>
 *   <li>{@link org.eclipse.mdht.uml.cda.impl.StrucDocTextImpl#getAny <em>Any</em>}</li>
 *   <li>{@link org.eclipse.mdht.uml.cda.impl.StrucDocTextImpl#getID <em>ID</em>}</li>
 * </ul>
 *
 * @generated
 */
public class StrucDocTextImpl extends EObjectImpl implements StrucDocText {
	/**
	 * The cached value of the '{@link #getMixed() <em>Mixed</em>}' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getMixed()
	 * @generated
	 * @ordered
	 */
	protected FeatureMap mixed;

	/**
	 * The default value of the '{@link #getID() <em>ID</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getID()
	 * @generated
	 * @ordered
	 */
	protected static final String ID_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getID() <em>ID</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getID()
	 * @generated
	 * @ordered
	 */
	protected String iD = ID_EDEFAULT;

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	protected StrucDocTextImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	protected EClass eStaticClass() {
		return CDAPackage.Literals.STRUC_DOC_TEXT;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public FeatureMap getMixed() {
		if (mixed == null) {
			mixed = new BasicFeatureMap(this, CDAPackage.STRUC_DOC_TEXT__MIXED);
		}
		return mixed;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public FeatureMap getAny() {
		return (FeatureMap) getMixed().<FeatureMap.Entry> list(CDAPackage.Literals.STRUC_DOC_TEXT__ANY);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String getID() {
		return iD;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void setID(String newID) {
		String oldID = iD;
		iD = newID;
		if (eNotificationRequired()) {
			eNotify(new ENotificationImpl(this, Notification.SET, CDAPackage.STRUC_DOC_TEXT__ID, oldID, iD));
		}
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void addText(String text) {
		StrucDocTextOperations.addText(this, text);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getText() {
		return StrucDocTextOperations.getText(this);
	}

	/**
	 * @generated NOT;
	 */
	private HashMap<String, AnyType> textHash = new HashMap<>();

	/**
	 * @generated NOT;
	 */
	boolean parsed = false;

	/**
	 * @generated NOT;
	 */
	private void parse() {

		Stack<FeatureMap> stack = new Stack<>();
		stack.push(this.mixed);
		while (!stack.isEmpty()) {
			FeatureMap featureMap = stack.pop();
			for (FeatureMap.Entry entry : featureMap) {
				if (entry.getEStructuralFeature() instanceof EReference) {
					AnyType anyType = (AnyType) entry.getValue();
					String x = StrucDocTextOperations.getAttributeValue(anyType.getAnyAttribute(), "ID");
					if (x != null) {
						textHash.put(x, anyType);
					}
					stack.push(anyType.getMixed());
				}
			}
		}

		parsed = true;

	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated NOT
	 */
	public String getText(String id) {
		if (!parsed) {
			parse();
		}
		if (textHash.containsKey(id)) {
			return StrucDocTextOperations.getText(textHash.get(id).getMixed());
		}

		return null;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
		switch (featureID) {
			case CDAPackage.STRUC_DOC_TEXT__MIXED:
				return ((InternalEList<?>) getMixed()).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 CDAPackage.STRUC_DOC_TEXT__MIXED:
				if (coreType) {
					return getMixed();
				}
				return ((FeatureMap.Internal) getMixed()).getWrapper();
			case CDAPackage.STRUC_DOC_TEXT__ANY:
				if (coreType) {
					return getAny();
				}
				return ((FeatureMap.Internal) getAny()).getWrapper();
			case CDAPackage.STRUC_DOC_TEXT__ID:
				return getID();
		}
		return super.eGet(featureID, resolve, coreType);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eSet(int featureID, Object newValue) {
		switch (featureID) {
			case CDAPackage.STRUC_DOC_TEXT__MIXED:
				((FeatureMap.Internal) getMixed()).set(newValue);
				return;
			case CDAPackage.STRUC_DOC_TEXT__ANY:
				((FeatureMap.Internal) getAny()).set(newValue);
				return;
			case CDAPackage.STRUC_DOC_TEXT__ID:
				setID((String) newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case CDAPackage.STRUC_DOC_TEXT__MIXED:
				getMixed().clear();
				return;
			case CDAPackage.STRUC_DOC_TEXT__ANY:
				getAny().clear();
				return;
			case CDAPackage.STRUC_DOC_TEXT__ID:
				setID(ID_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case CDAPackage.STRUC_DOC_TEXT__MIXED:
				return mixed != null && !mixed.isEmpty();
			case CDAPackage.STRUC_DOC_TEXT__ANY:
				return !getAny().isEmpty();
			case CDAPackage.STRUC_DOC_TEXT__ID:
				return ID_EDEFAULT == null
						? iD != null
						: !ID_EDEFAULT.equals(iD);
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) {
			return super.toString();
		}

		StringBuilder result = new StringBuilder(super.toString());
		result.append(" (mixed: ");
		result.append(mixed);
		result.append(", iD: ");
		result.append(iD);
		result.append(')');
		return result.toString();
	}

} // StrucDocTextImpl
