/*
* grEMF
*
* Copyright (C) 2006-2012 Institute for Software Technology
* University of Koblenz-Landau, Germany
* ist@uni-koblenz.de
*
* For bug reports, documentation and further information, visit
*
* https://github.com/jgralab/gremf
*
* 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; either version 3 of the License, or (at your
* option) any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see <http://www.gnu.org/licenses>.
*
* Additional permission under GNU GPL version 3 section 7
*
* If you modify this Program, or any covered work, by linking or combining
* it with Eclipse (or a modified version of that program or an Eclipse
* plugin), containing parts covered by the terms of the Eclipse Public
* License (EPL), the licensors of this Program grant you additional
* permission to convey the resulting work. Corresponding Source for a
* non-source form of such a combination shall include the source code for
* the parts of JGraLab used as well as that of the covered work.
*/
package de.uni_koblenz.gremf.schema.impl;
import java.lang.reflect.InvocationTargetException;
import java.util.Set;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.notify.impl.BasicNotifierImpl.EAdapterList;
import org.eclipse.emf.common.util.BasicEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EGenericType;
import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.BasicExtendedMetaData.EStructuralFeatureExtendedMetaData;
import org.eclipse.emf.ecore.util.BasicInternalEList;
import org.eclipse.emf.ecore.util.EContentsEList;
import org.eclipse.emf.ecore.util.ECrossReferenceEList;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.FeatureMap;
import de.uni_koblenz.gremf.GrEMFSchemaType;
import de.uni_koblenz.gremf.exception.InvalidFeatureException;
import de.uni_koblenz.gremf.exception.UnsupportedFeature;
import de.uni_koblenz.gremf.exception.UnsupportedFeatureException;
import de.uni_koblenz.gremf.exception.UnsupportedSchemaChangeException;
import de.uni_koblenz.gremf.util.EModelElementUtil;
import de.uni_koblenz.gremf.util.EObjectUtil;
import de.uni_koblenz.jgralab.schema.AggregationKind;
import de.uni_koblenz.jgralab.schema.EdgeClass;
import de.uni_koblenz.jgralab.schema.IncidenceClass;
import de.uni_koblenz.jgralab.schema.IncidenceDirection;
import de.uni_koblenz.jgralab.schema.VertexClass;
import de.uni_koblenz.jgralab.schema.impl.IncidenceClassImpl;
public class GrEMFIncidenceClassImpl extends IncidenceClassImpl implements
EReference, EStructuralFeatureExtendedMetaData.Holder,
EStructuralFeature.Internal, InternalEObject, GrEMFSchemaType {
private EList<EAnnotation> eAnnotations;
private boolean isChangeable = true;
private boolean isOrdered = true;
private int featureID;
/**
* determines whether this <code>IncidenceClass</code> is invisible as
* <code>EReference</code> in EMF
*/
private boolean invisible;
public GrEMFIncidenceClassImpl(EdgeClass edgeCls, VertexClass vrtxCls,
String rolename, int min, int max, IncidenceDirection dir,
AggregationKind aggr) {
super(edgeCls, vrtxCls, rolename, min, max, dir, aggr);
this.eAnnotations = new BasicInternalEList<EAnnotation>(
EAnnotation.class);
}
@Override
public String toString() {
return "incidence class " + super.getRolename() + " at "
+ super.getVertexClass();
}
public boolean isInvisible() {
return this.invisible;
}
/**
* Can be used as long as the <code>schema</code> is unfinished to set
* <code>isInvisible</code>. This value determines whether this
* <code>IncidenceClass</code> is invisible as <code>EReference</code> in
* EMF
*/
public void setInvisibile(boolean value) {
if (!super.getVertexClass().getSchema().isFinished()) {
this.invisible = value;
}
}
public void setFeatureID(int value) {
if (!super.getVertexClass().getSchema().isFinished()) {
this.featureID = value;
} else {
throw new UnsupportedSchemaChangeException();
}
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.EStructuralFeature
// --------------------------------------------------------------------------
@Override
public boolean isTransient() {
return false;
}
@Override
public void setTransient(boolean value) {
throw new UnsupportedSchemaChangeException();
}
@Override
public boolean isVolatile() {
return false;
}
@Override
public void setVolatile(boolean value) {
throw new UnsupportedSchemaChangeException();
}
@Override
public boolean isChangeable() {
return this.isChangeable;
}
@Override
public void setChangeable(boolean value) {
if (!this.getEdgeClass().getSchema().isFinished()) {
this.isChangeable = value;
} else {
throw new UnsupportedSchemaChangeException();
}
}
@Override
public String getDefaultValueLiteral() {
return null;
}
@Override
public void setDefaultValueLiteral(String value) {
throw new UnsupportedOperationException(
"No default values of GrEMFReferenceClasses supported by grEMF.");
}
@Override
public Object getDefaultValue() {
return null;
}
@Override
public void setDefaultValue(Object value) {
throw new UnsupportedOperationException(
"No default values of GrEMFReferenceClasses supported by grEMF.");
}
@Override
public boolean isUnsettable() {
return true; // Unset an EReference means deleting all Edges, is ok for
// normal Edges
}
@Override
public void setUnsettable(boolean value) {
throw new UnsupportedSchemaChangeException();
}
@Override
public boolean isDerived() {
return false; // default, no derived values
}
@Override
public void setDerived(boolean value) {
throw new UnsupportedSchemaChangeException();
}
@Override
public EClass getEContainingClass() {
return (EClass) this.getOpposite().getVertexClass();
}
@Override
public int getFeatureID() {
return this.featureID;
}
@Override
public Class<?> getContainerClass() {
return null;
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.ETypedElement
// --------------------------------------------------------------------------
@Override
public boolean isOrdered() {
return this.isOrdered;
}
@Override
public void setOrdered(boolean value) {
if (this.getEdgeClass().getSchema().isFinished()) {
throw new UnsupportedSchemaChangeException();
}
this.isOrdered = value;
}
@Override
public boolean isUnique() {
return false;
}
@Override
public void setUnique(boolean value) {
if (this.getEdgeClass().getSchema().isFinished()) {
throw new UnsupportedSchemaChangeException();
}
}
@Override
public int getLowerBound() {
return this.getMin();
}
@Override
public void setLowerBound(int value) {
throw new UnsupportedSchemaChangeException();
}
@Override
public int getUpperBound() {
if (this.getMax() == Integer.MAX_VALUE) {
return -1;
}
return this.getMax();
}
@Override
public void setUpperBound(int value) {
throw new UnsupportedSchemaChangeException();
}
@Override
public boolean isMany() {
return this.getMax() > 1;
}
@Override
public boolean isRequired() {
return this.getMin() > 0;
}
@Override
public EClassifier getEType() {
return (GrEMFVertexClassImpl) this.getVertexClass();
}
@Override
public void setEType(EClassifier value) {
throw new UnsupportedSchemaChangeException();
}
@Override
public EGenericType getEGenericType() {
return null;
}
@Override
public void setEGenericType(EGenericType value) {
throw new UnsupportedFeatureException(UnsupportedFeature.GENERICS);
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.ENamedElement
// --------------------------------------------------------------------------
@Override
public String getName() {
if ((this.getRolename() == null) || this.getRolename().equals("")) {
Set<IncidenceClass> set = this.getSubsettedIncidenceClasses();
String rolename = this.getEdgeClass().getSimpleName().toLowerCase();
for (IncidenceClass inc : set) {
if (!this.getRedefinedIncidenceClasses().contains(inc)
&& !inc.getEdgeClass().isDefaultGraphElementClass()) {
rolename += "_"
+ ((GrEMFIncidenceClassWithRefsImpl) inc).getName();
return rolename; // return first rolename of superclass
}
}
// return this.getRolename();
return rolename;
}
return this.getRolename();
}
@Override
public void setName(String value) {
throw new UnsupportedSchemaChangeException();
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.EModelElement
// --------------------------------------------------------------------------
@Override
public EList<EAnnotation> getEAnnotations() {
return this.eAnnotations;
}
@Override
public EAnnotation getEAnnotation(String source) {
return EModelElementUtil.getEAnnotation(source, this.eAnnotations);
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.EObject
// --------------------------------------------------------------------------
@Override
public EClass eClass() {
return EcorePackage.Literals.EREFERENCE;
}
@Override
public Resource eResource() {
return this.getEContainingClass().eResource();
}
@Override
public EObject eContainer() {
return (EObject) this.getOpposite().getVertexClass();
}
@Override
public EStructuralFeature eContainingFeature() {
return EcorePackage.Literals.ECLASS__ESTRUCTURAL_FEATURES;
}
@Override
public EReference eContainmentFeature() {
return EcorePackage.Literals.ECLASS__ESTRUCTURAL_FEATURES;
}
@Override
public EList<EObject> eContents() {
// That's not true, EGenericTypes are here, but we don't support that
return EContentsEList.emptyContentsEList();
}
@Override
public TreeIterator<EObject> eAllContents() {
return EcoreUtil.getAllContents(this, true);
}
@Override
public boolean eIsProxy() {
return false;
}
@Override
public EList<EObject> eCrossReferences() {
return ECrossReferenceEList.createECrossReferenceEList(this);
}
@Override
public Object eGet(EStructuralFeature feature) {
return this.eGet(feature, true, true);
}
@Override
public Object eGet(EStructuralFeature feature, boolean resolve) {
return this.eGet(feature, true, true);
}
@Override
public void eSet(EStructuralFeature feature, Object newValue) {
if (EObjectUtil.getFeatureID(this, feature) < 0) {
throw new InvalidFeatureException(feature);
}
this.eSet(feature.getFeatureID(), newValue);
}
@Override
public boolean eIsSet(EStructuralFeature feature) {
if (EObjectUtil.getFeatureID(this, feature) < 0) {
throw new InvalidFeatureException(feature);
}
return this.eIsSet(feature.getFeatureID());
}
@Override
public void eUnset(EStructuralFeature feature) {
if (EObjectUtil.getFeatureID(this, feature) < 0) {
throw new InvalidFeatureException(feature);
}
this.eUnset(feature.getFeatureID());
}
@Override
public Object eInvoke(EOperation operation, EList<?> arguments)
throws InvocationTargetException {
throw new UnsupportedFeatureException(UnsupportedFeature.OPERATION);
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.ENotifier
// --------------------------------------------------------------------------
private EAdapterList<Adapter> eAdapters;
@Override
public EList<Adapter> eAdapters() {
if (this.eAdapters == null) {
this.eAdapters = new EAdapterList<Adapter>(this);
}
return this.eAdapters;
}
@Override
public boolean eDeliver() {
return false;
}
@Override
public void eSetDeliver(boolean deliver) {
// No Schema changes allowed - so no Notifications necessary
throw new UnsupportedSchemaChangeException();
}
@Override
public void eNotify(Notification notification) {
// No Schema changes allowed - so no Notifications necessary
throw new UnsupportedSchemaChangeException();
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.EReference
// --------------------------------------------------------------------------
@Override
public boolean isContainment() {
return this.getAggregationKind().equals(AggregationKind.COMPOSITE);
}
@Override
public void setContainment(boolean value) {
throw new UnsupportedOperationException(
"Changes of the schema are not allowed by grEMF.");
}
@Override
public boolean isContainer() {
return this.getOpposite().getAggregationKind()
.equals(AggregationKind.COMPOSITE);
}
@Override
public boolean isResolveProxies() {
return true; // no proxies, so always resolved
}
@Override
public void setResolveProxies(boolean value) {
throw new UnsupportedOperationException(
"Changes of the schema are not allowed by grEMF.");
}
@Override
public EReference getEOpposite() {
if (((GrEMFIncidenceClassImpl) this.getOpposite()).invisible) {
return null;
}
return (EReference) this.getOpposite();
}
@Override
public void setEOpposite(EReference value) {
throw new UnsupportedSchemaChangeException();
}
@Override
public EClass getEReferenceType() {
return (GrEMFVertexClassImpl) this.getVertexClass();
}
@Override
public EList<EAttribute> getEKeys() {
return new BasicEList<EAttribute>();
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.EInternalObject
// --------------------------------------------------------------------------
@Override
public boolean eNotificationRequired() {
return false;
}
@Override
public String eURIFragmentSegment(EStructuralFeature eStructuralFeature,
EObject eObject) {
if (eObject instanceof ENamedElement) {
return ((ENamedElement) eObject).getName();
} else if (eObject instanceof EAnnotation) {
return "%"
+ URI.encodeSegment(((EAnnotation) eObject).getSource(),
false) + "%";
}
throw new NullPointerException();
}
@Override
public EObject eObjectForURIFragmentSegment(String uriFragmentSegment) {
if (uriFragmentSegment.charAt(0) == '%') {
return this.getEAnnotation(URI.decode(uriFragmentSegment).replace(
"%", ""));
} else {
return null;
}
}
@Override
public void eSetClass(EClass eClass) {
throw new UnsupportedSchemaChangeException();
}
@Override
public Setting eSetting(final EStructuralFeature eFeature) {
if (EObjectUtil.getFeatureID(this, eFeature) < 0) {
throw new InvalidFeatureException();
}
return new EStructuralFeature.Setting() {
@Override
public EObject getEObject() {
return GrEMFIncidenceClassImpl.this;
}
@Override
public Object get(boolean resolve) {
return GrEMFIncidenceClassImpl.this.eGet(eFeature, resolve);
}
@Override
public EStructuralFeature getEStructuralFeature() {
return eFeature;
}
@Override
public void set(Object newValue) {
GrEMFIncidenceClassImpl.this.eSet(eFeature, newValue);
}
@Override
public boolean isSet() {
return GrEMFIncidenceClassImpl.this.eIsSet(eFeature);
}
@Override
public void unset() {
GrEMFIncidenceClassImpl.this.eUnset(eFeature);
}
};
}
@Override
public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
return derivedFeatureID;
}
@Override
public int eContainerFeatureID() {
return EcorePackage.ESTRUCTURAL_FEATURE__ECONTAINING_CLASS;
}
@Override
public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
return baseFeatureID;
}
@Override
public int eDerivedOperationID(int baseOperationID, Class<?> baseClass) {
throw new UnsupportedFeatureException(UnsupportedFeature.OPERATION);
}
@Override
public NotificationChain eSetResource(
org.eclipse.emf.ecore.resource.Resource.Internal resource,
NotificationChain notifications) {
throw new UnsupportedSchemaChangeException();
}
@Override
public NotificationChain eInverseAdd(InternalEObject otherEnd,
int featureID, Class<?> baseClass, NotificationChain notifications) {
throw new UnsupportedSchemaChangeException();
}
@Override
public NotificationChain eInverseRemove(InternalEObject otherEnd,
int featureID, Class<?> baseClass, NotificationChain notifications) {
throw new UnsupportedSchemaChangeException();
}
@Override
public NotificationChain eBasicSetContainer(InternalEObject newContainer,
int newContainerFeatureID, NotificationChain notifications) {
throw new UnsupportedSchemaChangeException();
}
@Override
public NotificationChain eBasicRemoveFromContainer(
NotificationChain notifications) {
throw new UnsupportedSchemaChangeException();
}
@Override
public URI eProxyURI() {
return null;
}
@Override
public void eSetProxyURI(URI uri) {
throw new UnsupportedFeatureException(UnsupportedFeature.PROXY);
}
@Override
public EObject eResolveProxy(InternalEObject proxy) {
return EcoreUtil.resolve(proxy, this);
}
@Override
public InternalEObject eInternalContainer() {
return (InternalEObject) this.eContainer();
}
@Override
public org.eclipse.emf.ecore.resource.Resource.Internal eInternalResource() {
return (Resource.Internal) this.eResource();
}
@Override
public org.eclipse.emf.ecore.resource.Resource.Internal eDirectResource() {
return null; // EReferences are always in EClasses
}
@Override
public EStore eStore() {
return null;
}
@Override
public void eSetStore(EStore store) {
throw new UnsupportedOperationException(); // -> BasicEObjectImpl
}
@Override
public Object eGet(EStructuralFeature eFeature, boolean resolve,
boolean coreType) {
if (EObjectUtil.getFeatureID(this, eFeature) < 0) {
throw new InvalidFeatureException(eFeature);
}
return this.eGet(eFeature.getFeatureID(), true, true);
}
@Override
public Object eGet(int featureID, boolean resolve, boolean coreType) {
switch (featureID) {
case EcorePackage.EREFERENCE__EANNOTATIONS:
return this.getEAnnotations();
case EcorePackage.EREFERENCE__NAME:
return this.getName();
case EcorePackage.EREFERENCE__ORDERED:
return this.isOrdered();
case EcorePackage.EREFERENCE__UNIQUE:
return this.isUnique();
case EcorePackage.EREFERENCE__LOWER_BOUND:
return this.getLowerBound();
case EcorePackage.EREFERENCE__UPPER_BOUND:
return this.getUpperBound();
case EcorePackage.EREFERENCE__MANY:
return this.isMany();
case EcorePackage.EREFERENCE__REQUIRED:
return this.isRequired();
case EcorePackage.EREFERENCE__ETYPE:
return this.getEType();
case EcorePackage.EREFERENCE__EGENERIC_TYPE:
return this.getEGenericType();
case EcorePackage.EREFERENCE__CHANGEABLE:
return this.isChangeable();
case EcorePackage.EREFERENCE__VOLATILE:
return this.isVolatile();
case EcorePackage.EREFERENCE__TRANSIENT:
return this.isTransient();
case EcorePackage.EREFERENCE__DEFAULT_VALUE_LITERAL:
return this.getDefaultValueLiteral();
case EcorePackage.EREFERENCE__DEFAULT_VALUE:
return this.getDefaultValue();
case EcorePackage.EREFERENCE__UNSETTABLE:
return this.isUnsettable();
case EcorePackage.EREFERENCE__DERIVED:
return this.isDerived();
case EcorePackage.EREFERENCE__ECONTAINING_CLASS:
return this.getEContainingClass();
case EcorePackage.EREFERENCE__CONTAINMENT:
return this.isContainment();
case EcorePackage.EREFERENCE__CONTAINER:
return this.isContainer();
case EcorePackage.EREFERENCE__RESOLVE_PROXIES:
return this.isResolveProxies();
case EcorePackage.EREFERENCE__EOPPOSITE:
return this.getEOpposite();
case EcorePackage.EREFERENCE__EREFERENCE_TYPE:
return this.getEReferenceType();
case EcorePackage.EREFERENCE__EKEYS:
return this.getEKeys();
}
throw new InvalidFeatureException();
}
@Override
public void eSet(int featureID, Object newValue) {
switch (featureID) {
case EcorePackage.EREFERENCE__EANNOTATIONS:
case EcorePackage.EREFERENCE__NAME:
case EcorePackage.EREFERENCE__ORDERED:
case EcorePackage.EREFERENCE__UNIQUE:
case EcorePackage.EREFERENCE__LOWER_BOUND:
case EcorePackage.EREFERENCE__UPPER_BOUND:
case EcorePackage.EREFERENCE__ETYPE:
case EcorePackage.EREFERENCE__EGENERIC_TYPE:
case EcorePackage.EREFERENCE__CHANGEABLE:
case EcorePackage.EREFERENCE__VOLATILE:
case EcorePackage.EREFERENCE__TRANSIENT:
case EcorePackage.EREFERENCE__DEFAULT_VALUE_LITERAL:
case EcorePackage.EREFERENCE__UNSETTABLE:
case EcorePackage.EREFERENCE__DERIVED:
case EcorePackage.EREFERENCE__CONTAINMENT:
case EcorePackage.EREFERENCE__RESOLVE_PROXIES:
case EcorePackage.EREFERENCE__EOPPOSITE:
case EcorePackage.EREFERENCE__EKEYS:
throw new UnsupportedSchemaChangeException();
}
throw new InvalidFeatureException();
}
@Override
public void eUnset(int featureID) {
switch (featureID) {
case EcorePackage.EREFERENCE__EANNOTATIONS:
case EcorePackage.EREFERENCE__NAME:
case EcorePackage.EREFERENCE__ORDERED:
case EcorePackage.EREFERENCE__UNIQUE:
case EcorePackage.EREFERENCE__LOWER_BOUND:
case EcorePackage.EREFERENCE__UPPER_BOUND:
case EcorePackage.EREFERENCE__ETYPE:
case EcorePackage.EREFERENCE__EGENERIC_TYPE:
case EcorePackage.EREFERENCE__CHANGEABLE:
case EcorePackage.EREFERENCE__VOLATILE:
case EcorePackage.EREFERENCE__TRANSIENT:
case EcorePackage.EREFERENCE__DEFAULT_VALUE_LITERAL:
case EcorePackage.EREFERENCE__UNSETTABLE:
case EcorePackage.EREFERENCE__DERIVED:
case EcorePackage.EREFERENCE__CONTAINMENT:
case EcorePackage.EREFERENCE__RESOLVE_PROXIES:
case EcorePackage.EREFERENCE__EOPPOSITE:
case EcorePackage.EREFERENCE__EKEYS:
throw new UnsupportedSchemaChangeException();
}
throw new InvalidFeatureException();
}
@Override
public boolean eIsSet(int featureID) {
switch (featureID) {
case EcorePackage.EREFERENCE__EANNOTATIONS:
return (this.eAnnotations != null) && !this.eAnnotations.isEmpty();
case EcorePackage.EREFERENCE__NAME:
return this.getName() != null;
case EcorePackage.EREFERENCE__ORDERED:
return !this.isOrdered();
case EcorePackage.EREFERENCE__UNIQUE:
return !this.isUnique();
case EcorePackage.EREFERENCE__LOWER_BOUND:
return this.getLowerBound() != 0;
case EcorePackage.EREFERENCE__UPPER_BOUND:
return this.getUpperBound() != 1;
case EcorePackage.EREFERENCE__MANY:
return this.isMany();
case EcorePackage.EREFERENCE__REQUIRED:
return this.getLowerBound() > 0;
case EcorePackage.EREFERENCE__ETYPE:
return true; // Omega is the eType
case EcorePackage.EREFERENCE__EGENERIC_TYPE:
return false; // no generics in jgralab
case EcorePackage.EREFERENCE__CHANGEABLE:
return !this.isChangeable;
case EcorePackage.EREFERENCE__VOLATILE:
return this.isVolatile();
case EcorePackage.EREFERENCE__TRANSIENT:
return this.isTransient(); // but only for EMF View, really support?
case EcorePackage.EREFERENCE__DEFAULT_VALUE_LITERAL:
return false; // no default value for EReferences possible
case EcorePackage.EREFERENCE__DEFAULT_VALUE:
return false;// no default value for EReferences possible
case EcorePackage.EREFERENCE__UNSETTABLE:
return false; // can't forbid it
case EcorePackage.EREFERENCE__DERIVED:
return false; // can't derive
case EcorePackage.EREFERENCE__ECONTAINING_CLASS:
return true; // Alpha is the eContainingClass
case EcorePackage.EREFERENCE__CONTAINMENT:
return this.isContainment();
case EcorePackage.EREFERENCE__CONTAINER:
return this.isContainer();
case EcorePackage.EREFERENCE__RESOLVE_PROXIES:
return true; // no proxies in jgralab
case EcorePackage.EREFERENCE__EOPPOSITE:
return this.getEOpposite() != null;
case EcorePackage.EREFERENCE__EREFERENCE_TYPE:
return true; // Omega is the eReferenceType
case EcorePackage.EREFERENCE__EKEYS:
return (this.getEKeys() != null) && !this.getEKeys().isEmpty();
}
throw new InvalidFeatureException();
}
@Override
public Object eInvoke(int operationID, EList<?> arguments)
throws InvocationTargetException {
throw new UnsupportedFeatureException(UnsupportedFeature.OPERATION);
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.util.BasicExtendedMetaData.EClassifierExtendedMetaData.Holder
// --------------------------------------------------------------------------
private EStructuralFeatureExtendedMetaData md;
@Override
public EStructuralFeatureExtendedMetaData getExtendedMetaData() {
return this.md;
}
@Override
public void setExtendedMetaData(
EStructuralFeatureExtendedMetaData eStructuralFeatureExtendedMetaData) {
this.md = eStructuralFeatureExtendedMetaData;
}
// --------------------------------------------------------------------------
// Methods from interface
// org.eclipse.emf.ecore.EStructuralFeature.Internal
// --------------------------------------------------------------------------
@Override
public EStructuralFeature.Internal.SettingDelegate getSettingDelegate() {
// not supported
return null;
}
@Override
public void setSettingDelegate(
EStructuralFeature.Internal.SettingDelegate settingDelegate) {
throw new UnsupportedFeatureException(UnsupportedFeature.DELEGATION);
}
@Override
public boolean isFeatureMap() {
return false;
}
@Override
public FeatureMap.Entry.Internal getFeatureMapEntryPrototype() {
// not supported
return null;
}
@Override
public void setFeatureMapEntryPrototype(FeatureMap.Entry.Internal prototype) {
throw new UnsupportedFeatureException(UnsupportedFeature.FEATURE_MAP);
}
@Override
public boolean isID() {
return false;
}
}