Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2021-10-30 06:22:39 +0000
committerEike Stepper2021-10-30 06:22:39 +0000
commit694c3178f66a66ae6813e0c57b8214fb033e1177 (patch)
tree369a98627818ff0257d11c5dd16783be01ee0da8 /plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo
parent2980568e6f2c0302d1d3f5584abac1aa2c7ef75d (diff)
downloadcdo-694c3178f66a66ae6813e0c57b8214fb033e1177.tar.gz
cdo-694c3178f66a66ae6813e0c57b8214fb033e1177.tar.xz
cdo-694c3178f66a66ae6813e0c57b8214fb033e1177.zip
[576969] Revisions in the CDORevisionCache should be interned
https://bugs.eclipse.org/bugs/show_bug.cgi?id=576969
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo')
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java5
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCache.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCacheAdder.java2
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionInterner.java28
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java15
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java59
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java69
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java28
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java24
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevision.java11
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevisionManager.java47
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionCache.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java4
-rw-r--r--plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java16
15 files changed, 207 insertions, 110 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java
index 11adcfa0f1..214cc9386c 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevision.java
@@ -94,11 +94,6 @@ public interface CDORevision extends CDORevisionKey, CDORevisable
public boolean isValid(CDOBranchPoint branchPoint);
/**
- * @since 4.15
- */
- public boolean isValid(CDOBranchPoint branchPoint, boolean considerBases);
-
- /**
* @since 2.0
*/
public boolean isResourceNode();
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCache.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCache.java
index e5001aaf6b..030493ef28 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCache.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCache.java
@@ -32,7 +32,7 @@ import java.util.function.Consumer;
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients.
*/
-public interface CDORevisionCache extends CDORevisionCacheAdder, INotifier
+public interface CDORevisionCache extends INotifier
{
/**
* @since 3.0
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCacheAdder.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCacheAdder.java
index 95698dfa46..e84b55de14 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCacheAdder.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionCacheAdder.java
@@ -15,7 +15,9 @@ package org.eclipse.emf.cdo.common.revision;
*
* @author Eike Stepper
* @since 4.0
+ * @deprecated as of 4.15 use {@link CDORevisionInterner}.
*/
+@Deprecated
public interface CDORevisionCacheAdder
{
/**
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionInterner.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionInterner.java
new file mode 100644
index 0000000000..26d67eb5c7
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionInterner.java
@@ -0,0 +1,28 @@
+/*
+ * 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.common.revision;
+
+/**
+ * @author Eike Stepper
+ * @since 4.15
+ */
+public interface CDORevisionInterner
+{
+ /**
+ * Interns the given revision and returns either the given revision or
+ * a revision with the same {@link CDORevisionKey key} that was interned previously.
+ * <p>
+ * The returned revision is only different from the passed revision if this interner
+ * contains a previously cached, different revision instance with an equal
+ * {@link CDORevisionKey revision key}.
+ */
+ public CDORevision internRevision(CDORevision revision);
+}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
index c60b0c084f..14ef402913 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/AbstractCDORevisionCache.java
@@ -122,21 +122,6 @@ public abstract class AbstractCDORevisionCache extends Lifecycle implements Inte
}
@Override
- public final void addRevision(CDORevision revision)
- {
- referenceQueue.register((InternalCDORevision)revision);
- doAddRevision(revision);
-
- IListener[] listeners = getListeners();
- if (listeners != null)
- {
- fireEvent(new CacheAdditionEvent(this, revision));
- }
- }
-
- protected abstract void doAddRevision(CDORevision revision);
-
- @Override
public final CDORevision removeRevision(CDOID id, CDOBranchVersion branchVersion)
{
referenceQueue.clean();
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
index 854089eec7..423304a896 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheAuditing.java
@@ -23,6 +23,7 @@ import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache;
import org.eclipse.net4j.util.CheckUtil;
+import org.eclipse.net4j.util.event.IListener;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import org.eclipse.emf.ecore.EClass;
@@ -36,6 +37,7 @@ import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.function.Consumer;
+import java.util.function.Supplier;
/**
* @author Eike Stepper
@@ -183,7 +185,7 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
}
@Override
- protected void doAddRevision(CDORevision revision)
+ public CDORevision internRevision(CDORevision revision)
{
CheckUtil.checkArg(revision, "revision");
@@ -193,18 +195,41 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
CDOID id = revision.getID();
Object key = createKey(id, branch);
- synchronized (revisionLists)
+ IListener[] listeners = getListeners();
+ CacheAdditionEvent event = null;
+
+ try
{
- RevisionList list = revisionLists.get(key);
- if (list == null)
+ synchronized (revisionLists)
{
- list = new RevisionList();
- revisionLists.put(key, list);
+ RevisionList list = revisionLists.get(key);
+ if (list == null)
+ {
+ list = new RevisionList();
+ revisionLists.put(key, list);
+ }
+
+ CDORevision cachedRevision = list.addRevision(revision, () -> createReference(revision));
+ if (cachedRevision != revision)
+ {
+ return cachedRevision;
+ }
+
+ typeRefIncrease(id, revision.getEClass());
}
- if (list.addRevision((InternalCDORevision)revision, createReference(revision)))
+ if (listeners.length != 0)
{
- typeRefIncrease(id, revision.getEClass());
+ event = new CacheAdditionEvent(this, revision);
+ }
+
+ return revision;
+ }
+ finally
+ {
+ if (event != null)
+ {
+ fireEvent(event, listeners);
}
}
}
@@ -293,7 +318,7 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
{
}
- public synchronized InternalCDORevision getRevision(long timeStamp)
+ public InternalCDORevision getRevision(long timeStamp)
{
if (timeStamp == CDORevision.UNSPECIFIED_DATE)
{
@@ -344,7 +369,7 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
return null;
}
- public synchronized InternalCDORevision getRevisionByVersion(int version)
+ public InternalCDORevision getRevisionByVersion(int version)
{
for (Iterator<Reference<InternalCDORevision>> it = iterator(); it.hasNext();)
{
@@ -371,7 +396,7 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
return null;
}
- public synchronized boolean addRevision(InternalCDORevision revision, Reference<InternalCDORevision> reference)
+ public CDORevision addRevision(CDORevision revision, Supplier<Reference<InternalCDORevision>> referenceCreator)
{
int version = revision.getVersion();
for (ListIterator<Reference<InternalCDORevision>> it = listIterator(); it.hasNext();)
@@ -384,14 +409,14 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
int v = key.getVersion();
if (v == version)
{
- return false;
+ return foundRevision;
}
if (v < version)
{
it.previous();
- it.add(reference);
- return true;
+ it.add(referenceCreator.get());
+ return revision;
}
}
else
@@ -400,11 +425,11 @@ public class CDORevisionCacheAuditing extends AbstractCDORevisionCache
}
}
- addLast(reference);
- return true;
+ addLast(referenceCreator.get());
+ return revision;
}
- public synchronized void removeRevision(int version)
+ public void removeRevision(int version)
{
for (Iterator<Reference<InternalCDORevision>> it = iterator(); it.hasNext();)
{
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
index c598346bda..2dc2a99723 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionCacheNonAuditing.java
@@ -22,6 +22,7 @@ import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache;
import org.eclipse.net4j.util.CheckUtil;
+import org.eclipse.net4j.util.event.IListener;
import org.eclipse.emf.ecore.EClass;
@@ -194,7 +195,7 @@ public class CDORevisionCacheNonAuditing extends AbstractCDORevisionCache
}
@Override
- protected void doAddRevision(CDORevision revision)
+ public CDORevision internRevision(CDORevision revision)
{
CheckUtil.checkArg(revision, "revision");
checkBranch(revision.getBranch());
@@ -202,25 +203,56 @@ public class CDORevisionCacheNonAuditing extends AbstractCDORevisionCache
if (!revision.isHistorical())
{
CDOID id = revision.getID();
- Reference<InternalCDORevision> reference = createReference(revision);
+ CDORevision passedRevision = revision;
+
+ IListener[] listeners = getListeners();
+ CacheAdditionEvent[] event = { null };
synchronized (revisions)
{
- Reference<InternalCDORevision> oldReference = revisions.put(id, reference);
- if (oldReference != null)
+ try
{
- InternalCDORevision oldRevision = oldReference.get();
- if (oldRevision != null)
- {
- if (oldRevision.getVersion() > revision.getVersion())
+ revisions.compute(id, (k, cachedReference) -> {
+ if (cachedReference != null)
{
- // Put the old revision back because it's newer.
- revisions.put(id, oldReference);
+ InternalCDORevision cachedRevision = cachedReference.get();
+ if (cachedRevision != null)
+ {
+ if (cachedRevision.getVersion() > passedRevision.getVersion())
+ {
+ // Keep the cachedRevision in the cache because it's basically newer than the passedRevision,
+ // but don't change the result of internRevision().
+ throw new KeepCachedRevision(passedRevision);
+ }
+
+ if (cachedRevision.equals(passedRevision))
+ {
+ // Keep the cachedRevision in the cache because it's basically equal to the passedRevision,
+ // and change the result of internRevision() to the already cachedRevision.
+ throw new KeepCachedRevision(cachedRevision);
+ }
+ }
}
- }
+
+ // No revision is already cached, so cache and return the passedRevision.
+ if (listeners.length != 0)
+ {
+ event[0] = new CacheAdditionEvent(this, passedRevision);
+ }
+
+ return createReference(passedRevision);
+ });
+ }
+ catch (KeepCachedRevision ex)
+ {
+ revision = ex.returnValue;
}
}
+
+ fireEvent(event[0]);
}
+
+ return revision;
}
@Override
@@ -259,4 +291,19 @@ public class CDORevisionCacheNonAuditing extends AbstractCDORevisionCache
revisions.clear();
}
}
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class KeepCachedRevision extends RuntimeException
+ {
+ private static final long serialVersionUID = 1L;
+
+ public final CDORevision returnValue;
+
+ public KeepCachedRevision(CDORevision returnValue)
+ {
+ this.returnValue = returnValue;
+ }
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java
index e44d27e1df..7911df07a6 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionManagerImpl.java
@@ -26,7 +26,6 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionManager;
import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
import org.eclipse.emf.cdo.common.revision.CDORevisionsLoadedEvent;
import org.eclipse.emf.cdo.internal.common.bundle.OM;
-import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil;
import org.eclipse.emf.cdo.spi.common.revision.DetachedCDORevision;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache;
@@ -273,7 +272,7 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi
}
revision = revisionLoader.loadRevisionByVersion(id, branchVersion, referenceChunk);
- addRevision(revision);
+ revision = (InternalCDORevision)internRevision(revision);
}
}
@@ -517,7 +516,7 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi
}
@Override
- public void addRevision(CDORevision revision)
+ public CDORevision internRevision(CDORevision revision)
{
if (revision != null)
{
@@ -525,18 +524,6 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi
try
{
- if (revision instanceof PointerCDORevision)
- {
- PointerCDORevision pointer = (PointerCDORevision)revision;
- CDOBranchVersion target = pointer.getTarget();
- if (target instanceof InternalCDORevision)
- {
- // Replace the target CDORevision by a proper CDOBranchVersion.
- revision = new PointerCDORevision(pointer.getEClass(), pointer.getID(), pointer.getBranch(), pointer.getRevised(),
- CDOBranchUtil.copyBranchVersion(target));
- }
- }
-
int oldVersion = revision.getVersion() - 1;
if (oldVersion >= CDORevision.UNSPECIFIED_VERSION)
{
@@ -564,13 +551,22 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi
}
}
- cache.addRevision(revision);
+ revision = cache.internRevision(revision);
}
finally
{
releaseAtomicRequestLock(loadAndAddLock);
}
}
+
+ return revision;
+ }
+
+ @Deprecated
+ @Override
+ public void addRevision(CDORevision revision)
+ {
+ internRevision(revision);
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java
index 7f30198a6e..a8ece823e1 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/NOOPRevisionCache.java
@@ -87,9 +87,9 @@ public class NOOPRevisionCache extends Lifecycle implements InternalCDORevisionC
}
@Override
- public void addRevision(CDORevision revision)
+ public CDORevision internRevision(CDORevision revision)
{
- // Do nothing
+ return revision;
}
@Override
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java
index e7b85508a6..11b011fbca 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/AbstractCDORevision.java
@@ -168,30 +168,6 @@ public abstract class AbstractCDORevision implements InternalCDORevision
}
/**
- * @since 4.15
- */
- @Override
- public boolean isValid(CDOBranchPoint branchPoint, boolean considerBases)
- {
- if (considerBases)
- {
- do
- {
- if (isValid(branchPoint))
- {
- return true;
- }
-
- branchPoint = branchPoint.getBranch().getBase();
- } while (branchPoint.getBranch() != null);
-
- return false;
- }
-
- return isValid(branchPoint);
- }
-
- /**
* @since 4.1
*/
@Override
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevision.java
index 3158063aec..a273a3004e 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevision.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevision.java
@@ -185,15 +185,6 @@ public abstract class DelegatingCDORevision implements InternalCDORevision
}
/**
- * @since 4.15
- */
- @Override
- public boolean isValid(CDOBranchPoint branchPoint, boolean considerBases)
- {
- return getDelegate().isValid(branchPoint, considerBases);
- }
-
- /**
* @since 4.0
*/
@Override
@@ -612,7 +603,7 @@ public abstract class DelegatingCDORevision implements InternalCDORevision
* @author Eike Stepper
*/
@SuppressWarnings("unused")
- private static final class InternalCompletenessTest extends DelegatingCDORevision
+ private static final class InternalCompletenessChecker extends DelegatingCDORevision
{
@Override
public InternalCDORevision getDelegate()
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevisionManager.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevisionManager.java
index 6e27daf078..afcb24dc62 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevisionManager.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/DelegatingCDORevisionManager.java
@@ -11,12 +11,15 @@
package org.eclipse.emf.cdo.spi.common.revision;
import org.eclipse.emf.cdo.common.branch.CDOBranch;
+import org.eclipse.emf.cdo.common.branch.CDOBranchManager;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
+import org.eclipse.emf.cdo.common.branch.CDOBranchPointRange;
import org.eclipse.emf.cdo.common.branch.CDOBranchVersion;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.common.revision.CDORevisionCache;
import org.eclipse.emf.cdo.common.revision.CDORevisionFactory;
+import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
import org.eclipse.net4j.util.lifecycle.Lifecycle;
@@ -120,6 +123,7 @@ public abstract class DelegatingCDORevisionManager extends Lifecycle implements
/**
* @since 4.0
*/
+ @Deprecated
@Override
public void addRevision(CDORevision revision)
{
@@ -127,6 +131,12 @@ public abstract class DelegatingCDORevisionManager extends Lifecycle implements
}
@Override
+ public CDORevision internRevision(CDORevision revision)
+ {
+ return getDelegate().internRevision(revision);
+ }
+
+ @Override
public boolean containsRevision(CDOID id, CDOBranchPoint branchPoint)
{
return getDelegate().containsRevision(id, branchPoint);
@@ -145,6 +155,24 @@ public abstract class DelegatingCDORevisionManager extends Lifecycle implements
}
@Override
+ public EClass getObjectType(CDOID id, CDOBranchManager branchManagerForLoadOnDemand)
+ {
+ return getDelegate().getObjectType(id, branchManagerForLoadOnDemand);
+ }
+
+ @Override
+ public CDOBranchPointRange getObjectLifetime(CDOID id, CDOBranchPoint branchPoint)
+ {
+ return getDelegate().getObjectLifetime(id, branchPoint);
+ }
+
+ @Override
+ public InternalCDORevision getBaseRevision(CDORevision revision, int referenceChunk, boolean loadOnDemand)
+ {
+ return getDelegate().getBaseRevision(revision, referenceChunk, loadOnDemand);
+ }
+
+ @Override
public InternalCDORevision getRevisionByVersion(CDOID id, CDOBranchVersion branchVersion, int referenceChunk, boolean loadOnDemand)
{
return getDelegate().getRevisionByVersion(id, branchVersion, referenceChunk, loadOnDemand);
@@ -177,6 +205,12 @@ public abstract class DelegatingCDORevisionManager extends Lifecycle implements
}
@Override
+ public void handleRevisions(EClass eClass, CDOBranch branch, boolean exactBranch, long timeStamp, boolean exactTime, CDORevisionHandler handler)
+ {
+ getDelegate().handleRevisions(eClass, branch, exactBranch, timeStamp, exactTime, handler);
+ }
+
+ @Override
public void reviseLatest(CDOID id, CDOBranch branch)
{
getDelegate().reviseLatest(id, branch);
@@ -212,4 +246,17 @@ public abstract class DelegatingCDORevisionManager extends Lifecycle implements
}
protected abstract InternalCDORevisionManager getDelegate();
+
+ /**
+ * @author Eike Stepper
+ */
+ @SuppressWarnings("unused")
+ private static final class InternalCompletenessChecker extends DelegatingCDORevisionManager
+ {
+ @Override
+ protected InternalCDORevisionManager getDelegate()
+ {
+ return null;
+ }
+ }
}
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionCache.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionCache.java
index e8f931e6ab..5b190f562d 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionCache.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionCache.java
@@ -16,6 +16,7 @@ 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.CDORevisionCache;
+import org.eclipse.emf.cdo.common.revision.CDORevisionInterner;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
@@ -29,7 +30,7 @@ import java.util.List;
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients.
*/
-public interface InternalCDORevisionCache extends CDORevisionCache, CDOAllRevisionsProvider, ILifecycle
+public interface InternalCDORevisionCache extends CDORevisionCache, CDORevisionInterner, CDOAllRevisionsProvider, ILifecycle
{
public InternalCDORevisionCache instantiate(CDORevision revision);
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java
index 64741770d1..cc3eea94d9 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevisionManager.java
@@ -20,6 +20,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionCache;
import org.eclipse.emf.cdo.common.revision.CDORevisionCacheAdder;
import org.eclipse.emf.cdo.common.revision.CDORevisionFactory;
import org.eclipse.emf.cdo.common.revision.CDORevisionHandler;
+import org.eclipse.emf.cdo.common.revision.CDORevisionInterner;
import org.eclipse.emf.cdo.common.revision.CDORevisionManager;
import org.eclipse.net4j.util.lifecycle.ILifecycle;
@@ -36,7 +37,8 @@ import java.util.List;
* @noimplement This interface is not intended to be implemented by clients.
* @noextend This interface is not intended to be extended by clients.
*/
-public interface InternalCDORevisionManager extends CDORevisionManager, CDORevisionCacheAdder, ILifecycle
+@SuppressWarnings("deprecation")
+public interface InternalCDORevisionManager extends CDORevisionManager, CDORevisionInterner, CDORevisionCacheAdder, ILifecycle
{
/**
* @since 4.0
diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java
index 19e404de2d..9e74500835 100644
--- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java
+++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/RevisionInfo.java
@@ -168,6 +168,11 @@ public abstract class RevisionInfo
public void processResult(InternalCDORevisionManager revisionManager, List<CDORevision> results, SyntheticCDORevision[] synthetics, int i)
{
+ if (result != null)
+ {
+ result = (InternalCDORevision)revisionManager.internRevision(result);
+ }
+
if (results != null)
{
if (result instanceof DetachedCDORevision)
@@ -180,14 +185,9 @@ public abstract class RevisionInfo
}
}
- if (result != null)
- {
- revisionManager.addRevision(result);
- }
-
if (synthetic != null)
{
- revisionManager.addRevision(synthetic);
+ synthetic = (SyntheticCDORevision)revisionManager.internRevision(synthetic);
if (synthetic instanceof PointerCDORevision)
{
@@ -195,7 +195,7 @@ public abstract class RevisionInfo
CDOBranchVersion target = pointer.getTarget();
if (target != result && target instanceof InternalCDORevision)
{
- revisionManager.addRevision((CDORevision)target);
+ revisionManager.internRevision((CDORevision)target);
}
}
@@ -293,12 +293,14 @@ public abstract class RevisionInfo
EClassifier classifier = in.readCDOClassifierRefAndResolve();
long revised = in.readXLong();
InternalCDORevision target = readResult(in, id, branch);
+
// If target is null and we are in a Available RevisionInfo it means that we can use
// availableBranchVersion/result as target
if (target == null && result != null)
{
target = result;
}
+
return new PointerCDORevision((EClass)classifier, id, branch, revised, target);
}

Back to the top