/* license-start
*
* Copyright (C) 2008 - 2013 Crispico, <http://www.crispico.com/>.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 3.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details, at <http://www.gnu.org/licenses/>.
*
* Contributors:
* Crispico - Initial API and implementation
*
* license-end
*/
/**
* <copyright>
* </copyright>
*
* $Id$
*/
package com.crispico.flower.mp.model.codesync.impl;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.net.URLCodec;
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.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import com.crispico.flower.mp.model.codesync.CodeSyncPackage;
import com.crispico.flower.mp.model.codesync.FeatureChange;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Feature Change</b></em>'.
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link com.crispico.flower.mp.model.codesync.impl.FeatureChangeImpl#getOldValue <em>Old Value</em>}</li>
* <li>{@link com.crispico.flower.mp.model.codesync.impl.FeatureChangeImpl#getOldValueAsString <em>Old Value As String</em>}</li>
* <li>{@link com.crispico.flower.mp.model.codesync.impl.FeatureChangeImpl#getOldValueAsContainmentList <em>Old Value As Containment List</em>}</li>
* <li>{@link com.crispico.flower.mp.model.codesync.impl.FeatureChangeImpl#getNewValue <em>New Value</em>}</li>
* <li>{@link com.crispico.flower.mp.model.codesync.impl.FeatureChangeImpl#getNewValueAsString <em>New Value As String</em>}</li>
* <li>{@link com.crispico.flower.mp.model.codesync.impl.FeatureChangeImpl#getNewValueAsContainmentList <em>New Value As Containment List</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class FeatureChangeImpl extends EObjectImpl implements FeatureChange {
/**
* The default value of the '{@link #getOldValue() <em>Old Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getOldValue()
* @generated
* @ordered
*/
protected static final Object OLD_VALUE_EDEFAULT = null;
/**
* The cached value of the '{@link #getOldValue() <em>Old Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getOldValue()
* @generated
* @ordered
*/
protected Object oldValue = OLD_VALUE_EDEFAULT;
/**
* The default value of the '{@link #getOldValueAsString() <em>Old Value As String</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getOldValueAsString()
* @generated
* @ordered
*/
protected static final String OLD_VALUE_AS_STRING_EDEFAULT = null;
/**
* The cached value of the '{@link #getOldValueAsString() <em>Old Value As String</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getOldValueAsString()
* @generated
* @ordered
*/
protected String oldValueAsString = OLD_VALUE_AS_STRING_EDEFAULT;
/**
* The cached value of the '{@link #getOldValueAsContainmentList() <em>Old Value As Containment List</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getOldValueAsContainmentList()
* @generated
* @ordered
*/
protected EList<EObject> oldValueAsContainmentList;
/**
* The default value of the '{@link #getNewValue() <em>New Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getNewValue()
* @generated
* @ordered
*/
protected static final Object NEW_VALUE_EDEFAULT = null;
/**
* The cached value of the '{@link #getNewValue() <em>New Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getNewValue()
* @generated
* @ordered
*/
protected Object newValue = NEW_VALUE_EDEFAULT;
/**
* The default value of the '{@link #getNewValueAsString() <em>New Value As String</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getNewValueAsString()
* @generated
* @ordered
*/
protected static final String NEW_VALUE_AS_STRING_EDEFAULT = null;
/**
* The cached value of the '{@link #getNewValueAsString() <em>New Value As String</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getNewValueAsString()
* @generated
* @ordered
*/
protected String newValueAsString = NEW_VALUE_AS_STRING_EDEFAULT;
/**
* The cached value of the '{@link #getNewValueAsContainmentList() <em>New Value As Containment List</em>}' containment reference list.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getNewValueAsContainmentList()
* @generated
* @ordered
*/
protected EList<EObject> newValueAsContainmentList;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected FeatureChangeImpl() {
super();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass() {
return CodeSyncPackage.Literals.FEATURE_CHANGE;
}
/**
* @author Cristi
* @author Mariana
*/
private EDataType getEDataTypeOfFeature() {
if (eContainer instanceof EStructuralFeatureToFeatureChangeEntryImpl) {
EStructuralFeature feature = ((EStructuralFeatureToFeatureChangeEntryImpl) eContainer).getKey();
if (feature instanceof EAttribute) {
return ((EAttribute) feature).getEAttributeType();
}
}
return null;
}
/**
* @author Mariana
*/
private boolean isMany() {
if (eContainer instanceof EStructuralFeatureToFeatureChangeEntryImpl) {
EStructuralFeature feature = ((EStructuralFeatureToFeatureChangeEntryImpl) eContainer).getKey();
return feature.isMany();
}
return false;
}
/**
* @author Mariana
*/
private String encode(byte[] bytes) {
return new String(new URLCodec().encode(bytes));
}
private byte[] decode(byte[] bytes) {
try {
return URLCodec.decodeUrl(bytes);
} catch (DecoderException e) {
e.printStackTrace();
}
return null;
}
/**
* Transient and lazy initialized on first access, by converting <code>*valueAsString</code>
* to Object (using the current feature).
*
* @generated NOT
* @author Cristi
* @author Mariana
*/
public Object getOldValue() {
if (oldValue == null) {
EDataType eDataTypeOfFeature = getEDataTypeOfFeature();
if (eDataTypeOfFeature != null && !isMany()) {
oldValue = EcoreUtil.createFromString(eDataTypeOfFeature, getOldValueAsString());
} else {
if (getOldValueAsString() == null) {
oldValue = getOldValueAsContainmentList();
} else {
try {
ByteArrayInputStream input = new ByteArrayInputStream(decode(getOldValueAsString().getBytes()));
ObjectInputStream ois = new ObjectInputStream(input);
oldValue = ois.readObject();
ois.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
return oldValue;
}
/**
* Sets the cached value and sets also <code>*valueAsString</code> by converting the
* value to string, using the current feature.
*
* @generated NOT
* @author Cristi
* @author Mariana
*/
public void setOldValue(Object newOldValue) {
Object oldOldValue = oldValue;
oldValue = newOldValue;
EDataType eDataTypeOfFeature = getEDataTypeOfFeature();
if (eDataTypeOfFeature != null && !isMany()) {
setOldValueAsString(EcoreUtil.convertToString(eDataTypeOfFeature, oldValue));
} else {
if (isMany()) {
Collection<EObject> collection = (Collection<EObject>) (newOldValue == null ? Collections.emptyList() : newOldValue);
getOldValueAsContainmentList().clear();
for (EObject value : collection) {
getOldValueAsContainmentList().add(EcoreUtil.copy(value));
}
oldValue = oldValueAsContainmentList;
} else {
try {
ByteArrayOutputStream output = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(output);
oos.writeObject(newOldValue);
oos.close();
setOldValueAsString(encode(output.toByteArray()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE, oldOldValue, oldValue));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String getOldValueAsString() {
return oldValueAsString;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setOldValueAsString(String newOldValueAsString) {
String oldOldValueAsString = oldValueAsString;
oldValueAsString = newOldValueAsString;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_STRING, oldOldValueAsString, oldValueAsString));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<EObject> getOldValueAsContainmentList() {
if (oldValueAsContainmentList == null) {
oldValueAsContainmentList = new EObjectContainmentEList<EObject>(EObject.class, this, CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_CONTAINMENT_LIST);
}
return oldValueAsContainmentList;
}
/**
* Transient and lazy initialized on first access, by converting <code>*valueAsString</code>
* to Object (using the current feature).
*
* @generated NOT
* @author Cristi
* @author Mariana
*/
public Object getNewValue() {
if (newValue == null) {
EDataType eDataTypeOfFeature = getEDataTypeOfFeature();
if (eDataTypeOfFeature != null && !isMany()) {
newValue = EcoreUtil.createFromString(eDataTypeOfFeature, getNewValueAsString());
} else {
if (getNewValueAsString() == null) {
newValue = getNewValueAsContainmentList();
} else {
try {
ByteArrayInputStream input = new ByteArrayInputStream(decode(getNewValueAsString().getBytes()));
ObjectInputStream ois = new ObjectInputStream(input);
newValue = ois.readObject();
ois.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
return newValue;
}
/**
* Sets the cached value and sets also <code>*valueAsString</code> by converting the
* value to string, using the current feature.
*
* @generated NOT
* @author Cristi
* @author Mariana
*/
public void setNewValue(Object newNewValue) {
Object oldNewValue = newValue;
newValue = newNewValue;
EDataType eDataTypeOfFeature = getEDataTypeOfFeature();
if (eDataTypeOfFeature != null && !isMany()) {
setNewValueAsString(EcoreUtil.convertToString(eDataTypeOfFeature, newValue));
} else {
if (isMany()) {
Collection<EObject> collection = (Collection<EObject>) (newNewValue == null ? Collections.emptyList() : newNewValue);
getNewValueAsContainmentList().clear();
for (EObject value : collection) {
getNewValueAsContainmentList().add(EcoreUtil.copy(value));
}
newValue = newValueAsContainmentList;
} else {
try {
ByteArrayOutputStream output = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(output);
oos.writeObject(newNewValue);
oos.close();
setNewValueAsString(encode(output.toByteArray()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE, oldNewValue, newValue));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String getNewValueAsString() {
return newValueAsString;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void setNewValueAsString(String newNewValueAsString) {
String oldNewValueAsString = newValueAsString;
newValueAsString = newNewValueAsString;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_STRING, oldNewValueAsString, newValueAsString));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public EList<EObject> getNewValueAsContainmentList() {
if (newValueAsContainmentList == null) {
newValueAsContainmentList = new EObjectContainmentEList<EObject>(EObject.class, this, CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_CONTAINMENT_LIST);
}
return newValueAsContainmentList;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
switch (featureID) {
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_CONTAINMENT_LIST:
return ((InternalEList<?>)getOldValueAsContainmentList()).basicRemove(otherEnd, msgs);
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_CONTAINMENT_LIST:
return ((InternalEList<?>)getNewValueAsContainmentList()).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 CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE:
return getOldValue();
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_STRING:
return getOldValueAsString();
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_CONTAINMENT_LIST:
return getOldValueAsContainmentList();
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE:
return getNewValue();
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_STRING:
return getNewValueAsString();
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_CONTAINMENT_LIST:
return getNewValueAsContainmentList();
}
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 CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE:
setOldValue(newValue);
return;
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_STRING:
setOldValueAsString((String)newValue);
return;
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_CONTAINMENT_LIST:
getOldValueAsContainmentList().clear();
getOldValueAsContainmentList().addAll((Collection<? extends EObject>)newValue);
return;
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE:
setNewValue(newValue);
return;
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_STRING:
setNewValueAsString((String)newValue);
return;
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_CONTAINMENT_LIST:
getNewValueAsContainmentList().clear();
getNewValueAsContainmentList().addAll((Collection<? extends EObject>)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID) {
switch (featureID) {
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE:
setOldValue(OLD_VALUE_EDEFAULT);
return;
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_STRING:
setOldValueAsString(OLD_VALUE_AS_STRING_EDEFAULT);
return;
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_CONTAINMENT_LIST:
getOldValueAsContainmentList().clear();
return;
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE:
setNewValue(NEW_VALUE_EDEFAULT);
return;
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_STRING:
setNewValueAsString(NEW_VALUE_AS_STRING_EDEFAULT);
return;
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_CONTAINMENT_LIST:
getNewValueAsContainmentList().clear();
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE:
return OLD_VALUE_EDEFAULT == null ? oldValue != null : !OLD_VALUE_EDEFAULT.equals(oldValue);
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_STRING:
return OLD_VALUE_AS_STRING_EDEFAULT == null ? oldValueAsString != null : !OLD_VALUE_AS_STRING_EDEFAULT.equals(oldValueAsString);
case CodeSyncPackage.FEATURE_CHANGE__OLD_VALUE_AS_CONTAINMENT_LIST:
return oldValueAsContainmentList != null && !oldValueAsContainmentList.isEmpty();
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE:
return NEW_VALUE_EDEFAULT == null ? newValue != null : !NEW_VALUE_EDEFAULT.equals(newValue);
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_STRING:
return NEW_VALUE_AS_STRING_EDEFAULT == null ? newValueAsString != null : !NEW_VALUE_AS_STRING_EDEFAULT.equals(newValueAsString);
case CodeSyncPackage.FEATURE_CHANGE__NEW_VALUE_AS_CONTAINMENT_LIST:
return newValueAsContainmentList != null && !newValueAsContainmentList.isEmpty();
}
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(" (oldValue: ");
result.append(oldValue);
result.append(", oldValueAsString: ");
result.append(oldValueAsString);
result.append(", newValue: ");
result.append(newValue);
result.append(", newValueAsString: ");
result.append(newValueAsString);
result.append(')');
return result.toString();
}
} //FeatureChangeImpl