/** * Copyright (c) 2002-2009 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 java.util.HashMap; import java.util.Map; import org.eclipse.emf.common.notify.NotificationChain; import org.eclipse.emf.ecore.util.FeatureMap; /** * <!-- begin-user-doc --> * A representation of the model object '<em><b>EStructural Feature</b></em>'. * <!-- end-user-doc --> * * <p> * The following features are supported: * </p> * <ul> * <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isChangeable <em>Changeable</em>}</li> * <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isVolatile <em>Volatile</em>}</li> * <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isTransient <em>Transient</em>}</li> * <li>{@link org.eclipse.emf.ecore.EStructuralFeature#getDefaultValueLiteral <em>Default Value Literal</em>}</li> * <li>{@link org.eclipse.emf.ecore.EStructuralFeature#getDefaultValue <em>Default Value</em>}</li> * <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isUnsettable <em>Unsettable</em>}</li> * <li>{@link org.eclipse.emf.ecore.EStructuralFeature#isDerived <em>Derived</em>}</li> * <li>{@link org.eclipse.emf.ecore.EStructuralFeature#getEContainingClass <em>EContaining Class</em>}</li> * </ul> * * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature() * @model abstract="true" * annotation="http://www.eclipse.org/emf/2002/Ecore constraints='ValidDefaultValueLiteral'" * @generated */ public interface EStructuralFeature extends ETypedElement { /** * Returns the value of the '<em><b>Transient</b></em>' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @return the value of the '<em>Transient</em>' attribute. * @see #setTransient(boolean) * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Transient() * @model * @generated */ boolean isTransient(); /** * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isTransient <em>Transient</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @param value the new value of the '<em>Transient</em>' attribute. * @see #isTransient() * @generated */ void setTransient(boolean value); /** * Returns the value of the '<em><b>Volatile</b></em>' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @return the value of the '<em>Volatile</em>' attribute. * @see #setVolatile(boolean) * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Volatile() * @model * @generated */ boolean isVolatile(); /** * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isVolatile <em>Volatile</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @param value the new value of the '<em>Volatile</em>' attribute. * @see #isVolatile() * @generated */ void setVolatile(boolean value); /** * Returns the value of the '<em><b>Changeable</b></em>' attribute. * The default value is <code>"true"</code>. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @return the value of the '<em>Changeable</em>' attribute. * @see #setChangeable(boolean) * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Changeable() * @model default="true" * @generated */ boolean isChangeable(); /** * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isChangeable <em>Changeable</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @param value the new value of the '<em>Changeable</em>' attribute. * @see #isChangeable() * @generated */ void setChangeable(boolean value); /** * Returns the value of the '<em><b>Default Value Literal</b></em>' attribute. * <!-- begin-user-doc --> * <p> * It represents the serialized form of the default value. * </p> * <!-- end-user-doc --> * @return the value of the '<em>Default Value Literal</em>' attribute. * @see #setDefaultValueLiteral(String) * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_DefaultValueLiteral() * @model * @generated */ String getDefaultValueLiteral(); /** * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#getDefaultValueLiteral <em>Default Value Literal</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @param value the new value of the '<em>Default Value Literal</em>' attribute. * @see #getDefaultValueLiteral() * @generated */ void setDefaultValueLiteral(String value); /** * Returns the value of the '<em><b>Default Value</b></em>' attribute. * <!-- begin-user-doc --> * <p> * It represents the default value that feature must take on when an * explicit value has not been set. Specifically, it may be non-null if * the feature has an {@link ETypedElement#getEType eType}. If the * {@link #getDefaultValueLiteral defaultValueLiteral} is null, it is * simply the <code>eType</code>'s intrinsic {@link * EClassifier#getDefaultValue default value}. Otherwise, if the * <code>eType</code> is an {@link EDataType} and the * <code>defaultValueLiteral</code> is non-null, it is the object created * by the factory's {@link EFactory#createFromString} method when invoked * with those two objects as parameters. * </p> * <!-- end-user-doc --> * @return the value of the '<em>Default Value</em>' attribute. * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_DefaultValue() * @model transient="true" changeable="false" volatile="true" derived="true" * @generated */ Object getDefaultValue(); /** * A convenience method for setting the '<em><b>Default Value Literal</b></em>' attribute. * <p> * If the feature has an {@link ETypedElement#getEType eType} that is an * {@link EDataType}, the specified <code>value</code> is converted to * a string using the factory's {@link EFactory#convertToString} * method, and the {@link #getDefaultValueLiteral defaultValueLiteral} is * set to the result. * </p> * @see #setDefaultValueLiteral */ void setDefaultValue(Object value); /** * Returns the value of the '<em><b>Unsettable</b></em>' attribute. * <!-- begin-user-doc --> * <p> * An unsettable feature explicitly models the state of being set verses being unset * and so provides a direct implementation for the reflective {@link EObject#eIsSet eIsSet}. * It is only applicable {@link ETypedElement#isMany single-valued} features. * One effect of this setting is that, * in addition to generating the methods <code>getXyz</code> * and <code>setXyz</code> (if the feature is {@link #isChangeable changeable}), * a reflective generator will generate the methods <code>isSetXyz</code> and <code>unsetXyz</code>. * </p> * <!-- end-user-doc --> * @return the value of the '<em>Unsettable</em>' attribute. * @see #setUnsettable(boolean) * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Unsettable() * @model * @generated */ boolean isUnsettable(); /** * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isUnsettable <em>Unsettable</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @param value the new value of the '<em>Unsettable</em>' attribute. * @see #isUnsettable() * @generated */ void setUnsettable(boolean value); /** * Returns the value of the '<em><b>Derived</b></em>' attribute. * <!-- begin-user-doc --> * <p> * A derived feature typically computes its value from those of other features. * It will typically be {@link #isTransient transient} * and will often be {@link #isVolatile volatile} and not {@link #isChangeable changeable}. * The default {@link org.eclipse.emf.ecore.util.EcoreUtil.Copier copier} won't copy it. * </p> * <!-- end-user-doc --> * @return the value of the '<em>Derived</em>' attribute. * @see #setDerived(boolean) * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_Derived() * @model * @generated */ boolean isDerived(); /** * Sets the value of the '{@link org.eclipse.emf.ecore.EStructuralFeature#isDerived <em>Derived</em>}' attribute. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @param value the new value of the '<em>Derived</em>' attribute. * @see #isDerived() * @generated */ void setDerived(boolean value); /** * Returns the value of the '<em><b>EContaining Class</b></em>' container reference. * It is bidirectional and its opposite is '{@link org.eclipse.emf.ecore.EClass#getEStructuralFeatures <em>EStructural Features</em>}'. * <!-- begin-user-doc --> * <p> * It represents the containing class of this feature. * </p> * <!-- end-user-doc --> * @return the value of the '<em>EContaining Class</em>' container reference. * @see org.eclipse.emf.ecore.EcorePackage#getEStructuralFeature_EContainingClass() * @see org.eclipse.emf.ecore.EClass#getEStructuralFeatures * @model opposite="eStructuralFeatures" resolveProxies="false" changeable="false" * @generated */ EClass getEContainingClass(); /** * <!-- begin-user-doc --> * Returns the ID relative to the {@link #getEContainingClass containing} class. * @return the relative ID. * <!-- end-user-doc --> * @model kind="operation" * @generated */ int getFeatureID(); /** * <!-- begin-user-doc --> * Returns the {@link EClassifier#getInstanceClass instance class} of the {@link #getEContainingClass containing} class. * @return the instance class of the containing class. * <!-- end-user-doc --> * @model kind="operation" * @generated */ Class<?> getContainerClass(); /** * A representation of a value held by a feature of an object. * In the case of a {@link org.eclipse.emf.ecore.InternalEObject#eSetClass dynamic} instance, * a setting will be the only actual representation of the object-feature-value association. */ interface Setting { /** * Returns the object holding a value. * @return the object holding a value. */ EObject getEObject(); /** * Returns the specific feature holding a value for the object. * @return the specific feature holding a value for the object. */ EStructuralFeature getEStructuralFeature(); /** * Returns the value held by the feature of the object; * it optionally {@link org.eclipse.emf.ecore.util.EcoreUtil#resolve(EObject, EObject) resolves} the value. * @param resolve whether to resolve. * @return the value held by the feature of the object. * @see EObject#eGet(EStructuralFeature, boolean) */ Object get(boolean resolve); /** * Set the value held by the feature of the object. * If the new value is this setting itself, or is modified as a side effect of modifying this setting * (i.e., if it is a view on the setting), * the behavior is undefined and will likely result in simply clearing the list. * @param newValue the newValue. * @see EObject#eSet(EStructuralFeature, Object) */ void set(Object newValue); /** * Returns whether a value is held by the feature of the object. * @return whether a value is held by the feature of the object. * @see EObject#eIsSet(EStructuralFeature) */ boolean isSet(); /** * Unsets the value held by the feature of the object. * @see EObject#eUnset(EStructuralFeature) */ void unset(); } /** * Internal API implemented by all features. */ interface Internal extends EStructuralFeature, InternalEObject { /** * An API for the backing store that holds dynamic values. */ interface DynamicValueHolder { /** * An object used to represent being set to <code>null</code> * as opposed to having no value and hence being in the default state. */ Object NIL = new Object() { @Override public String toString() { return "NIL"; } }; /** * Returns the value of the feature. * @param dynamicFeatureID the feature's index in the cached dynamic values. * @return the value of the feature. */ Object dynamicGet(int dynamicFeatureID); /** * Sets the value of the feature to the new value. * @param dynamicFeatureID the feature's index in the cached dynamic values. * @param newValue the new value for the feature. */ void dynamicSet(int dynamicFeatureID, Object newValue); /** * Unsets the value of the feature. * @param dynamicFeatureID the feature's index in the cached dynamic values. */ void dynamicUnset(int dynamicFeatureID); } /** * An API for delegating reflective access to settings. */ interface SettingDelegate { /** * A factory for creating setting delegates. * @since 2.6 */ interface Factory { /** * Creates a setting delegate for the given feature. * @param eStructuralFeature the feature for which a setting delegate is to be created. * @return a new a setting delegate for the given feature. */ SettingDelegate createSettingDelegate(EStructuralFeature eStructuralFeature); /** * A <code>Factory</code> wrapper that is used by the {@link Factory.Registry}. */ interface Descriptor { Factory getFactory(); } /** * A registry of factories for creating setting delegates. */ interface Registry extends Map<String, Object> { Registry INSTANCE = new Impl(); Factory getFactory(String uri); class Impl extends HashMap<String, Object> implements Registry { private static final long serialVersionUID = 1L; @Override public Object get(Object key) { Object factory = super.get(key); if (factory instanceof Descriptor) { Descriptor factoryDescriptor = (Descriptor)factory; factory = factoryDescriptor.getFactory(); put((String)key, factory); return factory; } else { return factory; } } public Factory getFactory(String uri) { return (Factory)get(uri); } } } } /** * Returns a setting that can be used to access the owner's feature. * @param owner the owner of the feature. * @param settings the owner's array of cached values. * @param dynamicFeatureID the feature's index in the owner's cached dynamic values. * @return a setting that can be used to access the owner's feature. * @see InternalEObject#eSetting(EStructuralFeature) */ Setting dynamicSetting(InternalEObject owner, DynamicValueHolder settings, int dynamicFeatureID); /** * Returns the value of the feature of this owner. * @param owner the owner of the feature. * @param settings the owner's array of cached values. * @param dynamicFeatureID the feature's index in the owner's cached dynamic values. * @param resolve whether to resolve. * @param coreType return the core EMF object if value is a non-EMF wrapper/view. * @return the value of the feature of this owner. * @see EObject#eGet(EStructuralFeature, boolean) */ Object dynamicGet(InternalEObject owner, DynamicValueHolder settings, int dynamicFeatureID, boolean resolve, boolean coreType); /** * Sets the value of the given feature of the owner to the new value. * @param owner the owner of the feature. * @param settings the owner's array of cached values. * @param dynamicFeatureID the feature's index in the owner's cached dynamic values. * @param newValue the new value for the feature. * @see EObject#eSet(EStructuralFeature, Object) */ void dynamicSet(InternalEObject owner, DynamicValueHolder settings, int dynamicFeatureID, Object newValue); /** * Returns whether the feature of the owner is considered to be set. * @param owner the owner of the feature. * @param settings the owner's array of cached values. * @param dynamicFeatureID the feature's index in the owner's cached dynamic values. * @return whether the feature of the owner is considered to be set. * @see EObject#eIsSet(EStructuralFeature) */ boolean dynamicIsSet(InternalEObject owner, DynamicValueHolder settings, int dynamicFeatureID); /** * Unsets the value of the given feature of the owner. * @param owner the owner of the feature. * @param settings the owner's array of cached values. * @param dynamicFeatureID the feature's index in the owner's cached dynamic values. * @see EObject#eUnset(EStructuralFeature) */ void dynamicUnset(InternalEObject owner, DynamicValueHolder settings, int dynamicFeatureID); /** * Adds the object at the other end of a bidirectional reference to the appropriate feature * and returns accumulated notifications. * @param owner the owner of the feature. * @param settings the owner's array of cached values. * @param dynamicFeatureID the feature's index in the owner's cached dynamic values. * @param otherEnd the object to inverse add. * @param notifications the incoming accumulated notifications. * @return accumulated notifications. * @see InternalEObject#eInverseAdd */ NotificationChain dynamicInverseAdd (InternalEObject owner, DynamicValueHolder settings, int dynamicFeatureID, InternalEObject otherEnd, NotificationChain notifications); /** * Removes the object at the other end of a bidirectional reference from the appropriate feature * and returns accumulated notifications. * @param owner the owner of the feature. * @param settings the owner's array of cached values. * @param dynamicFeatureID the feature's index in the owner's cached dynamic values. * @param otherEnd the object to inverse remove. * @param notifications the incoming accumulated notifications. * @return accumulated notifications. * @see InternalEObject#eInverseRemove */ NotificationChain dynamicInverseRemove (InternalEObject owner, DynamicValueHolder settings, int dynamicFeatureID, InternalEObject otherEnd, NotificationChain notifications); } /** * Returns the delegate for this feature. * A default delegate implementation should always be available, * so this should never return <code>null</code>. * @return the delegate for this feature. */ SettingDelegate getSettingDelegate(); /** * Sets the specialized delegate for this feature. * @param settingDelegate the specialized delegate. */ void setSettingDelegate(SettingDelegate settingDelegate); /** * Returns whether the type is a feature map. * @return whether the type is a feature map. */ boolean isFeatureMap(); /** * Returns the appropriately behaving feature map entry for this feature. * @return the feature map entry prototype. */ FeatureMap.Entry.Internal getFeatureMapEntryPrototype(); /** * Sets the appropriately behaving feature map entry for this feature. * @param prototype the feature map entry prototype. */ void setFeatureMapEntryPrototype(FeatureMap.Entry.Internal prototype); /** * Returns whether this is an {@link EAttribute attribute} that is an {@link EAttribute#isID() ID}. * @return whether this is an attribute that is an ID. */ public boolean isID(); /** * Returns whether this is a {@link EReference reference} that {@link EReference#isResolveProxies() resolves proxies}. * @return whether this is a reference that resolves proxies. */ public boolean isResolveProxies(); /** * Returns whether this is a {@link EReference reference} that is a {@link EReference#isContainer() container}. * @return whether this is a reference that is a container. */ public boolean isContainer(); /** * Returns whether this is a {@link EReference reference} that is a {@link EReference#isContainment() containment}. * @return whether this is a reference that is a containment. */ public boolean isContainment(); /** * Returns the {@link EReference#getEOpposite() opposite} if this is {@link EReference reference} that has one. * @return the opposite if this is reference that has one. */ public EReference getEOpposite(); } }