diff --git a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java old mode 100644 new mode 100755 index 0a6eee0e3096656759a1b3b4a71111b6cc827b1e..942366488005a8c88abfa256f1d17be14b90369a --- a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java +++ b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java @@ -23,9 +23,11 @@ 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.DifferenceState; import org.eclipse.emf.compare.EMFCompare; import org.eclipse.emf.compare.diff.DefaultDiffEngine; import org.eclipse.emf.compare.diff.IDiffEngine; +import org.eclipse.emf.compare.internal.spec.ReferenceChangeSpec; import org.eclipse.emf.compare.match.DefaultComparisonFactory; import org.eclipse.emf.compare.match.DefaultEqualityHelperFactory; import org.eclipse.emf.compare.match.IComparisonFactory; @@ -34,9 +36,11 @@ import org.eclipse.emf.compare.match.eobject.IEObjectMatcher; import org.eclipse.emf.compare.match.impl.MatchEngineFactoryImpl; import org.eclipse.emf.compare.match.impl.MatchEngineFactoryRegistryImpl; import org.eclipse.emf.compare.merge.BatchMerger; +import org.eclipse.emf.compare.merge.ConflictMerger; import org.eclipse.emf.compare.merge.IMerger; import org.eclipse.emf.compare.merge.IMerger.Registry; import org.eclipse.emf.compare.merge.IMerger.RegistryImpl; +import org.eclipse.emf.compare.merge.PseudoConflictMerger; import org.eclipse.emf.compare.scope.DefaultComparisonScope; import org.eclipse.emf.compare.scope.IComparisonScope; import org.eclipse.emf.ecore.EClass; @@ -50,6 +54,7 @@ import org.eventb.emf.core.EventBNamedCommentedComponentElement; import org.eventb.texttools.diffmerge.EventBDiffProcessor; import org.eventb.texttools.diffmerge.EventBEObjectMatcher; import org.eventb.texttools.diffmerge.EventBMerger; +import org.eventb.texttools.diffmerge.EventBMerger; import org.eventb.texttools.prettyprint.PrettyPrinter; import de.be4.eventb.core.parser.BException; @@ -79,7 +84,11 @@ public class PersistenceHelper { final boolean overwrite, final IProgressMonitor monitor) throws CoreException { try { + //System.out.println("SAVING"); resource.save(Collections.EMPTY_MAP); + //resource.unload(); + //resource.load(Collections.EMPTY_MAP); + //System.out.println("SAVING DONE"); /* * Try to set timestamp to the same as in the annotation. Setting on @@ -108,6 +117,7 @@ public class PersistenceHelper { public static void addTextAnnotation(final Resource resource, final String textRepresentation, final long timeStamp) throws CoreException { +//System.out.println("TEXT1:"+textRepresentation); final EventBNamedCommentedComponentElement component = getComponent(resource); if (component != null) { addTextAnnotation(component, textRepresentation, timeStamp); @@ -123,6 +133,7 @@ public class PersistenceHelper { final EMap<String, Attribute> attributes = element.getAttributes(); // update text representation +//System.out.println("TEXT2:"+textRepresentation); Attribute textAttribute = attributes .get(TextToolsPlugin.TYPE_TEXTREPRESENTATION.getId()); if (textAttribute == null) { @@ -160,6 +171,15 @@ public class PersistenceHelper { } + private static void applyDiff(EventBNamedCommentedComponentElement root,IMerger evbMerger,Diff d) { + try { + if (d.getState() != DifferenceState.MERGED) + evbMerger.copyRightToLeft(d,null); + } catch(Exception e) { + System.out.println("SKIP:"+d); + } + } + private static void mergeComponents( final EventBNamedCommentedComponentElement oldVersion, final EventBNamedCommentedComponentElement newVersion, @@ -209,13 +229,15 @@ public class PersistenceHelper { IMerger evbMerger = new EventBMerger(); evbMerger.setRanking(100); registry.add(evbMerger); - BatchMerger bm = new BatchMerger(registry); - + //BatchMerger bm = new BatchMerger(registry); differences = filter(differences); - bm.copyAllRightToLeft(differences, null); - + //bm.copyAllRightToLeft(differences, null); + + for (Diff d: differences) applyDiff(oldVersion,evbMerger,d); + long time2 = System.currentTimeMillis(); + if (DEBUG) { System.out.println("new ModelMerge: " + (time1 - time0)); System.out.println("merge.applyChanges: " + (time2 - time1)); @@ -247,6 +269,8 @@ public class PersistenceHelper { long start = System.currentTimeMillis(); mergeComponents(component, newVersion, monitor); long end = System.currentTimeMillis(); + resource.setModified(true); + resource.eSetDeliver(true); if (DEBUG) { System.out .println("Time to merge components: " + (end - start)); diff --git a/org.eventb.texttools/src/org/eventb/texttools/diffmerge/EventBMerger.java b/org.eventb.texttools/src/org/eventb/texttools/diffmerge/EventBMerger.java index 7a016d5d368d79903c24a761923c1b4e236c43d1..39774f84be3427b5ef31423f7816650959672a05 100644 --- a/org.eventb.texttools/src/org/eventb/texttools/diffmerge/EventBMerger.java +++ b/org.eventb.texttools/src/org/eventb/texttools/diffmerge/EventBMerger.java @@ -1,18 +1,23 @@ package org.eventb.texttools.diffmerge; +import org.eclipse.emf.compare.AttributeChange; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.ReferenceChange; import org.eclipse.emf.compare.merge.AbstractMerger; +import org.eclipse.emf.compare.merge.AttributeChangeMerger; +import org.eclipse.emf.compare.merge.ReferenceChangeMerger; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; -import org.eventb.emf.core.context.Context; -import org.eventb.emf.core.machine.Event; -import org.eventb.emf.core.machine.Machine; +import org.eventb.emf.core.EventBObject; +import org.eventb.texttools.TextPositionUtil; public class EventBMerger extends AbstractMerger { + private AttributeChangeMerger am = new AttributeChangeMerger(); + private ReferenceChangeMerger rm = new ReferenceChangeMerger(); + @Override public boolean isMergerFor(Diff target) { - // System.out.println(target); + //FIXME: could return true in all cases??? if (target instanceof ReferenceChange) { ReferenceChange rtarget = (ReferenceChange) target; EReference reference = rtarget.getReference(); @@ -21,11 +26,20 @@ public class EventBMerger extends AbstractMerger { || reference.getName().equals("sees")) { return true; } - } - return false; // currently disabled + //FIXME: find a way to avoid naming all core MM attributes + //but test seems useless ... => always returns true? + if (reference.getName().contains("extension")) { + System.out.println("REFERENCE:"+reference.getName()); + return false; + } + return true; + } else if (target instanceof AttributeChange) + return true; + System.out.println("TARGET:"+target); + return false; } - @Override + //@Override protected void accept(final Diff diff, boolean rightToLeft) { // Maybe we do not need this method for Camille? throw new UnsupportedOperationException(); @@ -38,27 +52,40 @@ public class EventBMerger extends AbstractMerger { EObject left = diff.getMatch().getLeft(); EObject right = diff.getMatch().getRight(); - if (left instanceof Context) { - Context leftC = (Context) left; - Context rightC = (Context) right; - leftC.getExtends().clear(); - leftC.getExtends().addAll(rightC.getExtends()); + + if (left == null) { + super.reject(diff, rightToLeft); + return; } +//TODO: find insertion index to get more precise annotations when multiplicity is > 1 + if (left instanceof EventBObject) + TextPositionUtil.annotatePosition((EventBObject)left, TextPositionUtil.getTextRange((EventBObject)right)); - if (left instanceof Machine) { - Machine leftC = (Machine) left; - Machine rightC = (Machine) right; - leftC.getRefines().clear(); - leftC.getRefines().addAll(rightC.getRefines()); - leftC.getSees().clear(); - leftC.getSees().addAll(rightC.getSees()); + if (rm.isMergerFor(diff)) { + ReferenceChange d = (ReferenceChange) diff; + //System.out.println("REF CHANGE:"+d.getReference()); + //System.out.println("REF VALUE:"+ d.getValue()); + rm.copyRightToLeft(diff,null); + Object l = left.eGet(d.getReference()); + Object r = right.eGet(d.getReference()); + if (l instanceof EventBObject && r instanceof EventBObject) + TextPositionUtil.annotatePosition((EventBObject)l, TextPositionUtil.getTextRange((EventBObject)r)); + return; } - if (left instanceof Event) { - Event leftC = (Event) left; - Event rightC = (Event) right; - leftC.getRefines().clear(); - leftC.getRefines().addAll(rightC.getRefines()); + if (am.isMergerFor(diff)) { + AttributeChange d = (AttributeChange) diff; + //System.out.println("ATTR CHANGE:"+d.getAttribute()); + //System.out.println("ATTR VALUE:"+ d.getValue()); + am.copyRightToLeft(diff,null); + Object l = left.eGet(d.getAttribute()); + Object r = right.eGet(d.getAttribute()); + if (l instanceof EventBObject && r instanceof EventBObject) + TextPositionUtil.annotatePosition((EventBObject)l, TextPositionUtil.getTextRange((EventBObject)r)); + return; } + + System.out.println("DIFF:"+diff.getClass()+" LEFT:"+left+ " - RIGHT:"+right); + } }