diff options
author | Eike Stepper | 2021-11-03 15:13:04 +0000 |
---|---|---|
committer | Eike Stepper | 2021-11-03 15:13:04 +0000 |
commit | 4d6e437df30ffcb6e2df64911945cf28102f9eeb (patch) | |
tree | 172db1959f5d52a101273ac4d624c31260157107 /plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf | |
parent | a44e2799d89eb22157a9d0728b1669f71869b311 (diff) | |
download | cdo-4d6e437df30ffcb6e2df64911945cf28102f9eeb.tar.gz cdo-4d6e437df30ffcb6e2df64911945cf28102f9eeb.tar.xz cdo-4d6e437df30ffcb6e2df64911945cf28102f9eeb.zip |
[260036] Provide "revert to the history revision" operation
https://bugs.eclipse.org/bugs/show_bug.cgi?id=260036
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf')
11 files changed, 143 insertions, 30 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/commit/CDOChangeSetData.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/commit/CDOChangeSetData.java index e17b43c131..f38448cd7c 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/commit/CDOChangeSetData.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/commit/CDOChangeSetData.java @@ -52,27 +52,34 @@ public interface CDOChangeSetData extends CDOChangeKindProvider public void merge(CDOChangeSetData changeSetData); /** - * Returns a collection of keys denoting which revisions have been added in the context of a commit operation. + * Returns a list of keys denoting which revisions have been added in the context of a commit operation. * Depending on various conditions like change subscriptions particular elements can also be full {@link CDORevision * revisions}. */ public List<CDOIDAndVersion> getNewObjects(); /** - * Returns a collection of revision keys denoting which (original) revisions have been changed in the context of a + * Returns a list of revision keys denoting which (original) revisions have been changed in the context of a * commit operation. Depending on various conditions like change subscriptions particular elements can also be full * {@link CDORevisionDelta revision deltas}. */ public List<CDORevisionKey> getChangedObjects(); /** - * Returns a collection of keys denoting which revisions have been revised (corresponds to detached objects) in the + * Returns a list of keys denoting which revisions have been revised (corresponds to detached objects) in the * context of a commit operation. Depending on various conditions the version part of particular elements can be * {@link CDOBranchVersion#UNSPECIFIED_VERSION unspecified}. */ public List<CDOIDAndVersion> getDetachedObjects(); /** + * Returns a list of ids denoting which revisions have been added, changed, or revised in the context of a commit operation. + * + * @since 4.15 + */ + public List<CDOID> getAffectedIDs(); + + /** * @since 4.1 */ public Map<CDOID, CDOChangeKind> getChangeKinds(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOChangeSetDataImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOChangeSetDataImpl.java index 8a72deb9cf..9fa349970d 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOChangeSetDataImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOChangeSetDataImpl.java @@ -199,6 +199,12 @@ public class CDOChangeSetDataImpl implements CDOChangeSetData } @Override + public List<CDOID> getAffectedIDs() + { + return getAffectedIDs(this); + } + + @Override public synchronized Map<CDOID, CDOChangeKind> getChangeKinds() { if (changeKindCache == null) @@ -222,6 +228,27 @@ public class CDOChangeSetDataImpl implements CDOChangeSetData newObjects.size(), changedObjects.size(), detachedObjects.size()); } + public static List<CDOID> getAffectedIDs(CDOChangeSetData changeSetData) + { + List<CDOID> ids = new ArrayList<>(); + for (CDOIDAndVersion object : changeSetData.getNewObjects()) + { + ids.add(object.getID()); + } + + for (CDORevisionKey object : changeSetData.getChangedObjects()) + { + ids.add(object.getID()); + } + + for (CDOIDAndVersion object : changeSetData.getDetachedObjects()) + { + ids.add(object.getID()); + } + + return ids; + } + public static String format(CDOChangeSetData changeSetData) { StringBuilder builder = new StringBuilder(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOCommitHistoryImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOCommitHistoryImpl.java index a320771e07..de90013eaf 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOCommitHistoryImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOCommitHistoryImpl.java @@ -731,6 +731,12 @@ public class CDOCommitHistoryImpl extends Container<CDOCommitInfo> implements CD } @Override + public List<CDOID> getAffectedIDs() + { + return null; + } + + @Override public List<CDOIDAndVersion> getNewObjects() { return null; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOCommitInfoImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOCommitInfoImpl.java index 413461e38d..db5abcb189 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOCommitInfoImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/CDOCommitInfoImpl.java @@ -198,6 +198,13 @@ public class CDOCommitInfoImpl extends CDOBranchPointImpl implements CDOCommitIn } @Override + public synchronized List<CDOID> getAffectedIDs() + { + loadCommitDataIfNeeded(); + return commitData.getAffectedIDs(); + } + + @Override public Map<CDOID, CDOChangeKind> getChangeKinds() { loadCommitDataIfNeeded(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/DelegatingCommitInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/DelegatingCommitInfo.java index bbb00e6a32..50be5d21be 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/DelegatingCommitInfo.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/DelegatingCommitInfo.java @@ -132,6 +132,12 @@ public abstract class DelegatingCommitInfo implements CDOCommitInfo } @Override + public List<CDOID> getAffectedIDs() + { + return getDelegate().getAffectedIDs(); + } + + @Override public Map<CDOID, CDOChangeKind> getChangeKinds() { return getDelegate().getChangeKinds(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/FailureCommitInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/FailureCommitInfo.java index c88fad99b4..230e288fd2 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/FailureCommitInfo.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/commit/FailureCommitInfo.java @@ -141,6 +141,12 @@ public class FailureCommitInfo implements CDOCommitInfo } @Override + public List<CDOID> getAffectedIDs() + { + return Collections.emptyList(); + } + + @Override public Map<CDOID, CDOChangeKind> getChangeKinds() { return Collections.emptyMap(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/branch/CDOBranchUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/branch/CDOBranchUtil.java index ccbb2eef06..bd4d72bf97 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/branch/CDOBranchUtil.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/branch/CDOBranchUtil.java @@ -219,6 +219,12 @@ public final class CDOBranchUtil } } + /** + * Returns <code>true</code> if the first given branch point "contained" is reachable from the second given branch point "container" + * by following the {@link CDOBranch#getBase() branch bases} <i>upwards</i>, <code>false</code> otherwise. + * <p> + * + */ public static boolean isContainedBy(CDOBranchPoint contained, CDOBranchPoint container) { CDOBranch containerBranch = container.getBranch(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/branch/InternalCDOBranchManager.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/branch/InternalCDOBranchManager.java index 6eecc7344e..7f52bf4d21 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/branch/InternalCDOBranchManager.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/branch/InternalCDOBranchManager.java @@ -356,11 +356,6 @@ public interface InternalCDOBranchManager extends CDOBranchManager, ILifecycle */ public interface BranchLoader4 extends BranchLoader3 { - // public CDOBranchPoint changeTag(AtomicInteger modCount, String oldName, String newName, CDOBranchPoint - // branchPoint); - // - // public void loadTags(AtomicInteger modCount, String name, Consumer<BranchInfo> handler); - public CDOBranchPoint changeTag(AtomicInteger modCount, String oldName, String newName, CDOBranchPoint branchPoint); public void loadTags(String name, Consumer<BranchInfo> handler); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/commit/CDOChangeSetSegment.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/commit/CDOChangeSetSegment.java index 7df98e380f..a73050d07b 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/commit/CDOChangeSetSegment.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/commit/CDOChangeSetSegment.java @@ -160,16 +160,11 @@ public class CDOChangeSetSegment implements CDOBranchPoint */ public static CDOChangeSetSegment[] createFrom(long startTime, CDOBranchPoint endPoint) { - final LinkedList<CDOChangeSetSegment> result = new LinkedList<>(); + LinkedList<CDOChangeSetSegment> result = new LinkedList<>(); - handleSegments(startTime, endPoint, new Handler() - { - @Override - public boolean handleSegment(CDOChangeSetSegment segment) - { - result.addFirst(segment); - return true; - } + handleSegments(startTime, endPoint, (Handler)segment -> { + result.addFirst(segment); + return true; }); return result.toArray(new CDOChangeSetSegment[result.size()]); @@ -177,16 +172,11 @@ public class CDOChangeSetSegment implements CDOBranchPoint public static CDOChangeSetSegment[] createFrom(CDOBranchPoint startPoint, CDOBranchPoint endPoint) { - final LinkedList<CDOChangeSetSegment> result = new LinkedList<>(); + LinkedList<CDOChangeSetSegment> result = new LinkedList<>(); - handleSegments(startPoint, endPoint, new Handler() - { - @Override - public boolean handleSegment(CDOChangeSetSegment segment) - { - result.addFirst(segment); - return true; - } + handleSegments(startPoint, endPoint, (Handler)segment -> { + result.addFirst(segment); + return true; }); return result.toArray(new CDOChangeSetSegment[result.size()]); @@ -212,6 +202,7 @@ public class CDOChangeSetSegment implements CDOBranchPoint * @author Eike Stepper * @since 4.6 */ + @FunctionalInterface public interface Handler { public boolean handleSegment(CDOChangeSetSegment segment); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/CDORevisionProviderWithSynthetics.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/CDORevisionProviderWithSynthetics.java new file mode 100644 index 0000000000..55f6a43950 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/CDORevisionProviderWithSynthetics.java @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2021 Eike Stepper (Loehne, 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.spi.common.revision; + +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; + +/** + * A revision provider that can also provide {@link SyntheticCDORevision synthetic revisions}. + * + * @author Eike Stepper + * @since 4.15 + */ +public interface CDORevisionProviderWithSynthetics extends CDORevisionProvider +{ + public SyntheticCDORevision getSynthetic(CDOID id); +} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/ManagedRevisionProvider.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/ManagedRevisionProvider.java index b57ee09572..a2997234d8 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/ManagedRevisionProvider.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/ManagedRevisionProvider.java @@ -17,21 +17,28 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionManager; import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; /** - * If the meaning of this type isn't clear, there really should be more of a description here... + * A revision provider backed by a {@link CDORevisionManager revision manager} that provides revisions which are + * {@link CDORevision#isValid(CDOBranchPoint) valid} at the configured {@link #getBranchPoint() branch point}. * * @author Eike Stepper * @since 4.0 */ public class ManagedRevisionProvider implements CDORevisionProvider { - private CDORevisionManager revisionManager; + /** + * @since 4.15 + */ + protected final InternalCDORevisionManager revisionManager; - private CDOBranchPoint branchPoint; + /** + * @since 4.15 + */ + protected final CDOBranchPoint branchPoint; public ManagedRevisionProvider(CDORevisionManager revisionManager, CDOBranchPoint branchPoint) { this.branchPoint = branchPoint; - this.revisionManager = revisionManager; + this.revisionManager = (InternalCDORevisionManager)revisionManager; } public CDORevisionManager getRevisionManager() @@ -49,4 +56,34 @@ public class ManagedRevisionProvider implements CDORevisionProvider { return revisionManager.getRevision(id, branchPoint, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true); } + + /** + * @since 4.15 + */ + public CDORevisionProviderWithSynthetics withSynthetics() + { + return new WithSynthetics(revisionManager, branchPoint); + } + + /** + * A managed revision provider that can also provide {@link SyntheticCDORevision synthetic revisions}. + * + * @author Eike Stepper + * @since 4.15 + */ + public static class WithSynthetics extends ManagedRevisionProvider implements CDORevisionProviderWithSynthetics + { + public WithSynthetics(CDORevisionManager revisionManager, CDOBranchPoint branchPoint) + { + super(revisionManager, branchPoint); + } + + @Override + public SyntheticCDORevision getSynthetic(CDOID id) + { + SyntheticCDORevision[] synthetic = { null }; + revisionManager.getRevision(id, branchPoint, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true, synthetic); + return synthetic[0]; + } + } } |