blob: 40421673c62aa82b571fff5e5660cdfd5b58bb04 [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.internal.serialization;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.emf.ecore.xmi.XMLHelper;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLSaveImpl;
import org.eclipse.rmf.serialization.XMLPersistenceMappingExtendedMetaData;
import org.eclipse.rmf.serialization.XMLPersistenceMappingExtendedMetaDataImpl;
import org.eclipse.rmf.serialization.XMLPersistenceMappingResource;
// TODO: add javadoc with images
// TODO: deactivate or implement dom support
// TODO: implement prefix overwrite
// TODO: overwrite all explicitly not used methods from super-class and use asserts to show that it is not allowed to go there
// TODO: consider using the "kind" mechanism for switching between different savepatterns
/**
* @author broerkens
*/
public class XMLPersistenceMappingSaveImpl extends XMLSaveImpl {
XMLPersistenceMappingExtendedMetaData xmlPersistenceMappingExtendedMetaData = null;
static final String TRUE = "true"; //$NON-NLS-1$
Map<String, String> redefinedNamespaceUriToPrefixMap = null;
final StringBuffer buffer = new StringBuffer();
public enum SerializationType {
attributesOnly, elementsOnly, attributesAndElements
}
public XMLPersistenceMappingSaveImpl(XMLHelper helper) {
super(helper);
}
@Override
protected boolean saveFeatures(EObject o, boolean attributesOnly) {
if (attributesOnly) {
return saveFeatures(o, SerializationType.attributesOnly, false);
} else {
return saveFeatures(o, SerializationType.attributesAndElements, false);
}
}
protected boolean saveFeatures(EObject o, SerializationType serializationType, boolean suppressClosingElement) {
EClass eClass = o.eClass();
int contentKind = extendedMetaData.getContentKind(eClass);
if (!toDOM) {
switch (contentKind) {
case ExtendedMetaData.MIXED_CONTENT:
case ExtendedMetaData.SIMPLE_CONTENT: {
doc.setMixed(true);
break;
}
}
}
if (o == root) {
writeTopAttributes(root);
}
EStructuralFeature[] features = featureTable.getFeatures(eClass);
int[] featureKinds = featureTable.getKinds(eClass, features);
int[] elementFeatures = null;
int elementCount = 0;
String content = null;
// Process XML attributes
if (SerializationType.elementsOnly == serializationType) {
LOOP: for (int i = 0; i < features.length; i++) {
int kind = featureKinds[i];
EStructuralFeature f = features[i];
if (kind != TRANSIENT && shouldSaveFeature(o, f)) {
switch (kind) {
case DATATYPE_ELEMENT_SINGLE: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getDataTypeElementSingleSimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case DATATYPE_SINGLE: {
continue LOOP; // next feature, no element required
}
case DATATYPE_SINGLE_NILLABLE: {
if (!isNil(o, f)) {
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_ATTRIBUTE_SINGLE: {
continue LOOP; // next feature, no element required
}
case OBJECT_ATTRIBUTE_MANY: {
continue LOOP; // next feature, no element required
}
case OBJECT_ATTRIBUTE_IDREF_SINGLE: {
continue LOOP; // next feature, no element required
}
case OBJECT_ATTRIBUTE_IDREF_MANY: {
continue LOOP; // next feature, no element required
}
case OBJECT_HREF_SINGLE_UNSETTABLE: {
if (isNil(o, f)) {
break;
}
// it's intentional to keep going
}
case OBJECT_HREF_SINGLE: {
if (useEncodedAttributeStyle) {
continue LOOP; // next feature, no element required
} else {
switch (sameDocSingle(o, f)) {
case SAME_DOC: {
continue LOOP; // next feature, no element required
}
case CROSS_DOC: {
break;
}
default: {
continue LOOP; // next feature, no element required
}
}
}
break;
}
case OBJECT_HREF_MANY_UNSETTABLE: {
if (isEmpty(o, f) && !isXMLPersistenceMappingEnabled(f)) {
continue LOOP; // next feature, no element required
}
// It's intentional to keep going.
}
case OBJECT_HREF_MANY: {
if (useEncodedAttributeStyle) {
continue LOOP; // next feature, no element required
} else {
switch (sameDocMany(o, f)) {
case SAME_DOC: {
continue LOOP; // next feature, no element required
}
case CROSS_DOC: {
break;
}
default: {
continue LOOP; // next feature, no element required
}
}
}
break;
}
case OBJECT_ELEMENT_SINGLE_UNSETTABLE:
case OBJECT_ELEMENT_SINGLE: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getElementReferenceSingleSimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_ELEMENT_MANY: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getElementReferenceManySimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE:
case OBJECT_ELEMENT_IDREF_SINGLE: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getElementIDRefSingleSimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_ELEMENT_IDREF_MANY: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getElementIDRefManySimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case DATATYPE_ATTRIBUTE_MANY: {
break;
}
case OBJECT_CONTAIN_MANY_UNSETTABLE:
case DATATYPE_MANY: {
if (isEmpty(o, f) && !isXMLPersistenceMappingEnabled(f)) {
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_CONTAIN_SINGLE_UNSETTABLE:
case OBJECT_CONTAIN_SINGLE:
case OBJECT_CONTAIN_MANY:
case ELEMENT_FEATURE_MAP: {
break;
}
case ATTRIBUTE_FEATURE_MAP: {
continue LOOP; // next feature, no element required
}
default: {
continue LOOP; // next feature, no element required
}
} // end switch
// We only get here if we should do this.
//
if (elementFeatures == null) {
elementFeatures = new int[features.length];
}
elementFeatures[elementCount++] = i;
} // end if
} // end for
} else {
LOOP: for (int i = 0; i < features.length; i++) {
int kind = featureKinds[i];
EStructuralFeature f = features[i];
if (kind != TRANSIENT && shouldSaveFeature(o, f)) {
switch (kind) {
case DATATYPE_ELEMENT_SINGLE: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getDataTypeElementSingleSimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case DATATYPE_SINGLE: {
saveDataTypeSingle(o, f);
continue LOOP; // next feature, no element required
}
case DATATYPE_SINGLE_NILLABLE: {
if (!isNil(o, f)) {
saveDataTypeSingle(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_ATTRIBUTE_SINGLE: {
saveEObjectSingle(o, f);
continue LOOP; // next feature, no element required
}
case OBJECT_ATTRIBUTE_MANY: {
saveEObjectMany(o, f);
continue LOOP; // next feature, no element required
}
case OBJECT_ATTRIBUTE_IDREF_SINGLE: {
saveIDRefSingle(o, f);
continue LOOP; // next feature, no element required
}
case OBJECT_ATTRIBUTE_IDREF_MANY: {
saveIDRefMany(o, f);
continue LOOP; // next feature, no element required
}
case OBJECT_HREF_SINGLE_UNSETTABLE: {
if (isNil(o, f)) {
break;
}
// it's intentional to keep going
}
case OBJECT_HREF_SINGLE: {
if (useEncodedAttributeStyle) {
saveEObjectSingle(o, f);
continue LOOP; // next feature, no element required
} else {
switch (sameDocSingle(o, f)) {
case SAME_DOC: {
saveIDRefSingle(o, f);
continue LOOP; // next feature, no element required
}
case CROSS_DOC: {
break;
}
default: {
continue LOOP; // next feature, no element required
}
}
}
break;
}
case OBJECT_HREF_MANY_UNSETTABLE: {
if (isEmpty(o, f) && !isXMLPersistenceMappingEnabled(f)) {
saveManyEmpty(o, f);
continue LOOP; // next feature, no element required
}
// It's intentional to keep going.
}
case OBJECT_HREF_MANY: {
if (useEncodedAttributeStyle) {
saveEObjectMany(o, f);
continue LOOP; // next feature, no element required
} else {
switch (sameDocMany(o, f)) {
case SAME_DOC: {
saveIDRefMany(o, f);
continue LOOP; // next feature, no element required
}
case CROSS_DOC: {
break;
}
default: {
continue LOOP; // next feature, no element required
}
}
}
break;
}
case OBJECT_ELEMENT_SINGLE_UNSETTABLE:
case OBJECT_ELEMENT_SINGLE: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getElementReferenceSingleSimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_ELEMENT_MANY: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getElementReferenceManySimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE:
case OBJECT_ELEMENT_IDREF_SINGLE: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getElementIDRefSingleSimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_ELEMENT_IDREF_MANY: {
if (contentKind == ExtendedMetaData.SIMPLE_CONTENT) {
content = getElementIDRefManySimple(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case DATATYPE_ATTRIBUTE_MANY: {
break;
}
case OBJECT_CONTAIN_MANY_UNSETTABLE:
case DATATYPE_MANY: {
if (isEmpty(o, f) && !isXMLPersistenceMappingEnabled(f)) {
saveManyEmpty(o, f);
continue LOOP; // next feature, no element required
}
break;
}
case OBJECT_CONTAIN_SINGLE_UNSETTABLE:
case OBJECT_CONTAIN_SINGLE:
case OBJECT_CONTAIN_MANY:
case ELEMENT_FEATURE_MAP: {
break;
}
case ATTRIBUTE_FEATURE_MAP: {
saveAttributeFeatureMap(o, f);
continue LOOP; // next feature, no element required
}
default: {
continue LOOP; // next feature, no element required
}
}
if (SerializationType.attributesOnly == serializationType) {
continue LOOP; // next feature, no element required
}
// We only get here if we should do this.
//
if (elementFeatures == null) {
elementFeatures = new int[features.length];
}
elementFeatures[elementCount++] = i;
}
}
processAttributeExtensions(o);
if (elementFeatures == null) {
if (content == null) {
content = getContent(o, features);
}
if (content == null) {
if (o == root && writeTopElements(root)) {
endSaveFeatures(o, 0, null);
return true;
} else {
endSaveFeatures(o, EMPTY_ELEMENT, null);
return false;
}
} else {
endSaveFeatures(o, CONTENT_ELEMENT, content);
return true;
}
}
}
if (o == root) {
writeTopElements(root);
}
// Process XML elements
for (int i = 0; i < elementCount; i++) {
int kind = featureKinds[elementFeatures[i]];
EStructuralFeature f = features[elementFeatures[i]];
switch (kind) {
case DATATYPE_SINGLE_NILLABLE: {
saveNil(o, f);
break;
}
case ELEMENT_FEATURE_MAP: {
saveElementFeatureMap(o, f);
break;
}
case DATATYPE_MANY: {
saveDataTypeMany(o, f);
break;
}
case DATATYPE_ATTRIBUTE_MANY: {
saveDataTypeAttributeMany(o, f);
break;
}
case DATATYPE_ELEMENT_SINGLE: {
saveDataTypeElementSingle(o, f);
break;
}
case OBJECT_CONTAIN_SINGLE_UNSETTABLE: {
if (isNil(o, f)) {
saveNil(o, f);
break;
}
// it's intentional to keep going
}
case OBJECT_CONTAIN_SINGLE: {
saveContainedSingle(o, f);
break;
}
case OBJECT_CONTAIN_MANY_UNSETTABLE:
case OBJECT_CONTAIN_MANY: {
saveContainedMany(o, f);
break;
}
case OBJECT_HREF_SINGLE_UNSETTABLE: {
if (isNil(o, f)) {
saveNil(o, f);
break;
}
// it's intentional to keep going
}
case OBJECT_HREF_SINGLE: {
saveHRefSingle(o, f);
break;
}
case OBJECT_HREF_MANY_UNSETTABLE:
case OBJECT_HREF_MANY: {
saveHRefMany(o, f);
break;
}
case OBJECT_ELEMENT_SINGLE_UNSETTABLE: {
if (isNil(o, f)) {
saveNil(o, f);
break;
}
// it's intentional to keep going
}
case OBJECT_ELEMENT_SINGLE: {
saveElementReferenceSingle(o, f);
break;
}
case OBJECT_ELEMENT_MANY: {
saveElementReferenceMany(o, f);
break;
}
case OBJECT_ELEMENT_IDREF_SINGLE_UNSETTABLE: {
if (isNil(o, f)) {
saveNil(o, f);
break;
}
// it's intentional to keep going
}
case OBJECT_ELEMENT_IDREF_SINGLE: {
saveElementIDRefSingle(o, f);
break;
}
case OBJECT_ELEMENT_IDREF_MANY: {
saveElementIDRefMany(o, f);
break;
}
} // end switch
} // end for
if (!suppressClosingElement) {
endSaveFeatures(o, 0, null);
}
return true;
}
@Override
protected void saveNil(EStructuralFeature f) {
if (isXMLPersistenceMappingEnabled(f)) {
int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
switch (featureSerializationStructure) {
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
// no means for describing null values
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
doc.saveNilElement(getClassifierQName(f.getEType(), f));
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
doc.saveNilElement(getClassifierWrapperQName(f.getEType()));
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
doc.startElement(getClassifierWrapperQName(f.getEType()));
doc.endEmptyElement();
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
super.saveNil(f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
doc.startElement(getFeatureQName(f));
doc.endEmptyElement();
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
doc.saveNilElement(getFeatureWrapperQName(f));
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
doc.startElement(getFeatureWrapperQName(f));
doc.endEmptyElement();
break;
default:
super.saveNil(f);
}
} else {
super.saveNil(f);
}
}
@Override
protected void saveElementReferenceSingle(EObject o, EStructuralFeature f) {
assert null != helper.getValue(o, f);
EObject remote = (EObject) helper.getValue(o, f);
if (null != remote) {
int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
switch (featureSerializationStructure) {
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
// not allowed - ignore;
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
// default EMF mapping
saveEReferenceReferenced0100Single(remote, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceReferenced0101Single(remote, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceReferenced1001Single(remote, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
// if undefined, use the standard EMF mechanism
super.saveElementReferenceSingle(o, f);
break;
default:
saveEReferenceReferenced1001Single(remote, f);
break;
}
}
}
protected void saveReferencedHREF(EStructuralFeature f, EObject remote, String qname, boolean doSaveType) {
{
String href = helper.getHREF(remote);
if (href != null) {
href = convertURI(href);
EClass eClass = remote.eClass();
EClass expectedType = (EClass) f.getEType();
boolean shouldSaveType = doSaveType && (saveTypeInfo ? xmlTypeInfo.shouldSaveType(eClass, expectedType, f) : eClass != expectedType);
doc.startElement(qname);
if (shouldSaveType) {
saveTypeAttribute(eClass);
}
doc.endContentElement(href);
}
}
}
protected void saveEReferenceReferenced0100Single(EObject remote, EStructuralFeature f) {
String qname = getFeatureQName(f);
saveReferencedHREF(f, remote, qname, true);
}
protected void saveEReferenceReferenced0101Single(EObject remote, EStructuralFeature f) {
doc.startElement(getFeatureQName(f));
String qname = getClassifierQName(remote.eClass(), f);
saveReferencedHREF(f, remote, qname, false);
doc.endElement();
}
protected void saveEReferenceReferenced1001Single(EObject remote, EStructuralFeature f) {
doc.startElement(getFeatureWrapperQName(f));
String qname = getClassifierQName(remote.eClass(), f);
saveReferencedHREF(f, remote, qname, false);
doc.endElement();
}
@Override
protected void saveElementReferenceMany(EObject o, EStructuralFeature f) {
assert f.isMany() : "saveElementReferenceMany is applicable for references with true == isMany()"; //$NON-NLS-1$
@SuppressWarnings("unchecked")
InternalEList<? extends EObject> values = (InternalEList<? extends EObject>) helper.getValue(o, f);
int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
switch (featureSerializationStructure) {
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
// not allowed - ignore;
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
// default EMF mapping
saveEReferenceReferenced0100Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceReferenced0101Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceReferenced1001Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
// if undefined, use the standard EMF mechanism
super.saveHRefMany(o, f);
break;
default:
saveEReferenceReferenced1001Many(values, f);
break;
}
}
protected void saveEReferenceReferenced0100Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
int size = values.size();
String qname = getFeatureQName(f);
for (int i = 0; i < size; i++) {
saveReferencedHREF(f, values.basicGet(i), qname, true);
}
}
protected void saveEReferenceReferenced0101Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
int size = values.size();
String qname;
EObject value;
for (int i = 0; i < size; i++) {
doc.startElement(getFeatureQName(f));
value = values.basicGet(i);
qname = getClassifierQName(value.eClass(), f);
saveReferencedHREF(f, value, qname, false);
doc.endElement();
}
}
protected void saveEReferenceReferenced1001Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
int size = values.size();
String qname;
EObject value;
doc.startElement(getFeatureWrapperQName(f));
for (int i = 0; i < size; i++) {
value = values.basicGet(i);
qname = getClassifierQName(value.eClass(), f);
saveReferencedHREF(f, value, qname, false);
}
doc.endElement();
}
@Override
protected void saveDataTypeElementSingle(EObject o, EStructuralFeature f) {
assert !f.isMany() : "saveElementReferenceMany is applicable for references with false == isMany()"; //$NON-NLS-1$
String svalue = getDatatypeValue(helper.getValue(o, f), f, false);
int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
switch (featureSerializationStructure) {
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
// not allowed - ignore;
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
saveEAttributeContained0001Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
saveEAttributeContained0010Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained0011Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
saveEAttributeContained0100Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained0101Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEAttributeContained0110Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained0111Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
saveEAttributeContained1000Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained1001Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEAttributeContained1010Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained1011Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
saveEAttributeContained1100Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained1101Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEAttributeContained1110Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained1111Single(svalue, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
// if undefined, use the standard EMF mechanism
super.saveDataTypeMany(o, f);
break;
default:
saveEAttributeContained1001Single(svalue, f);
break;
}
}
protected void saveEAttributeContained0001Single(String value, EStructuralFeature f) {
String name = getClassifierQName(f.getEType());
if (value == null) {
doc.startElement(name);
doc.addAttribute(XSI_NIL, TRUE);
doc.endEmptyElement();
declareXSI = true;
} else {
doc.saveDataValueElement(name, value);
}
}
protected void saveEAttributeContained0010Single(String value, EStructuralFeature f) {
String name = getClassifierWrapperQName(f.getEType());
if (value == null) {
doc.startElement(name);
doc.addAttribute(XSI_NIL, TRUE);
doc.endEmptyElement();
declareXSI = true;
} else {
doc.saveDataValueElement(name, value);
}
}
protected void saveEAttributeContained0011Single(String value, EStructuralFeature f) {
doc.startElement(getClassifierWrapperQName(f.getEType()));
saveEAttributeContained0001Single(value, f);
doc.endElement();
}
protected void saveEAttributeContained0100Single(String value, EStructuralFeature f) {
// this is the default EMF behaviour
String name = getFeatureQName(f);
if (value == null) {
doc.startElement(name);
doc.addAttribute(XSI_NIL, TRUE);
doc.endEmptyElement();
declareXSI = true;
} else {
doc.saveDataValueElement(name, value);
}
}
protected void saveEAttributeContained0101Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureQName(f));
saveEAttributeContained0001Single(value, f);
doc.endElement();
}
protected void saveEAttributeContained0110Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureQName(f));
saveEAttributeContained0010Single(value, f);
doc.endElement();
}
protected void saveEAttributeContained0111Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureQName(f));
doc.startElement(getClassifierWrapperQName(f.getEType()));
saveEAttributeContained0001Single(value, f);
doc.endElement();
doc.endElement();
}
protected void saveEAttributeContained1000Single(String value, EStructuralFeature f) {
String name = getFeatureWrapperQName(f);
if (value == null) {
doc.startElement(name);
doc.addAttribute(XSI_NIL, TRUE);
doc.endEmptyElement();
declareXSI = true;
} else {
doc.saveDataValueElement(name, value);
}
}
protected void saveEAttributeContained1001Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0001Single(value, f);
doc.endElement();
}
protected void saveEAttributeContained1010Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0010Single(value, f);
doc.endElement();
}
protected void saveEAttributeContained1011Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureWrapperQName(f));
doc.startElement(getClassifierWrapperQName(f.getEType()));
saveEAttributeContained0001Single(value, f);
doc.endElement();
doc.endElement();
}
protected void saveEAttributeContained1100Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0100Single(value, f);
doc.endElement();
}
protected void saveEAttributeContained1101Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureWrapperQName(f));
doc.startElement(getFeatureQName(f));
saveEAttributeContained0001Single(value, f);
doc.endElement();
doc.endElement();
}
protected void saveEAttributeContained1110Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureWrapperQName(f));
doc.startElement(getFeatureQName(f));
saveEAttributeContained0010Single(value, f);
doc.endElement();
doc.endElement();
}
protected void saveEAttributeContained1111Single(String value, EStructuralFeature f) {
doc.startElement(getFeatureWrapperQName(f));
doc.startElement(getFeatureQName(f));
doc.startElement(getClassifierWrapperQName(f.getEType()));
saveEAttributeContained0001Single(value, f);
doc.endElement();
doc.endElement();
doc.endElement();
}
@Override
protected void saveDataTypeMany(EObject o, EStructuralFeature f) {
assert f.isMany() : "saveElementReferenceMany is applicable for references with true == isMany()"; //$NON-NLS-1$
@SuppressWarnings("unchecked")
InternalEList<? extends EObject> values = (InternalEList<? extends EObject>) helper.getValue(o, f);
if (null != values && !values.isEmpty()) {
int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
switch (featureSerializationStructure) {
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
// not allowed - ignore;
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
saveEAttributeContained0001Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
saveEAttributeContained0010Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained0011Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
saveEAttributeContained0100Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained0101Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEAttributeContained0110Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained0111Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
saveEAttributeContained1000Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained1001Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEAttributeContained1010Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained1011Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
saveEAttributeContained1100Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained1101Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEAttributeContained1110Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEAttributeContained1111Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
// if undefined, use the standard EMF mechanism
saveEAttributeContained0100Many(values, f);
break;
default:
saveEAttributeContained1001Many(values, f);
break;
}
}
}
protected String getAttributeString(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
EDataType d = (EDataType) f.getEType();
EPackage ePackage = d.getEPackage();
EFactory fac = ePackage.getEFactoryInstance();
buffer.setLength(0);
for (Iterator<? extends EObject> i = values.basicIterator();;) {
Object value = i.next();
String svalue = helper.convertToString(fac, d, value);
if (escape != null) {
svalue = escape.convertText(svalue);
}
buffer.append(svalue);
if (i.hasNext()) {
buffer.append(' ');
} else {
break;
}
}
return buffer.toString();
}
protected void saveEAttributeContained0001Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
EDataType d = (EDataType) f.getEType();
EPackage ePackage = d.getEPackage();
EFactory fac = ePackage.getEFactoryInstance();
String name = helper.getQName(d);
int size = values.size();
for (int i = 0; i < size; ++i) {
Object value = values.get(i);
if (value == null) {
doc.startElement(name);
doc.addAttribute(XSI_NIL, TRUE);
doc.endEmptyElement();
declareXSI = true;
} else {
String svalue = helper.convertToString(fac, d, value);
if (escape != null) {
svalue = escape.convertText(svalue);
}
doc.saveDataValueElement(name, svalue);
}
}
}
protected void saveEAttributeContained0010Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
String name = getClassifierWrapperQName(f.getEType());
doc.saveDataValueElement(name, getAttributeString(values, f));
}
protected void saveEAttributeContained0011Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getClassifierWrapperQName(f.getEType()));
saveEAttributeContained0001Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained0100Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
// this is the default EMF behaviour
assert null != values;
EDataType d = (EDataType) f.getEType();
EPackage ePackage = d.getEPackage();
EFactory fac = ePackage.getEFactoryInstance();
String name = helper.getQName(f);
int size = values.size();
for (int i = 0; i < size; ++i) {
Object value = values.get(i);
if (value == null) {
doc.startElement(name);
doc.addAttribute(XSI_NIL, TRUE);
doc.endEmptyElement();
declareXSI = true;
} else {
String svalue = helper.convertToString(fac, d, value);
if (escape != null) {
svalue = escape.convertText(svalue);
}
doc.saveDataValueElement(name, svalue);
}
}
}
protected void saveEAttributeContained0101Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
EDataType d = (EDataType) f.getEType();
EPackage ePackage = d.getEPackage();
EFactory fac = ePackage.getEFactoryInstance();
String name = getClassifierQName(d);
int size = values.size();
for (int i = 0; i < size; ++i) {
Object value = values.get(i);
doc.startElement(getFeatureQName(f));
if (value == null) {
doc.startElement(name);
doc.addAttribute(XSI_NIL, TRUE);
doc.endEmptyElement();
declareXSI = true;
} else {
String svalue = helper.convertToString(fac, d, value);
if (escape != null) {
svalue = escape.convertText(svalue);
}
doc.saveDataValueElement(name, svalue);
}
doc.endElement();
}
}
protected void saveEAttributeContained0110Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureQName(f));
saveEAttributeContained0010Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained0111Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureQName(f));
saveEAttributeContained0011Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained1000Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
String name = getFeatureWrapperQName(f);
doc.saveDataValueElement(name, getAttributeString(values, f));
}
protected void saveEAttributeContained1001Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0001Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained1010Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0010Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained1011Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0011Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained1100Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0100Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained1101Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0101Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained1110Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0110Many(values, f);
doc.endElement();
}
protected void saveEAttributeContained1111Many(InternalEList<? extends EObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureWrapperQName(f));
saveEAttributeContained0111Many(values, f);
doc.endElement();
}
@Override
protected void saveContainedMany(EObject o, EStructuralFeature f) {
assert f.isMany();
// XML Mapping serialization enabled
@SuppressWarnings("unchecked")
List<? extends InternalEObject> values = ((InternalEList<? extends InternalEObject>) helper.getValue(o, f)).basicList();
if (null != values) {
int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
switch (featureSerializationStructure) {
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
saveEReferenceContained0000Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
saveEReferenceContained0001Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
saveEReferenceContained0010Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained0011Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
saveEReferenceContained0100Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained0101Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEReferenceContained0110Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained0111Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
saveEReferenceContained1000Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained1001Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEReferenceContained1010Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained1011Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
saveEReferenceContained1100Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained1101Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEReferenceContained1110Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained1111Many(values, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
// if undefined, use the standard EMF mechanism
saveEReferenceContained0100Many(values, f);
break;
default:
saveEReferenceContained1001Many(values, f);
break;
}
}
}
protected void saveEReferenceContained0000Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
for (EObject value : values) {
saveFeatures(value, SerializationType.elementsOnly, true);
}
}
protected void saveEReferenceContained0001Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
for (EObject value : values) {
doc.startElement(getClassifierQName(value.eClass()));
saveFeatures(value);
}
}
protected void saveEReferenceContained0010Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
for (EClass eClass : getOrderedClasses(values)) {
doc.startElement(getClassifierWrapperQName(eClass));
for (EObject value : values) {
if (eClass == value.eClass()) {
saveFeatures(value, SerializationType.elementsOnly, true);
}
}
doc.endElement();
}
}
protected void saveEReferenceContained0011Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
for (EClass eClass : getOrderedClasses(values)) {
doc.startElement(getClassifierWrapperQName(eClass));
for (EObject value : values) {
if (eClass == value.eClass()) {
doc.startElement(getClassifierQName(value.eClass()));
saveFeatures(value, SerializationType.attributesAndElements, false);
}
}
doc.endElement();
}
}
protected void saveEReferenceContained0100Many(List<? extends InternalEObject> values, EStructuralFeature f) {
// this is the default EMF behaviour
assert null != values;
assert !values.isEmpty();
for (EObject value : values) {
saveElement(value, f);
}
}
protected void saveEReferenceContained0101Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
for (EObject value : values) {
doc.startElement(getFeatureQName(f));
doc.startElement(getClassifierQName(value.eClass()));
saveFeatures(value, SerializationType.attributesAndElements, false);
doc.endElement();
}
}
protected void saveEReferenceContained0110Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureQName(f));
for (EClass eClass : getOrderedClasses(values)) {
doc.startElement(getClassifierWrapperQName(eClass));
for (EObject value : values) {
if (eClass == value.eClass()) {
saveFeatures(value, SerializationType.elementsOnly, true);
}
}
doc.endElement();
}
doc.endElement();
}
protected void saveEReferenceContained0111Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureQName(f));
for (EClass eClass : getOrderedClasses(values)) {
doc.startElement(getClassifierWrapperQName(eClass));
for (EObject value : values) {
if (eClass == value.eClass()) {
doc.startElement(getClassifierQName(value.eClass()));
saveFeatures(value);
}
}
doc.endElement();
}
doc.endElement();
}
protected void saveEReferenceContained1000Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0000Many(values, f);
doc.endElement();
// last end is written by caller
}
protected void saveEReferenceContained1001Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0001Many(values, f);
doc.endElement();
}
protected void saveEReferenceContained1010Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0010Many(values, f);
doc.endElement();
}
protected void saveEReferenceContained1011Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0011Many(values, f);
doc.endElement();
}
protected void saveEReferenceContained1100Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0100Many(values, f);
doc.endElement();
}
protected void saveEReferenceContained1101Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0101Many(values, f);
doc.endElement();
}
protected void saveEReferenceContained1110Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0110Many(values, f);
doc.endElement();
}
protected void saveEReferenceContained1111Many(List<? extends InternalEObject> values, EStructuralFeature f) {
assert null != values;
assert !values.isEmpty();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0111Many(values, f);
doc.endElement();
}
@Override
protected void saveContainedSingle(EObject o, EStructuralFeature f) {
assert !f.isMany();
if (isXMLPersistenceMappingEnabled(f)) {
// XML Mapping serialization enabled
EObject value = (EObject) helper.getValue(o, f);
if (null != value) {
int featureSerializationStructure = xmlPersistenceMappingExtendedMetaData.getFeatureSerializationStructure(f);
switch (featureSerializationStructure) {
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0000__NONE:
saveEReferenceContained0000Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0001__CLASSIFIER_ELEMENT:
saveEReferenceContained0001Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0010__CLASSIFIER_WRAPPER_ELEMENT:
saveEReferenceContained0010Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0011__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained0011Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0100__FEATURE_ELEMENT:
saveEReferenceContained0100Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0101__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained0101Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0110__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEReferenceContained0110Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__0111__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained0111Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1000__FEATURE_WRAPPER_ELEMENT:
saveEReferenceContained1000Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1001__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained1001Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1010__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEReferenceContained1010Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1011__FEATURE_WRAPPER_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained1011Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1100__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT:
saveEReferenceContained1100Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1101__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained1101Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1110__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT:
saveEReferenceContained1110Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__1111__FEATURE_WRAPPER_ELEMENT__FEATURE_ELEMENT__CLASSIFIER_WRAPPER_ELEMENT__CLASSIFIER_ELEMENT:
saveEReferenceContained1111Single(value, f);
break;
case XMLPersistenceMappingExtendedMetaData.SERIALIZATION_STRUCTURE__UNDEFINED:
// if undefined, use the standard EMF mechanism
super.saveContainedSingle(o, f);
break;
default:
saveEReferenceContained1001Single(value, f);
break;
}
}
} else {
super.saveContainedSingle(o, f);
}
}
protected void saveEReferenceContained0000Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
saveFeatures(value, SerializationType.elementsOnly, true);
}
protected void saveEReferenceContained0001Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getClassifierQName(value.eClass()));
saveFeatures(value);
}
protected void saveEReferenceContained0010Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
EClass eClass = value.eClass();
doc.startElement(getClassifierWrapperQName(eClass));
saveFeatures(value);
}
protected void saveEReferenceContained0011Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
EClass eClass = value.eClass();
doc.startElement(getClassifierWrapperQName(eClass));
doc.startElement(getClassifierQName(eClass));
saveFeatures(value);
doc.endElement();
}
protected void saveEReferenceContained0100Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
saveElement(value, f);
}
protected void saveEReferenceContained0101Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
EClass eClass = value.eClass();
doc.startElement(getFeatureQName(f));
doc.startElement(getClassifierQName(eClass));
saveFeatures(value);
doc.endElement();
}
protected void saveEReferenceContained0110Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
EClass eClass = value.eClass();
doc.startElement(getFeatureQName(f));
doc.startElement(getClassifierWrapperQName(eClass));
saveFeatures(value);
doc.endElement();
}
protected void saveEReferenceContained0111Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
EClass eClass = value.eClass();
doc.startElement(getFeatureQName(f));
doc.startElement(getClassifierWrapperQName(eClass));
doc.startElement(getClassifierQName(eClass));
saveFeatures(value);
doc.endElement();
doc.endElement();
}
protected void saveEReferenceContained1000Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0000Single(value, f);
doc.endElement();
// last end is written by caller
}
protected void saveEReferenceContained1001Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0001Single(value, f);
doc.endElement();
}
protected void saveEReferenceContained1010Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0010Single(value, f);
doc.endElement();
}
protected void saveEReferenceContained1011Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0011Single(value, f);
doc.endElement();
}
protected void saveEReferenceContained1100Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0100Single(value, f);
doc.endElement();
}
protected void saveEReferenceContained1101Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0101Single(value, f);
doc.endElement();
}
protected void saveEReferenceContained1110Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0110Single(value, f);
doc.endElement();
}
protected void saveEReferenceContained1111Single(EObject value, EStructuralFeature f) {
assert null != value;
assert !f.isMany();
doc.startElement(getFeatureWrapperQName(f));
saveEReferenceContained0111Single(value, f);
doc.endElement();
}
protected String getFeatureQName(EStructuralFeature eStructuralFeature) {
String featureXMLName = xmlPersistenceMappingExtendedMetaData.getXMLName(eStructuralFeature);
EPackage ePackage = eStructuralFeature.getEContainingClass().getEPackage();
String prefix = helper.getPrefix(ePackage);
return getQName(prefix, featureXMLName);
}
protected String getFeatureWrapperQName(EStructuralFeature eStructuralFeature) {
String featureWrapperXMLName = xmlPersistenceMappingExtendedMetaData.getXMLWrapperName(eStructuralFeature);
EPackage ePackage = eStructuralFeature.getEContainingClass().getEPackage();
String prefix = helper.getPrefix(ePackage);
return getQName(prefix, featureWrapperXMLName);
}
protected String getClassifierQName(EClassifier eClassifier) {
String classifierXMLName = xmlPersistenceMappingExtendedMetaData.getXMLName(eClassifier);
EPackage ePackage = eClassifier.getEPackage();
String prefix = helper.getPrefix(ePackage);
return getQName(prefix, classifierXMLName);
}
protected String getClassifierQName(EClassifier eClassifier, EStructuralFeature eStructuralFeature) {
String classifierXMLName = xmlPersistenceMappingExtendedMetaData.getXMLName(eClassifier, eStructuralFeature);
EPackage ePackage = eClassifier.getEPackage();
String prefix = helper.getPrefix(ePackage);
return getQName(prefix, classifierXMLName);
}
protected String getClassifierWrapperQName(EClassifier eClassifier) {
String classifierWrapperXMLName = xmlPersistenceMappingExtendedMetaData.getXMLWrapperName(eClassifier);
EPackage ePackage = eClassifier.getEPackage();
String prefix = helper.getPrefix(ePackage);
return getQName(prefix, classifierWrapperXMLName);
}
protected String getQName(String prefix, String name) {
if (null == prefix || 0 == prefix.length()) {
return name;
} else {
return prefix + ":" + name; //$NON-NLS-1$
}
}
@Override
protected void init(XMLResource resource, Map<?, ?> options) {
super.init(resource, options);
// set extended meta data
Object extendedMetaDataOption = options.get(XMLResource.OPTION_EXTENDED_META_DATA);
if (null != extendedMetaDataOption && extendedMetaDataOption instanceof XMLPersistenceMappingExtendedMetaData) {
xmlPersistenceMappingExtendedMetaData = (XMLPersistenceMappingExtendedMetaData) options.get(XMLResource.OPTION_EXTENDED_META_DATA);
extendedMetaData = xmlPersistenceMappingExtendedMetaData;
} else {
// default
xmlPersistenceMappingExtendedMetaData = xmlResource == null || xmlResource.getResourceSet() == null ? XMLPersistenceMappingExtendedMetaData.INSTANCE
: new XMLPersistenceMappingExtendedMetaDataImpl(xmlResource.getResourceSet().getPackageRegistry());
extendedMetaData = xmlPersistenceMappingExtendedMetaData;
}
helper.setExtendedMetaData(xmlPersistenceMappingExtendedMetaData);
Object namespaceToPrefixMapObject = options.get(XMLPersistenceMappingResource.OPTION_NAMEPSACE_TO_PREFIX_MAP);
if (null != namespaceToPrefixMapObject && namespaceToPrefixMapObject instanceof Map<?, ?>) {
@SuppressWarnings("unchecked")
Map<Object, Object> namespaceToPrefixMap = (Map<Object, Object>) namespaceToPrefixMapObject;
EMap<String, String> prefixToNamespaceMap = helper.getPrefixToNamespaceMap();
for (Map.Entry<Object, Object> entry : namespaceToPrefixMap.entrySet()) {
Object namespace = entry.getKey();
Object prefix = entry.getValue();
if (namespace instanceof String && prefix instanceof String) {
if (prefixToNamespaceMap.contains(prefix)) {
// TODO: handle namespace redefinitions
if (null == redefinedNamespaceUriToPrefixMap) {
redefinedNamespaceUriToPrefixMap = new HashMap<String, String>();
}
redefinedNamespaceUriToPrefixMap.put((String) namespace, (String) prefix);
} else {
prefixToNamespaceMap.put((String) prefix, (String) namespace);
}
}
}
}
assert null != xmlPersistenceMappingExtendedMetaData : "xmlPersistenceMappingExtendedMetaData should never be null"; //$NON-NLS-1$
assert null != extendedMetaData : "extendedMetaData should never be null"; //$NON-NLS-1$
}
protected Collection<EClass> getOrderedClasses(List<? extends InternalEObject> values) {
Set<EClass> classesSet = new LinkedHashSet<EClass>();
for (EObject value : values) {
classesSet.add(value.eClass());
}
List<EClass> classesList = new ArrayList<EClass>(classesSet);
Comparator<EClass> comparator = new Comparator<EClass>() {
public int compare(EClass o1, EClass o2) {
return o1.getName().compareTo(o2.getName());
}
};
Collections.sort(classesList, comparator);
return classesList;
}
protected boolean isXMLPersistenceMappingEnabled(EStructuralFeature feature) {
return xmlPersistenceMappingExtendedMetaData.isXMLPersistenceMappingEnabled(feature);
}
@Override
protected void saveElementID(EObject o) {
// avoid writing the ID since this is already written as usual attribute
saveFeatures(o);
}
}