/**
* Copyright (c) 2003-2006 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 - Initial API and implementation
*/
package org.eclipse.emf.ecore.change.impl;
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.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.change.ChangeFactory;
import org.eclipse.emf.ecore.change.ChangeKind;
import org.eclipse.emf.ecore.change.ChangePackage;
import org.eclipse.emf.ecore.change.FeatureMapEntry;
import org.eclipse.emf.ecore.change.ListChange;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.impl.EObjectImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.FeatureMap;
//import org.eclipse.emf.ecore.InternalEObject;
/**
* <!-- begin-user-doc -->
* An implementation of the model object '<em><b>Feature Map Entry</b></em>'.
* @extends FeatureMap.Entry.Internal
* <!-- end-user-doc -->
* <p>
* The following features are implemented:
* <ul>
* <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getFeatureName <em>Feature Name</em>}</li>
* <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getDataValue <em>Data Value</em>}</li>
* <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getValue <em>Value</em>}</li>
* <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getFeature <em>Feature</em>}</li>
* <li>{@link org.eclipse.emf.ecore.change.impl.FeatureMapEntryImpl#getReferenceValue <em>Reference Value</em>}</li>
* </ul>
* </p>
*
* @generated
*/
public class FeatureMapEntryImpl extends EObjectImpl implements FeatureMapEntry, FeatureMap.Entry.Internal
{
/**
* The bit of {@link #eFlags} that is used to represent if feature is a proxy.
*/
protected static final int EPROXY_FEATURECHANGE = ELAST_EOBJECT_FLAG << 1;
/**
* The default value of the '{@link #getFeatureName() <em>Feature Name</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getFeatureName()
* @generated
* @ordered
*/
protected static final String FEATURE_NAME_EDEFAULT = null;
/**
* The default value of the '{@link #getDataValue() <em>Data Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getDataValue()
* @generated
* @ordered
*/
protected static final String DATA_VALUE_EDEFAULT = null;
/**
* The default value of the '{@link #getValue() <em>Value</em>}' attribute.
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @see #getValue()
* @generated
* @ordered
*/
protected static final Object VALUE_EDEFAULT = null;
protected EStructuralFeature feature = null;
protected String featureName = null;
protected Object value = null;
protected String valueString = null;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
protected FeatureMapEntryImpl()
{
super();
}
protected FeatureMapEntryImpl(EStructuralFeature feature, Object value)
{
this();
this.feature = feature;
setValue(value);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
protected EClass eStaticClass()
{
return ChangePackage.Literals.FEATURE_MAP_ENTRY;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public String getFeatureName()
{
return feature == null ? featureName : feature.getName();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public void setFeatureName(String newFeatureName)
{
featureName = newFeatureName;
feature = null;
eFlags &= ~EPROXY_FEATURECHANGE;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public void unsetFeatureName()
{
setFeatureName(null);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean isSetFeatureName()
{
if (featureName != null)
{
return true;
}
else if (feature == null)
{
return false;
}
else
{
EObject greatGrandParent = getGreatGrandParent();
return
greatGrandParent instanceof EObjectToChangesMapEntryImpl &&
((EObjectToChangesMapEntryImpl)greatGrandParent).getTypedKey().eClass().getEAllStructuralFeatures().contains(feature);
}
}
protected EObject getGreatGrandParent()
{
EObject container = eContainer();
if (container != null)
{
container = container.eContainer();
if (container != null)
{
return container.eContainer();
}
}
return null;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public String getDataValue()
{
if (valueString == null)
{
EStructuralFeature feature = getFeature();
if (feature instanceof EAttribute)
{
EDataType type = (EDataType)feature.getEType();
valueString = EcoreUtil.convertToString(type, value);
}
}
return valueString;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public void setDataValue(String newDataValue)
{
String oldDataValue = getDataValue();
valueString = newDataValue;
value = null;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__DATA_VALUE, oldDataValue, newDataValue));
}
public EStructuralFeature getEStructuralFeature()
{
return getFeature();
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public EStructuralFeature getFeature()
{
if (feature == null)
{
EObject greatGrandParent = getGreatGrandParent();
if (greatGrandParent instanceof EObjectToChangesMapEntryImpl)
{
feature = ((EObjectToChangesMapEntryImpl)greatGrandParent).getKey().eClass().getEStructuralFeature(featureName);
}
}
else if ((eFlags & EPROXY_FEATURECHANGE) !=0)
{
EStructuralFeature oldFeature = feature;
feature = (EStructuralFeature)EcoreUtil.resolve(feature, this);
if (feature != oldFeature)
{
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChangePackage.FEATURE_CHANGE__FEATURE, oldFeature, feature));
}
eFlags &= ~ EPROXY_FEATURECHANGE;
}
return feature;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public EStructuralFeature basicGetFeature()
{
return feature;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public void setFeature(EStructuralFeature newFeature)
{
EStructuralFeature oldFeature = basicGetFeature();
feature = newFeature;
featureName = null;
if (feature != null && feature.eIsProxy())
eFlags |= EPROXY_FEATURECHANGE;
else
eFlags &= ~EPROXY_FEATURECHANGE;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__FEATURE, oldFeature, newFeature));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public void unsetFeature()
{
setFeature(null);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public boolean isSetFeature()
{
if (feature == null)
{
return false;
}
else
{
EObject greatGrandParent = getGreatGrandParent();
return
!(greatGrandParent instanceof EObjectToChangesMapEntryImpl) ||
!((EObjectToChangesMapEntryImpl)greatGrandParent).getTypedKey().eClass().getEAllStructuralFeatures().contains(feature);
}
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public EObject getReferenceValue()
{
EObject referenceValue = basicGetReferenceValue();
if (referenceValue != null && referenceValue.eIsProxy())
{
EObject oldReferenceValue = referenceValue;
referenceValue = EcoreUtil.resolve(referenceValue, this);
if (referenceValue != oldReferenceValue)
{
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.RESOLVE, ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE, oldReferenceValue, referenceValue));
}
}
return referenceValue;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public EObject basicGetReferenceValue()
{
return feature instanceof EReference ? (EObject)value : null;
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public void setReferenceValue(EObject newReferenceValue)
{
EObject oldReferenceValue = basicGetReferenceValue();
value = newReferenceValue;
valueString = null;
if (eNotificationRequired())
eNotify(new ENotificationImpl(this, Notification.SET, ChangePackage.FEATURE_CHANGE__REFERENCE_VALUE, oldReferenceValue, newReferenceValue));
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType)
{
switch (featureID)
{
case ChangePackage.FEATURE_MAP_ENTRY__FEATURE_NAME:
return getFeatureName();
case ChangePackage.FEATURE_MAP_ENTRY__DATA_VALUE:
return getDataValue();
case ChangePackage.FEATURE_MAP_ENTRY__VALUE:
return getValue();
case ChangePackage.FEATURE_MAP_ENTRY__FEATURE:
if (resolve) return getFeature();
return basicGetFeature();
case ChangePackage.FEATURE_MAP_ENTRY__REFERENCE_VALUE:
if (resolve) return getReferenceValue();
return basicGetReferenceValue();
}
return super.eGet(featureID, resolve, coreType);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eSet(int featureID, Object newValue)
{
switch (featureID)
{
case ChangePackage.FEATURE_MAP_ENTRY__FEATURE_NAME:
setFeatureName((String)newValue);
return;
case ChangePackage.FEATURE_MAP_ENTRY__DATA_VALUE:
setDataValue((String)newValue);
return;
case ChangePackage.FEATURE_MAP_ENTRY__FEATURE:
setFeature((EStructuralFeature)newValue);
return;
case ChangePackage.FEATURE_MAP_ENTRY__REFERENCE_VALUE:
setReferenceValue((EObject)newValue);
return;
}
super.eSet(featureID, newValue);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public void eUnset(int featureID)
{
switch (featureID)
{
case ChangePackage.FEATURE_MAP_ENTRY__FEATURE_NAME:
unsetFeatureName();
return;
case ChangePackage.FEATURE_MAP_ENTRY__DATA_VALUE:
setDataValue(DATA_VALUE_EDEFAULT);
return;
case ChangePackage.FEATURE_MAP_ENTRY__FEATURE:
unsetFeature();
return;
case ChangePackage.FEATURE_MAP_ENTRY__REFERENCE_VALUE:
setReferenceValue((EObject)null);
return;
}
super.eUnset(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
@Override
public boolean eIsSet(int featureID)
{
switch (featureID)
{
case ChangePackage.FEATURE_MAP_ENTRY__FEATURE_NAME:
return isSetFeatureName();
case ChangePackage.FEATURE_MAP_ENTRY__DATA_VALUE:
return DATA_VALUE_EDEFAULT == null ? getDataValue() != null : !DATA_VALUE_EDEFAULT.equals(getDataValue());
case ChangePackage.FEATURE_MAP_ENTRY__VALUE:
return VALUE_EDEFAULT == null ? getValue() != null : !VALUE_EDEFAULT.equals(getValue());
case ChangePackage.FEATURE_MAP_ENTRY__FEATURE:
return isSetFeature();
case ChangePackage.FEATURE_MAP_ENTRY__REFERENCE_VALUE:
return basicGetReferenceValue() != null;
}
return super.eIsSet(featureID);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated NOT
*/
public Object getValue()
{
EStructuralFeature feature = getFeature();
if (feature instanceof EReference)
{
return getReferenceValue();
}
else if (value == null) // feature is instance of EAttribute
{
EDataType type = (EDataType)feature.getEType();
value = EcoreUtil.createFromString(type, valueString);
}
return value;
}
protected void setValue(Object value)
{
EStructuralFeature feature = getFeature();
if (!eNotificationRequired())
{
valueString = null;
this.value = value;
}
else
{
if (feature instanceof EAttribute)
{
EDataType type = (EDataType)feature.getEType();
setDataValue(valueString = EcoreUtil.convertToString(type, value));
this.value = value;
}
else
{
setReferenceValue((EObject)value);
}
}
}
protected ListChange createListChange(EList<ListChange> changesList, ChangeKind kind, int index)
{
ListChange listChange = ChangeFactory.eINSTANCE.createListChange();
listChange.setKind(kind);
listChange.setIndex(index);
changesList.add(listChange);
return listChange;
}
public NotificationChain inverseAdd(InternalEObject owner, int featureID, NotificationChain notifications)
{
return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().inverseAdd(owner, getValue(), featureID, notifications);
}
public NotificationChain inverseRemove(InternalEObject owner, int featureID, NotificationChain notifications)
{
return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().inverseRemove(owner, getValue(), featureID, notifications);
}
public NotificationChain inverseAdd(InternalEObject owner, Object otherEnd, int featureID, NotificationChain notifications)
{
return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().inverseAdd(owner, otherEnd, featureID, notifications);
}
public NotificationChain inverseRemove(InternalEObject owner, Object otherEnd, int featureID, NotificationChain notifications)
{
return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().inverseRemove(owner, otherEnd, featureID, notifications);
}
public void validate(Object value)
{
((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().validate(value);
}
public Internal createEntry(Object value)
{
return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().createEntry(value);
}
public Internal createEntry(InternalEObject value)
{
return ((EStructuralFeature.Internal)getFeature()).getFeatureMapEntryPrototype().createEntry(value);
}
} //FeatureChangeImpl