/**
 * *******************************************************************************
 *  Copyright (c) 2017 Timing-Architects Embedded Systems GmbH 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
 * 
 *     Generated using Eclipse EMF
 * 
 * *******************************************************************************
 */
package org.eclipse.app4mc.amalthea.generator.configuration.impl;

import java.math.BigInteger;

import java.util.Collection;

import org.eclipse.app4mc.amalthea.generator.configuration.ActivationProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.Generation;
import org.eclipse.app4mc.amalthea.generator.configuration.LabelProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.RTMGCPackage;
import org.eclipse.app4mc.amalthea.generator.configuration.RunnableProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.SemaphoreProperties;
import org.eclipse.app4mc.amalthea.generator.configuration.TaskProperties;

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.impl.MinimalEObjectImpl;

import org.eclipse.emf.ecore.util.EDataTypeEList;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Generation</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getCount <em>Count</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getBaseModel <em>Base Model</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getHwModels <em>Hw Models</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getOsModels <em>Os Models</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getSwModel <em>Sw Model</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getOutputFolder <em>Output Folder</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getActivations <em>Activations</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getLabels <em>Labels</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getRunnables <em>Runnables</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getSemaphores <em>Semaphores</em>}</li>
 *   <li>{@link org.eclipse.app4mc.amalthea.generator.configuration.impl.GenerationImpl#getTasks <em>Tasks</em>}</li>
 * </ul>
 *
 * @generated
 */
public class GenerationImpl extends MinimalEObjectImpl.Container implements Generation {
	/**
	 * The default value of the '{@link #getCount() <em>Count</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCount()
	 * @generated
	 * @ordered
	 */
	protected static final BigInteger COUNT_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getCount() <em>Count</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getCount()
	 * @generated
	 * @ordered
	 */
	protected BigInteger count = COUNT_EDEFAULT;

	/**
	 * The default value of the '{@link #getBaseModel() <em>Base Model</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getBaseModel()
	 * @generated
	 * @ordered
	 */
	protected static final String BASE_MODEL_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getBaseModel() <em>Base Model</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getBaseModel()
	 * @generated
	 * @ordered
	 */
	protected String baseModel = BASE_MODEL_EDEFAULT;

	/**
	 * The cached value of the '{@link #getHwModels() <em>Hw Models</em>}' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getHwModels()
	 * @generated
	 * @ordered
	 */
	protected EList<String> hwModels;

	/**
	 * The cached value of the '{@link #getOsModels() <em>Os Models</em>}' attribute list.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getOsModels()
	 * @generated
	 * @ordered
	 */
	protected EList<String> osModels;

	/**
	 * The default value of the '{@link #getSwModel() <em>Sw Model</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getSwModel()
	 * @generated
	 * @ordered
	 */
	protected static final String SW_MODEL_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getSwModel() <em>Sw Model</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getSwModel()
	 * @generated
	 * @ordered
	 */
	protected String swModel = SW_MODEL_EDEFAULT;

	/**
	 * The default value of the '{@link #getOutputFolder() <em>Output Folder</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getOutputFolder()
	 * @generated
	 * @ordered
	 */
	protected static final String OUTPUT_FOLDER_EDEFAULT = null;

	/**
	 * The cached value of the '{@link #getOutputFolder() <em>Output Folder</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getOutputFolder()
	 * @generated
	 * @ordered
	 */
	protected String outputFolder = OUTPUT_FOLDER_EDEFAULT;

	/**
	 * The cached value of the '{@link #getActivations() <em>Activations</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getActivations()
	 * @generated
	 * @ordered
	 */
	protected ActivationProperties activations;

	/**
	 * The cached value of the '{@link #getLabels() <em>Labels</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getLabels()
	 * @generated
	 * @ordered
	 */
	protected LabelProperties labels;

	/**
	 * The cached value of the '{@link #getRunnables() <em>Runnables</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getRunnables()
	 * @generated
	 * @ordered
	 */
	protected RunnableProperties runnables;

	/**
	 * The cached value of the '{@link #getSemaphores() <em>Semaphores</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getSemaphores()
	 * @generated
	 * @ordered
	 */
	protected SemaphoreProperties semaphores;

	/**
	 * The cached value of the '{@link #getTasks() <em>Tasks</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getTasks()
	 * @generated
	 * @ordered
	 */
	protected TaskProperties tasks;

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public BigInteger getCount() {
		return count;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setCount(BigInteger newCount) {
		BigInteger oldCount = count;
		count = newCount;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__COUNT, oldCount, count));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getBaseModel() {
		return baseModel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setBaseModel(String newBaseModel) {
		String oldBaseModel = baseModel;
		baseModel = newBaseModel;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__BASE_MODEL, oldBaseModel, baseModel));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<String> getHwModels() {
		if (hwModels == null) {
			hwModels = new EDataTypeEList<String>(String.class, this, RTMGCPackage.GENERATION__HW_MODELS);
		}
		return hwModels;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<String> getOsModels() {
		if (osModels == null) {
			osModels = new EDataTypeEList<String>(String.class, this, RTMGCPackage.GENERATION__OS_MODELS);
		}
		return osModels;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getSwModel() {
		return swModel;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setSwModel(String newSwModel) {
		String oldSwModel = swModel;
		swModel = newSwModel;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__SW_MODEL, oldSwModel, swModel));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public String getOutputFolder() {
		return outputFolder;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setOutputFolder(String newOutputFolder) {
		String oldOutputFolder = outputFolder;
		outputFolder = newOutputFolder;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__OUTPUT_FOLDER, oldOutputFolder, outputFolder));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public ActivationProperties getActivations() {
		return activations;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetActivations(ActivationProperties newActivations, NotificationChain msgs) {
		ActivationProperties oldActivations = activations;
		activations = newActivations;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__ACTIVATIONS, oldActivations, newActivations);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setActivations(ActivationProperties newActivations) {
		if (newActivations != activations) {
			NotificationChain msgs = null;
			if (activations != null)
				msgs = ((InternalEObject)activations).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__ACTIVATIONS, null, msgs);
			if (newActivations != null)
				msgs = ((InternalEObject)newActivations).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__ACTIVATIONS, null, msgs);
			msgs = basicSetActivations(newActivations, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__ACTIVATIONS, newActivations, newActivations));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public LabelProperties getLabels() {
		return labels;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetLabels(LabelProperties newLabels, NotificationChain msgs) {
		LabelProperties oldLabels = labels;
		labels = newLabels;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__LABELS, oldLabels, newLabels);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setLabels(LabelProperties newLabels) {
		if (newLabels != labels) {
			NotificationChain msgs = null;
			if (labels != null)
				msgs = ((InternalEObject)labels).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__LABELS, null, msgs);
			if (newLabels != null)
				msgs = ((InternalEObject)newLabels).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__LABELS, null, msgs);
			msgs = basicSetLabels(newLabels, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__LABELS, newLabels, newLabels));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public RunnableProperties getRunnables() {
		return runnables;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetRunnables(RunnableProperties newRunnables, NotificationChain msgs) {
		RunnableProperties oldRunnables = runnables;
		runnables = newRunnables;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__RUNNABLES, oldRunnables, newRunnables);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setRunnables(RunnableProperties newRunnables) {
		if (newRunnables != runnables) {
			NotificationChain msgs = null;
			if (runnables != null)
				msgs = ((InternalEObject)runnables).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__RUNNABLES, null, msgs);
			if (newRunnables != null)
				msgs = ((InternalEObject)newRunnables).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__RUNNABLES, null, msgs);
			msgs = basicSetRunnables(newRunnables, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__RUNNABLES, newRunnables, newRunnables));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public SemaphoreProperties getSemaphores() {
		return semaphores;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetSemaphores(SemaphoreProperties newSemaphores, NotificationChain msgs) {
		SemaphoreProperties oldSemaphores = semaphores;
		semaphores = newSemaphores;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__SEMAPHORES, oldSemaphores, newSemaphores);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setSemaphores(SemaphoreProperties newSemaphores) {
		if (newSemaphores != semaphores) {
			NotificationChain msgs = null;
			if (semaphores != null)
				msgs = ((InternalEObject)semaphores).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__SEMAPHORES, null, msgs);
			if (newSemaphores != null)
				msgs = ((InternalEObject)newSemaphores).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__SEMAPHORES, null, msgs);
			msgs = basicSetSemaphores(newSemaphores, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__SEMAPHORES, newSemaphores, newSemaphores));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public TaskProperties getTasks() {
		return tasks;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain basicSetTasks(TaskProperties newTasks, NotificationChain msgs) {
		TaskProperties oldTasks = tasks;
		tasks = newTasks;
		if (eNotificationRequired()) {
			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__TASKS, oldTasks, newTasks);
			if (msgs == null) msgs = notification; else msgs.add(notification);
		}
		return msgs;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setTasks(TaskProperties newTasks) {
		if (newTasks != tasks) {
			NotificationChain msgs = null;
			if (tasks != null)
				msgs = ((InternalEObject)tasks).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__TASKS, null, msgs);
			if (newTasks != null)
				msgs = ((InternalEObject)newTasks).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - RTMGCPackage.GENERATION__TASKS, null, msgs);
			msgs = basicSetTasks(newTasks, msgs);
			if (msgs != null) msgs.dispatch();
		}
		else if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, RTMGCPackage.GENERATION__TASKS, newTasks, newTasks));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
		switch (featureID) {
			case RTMGCPackage.GENERATION__ACTIVATIONS:
				return basicSetActivations(null, msgs);
			case RTMGCPackage.GENERATION__LABELS:
				return basicSetLabels(null, msgs);
			case RTMGCPackage.GENERATION__RUNNABLES:
				return basicSetRunnables(null, msgs);
			case RTMGCPackage.GENERATION__SEMAPHORES:
				return basicSetSemaphores(null, msgs);
			case RTMGCPackage.GENERATION__TASKS:
				return basicSetTasks(null, 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 RTMGCPackage.GENERATION__COUNT:
				return getCount();
			case RTMGCPackage.GENERATION__BASE_MODEL:
				return getBaseModel();
			case RTMGCPackage.GENERATION__HW_MODELS:
				return getHwModels();
			case RTMGCPackage.GENERATION__OS_MODELS:
				return getOsModels();
			case RTMGCPackage.GENERATION__SW_MODEL:
				return getSwModel();
			case RTMGCPackage.GENERATION__OUTPUT_FOLDER:
				return getOutputFolder();
			case RTMGCPackage.GENERATION__ACTIVATIONS:
				return getActivations();
			case RTMGCPackage.GENERATION__LABELS:
				return getLabels();
			case RTMGCPackage.GENERATION__RUNNABLES:
				return getRunnables();
			case RTMGCPackage.GENERATION__SEMAPHORES:
				return getSemaphores();
			case RTMGCPackage.GENERATION__TASKS:
				return getTasks();
		}
		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 RTMGCPackage.GENERATION__COUNT:
				setCount((BigInteger)newValue);
				return;
			case RTMGCPackage.GENERATION__BASE_MODEL:
				setBaseModel((String)newValue);
				return;
			case RTMGCPackage.GENERATION__HW_MODELS:
				getHwModels().clear();
				getHwModels().addAll((Collection<? extends String>)newValue);
				return;
			case RTMGCPackage.GENERATION__OS_MODELS:
				getOsModels().clear();
				getOsModels().addAll((Collection<? extends String>)newValue);
				return;
			case RTMGCPackage.GENERATION__SW_MODEL:
				setSwModel((String)newValue);
				return;
			case RTMGCPackage.GENERATION__OUTPUT_FOLDER:
				setOutputFolder((String)newValue);
				return;
			case RTMGCPackage.GENERATION__ACTIVATIONS:
				setActivations((ActivationProperties)newValue);
				return;
			case RTMGCPackage.GENERATION__LABELS:
				setLabels((LabelProperties)newValue);
				return;
			case RTMGCPackage.GENERATION__RUNNABLES:
				setRunnables((RunnableProperties)newValue);
				return;
			case RTMGCPackage.GENERATION__SEMAPHORES:
				setSemaphores((SemaphoreProperties)newValue);
				return;
			case RTMGCPackage.GENERATION__TASKS:
				setTasks((TaskProperties)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case RTMGCPackage.GENERATION__COUNT:
				setCount(COUNT_EDEFAULT);
				return;
			case RTMGCPackage.GENERATION__BASE_MODEL:
				setBaseModel(BASE_MODEL_EDEFAULT);
				return;
			case RTMGCPackage.GENERATION__HW_MODELS:
				getHwModels().clear();
				return;
			case RTMGCPackage.GENERATION__OS_MODELS:
				getOsModels().clear();
				return;
			case RTMGCPackage.GENERATION__SW_MODEL:
				setSwModel(SW_MODEL_EDEFAULT);
				return;
			case RTMGCPackage.GENERATION__OUTPUT_FOLDER:
				setOutputFolder(OUTPUT_FOLDER_EDEFAULT);
				return;
			case RTMGCPackage.GENERATION__ACTIVATIONS:
				setActivations((ActivationProperties)null);
				return;
			case RTMGCPackage.GENERATION__LABELS:
				setLabels((LabelProperties)null);
				return;
			case RTMGCPackage.GENERATION__RUNNABLES:
				setRunnables((RunnableProperties)null);
				return;
			case RTMGCPackage.GENERATION__SEMAPHORES:
				setSemaphores((SemaphoreProperties)null);
				return;
			case RTMGCPackage.GENERATION__TASKS:
				setTasks((TaskProperties)null);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case RTMGCPackage.GENERATION__COUNT:
				return COUNT_EDEFAULT == null ? count != null : !COUNT_EDEFAULT.equals(count);
			case RTMGCPackage.GENERATION__BASE_MODEL:
				return BASE_MODEL_EDEFAULT == null ? baseModel != null : !BASE_MODEL_EDEFAULT.equals(baseModel);
			case RTMGCPackage.GENERATION__HW_MODELS:
				return hwModels != null && !hwModels.isEmpty();
			case RTMGCPackage.GENERATION__OS_MODELS:
				return osModels != null && !osModels.isEmpty();
			case RTMGCPackage.GENERATION__SW_MODEL:
				return SW_MODEL_EDEFAULT == null ? swModel != null : !SW_MODEL_EDEFAULT.equals(swModel);
			case RTMGCPackage.GENERATION__OUTPUT_FOLDER:
				return OUTPUT_FOLDER_EDEFAULT == null ? outputFolder != null : !OUTPUT_FOLDER_EDEFAULT.equals(outputFolder);
			case RTMGCPackage.GENERATION__ACTIVATIONS:
				return activations != null;
			case RTMGCPackage.GENERATION__LABELS:
				return labels != null;
			case RTMGCPackage.GENERATION__RUNNABLES:
				return runnables != null;
			case RTMGCPackage.GENERATION__SEMAPHORES:
				return semaphores != null;
			case RTMGCPackage.GENERATION__TASKS:
				return tasks != null;
		}
		return super.eIsSet(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public String toString() {
		if (eIsProxy()) return super.toString();

		StringBuffer result = new StringBuffer(super.toString());
		result.append(" (count: ");
		result.append(count);
		result.append(", baseModel: ");
		result.append(baseModel);
		result.append(", hwModels: ");
		result.append(hwModels);
		result.append(", osModels: ");
		result.append(osModels);
		result.append(", swModel: ");
		result.append(swModel);
		result.append(", outputFolder: ");
		result.append(outputFolder);
		result.append(')');
		return result.toString();
	}

} //GenerationImpl
