blob: 7aeae585801afda3bbc4e6d15f623b817ab0378a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007,2008 E.D.Willink 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:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.qvt.declarative.emof.EMOF.util;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EGenericType;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EParameter;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.impl.EMOFExtendedMetaData;
import org.eclipse.qvt.declarative.ecore.adapters.AdaptingEObject;
import org.eclipse.qvt.declarative.ecore.mappings.EAttributeMap;
import org.eclipse.qvt.declarative.ecore.mappings.EAttributeOrEReference;
import org.eclipse.qvt.declarative.ecore.mappings.EClassMap;
import org.eclipse.qvt.declarative.ecore.mappings.EReferenceMap;
import org.eclipse.qvt.declarative.ecore.mappings.EReferenceToEClassifierMap;
import org.eclipse.qvt.declarative.ecore.mappings.EcoreFeatureElement;
import org.eclipse.qvt.declarative.ecore.mappings.ExtensionFeatureElement;
import org.eclipse.qvt.declarative.ecore.mappings.IMappingMetaDataRegistry;
import org.eclipse.qvt.declarative.ecore.mappings.MappingMetaDataRegistry;
import org.eclipse.qvt.declarative.ecore.mappings.MappingUtils;
import org.eclipse.qvt.declarative.emof.EMOF.EMOFPackage;
/**
* EMOFMappingMetaData defines the mapping between an EMOF adapting model and an Ecore model.
* The mapping is established by adapting model elements that adapt their Ecore counterparts.
* The mapping is established lazily, typically by invoking load or save on an
* AdaptingXMIResource.
*/
public class EMOFMappingMetaData extends AbstractEMOFMappingMetaData
{
protected static class Factory extends AbstractEMOFMappingMetaData.Factory
{
protected Factory(IMappingMetaDataRegistry.Install mappingMetaDataRegistry, EMOFMappingMetaData mappingMetaData) {
super(mappingMetaDataRegistry, mappingMetaData);
}
@Override
public EObject create(EClass ecoreClass) {
if (ecoreClass.getEPackage() == EMOFPackage.eINSTANCE) {
switch (ecoreClass.getClassifierID()) {
case EMOFPackage.CLASS: return getAdapter(EcoreFactory.eINSTANCE.createEClass());
case EMOFPackage.COMMENT: return createEAnnotationCommentAdapter();
// case EmofPackage.DATA_TYPE: return getAdapter(EcoreFactory.eINSTANCE.createEDataType());
case EMOFPackage.ENUMERATION: return getAdapter(EcoreFactory.eINSTANCE.createEEnum());
case EMOFPackage.ENUMERATION_LITERAL: return getAdapter(EcoreFactory.eINSTANCE.createEEnumLiteral());
// case EmofPackage.EXTENT: return getAdapter(EcoreFactory.eINSTANCE.createEExtent());
case EMOFPackage.FACTORY: return getAdapter(EcoreFactory.eINSTANCE.createEFactory());
// case EmofPackage.OBJECT: return getAdapter(EcoreFactory.eINSTANCE.createEObject());
case EMOFPackage.OPERATION: return getAdapter(createEOperation());
case EMOFPackage.PACKAGE: return getAdapter(EcoreFactory.eINSTANCE.createEPackage());
case EMOFPackage.PARAMETER: return getAdapter(createEParameter());
case EMOFPackage.PROPERTY: return getAdapter(createEProperty());
case EMOFPackage.PRIMITIVE_TYPE: return getAdapter(EcoreFactory.eINSTANCE.createEDataType());
// case EmofPackage.REFLECTIVE_COLLECTION: return getAdapter(EcoreFactory.eINSTANCE.createEReflectiveCollection());
// case EmofPackage.REFLECTIVE_SEQUENCE: return getAdapter(EcoreFactory.eINSTANCE.createEReflectiveSequence());
case EMOFPackage.TAG: return createEAnnotationTagAdapter();
// case EmofPackage.URI_EXTENT: return getAdapter(EcoreFactory.eINSTANCE.createEURIExtent());
}
}
return super.create(ecoreClass);
}
protected EObject createEAnnotationCommentAdapter() {
return getAnnotationMappingMetaData().createEAnnotationCommentAdapter(mappingMetaDataRegistry);
}
protected EObject createEAnnotationTagAdapter() {
return getAnnotationMappingMetaData().createEAnnotationTagAdapter(mappingMetaDataRegistry);
}
protected EOperation createEOperation() {
EOperation eOperation = EcoreFactory.eINSTANCE.createEOperation();
eOperation.setLowerBound(1);
eOperation.setOrdered(false);
return eOperation;
}
protected EParameter createEParameter() {
EParameter eParameter = EcoreFactory.eINSTANCE.createEParameter();
eParameter.setLowerBound(1);
eParameter.setOrdered(false);
return eParameter;
}
protected EAttributeOrEReference createEProperty() {
EAttributeOrEReference eProperty = new EAttributeOrEReference();
eProperty.setLowerBound(1);
eProperty.setOrdered(false);
return eProperty;
}
protected EMOFAnnotationMappingMetaData getAnnotationMappingMetaData() {
return ((EMOFMappingMetaData)mappingMetaData).getAnnotationMappingMetaData();
}
}
public static final EMOFMappingMetaData INSTANCE = new EMOFMappingMetaData(
EMOFPackage.eINSTANCE, EcorePackage.eINSTANCE, new String[] { EMOFExtendedMetaData.EMOF_PACKAGE_NS_URI });
protected final EMOFAnnotationMappingMetaData annotationMappingMetaData;
protected EMOFMappingMetaData(EPackage adaptingEPackage, EPackage ecoreEPackage, String[] uriAliases) {
super(adaptingEPackage, ecoreEPackage, uriAliases);
annotationMappingMetaData = new EMOFAnnotationMappingMetaData(this);
}
public Factory createFactory(IMappingMetaDataRegistry.Install mappingMetaDataRegistry) {
return new Factory(mappingMetaDataRegistry, this);
}
@Override
public String getAdaptingContentTypeIdentifier() {
return EMOFPackage.eCONTENT_TYPE;
}
@Override
public Resource.Factory getAdaptingResourceFactory(IMappingMetaDataRegistry mappingMetaDataRegistry) {
return new EMOFResourceFactoryImpl(mappingMetaDataRegistry);
}
public EMOFAnnotationMappingMetaData getAnnotationMappingMetaData() {
return annotationMappingMetaData;
}
@Override
public String getEcoreContentTypeIdentifier() {
return EcorePackage.eCONTENT_TYPE;
}
public void initialize(IMappingMetaDataRegistry.Install mappingMetaDataRegistry) {
// putEDataTypeMap(EcorePackage.Literals.EBOOLEAN, PrimitiveTypesPackage.Literals.BOOLEAN);
// putEDataTypeMap(EcorePackage.Literals.EDOUBLE, PrimitiveTypesPackage.Literals.REAL);
// putEDataTypeMap(EcorePackage.Literals.EINT, PrimitiveTypesPackage.Literals.INTEGER);
// putEDataTypeMap(EcorePackage.Literals.ESTRING, PrimitiveTypesPackage.Literals.STRING);
mappingMetaDataRegistry.putEDataTypeMap(EcorePackage.Literals.EBOOLEAN, EMOFPackage.Literals.BOOLEAN);
mappingMetaDataRegistry.putEDataTypeMap(EcorePackage.Literals.EDOUBLE, EMOFPackage.Literals.REAL);
mappingMetaDataRegistry.putEDataTypeMap(EcorePackage.Literals.EINT, EMOFPackage.Literals.INTEGER);
mappingMetaDataRegistry.putEDataTypeMap(EcorePackage.Literals.ESTRING, EMOFPackage.Literals.STRING);
annotationMappingMetaData.initialize(mappingMetaDataRegistry);
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.ECLASS, EMOFPackage.Literals.CLASS));
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.ECLASSIFIER, EMOFPackage.Literals.TYPE));
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.EDATA_TYPE, EMOFPackage.Literals.PRIMITIVE_TYPE));
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.EENUM, EMOFPackage.Literals.ENUMERATION));
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.EENUM_LITERAL, EMOFPackage.Literals.ENUMERATION_LITERAL));
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.EFACTORY, EMOFPackage.Literals.FACTORY));
//
// Don't transfer gratuitous generic types to/from xmi:Extension
//
mappingMetaDataRegistry.installClassToExtensionMap(new EClassMap.Extension(this, EcorePackage.Literals.EGENERIC_TYPE)
{
@Override public void postLoad(MappingMetaDataRegistry mappingMetaDataRegistry, EObject ecoreObject) {
if (MappingUtils.isGeneric((EGenericType)ecoreObject))
super.postLoad(mappingMetaDataRegistry, ecoreObject);
}
@Override public void preSave(MappingMetaDataRegistry mappingMetaDataRegistry, EObject ecoreObject) {
if (MappingUtils.isGeneric((EGenericType)ecoreObject))
super.preSave(mappingMetaDataRegistry, ecoreObject);
}
});
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.EMODEL_ELEMENT, EMOFPackage.Literals.ELEMENT));
mappingMetaDataRegistry.installClassToExtensionMap(new EClassMap.Extension(this, EcorePackage.Literals.EOBJECT)); // never used
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.EOPERATION, EMOFPackage.Literals.OPERATION));
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.EPACKAGE, EMOFPackage.Literals.PACKAGE));
mappingMetaDataRegistry.install(new EClassMap.Direct(this, EcorePackage.Literals.EPARAMETER, EMOFPackage.Literals.PARAMETER));
mappingMetaDataRegistry.installClassToExtensionMap(new EClassMap.Extension(this, EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY));
mappingMetaDataRegistry.install(new EClassMap(this, EcorePackage.Literals.ESTRUCTURAL_FEATURE, EMOFPackage.Literals.PROPERTY)
{
@Override public AdaptingEObject createAdapter(MappingMetaDataRegistry mappingMetaDataRegistry, EObject ecoreObject) {
return new EMOFPropertyAdapter(mappingMetaDataRegistry, this, (EAttributeOrEReference) ecoreObject);
}
});
mappingMetaDataRegistry.installClassToExtensionMap(new EClassMap.Extension(this, EcorePackage.Literals.ETYPE_PARAMETER));
//
// Must convert Property to EReference/EAttribute
//
EClassMap attributeClassMap = new EClassMap.Direct(this, EcorePackage.Literals.EATTRIBUTE, EMOFPackage.Literals.PROPERTY);
EClassMap referenceClassMap = new EClassMap.Direct(this, EcorePackage.Literals.EREFERENCE, EMOFPackage.Literals.PROPERTY);
mappingMetaDataRegistry.putEcoreEClassMap(attributeClassMap.getEcoreEClass(), attributeClassMap);
mappingMetaDataRegistry.putEcoreEClassMap(referenceClassMap.getEcoreEClass(), referenceClassMap);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EATTRIBUTE__ID, EMOFPackage.Literals.PROPERTY__IS_ID);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ECLASS__ABSTRACT, EMOFPackage.Literals.CLASS__IS_ABSTRACT);
//
// Must exclude non-generic types from EClass.eGenericSuperTypes.
//
mappingMetaDataRegistry.install(
new EReferenceMap(mappingMetaDataRegistry,
new EcoreFeatureElement.EReferenceElement(EcorePackage.Literals.ECLASS__EGENERIC_SUPER_TYPES)
{
@Override
public Object get(IMappingMetaDataRegistry.Install mappingMetaDataRegistry, EObject object, boolean resolveProxies) {
return MappingUtils.excludeNonGenericTypes(((EClass)object).getEGenericSuperTypes());
}
},
ExtensionFeatureElement.create(EcorePackage.Literals.ECLASS__EGENERIC_SUPER_TYPES, null)
)
);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ECLASS__EOPERATIONS, EMOFPackage.Literals.CLASS__OWNED_OPERATION);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ECLASS__ESTRUCTURAL_FEATURES, EMOFPackage.Literals.CLASS__OWNED_ATTRIBUTE); // ownedProperty???
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ECLASS__ESUPER_TYPES, EMOFPackage.Literals.CLASS__SUPER_CLASS);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.ECLASS__INTERFACE);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.ECLASSIFIER__ETYPE_PARAMETERS);
//
// Ignore instanceClassName if instanceClass.getName() != instanceTypeName
//
mappingMetaDataRegistry.install(
new EAttributeMap(mappingMetaDataRegistry,
new EcoreFeatureElement.EAttributeElement(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME)
{
@Override
public Object get(IMappingMetaDataRegistry.Install mappingMetaDataRegistry, EObject object, boolean resolveProxies) {
Class<?> instanceClass = (Class<?>)object.eGet(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS, resolveProxies);
Object instanceTypeName = object.eGet(EcorePackage.Literals.ECLASSIFIER__INSTANCE_TYPE_NAME, resolveProxies);
if ((instanceClass == null) || !instanceClass.getName().equals(instanceTypeName))
return null;
else
return super.get(mappingMetaDataRegistry, object, resolveProxies);
}
},
ExtensionFeatureElement.create(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME,
mappingMetaDataRegistry.createDemandExtensionAttributeAsReferenceFeature(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME))
)
);
//
// Ignore instanceTypeName if instanceClass.getName() == instanceTypeName
//
mappingMetaDataRegistry.install(
new EAttributeMap(mappingMetaDataRegistry,
new EcoreFeatureElement.EAttributeElement(EcorePackage.Literals.ECLASSIFIER__INSTANCE_TYPE_NAME)
{
@Override
public Object get(IMappingMetaDataRegistry.Install mappingMetaDataRegistry, EObject object, boolean resolveProxies) {
Class<?> instanceClass = (Class<?>)object.eGet(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS, resolveProxies);
Object instanceTypeName = super.get(mappingMetaDataRegistry, object, resolveProxies);
if ((instanceClass == null) || !instanceClass.getName().equals(instanceTypeName))
return instanceTypeName;
else
return null;
}
},
ExtensionFeatureElement.create(EcorePackage.Literals.ECLASSIFIER__INSTANCE_TYPE_NAME,
mappingMetaDataRegistry.createDemandExtensionAttributeAsReferenceFeature(EcorePackage.Literals.ECLASSIFIER__INSTANCE_TYPE_NAME))
)
);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EDATA_TYPE__SERIALIZABLE);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EENUM__ELITERALS, EMOFPackage.Literals.ENUMERATION__OWNED_LITERAL);
// FIXME Only save literal if non-default
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EENUM_LITERAL__LITERAL);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EENUM_LITERAL__VALUE);
// Ecore's feature is transient
mappingMetaDataRegistry.installFeatureToFeatureMap(null, EMOFPackage.Literals.FACTORY__PACKAGE);
//
// Generic types are not part of EMOF so mapping their classifiers is not necessary.
//
mappingMetaDataRegistry.installFeatureToExtensionAttributeOrElementMap(EcorePackage.Literals.EGENERIC_TYPE__ECLASSIFIER);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EGENERIC_TYPE__ELOWER_BOUND);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EGENERIC_TYPE__ETYPE_ARGUMENTS);
mappingMetaDataRegistry.installFeatureToExtensionAttributeOrElementMap(EcorePackage.Literals.EGENERIC_TYPE__ETYPE_PARAMETER);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EGENERIC_TYPE__EUPPER_BOUND);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ENAMED_ELEMENT__NAME, EMOFPackage.Literals.NAMED_ELEMENT__NAME);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EOPERATION__EEXCEPTIONS, EMOFPackage.Literals.OPERATION__RAISED_EXCEPTION);
//
// Must exclude non-generic exceptions from EOperation.eGenericExceptions.
//
mappingMetaDataRegistry.install(
new EReferenceMap(mappingMetaDataRegistry,
new EcoreFeatureElement.EReferenceElement(EcorePackage.Literals.EOPERATION__EGENERIC_EXCEPTIONS)
{
@Override
public Object get(IMappingMetaDataRegistry.Install mappingMetaDataRegistry, EObject object, boolean resolveProxies) {
return MappingUtils.excludeNonGenericTypes(((EOperation)object).getEGenericExceptions());
}
},
ExtensionFeatureElement.create(EcorePackage.Literals.EOPERATION__EGENERIC_EXCEPTIONS, null)
)
);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EOPERATION__EPARAMETERS, EMOFPackage.Literals.OPERATION__OWNED_PARAMETER);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EOPERATION__ETYPE_PARAMETERS);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EPACKAGE__ECLASSIFIERS, EMOFPackage.Literals.PACKAGE__OWNED_TYPE);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EPACKAGE__ESUBPACKAGES, EMOFPackage.Literals.PACKAGE__NESTED_PACKAGE);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EPACKAGE__NS_PREFIX);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EPACKAGE__NS_URI, EMOFPackage.Literals.PACKAGE__URI);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EREFERENCE__CONTAINMENT, EMOFPackage.Literals.PROPERTY__IS_COMPOSITE);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EREFERENCE__EKEYS, null); // no property
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.EREFERENCE__EOPPOSITE, EMOFPackage.Literals.PROPERTY__OPPOSITE);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.EREFERENCE__RESOLVE_PROXIES);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY__KEY, EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY__KEY);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY__VALUE, EcorePackage.Literals.ESTRING_TO_STRING_MAP_ENTRY__VALUE);
//
// Must invert value between changeable and isReadOnly.
//
mappingMetaDataRegistry.install(
new EAttributeMap(mappingMetaDataRegistry,
EcoreFeatureElement.create(EcorePackage.Literals.ESTRUCTURAL_FEATURE__CHANGEABLE),
EcoreFeatureElement.create(EMOFPackage.Literals.PROPERTY__IS_READ_ONLY))
{
@Override
protected Object exportValue(EObject adaptingObject, Object ecoreValue) {
boolean changeable = ((Boolean)ecoreValue).booleanValue();
return super.exportValue(adaptingObject, Boolean.valueOf(!changeable));
}
@Override
protected Object importValue(Resource adaptingResource, EObject adaptingObject, Object adaptingValue) {
boolean isReadOnly = ((Boolean)adaptingValue).booleanValue();
return super.importValue(adaptingResource, adaptingObject, Boolean.valueOf(!isReadOnly));
}
}
);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ESTRUCTURAL_FEATURE__DEFAULT_VALUE_LITERAL, EMOFPackage.Literals.PROPERTY__DEFAULT);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ESTRUCTURAL_FEATURE__DERIVED, EMOFPackage.Literals.PROPERTY__IS_DERIVED);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.ESTRUCTURAL_FEATURE__TRANSIENT);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.ESTRUCTURAL_FEATURE__UNSETTABLE);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.ESTRUCTURAL_FEATURE__VOLATILE);
mappingMetaDataRegistry.installFeatureToExtensionElementMap(EcorePackage.Literals.ETYPE_PARAMETER__EBOUNDS);
//
// Must not get ETypedElement.eGenericType if ETypedElement.eType will do.
//
mappingMetaDataRegistry.install(
new EReferenceMap(mappingMetaDataRegistry,
new EcoreFeatureElement.EReferenceElement(EcorePackage.Literals.ETYPED_ELEMENT__EGENERIC_TYPE)
{
@Override
public Object get(IMappingMetaDataRegistry.Install mappingMetaDataRegistry, EObject object, boolean resolveProxies) {
if (!MappingUtils.isGeneric((ETypedElement)object))
return null;
return super.get(mappingMetaDataRegistry, object, resolveProxies);
}
},
ExtensionFeatureElement.create(EcorePackage.Literals.ETYPED_ELEMENT__EGENERIC_TYPE,
mappingMetaDataRegistry.createDemandExtensionReferenceFeature(EcorePackage.Literals.ETYPED_ELEMENT__EGENERIC_TYPE, EcorePackage.Literals.ETYPED_ELEMENT__EGENERIC_TYPE.isContainment())))
);
//
// Must not get ETypedElement.eType if there is an eGenericType.
//
mappingMetaDataRegistry.install(
new EReferenceToEClassifierMap(mappingMetaDataRegistry,
new EcoreFeatureElement.EReferenceElement(EcorePackage.Literals.ETYPED_ELEMENT__ETYPE)
{
@Override
public Object get(IMappingMetaDataRegistry.Install mappingMetaDataRegistry, EObject object, boolean resolveProxies) {
if (MappingUtils.isGeneric((ETypedElement)object))
return null;
return super.get(mappingMetaDataRegistry, object, resolveProxies);
}
},
EcoreFeatureElement.create(EMOFPackage.Literals.TYPED_ELEMENT__TYPE))
);
//
// Must force saving of values if the Ecore is not the EMOF default.
//
mappingMetaDataRegistry.install(
new EAttributeMap(mappingMetaDataRegistry,
EcoreFeatureElement.create(EcorePackage.Literals.ETYPED_ELEMENT__LOWER_BOUND),
EcoreFeatureElement.create(EMOFPackage.Literals.MULTIPLICITY_ELEMENT__LOWER))
{
@Override public boolean isSetEcore(EObject ecoreObject) {
Object lowerBound = ecoreObject.eGet(EcorePackage.Literals.ETYPED_ELEMENT__LOWER_BOUND);
return !(lowerBound instanceof Integer) || (((Integer) lowerBound).intValue() != 1);
}
}
);
//
// Must force saving of values the Ecore is not the EMOF default.
//
mappingMetaDataRegistry.install(
new EAttributeMap(mappingMetaDataRegistry,
EcoreFeatureElement.create(EcorePackage.Literals.ETYPED_ELEMENT__ORDERED),
EcoreFeatureElement.create(EMOFPackage.Literals.MULTIPLICITY_ELEMENT__IS_ORDERED))
{
@Override public boolean isSetEcore(EObject ecoreObject) {
Object isOrdered = ecoreObject.eGet(EcorePackage.Literals.ETYPED_ELEMENT__ORDERED);
return !(isOrdered instanceof Boolean) || (((Boolean) isOrdered).booleanValue() != false);
}
}
);
mappingMetaDataRegistry.installFeatureToFeatureMap(EcorePackage.Literals.ETYPED_ELEMENT__UNIQUE, EMOFPackage.Literals.MULTIPLICITY_ELEMENT__IS_UNIQUE);
//
// Conversions between -1 and * are in EmofFactoryImpl.convert/createUnlimitedNaturalFromString,
// so the inherited string conversions are suppressed.
//
mappingMetaDataRegistry.install(
new EAttributeMap(mappingMetaDataRegistry,
EcoreFeatureElement.create(EcorePackage.Literals.ETYPED_ELEMENT__UPPER_BOUND),
EcoreFeatureElement.create(EMOFPackage.Literals.MULTIPLICITY_ELEMENT__UPPER))
{
@Override
protected Object exportValue(EObject adaptingObject, Object ecoreValue) {
return ecoreValue;
}
@Override
protected Object importValue(Resource adaptingResource, EObject adaptingObject, Object adaptingValue) {
return adaptingValue;
}
});
}
}