mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-15 16:28:56 +00:00
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:
parent
b5529bd356
commit
49b9ff4e55
2 changed files with 63 additions and 6 deletions
|
@ -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";
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue