/** * Copyright (c) 2002-2010 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; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.InvocationTargetException; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; /** * An internal interface implemented by all {@link EObject}s. */ public interface InternalEObject extends EObject { /** * The base value for negative, i.e., opposite-end, eContainerFeatureID values. */ static final int EOPPOSITE_FEATURE_BASE = -1; /** * Returns whether {@link org.eclipse.emf.common.notify.Notifier#eNotify eNotify} needs to be called. * <p> * This may return <code>true</code> even when {@link org.eclipse.emf.common.notify.Notifier#eDeliver eDeliver} is <code>false</code> * or when {@link org.eclipse.emf.common.notify.Notifier#eAdapters eAdapters} is empty. * <p> * @return <code>true</code> if eNotify needs to be called. */ boolean eNotificationRequired(); /** * Returns the fragment segment that, * when passed to {@link #eObjectForURIFragmentSegment eObjectForURIFragmentSegment}, * will resolve to the given object in this object's given feature. * <p> * The feature argument may be <code>null</code> in which case it will be deduced, if possible. * The default result will be of the form: *<pre> * "@<feature-name>[.<index>]" *</pre> * The index is used only for {@link ETypedElement#isMany() many-valued} features; * it represents the position within the list. * </p> * @param eFeature the feature relating the given object to this object, or <code>null</code>. * @param eObject the object to be identified. * @return the fragment segment that resolves to the given object in this object's given feature. */ String eURIFragmentSegment(EStructuralFeature eFeature, EObject eObject); /** * Returns the object resolved by the fragment segment. * <p> * The fragment segment encoding will typically be of the form returned by {@link #eURIFragmentSegment eURIFragmentSegment}. * @param uriFragmentSegment a fragment segment. * @return the fragment segment that resolves to the given object in this object's given feature. */ EObject eObjectForURIFragmentSegment(String uriFragmentSegment); /** * Sets the meta class. * An object with a set meta class is, by definition, a dynamic instance; * it will support dynamic {@link #eSetting settings}. * an. * @param eClass the dynamic meta class. * @see #eSetting(EStructuralFeature) */ void eSetClass(EClass eClass); /** * Returns a setting that can be used to access this object's feature. * @param feature the feature of the desired setting. * @return a setting that can be used to access this object's feature. */ EStructuralFeature.Setting eSetting(EStructuralFeature feature); /** * Returns the feature ID relative to the base class, given a feature ID relative to this derived object's actual class. * @param derivedFeatureID the ID in the actual derived class * @param baseClass the base class for which a relative ID is desired. * @return the up-cast feature ID. */ int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass); /** * Returns the container feature ID. * If the container isn't a navigable feature, this will be a negative ID indicating the inverse of the containment feature's ID. * @return the container feature ID. * @see #eContainmentFeature() * @see #EOPPOSITE_FEATURE_BASE */ int eContainerFeatureID(); /** * Returns the feature ID relative to this derived object's actual class, given a feature ID relative to the given base class. * @param baseFeatureID the ID relative to a base class. * @param baseClass the base class to which the ID is relative. * @return the down-cast feature ID. */ int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass); /** * Returns the operation ID relative to this derived object's actual class, given an operation ID relative to the given base class. * @param baseOperationID the ID relative to a base class. * @param baseClass the base class to which the ID is relative. * @return the down-cast operation ID. * @since 2.6 */ int eDerivedOperationID(int baseOperationID, Class<?> baseClass); /** * Sets this object to be directly contained by the resource * and returns accumulated notifications. * This is only done as the inverse of {@link Resource#getContents()}<code>.add(this)</code>. * @return accumulated notifications. */ NotificationChain eSetResource(Resource.Internal resource, NotificationChain notifications); /** * Adds the object at the other end of a bidirectional reference to the appropriate feature * and returns accumulated notifications. * @return accumulated notifications. */ NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, Class<?> baseClass, NotificationChain notifications); /** * Removes the object at the other end of a bidirectional reference from the appropriate feature * and returns accumulated notifications. * @return accumulated notifications. */ NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class<?> baseClass, NotificationChain notifications); /** * Sets the container to be new container and appropriate feature. * and returns accumulated notifications. * Since the container feature may not be navigable, i.e., may not exist, the containment feature may be encoded instead. * @return accumulated notifications. */ NotificationChain eBasicSetContainer(InternalEObject newContainer, int newContainerFeatureID, NotificationChain notifications); /** * Removes this object from whatever container holds it, * and returns accumulated notifications. * @return accumulated notifications. */ NotificationChain eBasicRemoveFromContainer(NotificationChain notifications); /** * Returns the proxy URI of this object. * It can be used to {@link org.eclipse.emf.ecore.util.EcoreUtil#resolve(EObject, EObject) resolve} to the actual object. * @return the proxy URI of this object. * @see org.eclipse.emf.ecore.util.EcoreUtil#resolve(EObject, org.eclipse.emf.ecore.resource.ResourceSet) * @see Resource#unload */ URI eProxyURI(); /** * Set the proxy URI of this object. * It will be used to {@link org.eclipse.emf.ecore.util.EcoreUtil#resolve(EObject, EObject) resolve} to the actual object. * @param uri the URI. * @see org.eclipse.emf.ecore.util.EcoreUtil#resolve(EObject, org.eclipse.emf.ecore.resource.ResourceSet) * @see Resource#unload */ void eSetProxyURI(URI uri); /** * Resolves the {@link EObject#eIsProxy proxy} object relative to this object. * @see org.eclipse.emf.ecore.util.EcoreUtil#resolve(EObject,EObject) * @return the resolved object, or the original if the proxy can't be resolved. */ EObject eResolveProxy(InternalEObject proxy); /** * Returns the internal container, or <code>null</code>. * It does not resolve a proxy. * @return the internal container. * @see EObject#eContainer * @see InternalEObject#eDirectResource */ InternalEObject eInternalContainer(); /** * Returns the containing internal resource, or <code>null</code>. * @return the containing internal resource. * @see EObject#eResource */ Resource.Internal eInternalResource(); /** * Returns the directly containing internal resource, or <code>null</code>. * @return the directly containing internal resource. * @see EObject#eResource * @see InternalEObject#eInternalResource * @see InternalEObject#eInternalContainer */ Resource.Internal eDirectResource(); /** * Returns the store associated with this object. * @return the store associated with this object. */ EStore eStore(); /** * Set the store associated with this object. * Most objects will <b>not</b> support this. * @param store the store to associate with this object. * @throws UnsupportedOperationException */ void eSetStore(EStore store); /** * An external backing store to which an {@link EObject object} may delegate all access. */ public interface EStore { /** * A value indicating that no index is specified. * It is used in the case of accessing {@link ETypedElement#isMany() single-valued} features * where an index would be meaningless. */ int NO_INDEX = -1; /** * Returns the value at the index in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a feature of the object. * @param index an index within the content or {@link #NO_INDEX}. * @return the value at the index in the content of the object's feature. */ Object get(InternalEObject object, EStructuralFeature feature, int index); /** * Sets the value at the index in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a feature of the object. * @param index an index within the content or {@link #NO_INDEX}. * @param value the new value. * @return the previous value. */ Object set(InternalEObject object, EStructuralFeature feature, int index, Object value); /** * Returns whether the object's feature is considered set. * @param object the object in question. * @param feature a feature of the object. * @return <code>true</code> if the object's feature is considered set. */ boolean isSet(InternalEObject object, EStructuralFeature feature); /** * Unsets the feature of the object. * @param object the object in question. * @param feature a feature of the object. */ void unset(InternalEObject object, EStructuralFeature feature); /** * Returns whether the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature is empty. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @return <code>true</code> if the content of the object's feature is empty. */ boolean isEmpty(InternalEObject object, EStructuralFeature feature); /** * Returns the number of values in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @return the number of values in the content of the object's feature. */ int size(InternalEObject object, EStructuralFeature feature); /** * Returns whether the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature contains the given value. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @param value the value in question. * @return <code>true</code> if the content of the object's feature contains the given value. */ boolean contains(InternalEObject object, EStructuralFeature feature, Object value); /** * Returns the first index of the given value in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @param value the value in question. * @return the first index of the given value in the content of the object's feature. */ int indexOf(InternalEObject object, EStructuralFeature feature, Object value); /** * Returns the last index of the given value in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @param value the value in question. * @return the last index of the given value in the content of the object's feature. */ int lastIndexOf(InternalEObject object, EStructuralFeature feature, Object value); /** * Adds the value at the index in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @param index an index within the content. * @param value the value to add. */ void add(InternalEObject object, EStructuralFeature feature, int index, Object value); /** * Removes the value at the index in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @param index the index within the feature's content of the value to remove. * @return the removed value. */ Object remove(InternalEObject object, EStructuralFeature feature, int index); /** * Moves the value at the source index in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature * to the target index. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @param targetIndex the index within the feature's content to which to move the value. * @param sourceIndex the index within the feature's content of the value to move. * @return the moved value. */ Object move(InternalEObject object, EStructuralFeature feature, int targetIndex, int sourceIndex); /** * Removes all values form the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. */ void clear(InternalEObject object, EStructuralFeature feature); /** * Returns a new array of the values in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @return a new array of the values in the content of the object's feature. */ Object[] toArray(InternalEObject object, EStructuralFeature feature); /** * Returns an array of the values in the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * The given array will be used, unless it's too small, in which case a new array of the same type is allocated instead. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @param array the array to fill. * @return an array of the values in the content of the object's feature. */ <T> T[] toArray(InternalEObject object, EStructuralFeature feature, T[] array); /** * Returns the hash code of the {@link EObject#eGet(EStructuralFeature,boolean) content} of the object's feature. * @param object the object in question. * @param feature a {@link ETypedElement#isMany() many-valued} feature of the object. * @return the hash code of the content of the object's feature. */ int hashCode(InternalEObject object, EStructuralFeature feature); /** * Returns the object's {@link EObject#eContainer container}. * @return the object's container. * @see EObject#eContainer */ InternalEObject getContainer(InternalEObject object); /** * Returns the object's {@link EObject#eContainingFeature containing feature}. * @return the object's containing feature. * @see EObject#eContainingFeature */ EStructuralFeature getContainingFeature(InternalEObject object); /** * Creates a new instance of the class. * @param eClass the class to instantiate. * @return a new instance of the class. */ EObject create(EClass eClass); } /** * Returns the value of the given feature of the object; * the value is optionally {@link org.eclipse.emf.ecore.util.EcoreUtil#resolve(EObject, EObject) resolved} before it is returned. * <p> * If the feature is {@link ETypedElement#isMany() many-valued}, * the result will be an {@link EList} * and each object in the list will be {@link EClassifier#isInstance an instance of} * the feature's {@link ETypedElement#getEType() type}; * the list's contents are <b>not</b> affected by <code>resolve</code> argument. * Otherwise the result directly will be an instance of the feature's type; * if it is a {@link EObject#eIsProxy() proxy}, * it is resolved. * The core type specifies whether to return the core reflective value, * e.g., {@link org.eclipse.emf.common.util.EMap}, * or the public API value, * e.g., {@link java.util.Map}. * @param eFeature the feature of the value to fetch. * @param resolve whether to resolve. * @param coreType whether to return the core type value or the API type value. * @return the value of the given feature of the object. * @see EObject#eGet(EStructuralFeature, boolean) */ public Object eGet(EStructuralFeature eFeature, boolean resolve, boolean coreType); /** * Does the equivalent of <code>eObject.eGet(eObject.eClass().getEStructuralFeature(featureID), resolve, coreType)</code>. * @see #eGet(EStructuralFeature, boolean, boolean) */ Object eGet(int featureID, boolean resolve, boolean coreType); /** * Does the equivalent of <code>eObject.eSet(eObject.eClass().getEStructuralFeature(featureID), newValue)</code>. * @see #eSet(EStructuralFeature, Object) */ void eSet(int featureID, Object newValue); /** * Does the equivalent of <code>eObject.eUnset(eObject.eClass().getEStructuralFeature(featureID))</code>. * @see #eUnset(EStructuralFeature) */ void eUnset(int featureID); /** * Does the equivalent of <code>eObject.eIsSet(eObject.eClass().getEStructuralFeature(featureID))</code>. * @see #eIsSet(EStructuralFeature) */ boolean eIsSet(int featureID); /** * Does the equivalent of <code>eObject.eInvoke(eObject.eClass().getEOperation(featureID), arguments)</code>. * @see #eInvoke(EOperation, EList<?>) * @since 2.6 */ Object eInvoke(int operationID, EList<?> arguments) throws InvocationTargetException; }