blob: 7840841795dc06ed680adb3cdf99a1f47d1022f6 [file] [log] [blame]
/**
* Copyright (c) 2013 itemis AG 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:
* itemis AG - initial API and implementation
*/
package org.eclipse.rmf.serialization;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.ecore.EAnnotation;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
public class XMLPersistenceMappingExtendedMetaDataImpl extends BasicExtendedMetaData implements XMLPersistenceMappingExtendedMetaData {
static final String WRAPPER_NAME = "wrapperName"; //$NON-NLS-1$
static final String CLASSIFIER_NAME_SUFFIX = "classifierNameSuffix"; //$NON-NLS-1$
static final String FEATURE_WRAPPER_ELEMENT = "featureWrapperElement"; //$NON-NLS-1$
static final String FEATURE_ELEMENT = "featureElement"; //$NON-NLS-1$
static final String CLASSIFIER_WRAPPER_ELEMENT = "classifierWrapperElement"; //$NON-NLS-1$
static final String CLASSIFIER_ELEMENT = "classifierElement"; //$NON-NLS-1$
static final int FEATURE_WRAPPER_ELEMENT_MASK = 8;
static final int FEATURE_ELEMENT_MASK = 4;
static final int CLASSIFIER_WRAPPER_ELEMENT_MASK = 2;
static final int CLASSIFIER_ELEMENT_MASK = 1;
protected EPackage.Registry registry;
protected int[] fallbackSerializationConfiguration = {
SERIALIZATION_STRUCTURE__0000__NONE /* 0000 */,
// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0001 */,
SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT /* 0001 */,
// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0010 */,
SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT /* 0010 */,
// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0011 */,
SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0011 */,
SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT /* 0100 */,
SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT/* 0101 */,
// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0110 */,
SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT/* 0110 */,
// SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 0111 */,
SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT /* 0111 */,
SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT /* 1000 */,
SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 1001 */,
SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT/* 1010 */,
SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT/* 1011 */,
SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT/* 1100_ */,
SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT /* 1101 */,
SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT/* 1110 */,
SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT /* 1111 */
};
static final String PLURAL_EXTENSION = "s"; //$NON-NLS-1$
protected Map<EModelElement, Object> extendedMetaDataCache = new HashMap<EModelElement, Object>();
protected Map<EModelElement, EAnnotation> annotationCache = new HashMap<EModelElement, EAnnotation>();
public static interface XMLPersistenceMappingEPackageExtendedMetaData {
EClassifier getType(String name);
EClassifier getType(String name, EStructuralFeature feature);
EClassifier getTypeByWrapperName(String wrapperName);
void renameToXMLName(EClassifier eClassifier, String newName);
void renameToXMLWrapperName(EClassifier eClassifier, String newName);
}
public class XMLPersistenceMappingEPackageExtendedMetaDataImpl implements XMLPersistenceMappingEPackageExtendedMetaData {
protected EPackage ePackage;
protected boolean isInitialized;
protected boolean isQualified;
protected Map<String, EClassifier> xmlNameToClassifierMap = new HashMap<String, EClassifier>();
protected Map<String, EClassifier> xmlWrapperNameToClassifierMap = new HashMap<String, EClassifier>();
public XMLPersistenceMappingEPackageExtendedMetaDataImpl(EPackage ePackage) {
this.ePackage = ePackage;
}
public EClassifier getType(String name) {
EClassifier result = null;
if (xmlNameToClassifierMap != null) {
result = xmlNameToClassifierMap.get(name);
}
if (result == null) {
List<EClassifier> eClassifiers = ePackage.getEClassifiers();
int size = eClassifiers.size();
if (xmlNameToClassifierMap == null || xmlNameToClassifierMap.size() != size) {
Map<String, EClassifier> nameToClassifierMap = new HashMap<String, EClassifier>();
if (xmlNameToClassifierMap != null) {
nameToClassifierMap.putAll(xmlNameToClassifierMap);
}
// For demand created created packages we allow the list of classifiers to grow
// so this should handle those additional instances.
//
int originalMapSize = nameToClassifierMap.size();
for (int i = originalMapSize; i < size; ++i) {
EClassifier eClassifier = eClassifiers.get(i);
String eClassifierName = getXMLName(eClassifier);
EClassifier conflictingEClassifier = nameToClassifierMap.put(eClassifierName, eClassifier);
if (conflictingEClassifier != null && conflictingEClassifier != eClassifier) {
nameToClassifierMap.put(eClassifierName, conflictingEClassifier);
}
}
if (nameToClassifierMap.size() != size) {
for (int i = 0; i < originalMapSize; ++i) {
EClassifier eClassifier = eClassifiers.get(i);
String eClassifierName = getXMLName(eClassifier);
EClassifier conflictingEClassifier = nameToClassifierMap.put(eClassifierName, eClassifier);
if (conflictingEClassifier != null && conflictingEClassifier != eClassifier) {
nameToClassifierMap.put(eClassifierName, conflictingEClassifier);
}
}
}
result = nameToClassifierMap.get(name);
xmlNameToClassifierMap = nameToClassifierMap;
}
}
return result;
}
public EClassifier getType(String name, EStructuralFeature feature) {
// TODO optimize implementation for performance
String classifierNameSuffix = getXMLPersistenceMappingExtendedMetaData(feature).getXMLClassiferNameSuffix();
EClassifier classifier;
int classifierNameSuffixLength = classifierNameSuffix.length();
if (0 == classifierNameSuffixLength) {
classifier = getType(name);
} else {
if (name.endsWith(classifierNameSuffix)) {
String classfierName = name.substring(0, name.length() - classifierNameSuffixLength);
classifier = getType(classfierName);
} else {
classifier = null;
}
}
return classifier;
}
public EClassifier getTypeByWrapperName(String name) {
EClassifier result = null;
if (xmlWrapperNameToClassifierMap != null) {
result = xmlWrapperNameToClassifierMap.get(name);
}
if (result == null) {
List<EClassifier> eClassifiers = ePackage.getEClassifiers();
int size = eClassifiers.size();
if (xmlWrapperNameToClassifierMap == null || xmlWrapperNameToClassifierMap.size() != size) {
Map<String, EClassifier> wrapperNameToClassifierMap = new HashMap<String, EClassifier>();
if (xmlWrapperNameToClassifierMap != null) {
wrapperNameToClassifierMap.putAll(xmlWrapperNameToClassifierMap);
}
// For demand created created packages we allow the list of classifiers to grow
// so this should handle those additional instances.
//
int originalMapSize = wrapperNameToClassifierMap.size();
for (int i = originalMapSize; i < size; ++i) {
EClassifier eClassifier = eClassifiers.get(i);
String eClassifierWrapperName = getXMLWrapperName(eClassifier);
EClassifier conflictingEClassifier = wrapperNameToClassifierMap.put(eClassifierWrapperName, eClassifier);
if (conflictingEClassifier != null && conflictingEClassifier != eClassifier) {
wrapperNameToClassifierMap.put(eClassifierWrapperName, conflictingEClassifier);
}
}
if (wrapperNameToClassifierMap.size() != size) {
for (int i = 0; i < originalMapSize; ++i) {
EClassifier eClassifier = eClassifiers.get(i);
String eClassifierWrapperName = getXMLWrapperName(eClassifier);
EClassifier conflictingEClassifier = wrapperNameToClassifierMap.put(eClassifierWrapperName, eClassifier);
if (conflictingEClassifier != null && conflictingEClassifier != eClassifier) {
wrapperNameToClassifierMap.put(eClassifierWrapperName, conflictingEClassifier);
}
}
}
result = wrapperNameToClassifierMap.get(name);
xmlWrapperNameToClassifierMap = wrapperNameToClassifierMap;
}
}
return result;
}
public void renameToXMLName(EClassifier eClassifier, String newName) {
if (xmlNameToClassifierMap != null) {
xmlNameToClassifierMap.values().remove(eClassifier);
xmlNameToClassifierMap.put(newName, eClassifier);
}
}
public void renameToXMLWrapperName(EClassifier eClassifier, String newName) {
if (xmlWrapperNameToClassifierMap != null) {
xmlWrapperNameToClassifierMap.values().remove(eClassifier);
xmlWrapperNameToClassifierMap.put(newName, eClassifier);
}
}
}
public static interface XMLPersistenceMappingEClassifierExtendedMetaData {
String getXMLName();
void setXMLName(String name);
String getXMLWrapperName();
void setXMLWrapperName(String name);
EStructuralFeature getFeatureByXMLElementName(String namespace, String xmlElementName);
}
class XMLPersistenceMappingEDataTypeExtendedMetaDataImpl implements XMLPersistenceMappingEClassifierExtendedMetaData {
protected static final String UNINITIALIZED_STRING = "uninitialized"; //$NON-NLS-1$
protected static final int UNINITIALIZED_INT = -2;
protected EClassifier eClassifier;
protected String xmlName = UNINITIALIZED_STRING;
protected String xmlWrapperName = UNINITIALIZED_STRING;
public XMLPersistenceMappingEDataTypeExtendedMetaDataImpl(EClassifier eClassifier) {
super();
this.eClassifier = eClassifier;
}
public String getXMLName() {
if (UNINITIALIZED_STRING == xmlName) {
setXMLName(basicGetName(eClassifier));
}
return xmlName;
}
public void setXMLName(String xmlName) {
this.xmlName = xmlName;
}
public String getXMLWrapperName() {
if (UNINITIALIZED_STRING == xmlName) {
setXMLWrapperName(basicGetWrapperName(eClassifier));
}
return xmlWrapperName;
}
public void setXMLWrapperName(String xmlWrapperName) {
this.xmlWrapperName = xmlWrapperName;
}
public EStructuralFeature getFeatureByXMLElementName(String namespace, String xmlElementName) {
throw new UnsupportedOperationException("Can't get a feature of an EDataType"); //$NON-NLS-1$
}
}
class XMLPersistenceMappingEClassExtendedMetaDataImpl implements XMLPersistenceMappingEClassifierExtendedMetaData {
protected static final String UNINITIALIZED_STRING = "uninitialized"; //$NON-NLS-1$
protected static final int UNINITIALIZED_INT = -2;
protected EClass eClass;
protected String xmlName = UNINITIALIZED_STRING;
protected String xmlWrapperName = UNINITIALIZED_STRING;
protected Map<String, EStructuralFeature> xmlNameToEStructuralFeatureMap = new HashMap<String, EStructuralFeature>();
public XMLPersistenceMappingEClassExtendedMetaDataImpl(EClassifier eClassifier) {
super();
assert eClassifier instanceof EClass;
eClass = (EClass) eClassifier;
}
public String getXMLName() {
if (UNINITIALIZED_STRING == xmlName) {
setXMLName(basicGetName(eClass));
}
return xmlName;
}
public void setXMLName(String xmlName) {
this.xmlName = xmlName;
}
public String getXMLWrapperName() {
if (UNINITIALIZED_STRING == xmlWrapperName) {
setXMLWrapperName(basicGetWrapperName(eClass));
}
return xmlWrapperName;
}
public void setXMLWrapperName(String xmlWrapperName) {
this.xmlWrapperName = xmlWrapperName;
}
/**
* return first EStructuralFeature that fits to the XML element name TODO: add error handling for ambiguous
* features
*/
public EStructuralFeature getFeatureByXMLElementName(String namespace, String xmlElementName) {
// try to find the EStructural feature locally
// TODO: consider namespace
EStructuralFeature result = xmlNameToEStructuralFeatureMap.get(xmlElementName);
if (null == result) {
Iterator<EStructuralFeature> allFeaturesIter = eClass.getEAllStructuralFeatures().iterator();
// TODO: we should iterate over features with no kind or
List<EStructuralFeature> results = new ArrayList<EStructuralFeature>();
EStructuralFeature possibleResult;
while (allFeaturesIter.hasNext()) {
EStructuralFeature feature = allFeaturesIter.next();
possibleResult = null;
String xmlWrapperName = getXMLPersistenceMappingExtendedMetaData(feature).getXMLWrapperName();
// search by feature wrapper
if (xmlWrapperName.equals(xmlElementName) && isIdentifiedByFeatureWrapper(feature)) {
if (isIdentifiedByFeatureWrapper(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
}
if (null == possibleResult) {
// search by feature name
String xmlName = getXMLPersistenceMappingExtendedMetaData(feature).getXMLName();
if (xmlName.equals(xmlElementName)) {
if (isIdentifiedByFeature(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
}
}
if (null == possibleResult) {
// search by type wrapper (assuming type is type of feature)
String classifierWrapperXMLName = getXMLPersistenceMappingExtendedMetaData(feature.getEType()).getXMLWrapperName();
if (classifierWrapperXMLName.equals(xmlElementName)) {
if (isIdentifiedByClassifierWrapper(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
} else {
// search by type wrapper name (assuming type not type of feature)
EClassifier classifier = getTypeByXMLWrapperName(namespace, xmlElementName);
if (null != classifier) {
if (feature.getEType().equals(classifier)) {
if (isIdentifiedByClassifierWrapper(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
} else if (classifier instanceof EClass) {
EClass eClass = (EClass) classifier;
// check if the identified is a sub-type of the eType of the reference
// note: EObject is not listed in EAllSuperTypes
if (feature.getEType() == EcorePackage.eINSTANCE.getEObject()
|| eClass.getEAllSuperTypes().contains(feature.getEType())) {
if (isIdentifiedByClassifierWrapper(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
} else {
// not found, continue with next feature
}
} else {
// not found, continue with next feature
}
}
}
}
if (null == possibleResult) {
// search by type name (assuming type not type of feature)
EClassifier classifier;
EPackage ePackage = getPackage(namespace);
if (null == ePackage) {
// unregistered package
classifier = demandType(namespace, xmlElementName);
} else {
// registered package
classifier = getTypeByXMLName(namespace, xmlElementName);
}
if (null != classifier) {
if (feature.getEType().equals(classifier)) {
if (isIdentifiedByClassifier(feature)) {
possibleResult = feature;
} else if (isEReference_Contained0000(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
} else if (classifier instanceof EClass) {
EClass eClass = (EClass) classifier;
// check if the identified is a sub-type of the eType of the reference
// note: EObject is not listed in EAllSuperTypes
if (feature.getEType() == EcorePackage.eINSTANCE.getEObject()
|| eClass.getEAllSuperTypes().contains(feature.getEType())) {
if (isIdentifiedByClassifier(feature)) {
possibleResult = feature;
} else if (isEReference_Contained0000(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
} else if (isEReference_Contained0000(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
} else if (isEReference_Contained0000(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
} else if (isEReference_Contained0000(feature)) {
possibleResult = feature;
} else {
// not found, continue with next feature
}
}
if (null != possibleResult) {
results.add(possibleResult);
}
} // while
// if there are multiple valid features, we prefer the feature that is many and is not NONE
int size = results.size();
if (1 == size) {
result = results.get(0);
} else if (1 < size) {
// rule 1 we like the features that are explicitly selected
List<EStructuralFeature> identifiedFeatures = new ArrayList<EStructuralFeature>();
List<EStructuralFeature> noneFeatures = new ArrayList<EStructuralFeature>();
for (int i = 0; i < size; i++) {
EStructuralFeature feature = results.get(i);
if (isNone(feature)) {
noneFeatures.add(feature);
} else {
identifiedFeatures.add(feature);
}
}
if (identifiedFeatures.isEmpty()) {
// there are none Features only
results = noneFeatures;
} else {
results = identifiedFeatures;
}
result = results.get(0);
// try to find a better features that is many
for (EStructuralFeature feature : results) {
if (feature.isMany()) {
result = feature;
break;
}
}
}
xmlNameToEStructuralFeatureMap.put(xmlElementName, result);
} // if (null == result)
// TODO: fall back to standard serialization?
return result;
}
}
public static interface XMLPersistenceMappingEStructuralFeatureExtendedMetaData {
String getXMLName();
void setXMLName(String name);
String getXMLWrapperName();
void setXMLWrapperName(String name);
String getXMLClassiferNameSuffix();
void setXMLClassiferNameSuffix(String suffix);
boolean isXMLPersistenceMappingEnabled();
int getFeatureSerializationStructure();
void setFeatureSerializationStructure(int featureSerializationStructure);
}
class XMLPersistenceMappingEStructuralFeatureExtendedMetaDataImpl implements XMLPersistenceMappingEStructuralFeatureExtendedMetaData {
protected static final String UNINITIALIZED_STRING = "uninitialized"; //$NON-NLS-1$
protected static final int UNINITIALIZED_INT = -2;
protected EStructuralFeature eStructuralFeature;
protected String xmlName = UNINITIALIZED_STRING;
protected String xmlWrapperName = UNINITIALIZED_STRING;
protected String xmlClassifierNameSuffix = UNINITIALIZED_STRING;
protected int featureSerializationStructure = UNINITIALIZED_INT;
protected Boolean xmlPersistenceMappingEnabled = null;
public XMLPersistenceMappingEStructuralFeatureExtendedMetaDataImpl(EStructuralFeature eStructuralFeature) {
super();
this.eStructuralFeature = eStructuralFeature;
}
public String getXMLName() {
if (UNINITIALIZED_STRING == xmlName) {
setXMLName(basicGetName(eStructuralFeature));
}
return xmlName;
}
public void setXMLName(String xmlName) {
this.xmlName = xmlName;
}
public String getXMLWrapperName() {
if (UNINITIALIZED_STRING == xmlWrapperName) {
setXMLWrapperName(basicGetWrapperName(eStructuralFeature));
}
return xmlWrapperName;
}
public void setXMLWrapperName(String xmlWrapperName) {
this.xmlWrapperName = xmlWrapperName;
}
public String getXMLClassiferNameSuffix() {
if (UNINITIALIZED_STRING == xmlClassifierNameSuffix) {
setXMLClassiferNameSuffix(basicGetClassifierNameSuffix(eStructuralFeature));
}
return xmlClassifierNameSuffix;
}
public boolean isXMLPersistenceMappingEnabled() {
if (null == xmlPersistenceMappingEnabled) {
setXMLPersistenceMappingEnabled(basicIsXMLPersistenceMappingEnabled(eStructuralFeature));
}
return xmlPersistenceMappingEnabled;
};
void setXMLPersistenceMappingEnabled(Boolean xmlPersistenceMappingEnabled) {
this.xmlPersistenceMappingEnabled = xmlPersistenceMappingEnabled;
};
public void setXMLClassiferNameSuffix(String suffix) {
xmlClassifierNameSuffix = suffix;
}
public int getFeatureSerializationStructure() {
if (UNINITIALIZED_INT == featureSerializationStructure) {
setFeatureSerializationStructure(basicGetFeatureSerializationStructure(eStructuralFeature));
}
return featureSerializationStructure;
}
public void setFeatureSerializationStructure(int featureSerializationStructure) {
this.featureSerializationStructure = featureSerializationStructure;
}
}
public XMLPersistenceMappingExtendedMetaDataImpl() {
this(EPackage.Registry.INSTANCE);
}
public XMLPersistenceMappingExtendedMetaDataImpl(EPackage.Registry registry) {
super();
this.registry = registry;
}
public XMLPersistenceMappingExtendedMetaDataImpl(int[] fallbackSerializations) {
this();
int min = 0;
int max = fallbackSerializationConfiguration.length;
for (int i = min; i < max && i < fallbackSerializations.length; i++) {
int newValue = fallbackSerializations[i];
if (min <= i && i < max) {
fallbackSerializationConfiguration[i] = newValue;
}
}
}
public boolean isXMLPersistenceMappingEnabled(EStructuralFeature feature) {
return null != getRMFAnnotation(feature, false);
}
public String getXMLName(EClassifier eClassifier) {
return getXMLPersistenceMappingExtendedMetaData(eClassifier).getXMLName();
}
public String getXMLWrapperName(EClassifier eClassifier) {
return getXMLPersistenceMappingExtendedMetaData(eClassifier).getXMLWrapperName();
}
public String getXMLName(EClassifier eClassifier, EStructuralFeature eStructuralFeature) {
StringBuffer buffer = new StringBuffer();
buffer.append(getXMLPersistenceMappingExtendedMetaData(eClassifier).getXMLName());
buffer.append(getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).getXMLClassiferNameSuffix());
return buffer.toString();
}
public void setXMLWrapperName(EClassifier eClassifier, String xmlWrapperName) {
EAnnotation eAnnotation = getRMFAnnotation(eClassifier, true);
eAnnotation.getDetails().put(WRAPPER_NAME, xmlWrapperName);
getXMLPersistenceMappingExtendedMetaData(eClassifier).setXMLWrapperName(xmlWrapperName);
EPackage ePackage = eClassifier.getEPackage();
if (ePackage != null) {
getXMLPersistenceMappingExtendedMetaData(ePackage).renameToXMLWrapperName(eClassifier, xmlWrapperName);
}
}
public String getXMLName(EStructuralFeature eStructuralFeature) {
return getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).getXMLName();
}
public String getXMLWrapperName(EStructuralFeature eStructuralFeature) {
return getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).getXMLWrapperName();
}
public void setXMLWrapperName(EStructuralFeature eStructuralFeature, String xmlWrapperName) {
EAnnotation eAnnotation = getRMFAnnotation(eStructuralFeature, true);
eAnnotation.getDetails().put(WRAPPER_NAME, xmlWrapperName);
getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).setXMLWrapperName(xmlWrapperName);
}
public int getFeatureSerializationStructure(EStructuralFeature eStructuralFeature) {
return getXMLPersistenceMappingExtendedMetaData(eStructuralFeature).getFeatureSerializationStructure();
}
public void setFeatureSerializationStructure(EStructuralFeature eStructuralFeature, int serializationStructure) {
// TODO Auto-generated method stub
}
public EClassifier getTypeByXMLName(String namespace, String xmlName) {
EPackage ePackage = getPackage(namespace);
return ePackage == null ? null : getTypeByXMLName(ePackage, xmlName);
}
public EClassifier getTypeByXMLName(String namespace, String xmlName, EStructuralFeature feature) {
EPackage ePackage = getPackage(namespace);
return ePackage == null ? null : getTypeByXMLName(ePackage, xmlName, feature);
}
public EClassifier getTypeByXMLWrapperName(String namespace, String xmlWrapperName) {
EPackage ePackage = getPackage(namespace);
return ePackage == null ? null : getTypeByXMLWrapperName(ePackage, xmlWrapperName);
}
public EClassifier getTypeByXMLName(EPackage ePackage, String xmlName) {
return getXMLPersistenceMappingExtendedMetaData(ePackage).getType(xmlName);
}
public EClassifier getTypeByXMLName(EPackage ePackage, String xmlName, EStructuralFeature feature) {
return getXMLPersistenceMappingExtendedMetaData(ePackage).getType(xmlName, feature);
}
public EClassifier getTypeByXMLWrapperName(EPackage ePackage, String xmlWrapperName) {
return getXMLPersistenceMappingExtendedMetaData(ePackage).getTypeByWrapperName(xmlWrapperName);
}
@Override
public EPackage getPackage(String namespace) {
EPackage ePackage = registry.getEPackage(namespace);
return ePackage;
}
public EStructuralFeature getFeatureByXMLElementName(EClass eClass, String namespace, String xmlElementName) {
return getXMLPersistenceMappingExtendedMetaData(eClass).getFeatureByXMLElementName(namespace, xmlElementName);
}
protected boolean basicIsXMLPersistenceMappingEnabled(EStructuralFeature eStructuralFeature) {
return null != getRMFAnnotation(eStructuralFeature, false);
}
protected String basicGetWrapperName(EClassifier eClassifier) {
EAnnotation eAnnotation = getRMFAnnotation(eClassifier, false);
String result = null;
if (eAnnotation != null) {
result = eAnnotation.getDetails().get(WRAPPER_NAME);
}
if (null == result) {
result = basicGetName(eClassifier) + PLURAL_EXTENSION;
}
return result;
}
protected String basicGetWrapperName(EStructuralFeature eStructuralFeature) {
EAnnotation eAnnotation = getRMFAnnotation(eStructuralFeature, false);
String result = null;
if (eAnnotation != null) {
result = eAnnotation.getDetails().get(WRAPPER_NAME);
}
if (null == result) {
result = basicGetName(eStructuralFeature) + PLURAL_EXTENSION;
}
return result;
}
protected String basicGetClassifierNameSuffix(EStructuralFeature eStructuralFeature) {
EAnnotation eAnnotation = getRMFAnnotation(eStructuralFeature, false);
String result = null;
if (eAnnotation != null) {
result = eAnnotation.getDetails().get(CLASSIFIER_NAME_SUFFIX);
}
if (null == result) {
result = ""; //$NON-NLS-1$
}
return result;
}
/**
* @param eStructuralFeature
* @return #SERILIZATION_STRUCTURE__UNDDEFINED, if no annotation is defined
*/
protected int basicGetFeatureSerializationStructure(EStructuralFeature eStructuralFeature) {
EAnnotation eAnnotation = getRMFAnnotation(eStructuralFeature, false);
if (eAnnotation != null) {
String featureWrapperElement = eAnnotation.getDetails().get(FEATURE_WRAPPER_ELEMENT);
String featureElement = eAnnotation.getDetails().get(FEATURE_ELEMENT);
String classifierWrapperElement = eAnnotation.getDetails().get(CLASSIFIER_WRAPPER_ELEMENT);
String classifierElement = eAnnotation.getDetails().get(CLASSIFIER_ELEMENT);
int result = 0;
if (null == featureWrapperElement || Boolean.parseBoolean(featureWrapperElement)) {
// if not explicitly set to false, the feature wrapper element is created
result += FEATURE_WRAPPER_ELEMENT_MASK;
}
if (Boolean.parseBoolean(featureElement)) {
// if explicitly set to true, the feature element is created
result += FEATURE_ELEMENT_MASK;
}
if (Boolean.parseBoolean(classifierWrapperElement)) {
// if explicitly set to true, the classifier wrapper element is created
result += CLASSIFIER_WRAPPER_ELEMENT_MASK;
}
if (null == classifierWrapperElement || Boolean.parseBoolean(classifierElement)) {
// if not explicitly set to false, the classifier element is created
result += CLASSIFIER_ELEMENT_MASK;
}
return fallbackSerializationConfiguration[result];
} else {
// default to standard EMF serialization
return SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT;
}
}
protected XMLPersistenceMappingEStructuralFeatureExtendedMetaData getXMLPersistenceMappingExtendedMetaData(EStructuralFeature eStructuralFeature) {
XMLPersistenceMappingEStructuralFeatureExtendedMetaData result = (XMLPersistenceMappingEStructuralFeatureExtendedMetaData) extendedMetaDataCache
.get(eStructuralFeature);
if (result == null) {
extendedMetaDataCache.put(eStructuralFeature, result = createRMFEStructuralFeatureExtendedMetaData(eStructuralFeature));
}
return result;
}
protected XMLPersistenceMappingEClassifierExtendedMetaData getXMLPersistenceMappingExtendedMetaData(EClassifier eClassifier) {
XMLPersistenceMappingEClassifierExtendedMetaData result = (XMLPersistenceMappingEClassifierExtendedMetaData) extendedMetaDataCache
.get(eClassifier);
if (result == null) {
extendedMetaDataCache.put(eClassifier, result = createRMFEClassifierExtendedMetaData(eClassifier));
}
return result;
}
protected XMLPersistenceMappingEPackageExtendedMetaData getXMLPersistenceMappingExtendedMetaData(EPackage ePackage) {
XMLPersistenceMappingEPackageExtendedMetaData result = (XMLPersistenceMappingEPackageExtendedMetaData) extendedMetaDataCache.get(ePackage);
if (result == null) {
extendedMetaDataCache.put(ePackage, result = createRMFEPackageExtendedMetaData(ePackage));
}
return result;
}
protected XMLPersistenceMappingEStructuralFeatureExtendedMetaData createRMFEStructuralFeatureExtendedMetaData(
EStructuralFeature eStructuralFeature) {
return new XMLPersistenceMappingEStructuralFeatureExtendedMetaDataImpl(eStructuralFeature);
}
protected XMLPersistenceMappingEClassifierExtendedMetaData createRMFEClassifierExtendedMetaData(EClassifier eClassifier) {
if (eClassifier instanceof EClass) {
return new XMLPersistenceMappingEClassExtendedMetaDataImpl(eClassifier);
} else {
return new XMLPersistenceMappingEDataTypeExtendedMetaDataImpl(eClassifier);
}
}
protected XMLPersistenceMappingEPackageExtendedMetaData createRMFEPackageExtendedMetaData(EPackage ePackage) {
return new XMLPersistenceMappingEPackageExtendedMetaDataImpl(ePackage);
}
protected EAnnotation getRMFAnnotation(EModelElement eModelElement, boolean demandCreate) {
EAnnotation result = annotationCache.get(eModelElement);
if (result == null) {
result = eModelElement.getEAnnotation(XML_PERSISTENCE_MAPPING_ANNOTATION_SOURCE_URI);
}
if (result == null && demandCreate) {
result = EcoreFactory.eINSTANCE.createEAnnotation();
result.setSource(XML_PERSISTENCE_MAPPING_ANNOTATION_SOURCE_URI);
annotationCache.put(eModelElement, result);
}
return result;
}
protected boolean isIdentifiedByFeatureWrapper(EStructuralFeature feature) {
int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
return FEATURE_WRAPPER_ELEMENT_MASK == (featureSerializationStructure & FEATURE_WRAPPER_ELEMENT_MASK);
}
protected boolean isIdentifiedByFeature(EStructuralFeature feature) {
int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
return FEATURE_ELEMENT_MASK == (featureSerializationStructure & (FEATURE_WRAPPER_ELEMENT_MASK | FEATURE_ELEMENT_MASK));
}
protected boolean isIdentifiedByClassifierWrapper(EStructuralFeature feature) {
int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
return CLASSIFIER_WRAPPER_ELEMENT_MASK == (featureSerializationStructure & (FEATURE_WRAPPER_ELEMENT_MASK | FEATURE_ELEMENT_MASK | CLASSIFIER_WRAPPER_ELEMENT_MASK));
}
protected boolean isIdentifiedByClassifier(EStructuralFeature feature) {
int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
return CLASSIFIER_ELEMENT_MASK == featureSerializationStructure;
}
protected boolean isNone(EStructuralFeature feature) {
int featureSerializationStructure = getXMLPersistenceMappingExtendedMetaData(feature).getFeatureSerializationStructure();
return 0 == featureSerializationStructure;
}
protected boolean isEReference_Contained0000(EStructuralFeature feature) {
boolean isEReference_Contained0000;
if (feature instanceof EReference) {
EReference reference = (EReference) feature;
if (reference.isContainment()) {
isEReference_Contained0000 = isNone(feature);
} else {
isEReference_Contained0000 = false;
}
} else {
isEReference_Contained0000 = false;
}
return isEReference_Contained0000;
}
}