Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2012-10-01 10:02:44 +0000
committerEike Stepper2012-10-01 10:02:44 +0000
commitc3e3a3584d1a122b809ea4c58ad4a22ab7b263c9 (patch)
treed31372e903aedaf7ab80a811d79a7cc9486d078b
parent8e53990a843a008c446773547762ab66b2debac9 (diff)
downloadcdo-c3e3a3584d1a122b809ea4c58ad4a22ab7b263c9.tar.gz
cdo-c3e3a3584d1a122b809ea4c58ad4a22ab7b263c9.tar.xz
cdo-c3e3a3584d1a122b809ea4c58ad4a22ab7b263c9.zip
[390808] Integrate CDO with EMF Compare
https://bugs.eclipse.org/bugs/show_bug.cgi?id=390808
-rw-r--r--plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CDOCompareUtil.java272
-rw-r--r--plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CloseableComparison.java22
-rw-r--r--plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/DelegatingComparison.java194
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java7
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF1
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java1
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/EMFCompareTest.java98
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java59
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java42
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java113
10 files changed, 765 insertions, 44 deletions
diff --git a/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CDOCompareUtil.java b/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CDOCompareUtil.java
index 736e8e8e1e..3fcffc08db 100644
--- a/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CDOCompareUtil.java
+++ b/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CDOCompareUtil.java
@@ -10,7 +10,38 @@
*/
package org.eclipse.emf.cdo.compare;
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
+import org.eclipse.emf.cdo.common.id.CDOID;
+import org.eclipse.emf.cdo.common.id.CDOIDUtil;
+import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil;
+import org.eclipse.emf.cdo.util.CDOUtil;
+import org.eclipse.emf.cdo.view.CDOView;
+
+import org.eclipse.net4j.util.lifecycle.ILifecycle;
+import org.eclipse.net4j.util.lifecycle.LifecycleEventAdapter;
+import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
+
+import org.eclipse.emf.common.notify.Notifier;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.EMFCompare;
+import org.eclipse.emf.compare.match.eobject.IEObjectMatcher;
+import org.eclipse.emf.compare.match.eobject.IdentifierEObjectMatcher;
+import org.eclipse.emf.compare.scope.AbstractComparisonScope;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterators;
+
+import java.util.Iterator;
+
/**
+ * Various static methods that may help EMF Compare in a CDO scope.
+ *
* @author Eike Stepper
*/
public final class CDOCompareUtil
@@ -19,13 +50,242 @@ public final class CDOCompareUtil
{
}
- public static void getMatch()
+ public static CDOComparison compare(CDOView leftView, CDOBranchPoint right)
{
- // Function<EObject, String> cdoidFunction = new Function<EObject, String>()
+ return compare(leftView, right, true);
+ }
+
+ public static CDOComparison compare(CDOView leftView, CDOBranchPoint right, boolean threeWay)
+ {
+ CDOSession session = leftView.getSession();
+
+ CDOView rightView;
+ if (right instanceof CDOView)
+ {
+ rightView = (CDOView)right;
+ if (rightView.getSession() != session)
+ {
+ throw new IllegalArgumentException("Sessions are different");
+ }
+ }
+ else
+ {
+ rightView = session.openView(right);
+ }
+
+ CDOObject leftObject = leftView.getRootResource();
+ Notifier rightObject = rightView.getRootResource();
+
+ CDOView originView = null;
+ Notifier originObject = null;
+ if (threeWay)
+ {
+ CDOBranchPoint ancestor = CDOBranchUtil.getAncestor(leftView, rightView);
+ if (!ancestor.equals(leftView) && !ancestor.equals(rightView))
+ {
+ originView = session.openView(ancestor);
+ originObject = originView.getRootResource();
+ }
+ }
+
+ // Set<CDOID> ids;
+ // if (originView != null)
+ // {
+ // MergeData mergeData = ((InternalCDOSession)session).getMergeData(leftView, rightView, null);
+ // ids = mergeData.getIDs();
+ // }
+ // else
// {
- // };
- //
- // IdentifierEObjectMatcher eObjectMatcher = new
- // IdentifierEObjectMatcher.Builder().idFunction(cdoidFunction).build();
+ // CDOChangeSetData changeSetData = leftView.compareRevisions(right);
+ // ids = changeSetData.getChangeKinds().keySet();
+ // }
+
+ IComparisonScope scope = new CDOComparisonScope.AllContents(leftObject, rightObject, originObject);
+ return createComparison(scope, leftView, rightView, originView);
+ }
+
+ public static CDOComparison compare(EObject leftRoot, CDOBranchPoint right)
+ {
+ return compare(leftRoot, right, true);
+ }
+
+ public static CDOComparison compare(EObject leftRoot, CDOBranchPoint right, boolean threeWay)
+ {
+ CDOObject leftObject = CDOUtil.getCDOObject(leftRoot);
+ CDOView leftView = leftObject.cdoView();
+ CDOBranchPoint left = CDOBranchUtil.copyBranchPoint(leftView);
+ CDOSession session = leftView.getSession();
+
+ CDOView rightView;
+ if (right instanceof CDOView)
+ {
+ rightView = (CDOView)right;
+ if (rightView.getSession() != session)
+ {
+ throw new IllegalArgumentException("Sessions are different");
+ }
+ }
+ else
+ {
+ rightView = session.openView(right);
+ }
+
+ Notifier rightObject = rightView.getObject(leftObject);
+
+ CDOView originView = null;
+ Notifier originObject = null;
+ if (threeWay)
+ {
+ CDOBranchPoint ancestor = CDOBranchUtil.getAncestor(left, right);
+ if (!ancestor.equals(left) && !ancestor.equals(right))
+ {
+ originView = session.openView(ancestor);
+ originObject = originView.getObject(leftObject);
+ }
+ }
+
+ IComparisonScope scope = new CDOComparisonScope.AllContents(leftObject, rightObject, originObject);
+ return createComparison(scope, leftView, rightView, originView);
+ }
+
+ private static EMFCompare createComparator(IComparisonScope scope)
+ {
+ Function<EObject, String> idFunction = new CDOIDFunction();
+ IEObjectMatcher matcher = new IdentifierEObjectMatcher.Builder().idFunction(idFunction).build();
+
+ EMFCompare comparator = EMFCompare.newComparator(scope);
+ comparator.setEObjectMatcher(matcher);
+ return comparator;
+ }
+
+ private static CDOComparison createComparison(IComparisonScope scope, CDOView leftView, CDOView rightView,
+ CDOView originView)
+ {
+ EMFCompare comparator = createComparator(scope);
+ Comparison comparison = comparator.compare();
+ return new CDOComparison(comparison, leftView, rightView, originView);
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class CDOComparison extends DelegatingComparison implements CloseableComparison
+ {
+ private CDOView leftView;
+
+ private CDOView rightView;
+
+ private CDOView originView;
+
+ public CDOComparison(Comparison delegate, CDOView leftView, CDOView rightView, CDOView originView)
+ {
+ super(delegate);
+ this.leftView = leftView;
+ this.rightView = rightView;
+ this.originView = originView;
+
+ leftView.addListener(new LifecycleEventAdapter()
+ {
+ @Override
+ protected void onDeactivated(ILifecycle lifecycle)
+ {
+ close();
+ }
+ });
+ }
+
+ public CDOView getLeftView()
+ {
+ return leftView;
+ }
+
+ public CDOView getRightView()
+ {
+ return rightView;
+ }
+
+ public CDOView getOriginView()
+ {
+ return originView;
+ }
+
+ public void close()
+ {
+ close(false);
+ }
+
+ public void close(boolean closeLeftView)
+ {
+ if (closeLeftView)
+ {
+ LifecycleUtil.deactivate(leftView);
+ }
+
+ LifecycleUtil.deactivate(rightView);
+ LifecycleUtil.deactivate(originView);
+
+ leftView = null;
+ rightView = null;
+ originView = null;
+ delegate = null;
+ }
+
+ public boolean isClosed()
+ {
+ return delegate == null;
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static abstract class CDOComparisonScope extends AbstractComparisonScope
+ {
+ public CDOComparisonScope(Notifier left, Notifier right, Notifier origin)
+ {
+ super(left, right, origin);
+ }
+
+ public Iterator<? extends Resource> getCoveredResources(ResourceSet resourceSet)
+ {
+ return Iterators.emptyIterator();
+ }
+
+ public Iterator<? extends EObject> getCoveredEObjects(Resource resource)
+ {
+ return Iterators.emptyIterator();
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class AllContents extends CDOComparisonScope
+ {
+ public AllContents(Notifier left, Notifier right, Notifier origin)
+ {
+ super(left, right, origin);
+ }
+
+ public Iterator<? extends EObject> getChildren(EObject eObject)
+ {
+ return eObject.eAllContents();
+ }
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ public static class CDOIDFunction implements Function<EObject, String>
+ {
+ public String apply(EObject o)
+ {
+ CDOObject object = CDOUtil.getCDOObject(o);
+ CDOID id = object.cdoID();
+
+ StringBuilder builder = new StringBuilder();
+ CDOIDUtil.write(builder, id);
+ return builder.toString();
+ }
}
}
diff --git a/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CloseableComparison.java b/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CloseableComparison.java
new file mode 100644
index 0000000000..9c002782ae
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/CloseableComparison.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.compare;
+
+import org.eclipse.net4j.util.collection.Closeable;
+
+import org.eclipse.emf.compare.Comparison;
+
+/**
+ * @author Eike Stepper
+ */
+public interface CloseableComparison extends Comparison, Closeable
+{
+} \ No newline at end of file
diff --git a/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/DelegatingComparison.java b/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/DelegatingComparison.java
new file mode 100644
index 0000000000..6880a713ff
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.compare/src/org/eclipse/emf/cdo/compare/DelegatingComparison.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.compare;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Conflict;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.EMFCompareConfiguration;
+import org.eclipse.emf.compare.Equivalence;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.MatchResource;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EOperation;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.emf.ecore.resource.Resource;
+
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author Eike Stepper
+ */
+public class DelegatingComparison implements Comparison
+{
+ protected Comparison delegate;
+
+ public DelegatingComparison(Comparison delegate)
+ {
+ this.delegate = delegate;
+ }
+
+ public Comparison getDelegate()
+ {
+ return delegate;
+ }
+
+ public EList<Adapter> eAdapters()
+ {
+ return delegate.eAdapters();
+ }
+
+ public boolean eDeliver()
+ {
+ return delegate.eDeliver();
+ }
+
+ public void eSetDeliver(boolean deliver)
+ {
+ delegate.eSetDeliver(deliver);
+ }
+
+ public void eNotify(Notification notification)
+ {
+ delegate.eNotify(notification);
+ }
+
+ public EList<MatchResource> getMatchedResources()
+ {
+ return delegate.getMatchedResources();
+ }
+
+ public EList<Match> getMatches()
+ {
+ return delegate.getMatches();
+ }
+
+ public EClass eClass()
+ {
+ return delegate.eClass();
+ }
+
+ public EList<Conflict> getConflicts()
+ {
+ return delegate.getConflicts();
+ }
+
+ public Resource eResource()
+ {
+ return delegate.eResource();
+ }
+
+ public EList<Equivalence> getEquivalences()
+ {
+ return delegate.getEquivalences();
+ }
+
+ public EObject eContainer()
+ {
+ return delegate.eContainer();
+ }
+
+ public EMFCompareConfiguration getConfiguration()
+ {
+ return delegate.getConfiguration();
+ }
+
+ public EList<Diff> getDifferences()
+ {
+ return delegate.getDifferences();
+ }
+
+ public EStructuralFeature eContainingFeature()
+ {
+ return delegate.eContainingFeature();
+ }
+
+ public EList<Diff> getDifferences(EObject element)
+ {
+ return delegate.getDifferences(element);
+ }
+
+ public Match getMatch(EObject element)
+ {
+ return delegate.getMatch(element);
+ }
+
+ public EReference eContainmentFeature()
+ {
+ return delegate.eContainmentFeature();
+ }
+
+ public boolean isThreeWay()
+ {
+ return delegate.isThreeWay();
+ }
+
+ public void setThreeWay(boolean value)
+ {
+ delegate.setThreeWay(value);
+ }
+
+ public EList<EObject> eContents()
+ {
+ return delegate.eContents();
+ }
+
+ public TreeIterator<EObject> eAllContents()
+ {
+ return delegate.eAllContents();
+ }
+
+ public boolean eIsProxy()
+ {
+ return delegate.eIsProxy();
+ }
+
+ public EList<EObject> eCrossReferences()
+ {
+ return delegate.eCrossReferences();
+ }
+
+ public Object eGet(EStructuralFeature feature)
+ {
+ return delegate.eGet(feature);
+ }
+
+ public Object eGet(EStructuralFeature feature, boolean resolve)
+ {
+ return delegate.eGet(feature, resolve);
+ }
+
+ public void eSet(EStructuralFeature feature, Object newValue)
+ {
+ delegate.eSet(feature, newValue);
+ }
+
+ public boolean eIsSet(EStructuralFeature feature)
+ {
+ return delegate.eIsSet(feature);
+ }
+
+ public void eUnset(EStructuralFeature feature)
+ {
+ delegate.eUnset(feature);
+ }
+
+ public Object eInvoke(EOperation operation, EList<?> arguments) throws InvocationTargetException
+ {
+ return delegate.eInvoke(operation, arguments);
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java
index 7c6bb4aa0e..9c3ed2af22 100644
--- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java
+++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java
@@ -967,14 +967,21 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd
throw new UnsupportedOperationException();
}
+ @Deprecated
public CDORevisionAvailabilityInfo createRevisionAvailabilityInfo(CDOBranchPoint branchPoint)
{
throw new UnsupportedOperationException();
}
+ @Deprecated
public void cacheRevisions(CDORevisionAvailabilityInfo info)
{
throw new UnsupportedOperationException();
}
+
+ public MergeData getMergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint sourceBase)
+ {
+ throw new UnsupportedOperationException();
+ }
}
}
diff --git a/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF
index 0681f00b5d..4bed8e9286 100644
--- a/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.emf.cdo.tests/META-INF/MANIFEST.MF
@@ -18,6 +18,7 @@ Require-Bundle: org.eclipse.net4j.tests;bundle-version="[4.0.0,5.0.0)";visibilit
org.eclipse.emf.transaction;bundle-version="[1.4.0,1.5.0)";visibility:=reexport,
org.eclipse.emf.cdo.common;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
org.eclipse.emf.cdo.common.db;bundle-version="[3.0.0,4.0.0)";visibility:=reexport,
+ org.eclipse.emf.cdo.compare;bundle-version="[4.2.0,5.0.0)";visibility:=reexport,
org.eclipse.emf.cdo;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
org.eclipse.emf.cdo.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)";visibility:=reexport,
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
index b196f1aab4..e78a3e9050 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/AllConfigs.java
@@ -98,6 +98,7 @@ public abstract class AllConfigs extends ConfigTestSuite
testClasses.add(XRefTest.class);
testClasses.add(StickyViewsTest.class);
testClasses.add(LobTest.class);
+ testClasses.add(EMFCompareTest.class);
testClasses.add(OCLQueryTest.class);
testClasses.add(ViewProviderTest.class);
testClasses.add(WorkspaceTest.class);
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/EMFCompareTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/EMFCompareTest.java
new file mode 100644
index 0000000000..3edee66546
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/EMFCompareTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2004 - 2012 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests;
+
+import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
+import org.eclipse.emf.cdo.compare.CDOCompareUtil;
+import org.eclipse.emf.cdo.compare.CDOCompareUtil.CDOComparison;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
+import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
+import org.eclipse.emf.cdo.tests.model1.Company;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+import org.eclipse.emf.cdo.util.CDOUtil;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * @author Eike Stepper
+ */
+@Requires(IRepositoryConfig.CAPABILITY_AUDITING)
+public class EMFCompareTest extends AbstractCDOTest
+{
+ @SuppressWarnings("unused")
+ public void testNewAudit() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ CDOResource resource = transaction.createResource(getResourcePath("/res1"));
+
+ Company company = getModel1Factory().createCompany();
+ company.setName("ESC");
+ resource.getContents().add(company);
+ CDOCommitInfo commit1 = transaction.commit();
+
+ company.setName("Sympedia");
+ CDOCommitInfo commit2 = transaction.commit();
+
+ company.setName("Eclipse");
+ CDOCommitInfo commit3 = transaction.commit();
+
+ // CloseableComparison comparison = CDOCompareUtil.compare(session.openView(commit2).getObject(company), commit3);
+ CDOComparison comparison = CDOCompareUtil.compare(company, commit2);
+ dump(comparison.getMatches(), "");
+ comparison.close();
+ }
+
+ private static void dump(EList<Match> matches, String indent)
+ {
+ for (Match match : matches)
+ {
+ System.out.println(indent + "Match:");
+ System.out.println(indent + " Left: " + toString(match.getLeft()));
+ System.out.println(indent + " Right: " + toString(match.getRight()));
+ String origin = toString(match.getOrigin());
+ if (origin != null)
+ {
+ System.out.println(indent + " Origin: " + origin);
+ }
+
+ System.out.println(indent + " Differences:");
+ for (Diff diff : match.getDifferences())
+ {
+ System.out.println(indent + " " + diff);
+ }
+
+ dump(match.getSubmatches(), indent + " ");
+ }
+ }
+
+ private static String toString(EObject object)
+ {
+ if (object == null)
+ {
+ return null;
+ }
+
+ CDOObject cdoObject = CDOUtil.getCDOObject(object);
+ if (cdoObject != null)
+ {
+ return cdoObject.cdoRevision().toString();
+ }
+
+ return object.toString();
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java
index 35b1ad839a..c5e1a44656 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java
@@ -20,6 +20,7 @@ import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.common.branch.CDOBranchVersion;
import org.eclipse.emf.cdo.common.commit.CDOChangeKind;
+import org.eclipse.emf.cdo.common.commit.CDOChangeSet;
import org.eclipse.emf.cdo.common.commit.CDOChangeSetData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfoManager;
@@ -1247,19 +1248,56 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl impleme
source = source.getBranch().getPoint(now);
}
- CDORevisionAvailabilityInfo targetInfo = createRevisionAvailabilityInfo(target);
- CDORevisionAvailabilityInfo sourceInfo = createRevisionAvailabilityInfo(source);
+ CDORevisionAvailabilityInfo targetInfo = createRevisionAvailabilityInfo2(target);
+ CDORevisionAvailabilityInfo sourceInfo = createRevisionAvailabilityInfo2(source);
Set<CDOID> ids = sessionProtocol.loadMergeData(targetInfo, sourceInfo, null, null);
- cacheRevisions(targetInfo);
- cacheRevisions(sourceInfo);
+ cacheRevisions2(targetInfo);
+ cacheRevisions2(sourceInfo);
return CDORevisionUtil.createChangeSetData(ids, sourceInfo, targetInfo);
}
+ public MergeData getMergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint sourceBase)
+ {
+ CDOBranchPoint ancestor = CDOBranchUtil.getAncestor(target, source);
+
+ CDORevisionAvailabilityInfo ancestorInfo = createRevisionAvailabilityInfo2(ancestor);
+ CDORevisionAvailabilityInfo targetInfo = createRevisionAvailabilityInfo2(target);
+ CDORevisionAvailabilityInfo sourceInfo = createRevisionAvailabilityInfo2(source);
+ CDORevisionAvailabilityInfo baseInfo = sourceBase != null ? createRevisionAvailabilityInfo2(sourceBase) : null;
+
+ Set<CDOID> ids = sessionProtocol.loadMergeData(targetInfo, sourceInfo, ancestorInfo, baseInfo);
+
+ cacheRevisions2(targetInfo);
+ cacheRevisions2(sourceInfo);
+ cacheRevisions2(ancestorInfo);
+
+ if (baseInfo != null)
+ {
+ cacheRevisions2(baseInfo);
+ }
+ else
+ {
+ baseInfo = ancestorInfo;
+ }
+
+ CDOChangeSet targetChanges = createChangeSet(ids, ancestorInfo, targetInfo);
+ CDOChangeSet sourceChanges = createChangeSet(ids, baseInfo, sourceInfo);
+
+ return new MergeData(target, source, sourceBase, ancestor, targetInfo, sourceInfo, baseInfo, ancestorInfo, ids,
+ targetChanges, sourceChanges);
+ }
+
+ @Deprecated
public CDORevisionAvailabilityInfo createRevisionAvailabilityInfo(CDOBranchPoint branchPoint)
{
+ throw new UnsupportedOperationException();
+ }
+
+ private CDORevisionAvailabilityInfo createRevisionAvailabilityInfo2(CDOBranchPoint branchPoint)
+ {
CDORevisionAvailabilityInfo info = new CDORevisionAvailabilityInfo(branchPoint);
InternalCDORevisionManager revisionManager = getRevisionManager();
@@ -1292,8 +1330,14 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl impleme
return info;
}
+ @Deprecated
public void cacheRevisions(CDORevisionAvailabilityInfo info)
{
+ throw new UnsupportedOperationException();
+ }
+
+ private void cacheRevisions2(CDORevisionAvailabilityInfo info)
+ {
InternalCDORevisionManager revisionManager = getRevisionManager();
CDOBranch branch = info.getBranchPoint().getBranch();
for (CDORevisionKey key : info.getAvailableRevisions().values())
@@ -1317,6 +1361,13 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl impleme
}
}
+ private CDOChangeSet createChangeSet(Set<CDOID> ids, CDORevisionAvailabilityInfo startInfo,
+ CDORevisionAvailabilityInfo endInfo)
+ {
+ CDOChangeSetData data = CDORevisionUtil.createChangeSetData(ids, startInfo, endInfo);
+ return CDORevisionUtil.createChangeSet(startInfo.getBranchPoint(), endInfo.getBranchPoint(), data);
+ }
+
@Override
protected void doActivate() throws Exception
{
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
index 8ee3561726..900ccea9a7 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java
@@ -153,6 +153,7 @@ import org.eclipse.emf.spi.cdo.FSMUtil;
import org.eclipse.emf.spi.cdo.InternalCDOObject;
import org.eclipse.emf.spi.cdo.InternalCDOSavepoint;
import org.eclipse.emf.spi.cdo.InternalCDOSession;
+import org.eclipse.emf.spi.cdo.InternalCDOSession.MergeData;
import org.eclipse.emf.spi.cdo.InternalCDOTransaction;
import org.eclipse.emf.spi.cdo.InternalCDOViewSet;
@@ -468,48 +469,21 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa
throw new IllegalArgumentException("Source base is not contained in " + source);
}
- CDOBranchPoint ancestor = CDOBranchUtil.getAncestor(target, source);
-
InternalCDOSession session = getSession();
- CDORevisionAvailabilityInfo ancestorInfo = session.createRevisionAvailabilityInfo(ancestor);
- CDORevisionAvailabilityInfo targetInfo = session.createRevisionAvailabilityInfo(target);
- CDORevisionAvailabilityInfo sourceInfo = session.createRevisionAvailabilityInfo(source);
- CDORevisionAvailabilityInfo baseInfo = sourceBase != null ? session.createRevisionAvailabilityInfo(sourceBase)
- : null;
-
- CDOSessionProtocol sessionProtocol = session.getSessionProtocol();
- Set<CDOID> ids = sessionProtocol.loadMergeData(targetInfo, sourceInfo, ancestorInfo, baseInfo);
-
- session.cacheRevisions(targetInfo);
- session.cacheRevisions(sourceInfo);
- session.cacheRevisions(ancestorInfo);
-
- if (baseInfo != null)
- {
- session.cacheRevisions(baseInfo);
- }
- else
- {
- baseInfo = ancestorInfo;
- }
-
- CDOChangeSet targetChanges = createChangeSet(ids, ancestorInfo, targetInfo);
- CDOChangeSet sourceChanges = createChangeSet(ids, baseInfo, sourceInfo);
+ MergeData mergeData = session.getMergeData(target, source, sourceBase);
+ CDOChangeSet targetChanges = mergeData.getTargetChanges();
+ CDOChangeSet sourceChanges = mergeData.getSourceChanges();
CDOChangeSetData result = merger.merge(targetChanges, sourceChanges);
if (result == null)
{
return null;
}
- return applyChangeSet(result, ancestorInfo, targetInfo, source, false).getChangeSetData();
- }
-
- private CDOChangeSet createChangeSet(Set<CDOID> ids, CDORevisionAvailabilityInfo startInfo,
- CDORevisionAvailabilityInfo endInfo)
- {
- CDOChangeSetData data = CDORevisionUtil.createChangeSetData(ids, startInfo, endInfo);
- return CDORevisionUtil.createChangeSet(startInfo.getBranchPoint(), endInfo.getBranchPoint(), data);
+ CDORevisionAvailabilityInfo ancestorInfo = mergeData.getAncestorInfo();
+ CDORevisionAvailabilityInfo targetInfo = mergeData.getTargetInfo();
+ ApplyChangeSetResult changeSet = applyChangeSet(result, ancestorInfo, targetInfo, source, false);
+ return changeSet.getChangeSetData();
}
@Deprecated
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java
index 8894ccb72f..c6a693cf8f 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java
@@ -13,6 +13,7 @@ package org.eclipse.emf.spi.cdo;
import org.eclipse.emf.cdo.common.CDOCommonRepository;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
+import org.eclipse.emf.cdo.common.commit.CDOChangeSet;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.id.CDOIDGenerator;
@@ -41,6 +42,7 @@ import org.eclipse.emf.spi.cdo.CDOSessionProtocol.RefreshSessionResult;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* If the meaning of this type isn't clear, there really should be more of a description here...
@@ -239,11 +241,122 @@ public interface InternalCDOSession extends CDOSession, PackageProcessor, Packag
/**
* @since 4.0
+ * @deprecated As of 4.2 not used anymore.
*/
+ @Deprecated
public CDORevisionAvailabilityInfo createRevisionAvailabilityInfo(CDOBranchPoint branchPoint);
/**
* @since 4.0
+ * @deprecated As of 4.2 not used anymore.
*/
+ @Deprecated
public void cacheRevisions(CDORevisionAvailabilityInfo info);
+
+ /**
+ * @since 4.2
+ */
+ public MergeData getMergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint sourceBase);
+
+ /**
+ * @author Eike Stepper
+ * @since 4.2
+ */
+ public static final class MergeData
+ {
+ private final CDOBranchPoint target;
+
+ private final CDOBranchPoint source;
+
+ private final CDOBranchPoint sourceBase;
+
+ private final CDOBranchPoint ancestor;
+
+ private final CDORevisionAvailabilityInfo targetInfo;
+
+ private final CDORevisionAvailabilityInfo sourceInfo;
+
+ private final CDORevisionAvailabilityInfo baseInfo;
+
+ private final CDORevisionAvailabilityInfo ancestorInfo;
+
+ private final Set<CDOID> ids;
+
+ private final CDOChangeSet targetChanges;
+
+ private final CDOChangeSet sourceChanges;
+
+ public MergeData(CDOBranchPoint target, CDOBranchPoint source, CDOBranchPoint sourceBase, CDOBranchPoint ancestor,
+ CDORevisionAvailabilityInfo targetInfo, CDORevisionAvailabilityInfo sourceInfo,
+ CDORevisionAvailabilityInfo baseInfo, CDORevisionAvailabilityInfo ancestorInfo, Set<CDOID> ids,
+ CDOChangeSet targetChanges, CDOChangeSet sourceChanges)
+ {
+ this.target = target;
+ this.source = source;
+ this.sourceBase = sourceBase;
+ this.ancestor = ancestor;
+ this.targetInfo = targetInfo;
+ this.sourceInfo = sourceInfo;
+ this.baseInfo = baseInfo;
+ this.ancestorInfo = ancestorInfo;
+ this.ids = ids;
+ this.targetChanges = targetChanges;
+ this.sourceChanges = sourceChanges;
+ }
+
+ public CDOBranchPoint getTarget()
+ {
+ return target;
+ }
+
+ public CDOBranchPoint getSource()
+ {
+ return source;
+ }
+
+ public CDOBranchPoint getSourceBase()
+ {
+ return sourceBase;
+ }
+
+ public CDOBranchPoint getAncestor()
+ {
+ return ancestor;
+ }
+
+ public CDORevisionAvailabilityInfo getTargetInfo()
+ {
+ return targetInfo;
+ }
+
+ public CDORevisionAvailabilityInfo getSourceInfo()
+ {
+ return sourceInfo;
+ }
+
+ public CDORevisionAvailabilityInfo getBaseInfo()
+ {
+ return baseInfo;
+ }
+
+ public CDORevisionAvailabilityInfo getAncestorInfo()
+ {
+ return ancestorInfo;
+ }
+
+ public Set<CDOID> getIDs()
+ {
+ return ids;
+ }
+
+ public CDOChangeSet getTargetChanges()
+ {
+ return targetChanges;
+ }
+
+ public CDOChangeSet getSourceChanges()
+ {
+ return sourceChanges;
+ }
+ }
}

Back to the top