Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2015-09-11 04:43:35 +0000
committerEike Stepper2015-09-11 04:43:35 +0000
commit130a6994656afb0e0d954a42c50d9db063c755d0 (patch)
tree36d08b44cd47b44a9c4e4716565eacbd5249c434 /plugins/org.eclipse.emf.cdo.tests/src
parentf7c4495e58380b03f363d7620c00b5f9ebe8a3f2 (diff)
downloadcdo-130a6994656afb0e0d954a42c50d9db063c755d0.tar.gz
cdo-130a6994656afb0e0d954a42c50d9db063c755d0.tar.xz
cdo-130a6994656afb0e0d954a42c50d9db063c755d0.zip
[477128] Support interactive merging in CDOWorkspace.update()
https://bugs.eclipse.org/bugs/show_bug.cgi?id=477128
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.tests/src')
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/WorkspaceTest.java166
1 files changed, 163 insertions, 3 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/WorkspaceTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/WorkspaceTest.java
index a3dcea5334..39fdd0ced9 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/WorkspaceTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/WorkspaceTest.java
@@ -10,22 +10,29 @@
*/
package org.eclipse.emf.cdo.tests;
+import org.eclipse.emf.cdo.CDOObject;
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.CDOChangeSetData;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDOAllRevisionsProvider;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
+import org.eclipse.emf.cdo.compare.CDOCompareUtil;
+import org.eclipse.emf.cdo.compare.CDOComparisonScope;
import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.internal.server.mem.MEMStore;
import org.eclipse.emf.cdo.server.IRepository;
import org.eclipse.emf.cdo.server.IStore;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.session.CDOSessionConfiguration;
import org.eclipse.emf.cdo.session.CDOSessionConfigurationFactory;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.server.InternalRepository;
import org.eclipse.emf.cdo.spi.workspace.InternalCDOWorkspace;
+import org.eclipse.emf.cdo.spi.workspace.InternalCDOWorkspaceBase;
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Skips;
@@ -35,7 +42,9 @@ import org.eclipse.emf.cdo.tests.model1.Product1;
import org.eclipse.emf.cdo.tests.model1.SalesOrder;
import org.eclipse.emf.cdo.tests.model1.VAT;
import org.eclipse.emf.cdo.tests.util.TestSessionConfiguration;
+import org.eclipse.emf.cdo.transaction.CDOMerger;
import org.eclipse.emf.cdo.transaction.CDOMerger.ConflictException;
+import org.eclipse.emf.cdo.transaction.CDOMerger2;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.cdo.util.CommitException;
@@ -51,7 +60,14 @@ 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.util.BasicMonitor;
import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.merge.BatchMerger;
+import org.eclipse.emf.compare.merge.IBatchMerger;
+import org.eclipse.emf.compare.merge.IMerger;
+import org.eclipse.emf.compare.merge.IMerger.RegistryImpl;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.spi.cdo.DefaultCDOMerger;
@@ -63,6 +79,7 @@ import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Set;
/**
* @author Eike Stepper
@@ -1262,7 +1279,7 @@ public class WorkspaceTest extends AbstractCDOTest
local.commit();
local.close();
- DefaultCDOMerger.PerFeature.ManyValued merger = new DefaultCDOMerger.PerFeature.ManyValued();
+ DefaultCDOMerger merger = new DefaultCDOMerger.PerFeature.ManyValued();
local = workspace.update(merger);
assertEquals(0, merger.getConflicts().size());
assertEquals(false, local.isDirty());
@@ -1274,7 +1291,7 @@ public class WorkspaceTest extends AbstractCDOTest
assertEquals(1, countModifiedProduct(view));
}
- public void testConflictMasterAndLocalModify() throws Exception
+ public void testConflictMasterAndLocalModify_DefaultMerger() throws Exception
{
CDOID id = CDOUtil.getCDOObject(products.get(1)).cdoID();
@@ -1289,7 +1306,7 @@ public class WorkspaceTest extends AbstractCDOTest
local.commit();
local.close();
- DefaultCDOMerger.PerFeature.ManyValued merger = new DefaultCDOMerger.PerFeature.ManyValued();
+ DefaultCDOMerger merger = new DefaultCDOMerger.PerFeature.ManyValued();
try
{
@@ -1310,6 +1327,149 @@ public class WorkspaceTest extends AbstractCDOTest
assertEquals(1, countModifiedProduct(view));
}
+ public void testConflictMasterAndLocalModify_CompareMerger() throws Exception
+ {
+ disableLog4j();
+
+ @SuppressWarnings("unused")
+ CDOID id = CDOUtil.getCDOObject(products.get(1)).cdoID();
+
+ InternalCDOWorkspace workspace = checkout("MAIN", CDOBranchPoint.UNSPECIFIED_DATE);
+ assertNotSame(CDOBranchPoint.UNSPECIFIED_DATE, workspace.getTimeStamp());
+
+ @SuppressWarnings("unused")
+ InternalCDOWorkspaceBase base = workspace.getBase();
+
+ assertEquals(1, modifyProduct(transaction, 1, "MODIFIED_1_"));
+ transaction.commit();
+
+ CDOTransaction local = workspace.openTransaction();
+ assertEquals(1, modifyProduct(local, 1, "MODIFIED_2_"));
+ local.commit();
+
+ local.close();
+
+ CDOMerger merger = new CDOMerger2()
+ {
+ @Deprecated
+ public CDOChangeSetData merge(CDOChangeSet target, CDOChangeSet source) throws UnsupportedOperationException
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public void merge(CDOTransaction localTransaction, CDOView remoteView, Set<CDOID> affectedIDs)
+ throws ConflictException
+ {
+ CDOComparisonScope scope = new CDOComparisonScope.Minimal(remoteView, localTransaction, null, affectedIDs);
+ Comparison comparison = CDOCompareUtil.compare(scope);
+ EList<Diff> differences = comparison.getDifferences();
+
+ IMerger.Registry mergerRegistry = RegistryImpl.createStandaloneInstance();
+
+ IBatchMerger merger = new BatchMerger(mergerRegistry);
+ merger.copyAllLeftToRight(differences, new BasicMonitor());
+ }
+ };
+
+ local = workspace.update(merger);
+
+ List<CDORevision> dirtyRevisions = getDirtyRevisions(local);
+ dump("dirtyRevisions", dirtyRevisions);
+
+ List<CDORevision> storeRevisions = getStoreRevisions(workspace, dirtyRevisions);
+ dump("storeRevisions", storeRevisions);
+
+ List<CDORevision> baseRevisions = getBaseRevisions(workspace);
+ dump("baseRevisions", baseRevisions);
+
+ dump("COMMIT", null);
+ local.commit();
+
+ dirtyRevisions = getDirtyRevisions(local);
+ dump("dirtyRevisions", dirtyRevisions);
+
+ storeRevisions = getStoreRevisions(workspace, dirtyRevisions);
+ dump("storeRevisions", storeRevisions);
+
+ baseRevisions = getBaseRevisions(workspace);
+ dump("baseRevisions", baseRevisions);
+
+ local.close();
+
+ CDOCommitInfo commitInfo = workspace.checkin();
+ System.out.println(commitInfo);
+ }
+
+ private void dump(String label, List<CDORevision> revisions)
+ {
+ System.out.println();
+ System.out.println(label);
+
+ if (revisions != null)
+ {
+ for (CDORevision revision : revisions)
+ {
+ System.out.println(" " + revision);
+ }
+ }
+ }
+
+ private boolean containsID(List<CDORevision> revisions, CDOID id)
+ {
+ for (CDORevision revision : revisions)
+ {
+ if (revision.getID() == id)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private List<CDORevision> getDirtyRevisions(CDOTransaction transaction)
+ {
+ List<CDORevision> revisions = new ArrayList<CDORevision>();
+
+ for (CDOObject dirtyObject : transaction.getDirtyObjects().values())
+ {
+ CDORevision revision = dirtyObject.cdoRevision(false);
+ revisions.add(revision);
+ }
+
+ return revisions;
+ }
+
+ private List<CDORevision> getStoreRevisions(InternalCDOWorkspace workspace, List<CDORevision> dirtyRevisions)
+ {
+ List<CDORevision> revisions = new ArrayList<CDORevision>();
+
+ MEMStore store = (MEMStore)workspace.getLocalRepository().getStore();
+ for (InternalCDORevision revision : store.getCurrentRevisions())
+ {
+ if (containsID(dirtyRevisions, revision.getID()))
+ {
+ revisions.add(revision);
+ }
+ }
+
+ return revisions;
+ }
+
+ private List<CDORevision> getBaseRevisions(InternalCDOWorkspace workspace)
+ {
+ List<CDORevision> revisions = new ArrayList<CDORevision>();
+
+ InternalCDOWorkspaceBase base = workspace.getBase();
+ for (CDOID id : base.getIDs())
+ {
+ CDORevision revision = base.getRevision(id);
+ revisions.add(revision);
+ }
+
+ return revisions;
+ }
+
public void testRevertNoTransaction() throws Exception
{
// Checkout local

Back to the top