package org.eclipse.stem.analysis.impl;

/*******************************************************************************
 * Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018
 * IBM Corporation, BfR, and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation and new features
 *     Bundesinstitut für Risikobewertung - Pajek Graph interface, new Veterinary Models
 *******************************************************************************/

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.stem.analysis.AnalysisPackage;
import org.eclipse.stem.analysis.ErrorResult;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Error Result</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 *   <li>{@link org.eclipse.stem.analysis.impl.ErrorResultImpl#getErrorByTimeStep <em>Error By Time Step</em>}</li>
 *   <li>{@link org.eclipse.stem.analysis.impl.ErrorResultImpl#getError <em>Error</em>}</li>
 *   <li>{@link org.eclipse.stem.analysis.impl.ErrorResultImpl#getReferenceByTime <em>Reference By Time</em>}</li>
 *   <li>{@link org.eclipse.stem.analysis.impl.ErrorResultImpl#getModelByTime <em>Model By Time</em>}</li>
 *   <li>{@link org.eclipse.stem.analysis.impl.ErrorResultImpl#getValidationError <em>Validation Error</em>}</li>
 * </ul>
 *
 * @generated
 */
public class ErrorResultImpl extends EObjectImpl implements ErrorResult {
	/**
	 * The cached value of the '{@link #getErrorByTimeStep() <em>Error By Time Step</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getErrorByTimeStep()
	 * @generated
	 * @ordered
	 */
	protected EList<Double> errorByTimeStep;
	/**
	 * The default value of the '{@link #getError() <em>Error</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getError()
	 * @generated
	 * @ordered
	 */
	protected static final double ERROR_EDEFAULT = 0.0;
	/**
	 * The cached value of the '{@link #getError() <em>Error</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getError()
	 * @generated
	 * @ordered
	 */
	protected double error = ERROR_EDEFAULT;

	/**
	 * The cached value of the '{@link #getReferenceByTime() <em>Reference By Time</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getReferenceByTime()
	 * @generated
	 * @ordered
	 */
	protected EList<Double> referenceByTime;
	/**
	 * The cached value of the '{@link #getModelByTime() <em>Model By Time</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getModelByTime()
	 * @generated
	 * @ordered
	 */
	protected EList<Double> modelByTime;

	/**
	 * The default value of the '{@link #getValidationError() <em>Validation Error</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getValidationError()
	 * @generated
	 * @ordered
	 */
	protected static final double VALIDATION_ERROR_EDEFAULT = 0.0;
	/**
	 * The cached value of the '{@link #getValidationError() <em>Validation Error</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see #getValidationError()
	 * @generated
	 * @ordered
	 */
	protected double validationError = VALIDATION_ERROR_EDEFAULT;

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

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

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<Double> getErrorByTimeStep() {
		return errorByTimeStep;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setErrorByTimeStep(EList<Double> newErrorByTimeStep) {
		EList<Double> oldErrorByTimeStep = errorByTimeStep;
		errorByTimeStep = newErrorByTimeStep;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, AnalysisPackage.ERROR_RESULT__ERROR_BY_TIME_STEP, oldErrorByTimeStep, errorByTimeStep));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public double getError() {
		return error;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setError(double newError) {
		double oldError = error;
		error = newError;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, AnalysisPackage.ERROR_RESULT__ERROR, oldError, error));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<Double> getReferenceByTime() {
		return referenceByTime;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setReferenceByTime(EList<Double> newReferenceByTime) {
		EList<Double> oldReferenceByTime = referenceByTime;
		referenceByTime = newReferenceByTime;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, AnalysisPackage.ERROR_RESULT__REFERENCE_BY_TIME, oldReferenceByTime, referenceByTime));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public EList<Double> getModelByTime() {
		return modelByTime;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setModelByTime(EList<Double> newModelByTime) {
		EList<Double> oldModelByTime = modelByTime;
		modelByTime = newModelByTime;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, AnalysisPackage.ERROR_RESULT__MODEL_BY_TIME, oldModelByTime, modelByTime));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public double getValidationError() {
		return validationError;
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	public void setValidationError(double newValidationError) {
		double oldValidationError = validationError;
		validationError = newValidationError;
		if (eNotificationRequired())
			eNotify(new ENotificationImpl(this, Notification.SET, AnalysisPackage.ERROR_RESULT__VALIDATION_ERROR, oldValidationError, validationError));
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public Object eGet(int featureID, boolean resolve, boolean coreType) {
		switch (featureID) {
			case AnalysisPackage.ERROR_RESULT__ERROR_BY_TIME_STEP:
				return getErrorByTimeStep();
			case AnalysisPackage.ERROR_RESULT__ERROR:
				return getError();
			case AnalysisPackage.ERROR_RESULT__REFERENCE_BY_TIME:
				return getReferenceByTime();
			case AnalysisPackage.ERROR_RESULT__MODEL_BY_TIME:
				return getModelByTime();
			case AnalysisPackage.ERROR_RESULT__VALIDATION_ERROR:
				return getValidationError();
		}
		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 AnalysisPackage.ERROR_RESULT__ERROR_BY_TIME_STEP:
				setErrorByTimeStep((EList<Double>)newValue);
				return;
			case AnalysisPackage.ERROR_RESULT__ERROR:
				setError((Double)newValue);
				return;
			case AnalysisPackage.ERROR_RESULT__REFERENCE_BY_TIME:
				setReferenceByTime((EList<Double>)newValue);
				return;
			case AnalysisPackage.ERROR_RESULT__MODEL_BY_TIME:
				setModelByTime((EList<Double>)newValue);
				return;
			case AnalysisPackage.ERROR_RESULT__VALIDATION_ERROR:
				setValidationError((Double)newValue);
				return;
		}
		super.eSet(featureID, newValue);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public void eUnset(int featureID) {
		switch (featureID) {
			case AnalysisPackage.ERROR_RESULT__ERROR_BY_TIME_STEP:
				setErrorByTimeStep((EList<Double>)null);
				return;
			case AnalysisPackage.ERROR_RESULT__ERROR:
				setError(ERROR_EDEFAULT);
				return;
			case AnalysisPackage.ERROR_RESULT__REFERENCE_BY_TIME:
				setReferenceByTime((EList<Double>)null);
				return;
			case AnalysisPackage.ERROR_RESULT__MODEL_BY_TIME:
				setModelByTime((EList<Double>)null);
				return;
			case AnalysisPackage.ERROR_RESULT__VALIDATION_ERROR:
				setValidationError(VALIDATION_ERROR_EDEFAULT);
				return;
		}
		super.eUnset(featureID);
	}

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	@Override
	public boolean eIsSet(int featureID) {
		switch (featureID) {
			case AnalysisPackage.ERROR_RESULT__ERROR_BY_TIME_STEP:
				return errorByTimeStep != null;
			case AnalysisPackage.ERROR_RESULT__ERROR:
				return error != ERROR_EDEFAULT;
			case AnalysisPackage.ERROR_RESULT__REFERENCE_BY_TIME:
				return referenceByTime != null;
			case AnalysisPackage.ERROR_RESULT__MODEL_BY_TIME:
				return modelByTime != null;
			case AnalysisPackage.ERROR_RESULT__VALIDATION_ERROR:
				return validationError != VALIDATION_ERROR_EDEFAULT;
		}
		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(" (errorByTimeStep: ");
		result.append(errorByTimeStep);
		result.append(", error: ");
		result.append(error);
		result.append(", referenceByTime: ");
		result.append(referenceByTime);
		result.append(", modelByTime: ");
		result.append(modelByTime);
		result.append(", validationError: ");
		result.append(validationError);
		result.append(')');
		return result.toString();
	}

	public ErrorResult copy() {
		ErrorResultImpl res = new ErrorResultImpl();
		res.setError(this.getError());
		res.setValidationError(this.getValidationError());
		EList<Double>newlist = new BasicEList<Double>();
		if(this.getErrorByTimeStep()!=null) {
			for(double d:this.getErrorByTimeStep())newlist.add(d);
		}
		res.setErrorByTimeStep(newlist);
		return res;
	}

} //ErrorResultImpl
