Do not collect EObjects in transient Features when calculating IdToEObjectMap for Serialization. Fixes #65

Signed-off-by: Christian Dietrich <christian.dietrich@itemis.de>
This commit is contained in:
Christian Dietrich 2016-08-02 18:03:35 +02:00
parent b5529bd356
commit 49b9ff4e55
2 changed files with 63 additions and 6 deletions

View file

@ -12,15 +12,71 @@ import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.xtext.nodemodel.SyntaxErrorMessage;
import org.junit.Assert;
import org.junit.Test;
/** @author Mark Christiaens */
/**
* @author Mark Christiaens
* @author Christian Dietrich
*/
public class SerializationUtilTest extends Assert {
@Test
public void testFillIdToEObjectMap() {
EPackage pack = EcoreFactory.eINSTANCE.createEPackage();
EClass root = createEClass(pack, "Root");
EClass someType = createEClass(pack, "SomeType");
EReference ref1 = addEReference(root, someType, "ref1", false);
EReference ref2 = addEReference(root, someType, "ref2", true);
EFactory factory = pack.getEFactoryInstance();
EObject rootObject = factory.create(root);
EObject someTypeObject1 = factory.create(someType);
EObject someTypeObject2 = factory.create(someType);
rootObject.eSet(ref1, someTypeObject1);
rootObject.eSet(ref2, someTypeObject2);
List<EObject> map = new ArrayList<>();
SerializationUtil.fillIdToEObjectMap(rootObject, map);
assertTrue(map.contains(rootObject));
assertTrue(map.contains(someTypeObject1));
assertFalse(map.contains(someTypeObject2));
assertEquals(2, map.size());
}
private EClass createEClass(EPackage pack, String name) {
EClass clazz = EcoreFactory.eINSTANCE.createEClass();
clazz.setName(name);
pack.getEClassifiers().add(clazz);
return clazz;
}
private EReference addEReference(EClass from, EClass to, String name, boolean isTransient) {
EReference ref = EcoreFactory.eINSTANCE.createEReference();
ref.setName("ref2");
ref.setEType(to);
ref.setContainment(true);
if (isTransient) {
ref.setTransient(true);
ref.setDerived(true);
}
ref.setChangeable(true);
from.getEStructuralFeatures().add(ref);
return ref;
}
@Test
public void testSyntaxErrorMessage() throws IOException {
final String message = "hi";

View file

@ -48,12 +48,13 @@ public class SerializationUtil {
}
public static void fillIdToEObjectMap(EObject eObject, List<EObject> map) {
map.add(eObject);
if (eObject.eContainingFeature() == null || !eObject.eContainingFeature().isTransient()) {
map.add(eObject);
EList<EObject> eContents = eObject.eContents();
EList<EObject> eContents = eObject.eContents();
for (EObject child : eContents) {
fillIdToEObjectMap(child, map);
for (EObject child : eContents) {
fillIdToEObjectMap(child, map);
}
}
}