diff --git a/org.eventb.texttools/src/org/eventb/texttools/Parser.java b/org.eventb.texttools/src/org/eventb/texttools/Parser.java index a5f2eca8d376541785896f95789a03650426de87..c4b9b0c6afa3dbf4ac034f40aed1d76c191950f6 100644 --- a/org.eventb.texttools/src/org/eventb/texttools/Parser.java +++ b/org.eventb.texttools/src/org/eventb/texttools/Parser.java @@ -8,7 +8,6 @@ package org.eventb.texttools; import org.eclipse.jface.text.IDocument; import org.eventb.emf.core.EventBObject; -import org.eventb.texttools.extensions.ExtendedEventB; import org.eventb.texttools.internal.parsing.TransformationVisitor; import de.be4.eventb.core.parser.BException; @@ -22,13 +21,12 @@ import de.hhu.stups.sablecc.patch.SourcePositions; import de.hhu.stups.sablecc.patch.SourcecodeRange; public class Parser { - + private final Boolean allowSynatxExtensions = false; - + private final EventBParser parser = new EventBParser(); private final TransformationVisitor transformer = new TransformationVisitor(); - - + /** * Parses the content of the given {@link IDocument}. * @@ -42,32 +40,20 @@ public class Parser { */ public <T extends EventBObject> T parse(final IDocument document) throws ParseException { - + if (document == null) { throw new IllegalArgumentException( "Parser may not be called without input document"); } - String input; - ExtendedEventB extendedEventB = null; - if (allowSynatxExtensions){ - extendedEventB = ExtendedEventB.createFromInput(document.get()); - input = extendedEventB.getPlainEventBCode(); - }else{ - input = document.get(); - } - + + input = document.get(); try { final Start rootNode = parser.parse(input, false); - T transform = transformer.<T>transform(rootNode, document); - - if (allowSynatxExtensions && extendedEventB != null){ - extendedEventB.assignElements((EventBObject)transform); - extendedEventB.runSyntaxExtensions(); - } - + T transform = transformer.<T> transform(rootNode, document); + return transform; } catch (final BException e) { final Exception cause = e.getCause(); @@ -77,8 +63,8 @@ public class Parser { final Token token = ex.getToken(); throw new ParseException( - adjustMessage(ex.getLocalizedMessage()), token - .getLine() - 1, token.getPos() - 1, token + adjustMessage(ex.getLocalizedMessage()), + token.getLine() - 1, token.getPos() - 1, token .getText().length()); } if (cause instanceof EventBLexerException) { @@ -86,8 +72,8 @@ public class Parser { final String lastText = ex.getLastText(); throw new ParseException( - adjustMessage(ex.getLocalizedMessage()), ex - .getLastLine() - 1, ex.getLastPos() - 1, + adjustMessage(ex.getLocalizedMessage()), + ex.getLastLine() - 1, ex.getLastPos() - 1, lastText.length()); } @@ -97,17 +83,18 @@ public class Parser { final SourcePositions positions = parser.getSourcePositions(); if (range != null && positions != null) { - throw new ParseException(adjustMessage(ex - .getLocalizedMessage()), positions - .getBeginLine(range) - 1, positions - .getBeginColumn(range) - 1, positions - .getRangeString(range).length()); + throw new ParseException( + adjustMessage(ex.getLocalizedMessage()), + positions.getBeginLine(range) - 1, + positions.getBeginColumn(range) - 1, positions + .getRangeString(range).length()); } else { final Token token = ex.getToken(); if (token != null) { - throw new ParseException(adjustMessage(ex - .getLocalizedMessage()), token.getLine() - 1, - token.getPos() - 1, token.getText().length()); + throw new ParseException( + adjustMessage(ex.getLocalizedMessage()), + token.getLine() - 1, token.getPos() - 1, token + .getText().length()); } } } diff --git a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java index 92260bdcbeb5446a6b3263603ec54dbc53791d77..e4c2b968a7ec5f3dd1b291823d1b49c8510ba7da 100644 --- a/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java +++ b/org.eventb.texttools/src/org/eventb/texttools/PersistenceHelper.java @@ -32,12 +32,12 @@ import org.eventb.texttools.prettyprint.PrettyPrinter; public class PersistenceHelper { public static final Boolean DEBUG = false; - + public static IResource getIResource(final Resource resource) { final URI uri = resource.getURI(); if (uri.isPlatformResource()) { - return ResourcesPlugin.getWorkspace().getRoot().findMember( - uri.toPlatformString(true)); + return ResourcesPlugin.getWorkspace().getRoot() + .findMember(uri.toPlatformString(true)); } return null; @@ -101,34 +101,35 @@ public class PersistenceHelper { } timeAttribute.setValue(timeStamp); } - - + public static void addUsesAnnotation(final EventBElement element, final String usesStatements) { final EMap<String, Attribute> attributes = element.getAttributes(); - Attribute usesAttribute = attributes.get(TextToolsPlugin.TYPE_USESEXTENSION.getId()); + Attribute usesAttribute = attributes + .get(TextToolsPlugin.TYPE_USESEXTENSION.getId()); if (usesAttribute == null) { usesAttribute = CoreFactory.eINSTANCE.createAttribute(); usesAttribute.setType(AttributeType.STRING); attributes.put(TextToolsPlugin.TYPE_USESEXTENSION.getId(), usesAttribute); } - usesAttribute.setValue(usesStatements); + usesAttribute.setValue(usesStatements); } - - private static void mergeComponents(final EventBNamedCommentedComponentElement oldVersion, - final EventBNamedCommentedComponentElement newVersion, final IProgressMonitor monitor) { + private static void mergeComponents( + final EventBNamedCommentedComponentElement oldVersion, + final EventBNamedCommentedComponentElement newVersion, + final IProgressMonitor monitor) { try { long time0 = System.currentTimeMillis(); final ModelMerge merge = new ModelMerge(oldVersion, newVersion); long time1 = System.currentTimeMillis(); merge.applyChanges(monitor); long time2 = System.currentTimeMillis(); - if (DEBUG){ - System.out.println("new ModelMerge: " + (time1-time0)); - System.out.println("merge.applyChanges: " + (time2-time1)); + if (DEBUG) { + System.out.println("new ModelMerge: " + (time1 - time0)); + System.out.println("merge.applyChanges: " + (time2 - time1)); } } catch (final InterruptedException e) { // TODO Auto-generated catch block @@ -137,15 +138,17 @@ public class PersistenceHelper { } public static void mergeRootElement(final Resource resource, - final EventBNamedCommentedComponentElement newVersion, final IProgressMonitor monitor) { + final EventBNamedCommentedComponentElement newVersion, + final IProgressMonitor monitor) { final EventBNamedCommentedComponentElement component = getComponent(resource); if (component != null) { // FIXME Hier stimmt die Reihenfolge noch long start = System.currentTimeMillis(); mergeComponents(component, newVersion, monitor); long end = System.currentTimeMillis(); - if (DEBUG){ - System.out.println("Time to merge components: " + (end-start)); + if (DEBUG) { + System.out + .println("Time to merge components: " + (end - start)); } // Hier stimmt die Reihenfolge in component nicht mehr } else { @@ -212,9 +215,11 @@ public class PersistenceHelper { return null; } - private static EventBNamedCommentedComponentElement getComponent(final Resource resource) { + private static EventBNamedCommentedComponentElement getComponent( + final Resource resource) { final EList<EObject> contents = resource.getContents(); - if (contents.size() > 0 && contents.get(0) instanceof EventBNamedCommentedComponentElement) { + if (contents.size() > 0 + && contents.get(0) instanceof EventBNamedCommentedComponentElement) { return (EventBNamedCommentedComponentElement) contents.get(0); } @@ -224,7 +229,7 @@ public class PersistenceHelper { /** * Extracts the timestamp of the latest saved text representation from the * EMF and returns it. - * + * * @param resource * @return timestamp or <code>-1</code> if none is found */ @@ -257,7 +262,7 @@ public class PersistenceHelper { * Checks if the text representation saved in the EMF is up-to-date. The * timestamps in the EMF and of the underlying file are compared for this * decision. - * + * * @param resource * @return <code>true</code> if there was no external change and the text * representation is still up-to-date @@ -284,8 +289,10 @@ public class PersistenceHelper { return true; } } catch (final CoreException e) { - TextToolsPlugin.getDefault().getLog().log( - new Status(IStatus.ERROR, TextToolsPlugin.PLUGIN_ID, + TextToolsPlugin + .getDefault() + .getLog() + .log(new Status(IStatus.ERROR, TextToolsPlugin.PLUGIN_ID, "Error checking file timestamps", e)); } diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/DefaultMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/DefaultMerger.java deleted file mode 100644 index a9193d7577c4a6c8de8dd7c927deda8a2a42ebfc..0000000000000000000000000000000000000000 --- a/org.eventb.texttools/src/org/eventb/texttools/merge/DefaultMerger.java +++ /dev/null @@ -1,108 +0,0 @@ -package org.eventb.texttools.merge; - -import org.eclipse.emf.compare.diff.metamodel.DiffElement; -import org.eclipse.emf.compare.diff.metamodel.DiffGroup; -import org.eclipse.emf.compare.diff.metamodel.ModelElementChangeLeftTarget; -import org.eclipse.emf.compare.diff.metamodel.ModelElementChangeRightTarget; -import org.eclipse.emf.compare.diff.metamodel.ReferenceChange; -import org.eclipse.emf.compare.diff.metamodel.ReferenceChangeLeftTarget; -import org.eclipse.emf.compare.diff.metamodel.ReferenceChangeRightTarget; -import org.eclipse.emf.ecore.EClassifier; -import org.eclipse.emf.ecore.EGenericType; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EReference; -import org.eclipse.emf.ecore.EcorePackage; - -public class DefaultMerger extends - org.eclipse.emf.compare.diff.merge.DefaultMerger { - - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.diff.merge.IMerger#applyInOrigin() - */ - public void applyInOrigin() { - handleMutuallyDerivedReferences(); - removeFromContainer(diff); - } - - /* - * This function has been copied from emf-compare version 1.1.0M7 as a - * bugfix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=288659 - */ - private void handleMutuallyDerivedReferences() { - DiffElement toRemove = null; - if (diff instanceof ReferenceChange) { - final EReference reference = ((ReferenceChange) diff) - .getReference(); - if (reference == EcorePackage.eINSTANCE.getEClass_ESuperTypes()) { - final EObject referenceType; - if (diff instanceof ReferenceChangeLeftTarget) { - referenceType = ((ReferenceChangeLeftTarget) diff) - .getRightTarget(); - } else { - referenceType = ((ReferenceChangeRightTarget) diff) - .getLeftTarget(); - } - for (final DiffElement siblingDiff : ((DiffGroup) diff - .eContainer()).getSubDiffElements()) { - if (siblingDiff instanceof ModelElementChangeLeftTarget) { - if (((ModelElementChangeLeftTarget) siblingDiff) - .getLeftElement() instanceof EGenericType - && ((EGenericType) ((ModelElementChangeLeftTarget) siblingDiff) - .getLeftElement()).getEClassifier() == referenceType) { - toRemove = siblingDiff; - break; - } - } else if (siblingDiff instanceof ModelElementChangeRightTarget) { - if (((ModelElementChangeRightTarget) siblingDiff) - .getRightElement() instanceof EGenericType - && ((EGenericType) ((ModelElementChangeRightTarget) siblingDiff) - .getRightElement()).getEClassifier() == referenceType) { - toRemove = siblingDiff; - break; - } - } - } - } - } else if (diff instanceof ModelElementChangeLeftTarget - && ((ModelElementChangeLeftTarget) diff).getLeftElement() instanceof EGenericType) { - final ModelElementChangeLeftTarget theDiff = (ModelElementChangeLeftTarget) diff; - final EClassifier referenceType = ((EGenericType) theDiff - .getLeftElement()).getEClassifier(); - for (final DiffElement siblingDiff : ((DiffGroup) diff.eContainer()) - .getSubDiffElements()) { - if (siblingDiff instanceof ReferenceChangeLeftTarget - && ((ReferenceChangeLeftTarget) siblingDiff) - .getReference().getFeatureID() == EcorePackage.ECLASS__ESUPER_TYPES) { - if (((ReferenceChangeLeftTarget) siblingDiff) - .getRightTarget() == referenceType) { - toRemove = siblingDiff; - break; - } - } - } - } else if (diff instanceof ModelElementChangeRightTarget - && ((ModelElementChangeRightTarget) diff).getRightElement() instanceof EGenericType) { - final ModelElementChangeRightTarget theDiff = (ModelElementChangeRightTarget) diff; - final EClassifier referenceType = ((EGenericType) theDiff - .getRightElement()).getEClassifier(); - for (final DiffElement siblingDiff : ((DiffGroup) diff.eContainer()) - .getSubDiffElements()) { - if (siblingDiff instanceof ReferenceChangeRightTarget - && ((ReferenceChangeRightTarget) siblingDiff) - .getReference().getFeatureID() == EcorePackage.ECLASS__ESUPER_TYPES) { - if (((ReferenceChangeRightTarget) siblingDiff) - .getLeftTarget() == referenceType) { - toRemove = siblingDiff; - break; - } - } - } - } - if (toRemove != null) { - removeFromContainer(toRemove); - } - } - -} diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ModelElementChangeRightTargetMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ModelElementChangeRightTargetMerger.java index eece51da676b2c463046324b2ad0db5a8f824ae3..5ee3d8c363b2c04f04bb0fbba2bf819998d760f6 100644 --- a/org.eventb.texttools/src/org/eventb/texttools/merge/ModelElementChangeRightTargetMerger.java +++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ModelElementChangeRightTargetMerger.java @@ -1,6 +1,7 @@ package org.eventb.texttools.merge; import java.util.Iterator; +import java.util.List; import org.eclipse.emf.compare.EMFComparePlugin; import org.eclipse.emf.compare.FactoryException; @@ -24,6 +25,9 @@ public class ModelElementChangeRightTargetMerger extends DefaultMerger { final ModelElementChangeRightTarget theDiff = (ModelElementChangeRightTarget) this.diff; final EObject origin = theDiff.getLeftParent(); final EObject element = theDiff.getRightElement(); + System.out.println("ModelElementChangeRightTargetMerger.applyInOrigin"); + System.out.println(" element: " + element); + System.out.println(" origin: " + origin); // Scenarios where we need to handle special: // Machine sees Context @@ -61,13 +65,26 @@ public class ModelElementChangeRightTargetMerger extends DefaultMerger { final EReference ref = element.eContainmentFeature(); if (ref != null) { try { - EFactory.eAdd(origin, ref.getName(), newOne); + int elementIndex = -1; + if (ref.isMany()) { + Object containmentRefVal = element.eContainer().eGet(ref); + if (containmentRefVal instanceof List) { + List listVal = (List) containmentRefVal; + elementIndex = listVal.indexOf(element); + } + } + EFactory.eAdd(origin, ref.getName(), newOne, elementIndex); setXMIID(newOne, getXMIID(element)); } catch (final FactoryException e) { EMFComparePlugin.log(e, true); } - } else { + } else if (origin == null && getDiffModel().getLeftRoots().size() > 0) { + getDiffModel().getLeftRoots().get(0).eResource().getContents() + .add(newOne); + } else if (origin != null) { origin.eResource().getContents().add(newOne); + } else { + // FIXME Throw exception : couldn't merge this } // we should now have a look for AddReferencesLinks needing this object final Iterator<EObject> siblings = getDiffModel().eAllContents(); @@ -99,13 +116,14 @@ public class ModelElementChangeRightTargetMerger extends DefaultMerger { */ @Override public void undoInTarget() { - final ModelElementChangeRightTarget theDiff = (ModelElementChangeRightTarget) this.diff; - final EObject element = theDiff.getRightElement(); - final EObject parent = theDiff.getRightElement().eContainer(); - EcoreUtil.remove(element); - // now removes all the dangling references - removeDanglingReferences(parent); - super.undoInTarget(); + throw new RuntimeException(); + // final ModelElementChangeRightTarget theDiff = + // (ModelElementChangeRightTarget) this.diff; + // final EObject element = theDiff.getRightElement(); + // final EObject parent = theDiff.getRightElement().eContainer(); + // EcoreUtil.remove(element); + // // now removes all the dangling references + // removeDanglingReferences(parent); + // super.undoInTarget(); } - } diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ModelMerge.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ModelMerge.java index afa99eb401e13938e598f1b3e5887845db7b53c5..772083ea8ac6c10566469f1b16a4dec19869acb4 100644 --- a/org.eventb.texttools/src/org/eventb/texttools/merge/ModelMerge.java +++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ModelMerge.java @@ -29,6 +29,7 @@ import org.eclipse.emf.compare.match.service.MatchService; import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.impl.ResourceImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl; import org.eventb.emf.core.Annotation; @@ -94,8 +95,11 @@ public class ModelMerge { final SubMonitor subMonitor = SubMonitor.convert(monitor, "Analyzing model changes", 4); + // Fucking EMF and Eclipse reinventing the fucking wheel!!! + URI uri = URI.createURI(resource.getLocationURI().toString()); + Resource resources = new ResourceImpl(uri); final IMatchEngine matchEngine = MatchService - .getBestMatchEngine(resource.getFileExtension()); + .getBestMatchEngine(resources); // Workaround to make sure the models have an associated resource // See setResourceFile() for Bug info @@ -111,41 +115,41 @@ public class ModelMerge { // setRodinResource(newVersion, extension, projectName); } - matchOptions.put(MatchOptions.OPTION_PROGRESS_MONITOR, subMonitor - .newChild(1)); - + matchOptions.put(MatchOptions.OPTION_PROGRESS_MONITOR, + subMonitor.newChild(1)); + long timeStart = System.currentTimeMillis(); - + final MatchModel matchModel = matchEngine.contentMatch(oldVersion, newVersion, matchOptions); - + long timeMatch = System.currentTimeMillis(); - + final DiffModel diff = getDiffModel(matchModel, subMonitor.newChild(2)); - + long timeDiff = System.currentTimeMillis(); - + final EList<DiffElement> ownedElements = diff.getOwnedElements(); - + if (ownedElements.size() > 0) { // MergeService // .merge(new ArrayList<DiffElement>(ownedElements), false); MergeService.merge(ownedElements, false); - matchOptions.put(MatchOptions.OPTION_PROGRESS_MONITOR, subMonitor - .newChild(1)); + matchOptions.put(MatchOptions.OPTION_PROGRESS_MONITOR, + subMonitor.newChild(1)); subMonitor.worked(1); } long timeMerge = System.currentTimeMillis(); - if (PersistenceHelper.DEBUG){ + if (PersistenceHelper.DEBUG) { System.out.println("*** applyChanges() ****"); - System.out.println(" contentMatch: " + (timeMatch-timeStart)); - System.out.println(" getDiffModel: " + (timeDiff-timeMatch)); - System.out.println(" merge: " + (timeMerge-timeDiff)); + System.out.println(" contentMatch: " + (timeMatch - timeStart)); + System.out.println(" getDiffModel: " + (timeDiff - timeMatch)); + System.out.println(" merge: " + (timeMerge - timeDiff)); System.out.println(); } - + // cleanup tmp files EcoreUtil.remove(newVersion); if (tmpFileNew != null) { diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeLeftTargetMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeLeftTargetMerger.java index 7765013fe0cb43ca5e4aa222294d38a3e863bea6..f7b59d751f9b3ef4b0333ffdc99268cff512e9ca 100644 --- a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeLeftTargetMerger.java +++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeLeftTargetMerger.java @@ -5,10 +5,8 @@ import java.util.Iterator; import org.eclipse.emf.compare.EMFComparePlugin; import org.eclipse.emf.compare.FactoryException; import org.eclipse.emf.compare.diff.merge.DefaultMerger; -import org.eclipse.emf.compare.diff.merge.service.MergeService; import org.eclipse.emf.compare.diff.metamodel.DiffElement; import org.eclipse.emf.compare.diff.metamodel.ReferenceChangeLeftTarget; -import org.eclipse.emf.compare.diff.metamodel.ReferenceOrderChange; import org.eclipse.emf.compare.diff.metamodel.ResourceDependencyChange; import org.eclipse.emf.compare.util.EFactory; import org.eclipse.emf.ecore.EObject; @@ -28,6 +26,7 @@ import org.eclipse.emf.ecore.util.EcoreUtil; * @author <a href="mailto:laurent.goubet@obeo.fr">Laurent Goubet</a> */ public class ReferenceChangeLeftTargetMerger extends DefaultMerger { + /** * {@inheritDoc} * @@ -38,6 +37,10 @@ public class ReferenceChangeLeftTargetMerger extends DefaultMerger { final ReferenceChangeLeftTarget theDiff = (ReferenceChangeLeftTarget) this.diff; final EObject element = theDiff.getLeftElement(); final EObject leftTarget = theDiff.getRightTarget(); + System.out.println("ReferenceChangeLeftTargetMerger.applyInOrigin"); + System.out.println(" element: " + element); + System.out.println(" leftTarget: " + leftTarget); + try { if (leftTarget != null) { EFactory.eRemove(element, theDiff.getReference().getName(), @@ -77,43 +80,49 @@ public class ReferenceChangeLeftTargetMerger extends DefaultMerger { super.applyInOrigin(); } + @Override + public void undoInTarget() { + throw new RuntimeException(); + } + /** * {@inheritDoc} * * @see org.eclipse.emf.compare.diff.merge.DefaultMerger#undoInTarget() */ - @Override - public void undoInTarget() { - final ReferenceChangeLeftTarget theDiff = (ReferenceChangeLeftTarget) this.diff; - final EObject element = theDiff.getRightElement(); - final EObject leftTarget = theDiff.getRightTarget(); - final EObject rightTarget = theDiff.getLeftTarget(); - // FIXME respect ordering! - final EObject copiedValue = MergeService.getCopier(diff) - .copyReferenceValue(theDiff.getReference(), element, - leftTarget, rightTarget); - - // we should now have a look for AddReferencesLinks needing this object - final Iterator<EObject> siblings = getDiffModel().eAllContents(); - while (siblings.hasNext()) { - final DiffElement op = (DiffElement) siblings.next(); - if (op instanceof ReferenceChangeLeftTarget) { - final ReferenceChangeLeftTarget link = (ReferenceChangeLeftTarget) op; - // now if I'm in the target References I should put my copy in - // the origin - if (link.getReference().equals( - theDiff.getReference().getEOpposite()) - && link.getLeftTarget().equals(element)) { - removeFromContainer(link); - } - } else if (op instanceof ReferenceOrderChange) { - final ReferenceOrderChange link = (ReferenceOrderChange) op; - if (link.getReference().equals(theDiff.getReference())) { - // FIXME respect ordering! - link.getRightTarget().add(copiedValue); - } - } - } - super.undoInTarget(); - } + // @Override + // public void undoInTarget() { + // final ReferenceChangeLeftTarget theDiff = (ReferenceChangeLeftTarget) + // this.diff; + // final EObject element = theDiff.getRightElement(); + // final EObject leftTarget = theDiff.getRightTarget(); + // final EObject rightTarget = theDiff.getLeftTarget(); + // // FIXME respect ordering! + // final EObject copiedValue = MergeService.getCopier(diff) + // .copyReferenceValue(theDiff.getReference(), element, + // leftTarget, rightTarget); + // + // // we should now have a look for AddReferencesLinks needing this object + // final Iterator<EObject> siblings = getDiffModel().eAllContents(); + // while (siblings.hasNext()) { + // final DiffElement op = (DiffElement) siblings.next(); + // if (op instanceof ReferenceChangeLeftTarget) { + // final ReferenceChangeLeftTarget link = (ReferenceChangeLeftTarget) op; + // // now if I'm in the target References I should put my copy in + // // the origin + // if (link.getReference().equals( + // theDiff.getReference().getEOpposite()) + // && link.getLeftTarget().equals(element)) { + // removeFromContainer(link); + // } + // } else if (op instanceof ReferenceOrderChange) { + // final ReferenceOrderChange link = (ReferenceOrderChange) op; + // if (link.getReference().equals(theDiff.getReference())) { + // // FIXME respect ordering! + // link.getRightTarget().add(copiedValue); + // } + // } + // } + // super.undoInTarget(); + // } } diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeRightTargetMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeRightTargetMerger.java index 9ecb28a30af0acac9156135be55eb442d80afdc4..b8010924e05e145f1a6347afd2d94e1881a7b6c1 100644 --- a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeRightTargetMerger.java +++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceChangeRightTargetMerger.java @@ -7,19 +7,15 @@ package org.eventb.texttools.merge; import java.util.Iterator; +import java.util.List; -import org.eclipse.emf.compare.EMFComparePlugin; -import org.eclipse.emf.compare.FactoryException; import org.eclipse.emf.compare.diff.merge.DefaultMerger; import org.eclipse.emf.compare.diff.merge.service.MergeService; import org.eclipse.emf.compare.diff.metamodel.DiffElement; import org.eclipse.emf.compare.diff.metamodel.ReferenceChangeRightTarget; import org.eclipse.emf.compare.diff.metamodel.ReferenceOrderChange; -import org.eclipse.emf.compare.diff.metamodel.ResourceDependencyChange; -import org.eclipse.emf.compare.util.EFactory; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.ecore.EReference; public class ReferenceChangeRightTargetMerger extends DefaultMerger { @@ -29,22 +25,42 @@ public class ReferenceChangeRightTargetMerger extends DefaultMerger { final EObject element = theDiff.getLeftElement(); final EObject leftTarget = theDiff.getLeftTarget(); final EObject rightTarget = theDiff.getRightTarget(); + System.out.println("ReferenceChangeRightTargetMerger.applyInOrigin"); + System.out.println(" element: " + element); + System.out.println(" leftTarget: " + leftTarget); + System.out.println(" rightTarget: " + rightTarget); boolean applied = MergeUtil.rodinCopy(element, leftTarget, rightTarget); + System.out.println(" Applied: " + applied); if (!applied) originalApplyInOrigin(); } - public void originalApplyInOrigin() { + private void originalApplyInOrigin() { final ReferenceChangeRightTarget theDiff = (ReferenceChangeRightTarget) this.diff; final EObject element = theDiff.getLeftElement(); - final EObject leftTarget = theDiff.getRightTarget(); - final EObject rightTarget = theDiff.getLeftTarget(); + // (mj) In the past, we had right and left toggled. + final EObject rightTarget = theDiff.getRightTarget(); + final EObject leftTarget = theDiff.getLeftTarget(); + // FIXME respect ordering! + EReference reference = theDiff.getReference(); + + // ordering handling: + int index = -1; + if (reference.isMany()) { + + EObject rightElement = theDiff.getRightElement(); + Object fightRefValue = rightElement.eGet(reference); + if (fightRefValue instanceof List) { + List refRightValueList = (List) fightRefValue; + index = refRightValueList.indexOf(rightTarget); + } + } final EObject copiedValue = MergeService.getCopier(diff) - .copyReferenceValue(theDiff.getReference(), element, - rightTarget, leftTarget); + .copyReferenceValue(reference, element, rightTarget, + leftTarget, index); // We'll now look through this reference's eOpposite as they are already // taken care of @@ -71,45 +87,52 @@ public class ReferenceChangeRightTargetMerger extends DefaultMerger { super.applyInOrigin(); } - /** - * {@inheritDoc} - * - * @see org.eclipse.emf.compare.diff.merge.api.AbstractMerger#undoInTarget() - */ @Override public void undoInTarget() { - final ReferenceChangeRightTarget theDiff = (ReferenceChangeRightTarget) this.diff; - final EObject element = theDiff.getRightElement(); - final EObject rightTarget = theDiff.getLeftTarget(); - try { - EFactory.eRemove(element, theDiff.getReference().getName(), - rightTarget); - } catch (final FactoryException e) { - EMFComparePlugin.log(e, true); - } - // we should now have a look for AddReferencesLinks needing this object - final Iterator<EObject> related = getDiffModel().eAllContents(); - while (related.hasNext()) { - final DiffElement op = (DiffElement) related.next(); - if (op instanceof ReferenceChangeRightTarget) { - final ReferenceChangeRightTarget link = (ReferenceChangeRightTarget) op; - // now if I'm in the target References I should put my copy in - // the origin - if (link.getReference().equals( - theDiff.getReference().getEOpposite()) - && link.getLeftTarget().equals(element)) { - removeFromContainer(link); - } - } else if (op instanceof ResourceDependencyChange) { - final ResourceDependencyChange link = (ResourceDependencyChange) op; - final Resource res = link.getRoots().get(0).eResource(); - if (res == rightTarget.eResource()) { - EcoreUtil.remove(link); - res.unload(); - } - } - } - super.undoInTarget(); + throw new RuntimeException(); } + // /** + // * {@inheritDoc} + // * + // * @see + // org.eclipse.emf.compare.diff.merge.api.AbstractMerger#undoInTarget() + // */ + // @Override + // public void undoInTarget() { + // final ReferenceChangeRightTarget theDiff = (ReferenceChangeRightTarget) + // this.diff; + // final EObject element = theDiff.getRightElement(); + // final EObject rightTarget = theDiff.getLeftTarget(); + // try { + // EFactory.eRemove(element, theDiff.getReference().getName(), + // rightTarget); + // } catch (final FactoryException e) { + // EMFComparePlugin.log(e, true); + // } + // // we should now have a look for AddReferencesLinks needing this object + // final Iterator<EObject> related = getDiffModel().eAllContents(); + // while (related.hasNext()) { + // final DiffElement op = (DiffElement) related.next(); + // if (op instanceof ReferenceChangeRightTarget) { + // final ReferenceChangeRightTarget link = (ReferenceChangeRightTarget) op; + // // now if I'm in the target References I should put my copy in + // // the origin + // if (link.getReference().equals( + // theDiff.getReference().getEOpposite()) + // && link.getLeftTarget().equals(element)) { + // removeFromContainer(link); + // } + // } else if (op instanceof ResourceDependencyChange) { + // final ResourceDependencyChange link = (ResourceDependencyChange) op; + // final Resource res = link.getRoots().get(0).eResource(); + // if (res == rightTarget.eResource()) { + // EcoreUtil.remove(link); + // res.unload(); + // } + // } + // } + // super.undoInTarget(); + // } + } diff --git a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceOrderChangeMerger.java b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceOrderChangeMerger.java index 8200b69a2a9f9702241117cae0653a9d7b7a5e8c..96cf75f2562272b41a96dbea31860a7016d3d03f 100644 --- a/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceOrderChangeMerger.java +++ b/org.eventb.texttools/src/org/eventb/texttools/merge/ReferenceOrderChangeMerger.java @@ -4,6 +4,7 @@ import java.util.List; import org.eclipse.emf.compare.EMFComparePlugin; import org.eclipse.emf.compare.FactoryException; +import org.eclipse.emf.compare.diff.merge.DefaultMerger; import org.eclipse.emf.compare.diff.metamodel.ReferenceOrderChange; import org.eclipse.emf.compare.util.EFactory; import org.eclipse.emf.ecore.EObject; @@ -24,14 +25,17 @@ public class ReferenceOrderChangeMerger extends DefaultMerger { final ReferenceOrderChange theDiff = (ReferenceOrderChange) this.diff; final EObject element = theDiff.getLeftElement(); final List<EObject> leftTarget = theDiff.getLeftTarget(); + System.out.println("ReferenceOrderChangeMerger.applyInOrigin"); + System.out.println(" element: " + element); + System.out.println(" leftTarget: " + leftTarget); // (mj) START if (leftTarget.size() == 0) { // Handle Event Refinement changed if (element instanceof Event - && theDiff.getReference().getName().equals( - Constants.REFINES)) { + && theDiff.getReference().getName() + .equals(Constants.REFINES)) { Event leftEvent = (Event) element; Event rightEvent = (Event) theDiff.getRightElement(); leftEvent.getRefines().clear(); @@ -44,15 +48,15 @@ public class ReferenceOrderChangeMerger extends DefaultMerger { leftMachine.getRefines().clear(); leftMachine.getRefines().addAll( EcoreUtil.copyAll(rightMachine.getRefines())); - } else if (theDiff.getReference().getName().equals( - Constants.SEES)) { + } else if (theDiff.getReference().getName() + .equals(Constants.SEES)) { leftMachine.getSees().clear(); leftMachine.getSees().addAll( EcoreUtil.copyAll(rightMachine.getSees())); } } else if (element instanceof Context - && theDiff.getReference().getName().equals( - Constants.EXTENDS)) { + && theDiff.getReference().getName() + .equals(Constants.EXTENDS)) { Context leftContext = (Context) element; Context rightContext = (Context) theDiff.getRightElement(); leftContext.getExtends().clear(); @@ -66,8 +70,7 @@ public class ReferenceOrderChangeMerger extends DefaultMerger { // (mj) END try { - EFactory - .eSet(element, theDiff.getReference().getName(), leftTarget); + EFactory.eSet(element, theDiff.getReference().getName(), leftTarget); } catch (final FactoryException e) { EMFComparePlugin.log(e, true); } @@ -81,16 +84,19 @@ public class ReferenceOrderChangeMerger extends DefaultMerger { */ @Override public void undoInTarget() { - final ReferenceOrderChange theDiff = (ReferenceOrderChange) this.diff; - final EObject element = theDiff.getRightElement(); - final List<EObject> rightTarget = theDiff.getRightTarget(); - try { - EFactory.eSet(element, theDiff.getReference().getName(), - rightTarget); - } catch (final FactoryException e) { - EMFComparePlugin.log(e, true); - } - super.undoInTarget(); + throw new RuntimeException(); + + // final ReferenceOrderChange theDiff = (ReferenceOrderChange) + // this.diff; + // final EObject element = theDiff.getRightElement(); + // final List<EObject> rightTarget = theDiff.getRightTarget(); + // try { + // EFactory.eSet(element, theDiff.getReference().getName(), + // rightTarget); + // } catch (final FactoryException e) { + // EMFComparePlugin.log(e, true); + // } + // super.undoInTarget(); } } \ No newline at end of file