diff options
author | Eike Stepper | 2012-10-01 10:02:44 +0000 |
---|---|---|
committer | Eike Stepper | 2012-10-01 10:02:44 +0000 |
commit | c3e3a3584d1a122b809ea4c58ad4a22ab7b263c9 (patch) | |
tree | d31372e903aedaf7ab80a811d79a7cc9486d078b | |
parent | 8e53990a843a008c446773547762ab66b2debac9 (diff) | |
download | cdo-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
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; + } + } } |