From cc2de809597540d2fb41525be7add01360a706ce Mon Sep 17 00:00:00 2001
From: Sebastian Krings <sebastian@krin.gs>
Date: Tue, 16 Jun 2015 10:07:52 +0200
Subject: [PATCH] drop some problematic emf diffs, see comment

---
 .../eventb/texttools/PersistenceHelper.java   | 20 +++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
index d74d389..0a6eee0 100644
--- a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
+++ b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java
@@ -7,6 +7,7 @@
 package org.eventb.texttools;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -21,6 +22,7 @@ import org.eclipse.emf.common.util.EMap;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.compare.Comparison;
 import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.DifferenceKind;
 import org.eclipse.emf.compare.EMFCompare;
 import org.eclipse.emf.compare.diff.DefaultDiffEngine;
 import org.eclipse.emf.compare.diff.IDiffEngine;
@@ -209,6 +211,8 @@ public class PersistenceHelper {
 		registry.add(evbMerger);
 		BatchMerger bm = new BatchMerger(registry);
 
+		differences = filter(differences);
+
 		bm.copyAllRightToLeft(differences, null);
 
 		long time2 = System.currentTimeMillis();
@@ -218,6 +222,22 @@ public class PersistenceHelper {
 		}
 	}
 
+	// for some reasons, there are still problematic diffs:
+	// usually, they can be identified as follows:
+	// 1. right = null, i.e. Camille does not hold this element
+	// 2. ADD, i.e. the "nothing" coming from Camille is added to the EMF model
+	// => we drop the diff before we screw up the database
+	// Obvoiusly it would be better not to generate the diff at all....
+	private static List<Diff> filter(List<Diff> differences) {
+		List<Diff> newList = new ArrayList<Diff>();
+		for (Diff d : differences) {
+			if (!(d.getKind() == DifferenceKind.ADD && d.getMatch().getRight() == null)) {
+				newList.add(d);
+			}
+		}
+		return newList;
+	}
+
 	public static void mergeRootElement(final Resource resource,
 			final EventBNamedCommentedComponentElement newVersion,
 			final IProgressMonitor monitor) {
-- 
GitLab