diff options
author | Eike Stepper | 2009-09-23 17:19:33 +0000 |
---|---|---|
committer | Eike Stepper | 2009-09-23 17:19:33 +0000 |
commit | 9bb601e0689834d4dd9ce0507c7212e32853b98d (patch) | |
tree | 9e6ef7bf56655b0959f188c1d820a4e4fb41ba63 | |
parent | 1b527b5759ef827b4d08bb536e615ab39bddb035 (diff) | |
download | cdo-9bb601e0689834d4dd9ce0507c7212e32853b98d.tar.gz cdo-9bb601e0689834d4dd9ce0507c7212e32853b98d.tar.xz cdo-9bb601e0689834d4dd9ce0507c7212e32853b98d.zip |
[289371] Provide Dynamic content prefetching mechanism upon CDOResource load
https://bugs.eclipse.org/bugs/show_bug.cgi?id=289371
34 files changed, 402 insertions, 144 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 9b934beacb..9fb6e7b40a 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 @@ -4,7 +4,7 @@ * 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 * Simon McDuff - delta support @@ -31,6 +31,16 @@ public interface CDORevision public static final int UNCHUNKED = -1; /** + * @since 3.0 + */ + public static final int DEPTH_NONE = 0; + + /** + * @since 3.0 + */ + public static final int DEPTH_INFINITE = -1; + + /** * @since 2.0 */ public EClass getEClass(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java index ce6fe523de..ca83e0c0a9 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/revision/CDORevisionManager.java @@ -34,20 +34,22 @@ public interface CDORevisionManager public boolean containsRevisionByVersion(CDOID id, int version); - public CDORevision getRevision(CDOID id, int referenceChunk); + public CDORevision getRevision(CDOID id, int referenceChunk, int prefetchDepth); - public CDORevision getRevision(CDOID id, int referenceChunk, boolean loadOnDemand); + public CDORevision getRevision(CDOID id, int referenceChunk, int prefetchDepth, boolean loadOnDemand); - public CDORevision getRevisionByTime(CDOID id, int referenceChunk, long timeStamp); + public CDORevision getRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp); - public CDORevision getRevisionByTime(CDOID id, int referenceChunk, long timeStamp, boolean loadOnDemand); + public CDORevision getRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp, + boolean loadOnDemand); - public CDORevision getRevisionByVersion(CDOID id, int referenceChunk, int version); + public CDORevision getRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version); - public CDORevision getRevisionByVersion(CDOID id, int referenceChunk, int version, boolean loadOnDemand); + public CDORevision getRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version, + boolean loadOnDemand); - public List<CDORevision> getRevisions(Collection<CDOID> ids, int referenceChunk); + public List<CDORevision> getRevisions(Collection<CDOID> ids, int referenceChunk, int prefetchDepth); - public List<CDORevision> getRevisionsByTime(Collection<CDOID> ids, int referenceChunk, long timeStamp, - boolean loadMissingRevisions); + public List<CDORevision> getRevisionsByTime(Collection<CDOID> ids, int referenceChunk, int prefetchDepth, + long timeStamp, boolean loadOnDemand); } 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 66aedb2a4a..c20c69315a 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 @@ -168,12 +168,12 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi } } - public InternalCDORevision getRevision(CDOID id, int referenceChunk) + public InternalCDORevision getRevision(CDOID id, int referenceChunk, int prefetchDepth) { - return getRevision(id, referenceChunk, true); + return getRevision(id, referenceChunk, prefetchDepth, true); } - public InternalCDORevision getRevision(CDOID id, int referenceChunk, boolean loadOnDemand) + public InternalCDORevision getRevision(CDOID id, int referenceChunk, int prefetchDepth, boolean loadOnDemand) { acquireAtomicRequestLock(loadAndAddLock); @@ -189,7 +189,7 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi TRACER.format("Loading revision {0}", id); //$NON-NLS-1$ } - revision = revisionLoader.loadRevision(id, referenceChunk); + revision = revisionLoader.loadRevision(id, referenceChunk, prefetchDepth); addCachedRevisionIfNotNull(revision); } } @@ -211,12 +211,13 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi } } - public InternalCDORevision getRevisionByTime(CDOID id, int referenceChunk, long timeStamp) + public InternalCDORevision getRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp) { - return getRevisionByTime(id, referenceChunk, timeStamp, true); + return getRevisionByTime(id, referenceChunk, prefetchDepth, timeStamp, true); } - public InternalCDORevision getRevisionByTime(CDOID id, int referenceChunk, long timeStamp, boolean loadOnDemand) + public InternalCDORevision getRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp, + boolean loadOnDemand) { acquireAtomicRequestLock(loadAndAddLock); @@ -232,7 +233,7 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi TRACER.format("Loading revision {0} by time {1,date} {1,time}", id, timeStamp); //$NON-NLS-1$ } - revision = revisionLoader.loadRevisionByTime(id, referenceChunk, timeStamp); + revision = revisionLoader.loadRevisionByTime(id, referenceChunk, prefetchDepth, timeStamp); addCachedRevisionIfNotNull(revision); } } @@ -254,12 +255,14 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi } } - public synchronized InternalCDORevision getRevisionByVersion(CDOID id, int referenceChunk, int version) + public synchronized InternalCDORevision getRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, + int version) { - return getRevisionByVersion(id, referenceChunk, version, true); + return getRevisionByVersion(id, referenceChunk, prefetchDepth, version, true); } - public InternalCDORevision getRevisionByVersion(CDOID id, int referenceChunk, int version, boolean loadOnDemand) + public InternalCDORevision getRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version, + boolean loadOnDemand) { acquireAtomicRequestLock(loadAndAddLock); @@ -275,7 +278,7 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi TRACER.format("Loading revision {0} by version {1}", id, version); //$NON-NLS-1$ } - revision = revisionLoader.loadRevisionByVersion(id, referenceChunk, version); + revision = revisionLoader.loadRevisionByVersion(id, referenceChunk, prefetchDepth, version); addCachedRevisionIfNotNull(revision); } } @@ -288,13 +291,13 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi } } - public List<CDORevision> getRevisions(Collection<CDOID> ids, int referenceChunk) + public List<CDORevision> getRevisions(Collection<CDOID> ids, int referenceChunk, int prefetchDepth) { List<CDOID> missingIDs = new ArrayList<CDOID>(0); List<CDORevision> revisions = new ArrayList<CDORevision>(ids.size()); for (CDOID id : ids) { - InternalCDORevision revision = getRevision(id, referenceChunk, false); + InternalCDORevision revision = getRevision(id, referenceChunk, prefetchDepth, false); revisions.add(revision); if (revision == null) { @@ -308,7 +311,8 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi try { - List<InternalCDORevision> missingRevisions = revisionLoader.loadRevisions(missingIDs, referenceChunk); + List<InternalCDORevision> missingRevisions = revisionLoader.loadRevisions(missingIDs, referenceChunk, + prefetchDepth); handleMissingRevisions(revisions, missingRevisions); } finally @@ -320,14 +324,14 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi return revisions; } - public List<CDORevision> getRevisionsByTime(Collection<CDOID> ids, int referenceChunk, long timeStamp, - boolean loadMissingRevisions) + public List<CDORevision> getRevisionsByTime(Collection<CDOID> ids, int referenceChunk, int prefetchDepth, + long timeStamp, boolean loadOnDemand) { - List<CDOID> missingIDs = loadMissingRevisions ? new ArrayList<CDOID>(0) : null; + List<CDOID> missingIDs = loadOnDemand ? new ArrayList<CDOID>(0) : null; List<CDORevision> revisions = new ArrayList<CDORevision>(ids.size()); for (CDOID id : ids) { - InternalCDORevision revision = getRevisionByTime(id, referenceChunk, timeStamp, false); + InternalCDORevision revision = getRevisionByTime(id, referenceChunk, prefetchDepth, timeStamp, false); revisions.add(revision); if (revision == null && missingIDs != null) { @@ -342,7 +346,7 @@ public class CDORevisionManagerImpl extends Lifecycle implements InternalCDORevi try { List<InternalCDORevision> missingRevisions = revisionLoader.loadRevisionsByTime(missingIDs, referenceChunk, - timeStamp); + prefetchDepth, timeStamp); handleMissingRevisions(revisions, missingRevisions); } finally 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 5e73d95cc0..e3ece389db 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 @@ -233,6 +233,14 @@ public abstract class AbstractCDORevision implements InternalCDORevision } } + /** + * @since 3.0 + */ + public CDOClassInfo getClassInfo() + { + return classInfo; + } + public EClass getEClass() { return classInfo.getEClass(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java index 495cce5c5a..7559720b3e 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/InternalCDORevision.java @@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.io.CDODataInput; import org.eclipse.emf.cdo.common.io.CDODataOutput; +import org.eclipse.emf.cdo.common.model.CDOClassInfo; import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjustable; import org.eclipse.emf.cdo.common.revision.CDORevision; @@ -35,6 +36,11 @@ public interface InternalCDORevision extends CDORevision, CDORevisionData, CDORe */ public static final Object NIL = new Object(); + /** + * @since 3.0 + */ + public CDOClassInfo getClassInfo(); + public void setID(CDOID id); public void setVersion(int version); 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 1483c368d0..7e356b2bd7 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 @@ -53,17 +53,15 @@ public interface InternalCDORevisionManager extends CDORevisionManager, ILifecyc { public InternalCDORevision verifyRevision(InternalCDORevision revision, int referenceChunk); - public InternalCDORevision loadRevision(CDOID id, int referenceChunk); + public InternalCDORevision loadRevision(CDOID id, int referenceChunk, int prefetchDepth); - public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, long timeStamp); + public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp); - public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int version); + public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version); - public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk); + public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk, int prefetchDepth); - public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, long timeStamp); - - // public List<InternalCDORevision> verifyRevisions(List<InternalCDORevision> revisions); + public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, int prefetchDepth, long timeStamp); } /** diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java index 71429264d5..59c8c54670 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientProtocol.java @@ -105,29 +105,30 @@ public class CDOClientProtocol extends SignalProtocol<CDOSession> implements CDO return send(new LoadChunkRequest(this, revision, feature, accessIndex, fetchIndex, fromIndex, toIndex)); } - public InternalCDORevision loadRevision(CDOID id, int referenceChunk) + public InternalCDORevision loadRevision(CDOID id, int referenceChunk, int prefetchDepth) { - return loadRevisions(Collections.singleton(id), referenceChunk).get(0); + return loadRevisions(Collections.singleton(id), referenceChunk, prefetchDepth).get(0); } - public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, long timeStamp) + public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp) { - return loadRevisionsByTime(Collections.singleton(id), referenceChunk, timeStamp).get(0); + return loadRevisionsByTime(Collections.singleton(id), referenceChunk, prefetchDepth, timeStamp).get(0); } - public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk) + public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk, int prefetchDepth) { - return send(new LoadRevisionRequest(this, ids, referenceChunk)); + return send(new LoadRevisionRequest(this, ids, referenceChunk, prefetchDepth)); } - public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, long timeStamp) + public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, int prefetchDepth, + long timeStamp) { - return send(new LoadRevisionByTimeRequest(this, ids, referenceChunk, timeStamp)); + return send(new LoadRevisionByTimeRequest(this, ids, referenceChunk, prefetchDepth, timeStamp)); } - public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int version) + public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version) { - return send(new LoadRevisionByVersionRequest(this, id, referenceChunk, version)).get(0); + return send(new LoadRevisionByVersionRequest(this, id, referenceChunk, prefetchDepth, version)).get(0); } public InternalCDORevision verifyRevision(InternalCDORevision revision, int referenceChunk) diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionByTimeRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionByTimeRequest.java index 5791fb60b5..1d4c0026d2 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionByTimeRequest.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionByTimeRequest.java @@ -4,7 +4,7 @@ * 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 **************************************************************************/ @@ -30,9 +30,10 @@ public class LoadRevisionByTimeRequest extends LoadRevisionRequest private long timeStamp; - public LoadRevisionByTimeRequest(CDOClientProtocol protocol, Collection<CDOID> ids, int referenceChunk, long timeStamp) + public LoadRevisionByTimeRequest(CDOClientProtocol protocol, Collection<CDOID> ids, int referenceChunk, + int prefetchDepth, long timeStamp) { - super(protocol, CDOProtocolConstants.SIGNAL_LOAD_REVISION_BY_TIME, ids, referenceChunk); + super(protocol, CDOProtocolConstants.SIGNAL_LOAD_REVISION_BY_TIME, ids, referenceChunk, prefetchDepth); this.timeStamp = timeStamp; } @@ -51,7 +52,8 @@ public class LoadRevisionByTimeRequest extends LoadRevisionRequest @Override public String toString() { - return MessageFormat.format("{0}(ids={1}, referenceChunk={2}, timeStamp={3})", getClass().getSimpleName(), //$NON-NLS-1$ - getIDs(), getReferenceChunk(), timeStamp); + return MessageFormat.format( + "{0}(ids={1}, referenceChunk={2}, prefetchDepth={3}, timeStamp={4})", getClass().getSimpleName(), //$NON-NLS-1$ + getIDs(), getReferenceChunk(), getPrefetchDepth(), timeStamp); } } diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionByVersionRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionByVersionRequest.java index 9f746df55a..773a031011 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionByVersionRequest.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionByVersionRequest.java @@ -4,7 +4,7 @@ * 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 **************************************************************************/ @@ -30,9 +30,11 @@ public class LoadRevisionByVersionRequest extends LoadRevisionRequest private int version; - public LoadRevisionByVersionRequest(CDOClientProtocol protocol, CDOID id, int referenceChunk, int version) + public LoadRevisionByVersionRequest(CDOClientProtocol protocol, CDOID id, int referenceChunk, int prefetchDepth, + int version) { - super(protocol, CDOProtocolConstants.SIGNAL_LOAD_REVISION_BY_VERSION, Collections.singleton(id), referenceChunk); + super(protocol, CDOProtocolConstants.SIGNAL_LOAD_REVISION_BY_VERSION, Collections.singleton(id), referenceChunk, + prefetchDepth); this.version = version; } @@ -51,7 +53,8 @@ public class LoadRevisionByVersionRequest extends LoadRevisionRequest @Override public String toString() { - return MessageFormat.format("{0}(ids={1}, referenceChunk={2}, version={3})", getClass().getSimpleName(), getIDs(), //$NON-NLS-1$ - getReferenceChunk(), version); + return MessageFormat.format( + "{0}(ids={1}, referenceChunk={2}, prefetchDepth={3}, version={4})", getClass().getSimpleName(), getIDs(), //$NON-NLS-1$ + getReferenceChunk(), getPrefetchDepth(), version); } } diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionRequest.java index 6fb441d176..48a4a954ea 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionRequest.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/LoadRevisionRequest.java @@ -39,16 +39,20 @@ public class LoadRevisionRequest extends CDOClientRequest<List<InternalCDORevisi private int referenceChunk; - public LoadRevisionRequest(CDOClientProtocol protocol, Collection<CDOID> ids, int referenceChunk) + private int prefetchDepth; + + public LoadRevisionRequest(CDOClientProtocol protocol, Collection<CDOID> ids, int referenceChunk, int prefetchDepth) { - this(protocol, CDOProtocolConstants.SIGNAL_LOAD_REVISION, ids, referenceChunk); + this(protocol, CDOProtocolConstants.SIGNAL_LOAD_REVISION, ids, referenceChunk, prefetchDepth); } - public LoadRevisionRequest(CDOClientProtocol protocol, short signalID, Collection<CDOID> ids, int referenceChunk) + protected LoadRevisionRequest(CDOClientProtocol protocol, short signalID, Collection<CDOID> ids, int referenceChunk, + int prefetchDepth) { super(protocol, signalID); this.ids = ids; this.referenceChunk = referenceChunk; + this.prefetchDepth = prefetchDepth; } public Collection<CDOID> getIDs() @@ -61,6 +65,11 @@ public class LoadRevisionRequest extends CDOClientRequest<List<InternalCDORevisi return referenceChunk; } + public int getPrefetchDepth() + { + return prefetchDepth; + } + @Override protected void requesting(CDODataOutput out) throws IOException { @@ -75,7 +84,21 @@ public class LoadRevisionRequest extends CDOClientRequest<List<InternalCDORevisi TRACER.format("Writing {0} IDs", ids.size()); //$NON-NLS-1$ } - out.writeInt(ids.size()); + if (prefetchDepth == 0) + { + out.writeInt(ids.size()); + } + else + { + out.writeInt(-ids.size()); + if (TRACER.isEnabled()) + { + TRACER.format("Writing prefetchDepth: {0}", prefetchDepth); //$NON-NLS-1$ + } + + out.writeInt(prefetchDepth); + } + for (CDOID id : ids) { if (TRACER.isEnabled()) @@ -150,6 +173,8 @@ public class LoadRevisionRequest extends CDOClientRequest<List<InternalCDORevisi @Override public String toString() { - return MessageFormat.format("{0}(ids={1}, referenceChunk={2})", getClass().getSimpleName(), ids, referenceChunk); //$NON-NLS-1$ + return MessageFormat + .format( + "{0}(ids={1}, referenceChunk={2}, prefetchDepth={3})", getClass().getSimpleName(), ids, referenceChunk, prefetchDepth); //$NON-NLS-1$ } } diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java index c54ca17947..87533c812c 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDORevisionProxy.java @@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.io.CDODataInput; import org.eclipse.emf.cdo.common.io.CDODataOutput; +import org.eclipse.emf.cdo.common.model.CDOClassInfo; import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster; import org.eclipse.emf.cdo.common.revision.CDORevision; @@ -75,6 +76,11 @@ public class CDORevisionProxy implements HibernateProxy, InternalCDORevision, Se return li; } + public CDOClassInfo getClassInfo() + { + return li.getRevision().getClassInfo(); + } + public EClass getEClass() { return li.getRevision().getEClass(); diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/AbstractSyncRevisionsIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/AbstractSyncRevisionsIndication.java index f289abb7ab..6f309747f2 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/AbstractSyncRevisionsIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/AbstractSyncRevisionsIndication.java @@ -86,7 +86,7 @@ public abstract class AbstractSyncRevisionsIndication extends CDOReadIndication try { InternalCDORevision revision = (InternalCDORevision)getRepository().getRevisionManager().getRevision(id, - referenceChunk); + referenceChunk, CDORevision.DEPTH_NONE); if (revision == null) { detachedObjects.add(new Pair<CDOID, Long>(id, getTimestamp(id, version))); @@ -109,7 +109,8 @@ public abstract class AbstractSyncRevisionsIndication extends CDOReadIndication protected long getTimestamp(CDOID id, int version) { - CDORevision revision = getRepository().getRevisionManager().getRevisionByVersion(id, 0, version, false); + CDORevision revision = getRepository().getRevisionManager().getRevisionByVersion(id, 0, CDORevision.DEPTH_NONE, + version, false); if (revision != null) { return revision.getRevised() + 1; diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadChunkIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadChunkIndication.java index ee7ee2f779..6c54574b5f 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadChunkIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadChunkIndication.java @@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.common.io.CDODataOutput; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOType; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; +import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.server.internal.net4j.bundle.OM; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager; @@ -94,7 +95,8 @@ public class LoadChunkIndication extends CDOReadIndication InternalRepository repository = getRepository(); InternalCDORevisionManager revisionManager = repository.getRevisionManager(); - InternalCDORevision revision = (InternalCDORevision)revisionManager.getRevisionByVersion(id, 0, version); + InternalCDORevision revision = (InternalCDORevision)revisionManager.getRevisionByVersion(id, 0, + CDORevision.DEPTH_NONE, version); repository.ensureChunk(revision, feature, fromIndex, toIndex + 1); CDOType type = CDOModelUtil.getType(feature); diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionByTimeIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionByTimeIndication.java index 42c5622346..3430ef0201 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionByTimeIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionByTimeIndication.java @@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.server.internal.net4j.protocol; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.io.CDODataInput; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; +import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.server.internal.net4j.bundle.OM; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; @@ -48,7 +49,7 @@ public class LoadRevisionByTimeIndication extends LoadRevisionIndication @Override protected InternalCDORevision getRevision(CDOID cdoID) { - return (InternalCDORevision)getRepository().getRevisionManager() - .getRevisionByTime(cdoID, referenceChunk, timeStamp); + return (InternalCDORevision)getRepository().getRevisionManager().getRevisionByTime(cdoID, referenceChunk, + CDORevision.DEPTH_NONE, timeStamp); } } diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionByVersionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionByVersionIndication.java index d86971c29e..c61181099c 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionByVersionIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionByVersionIndication.java @@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.server.internal.net4j.protocol; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.io.CDODataInput; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; +import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.server.internal.net4j.bundle.OM; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; @@ -49,6 +50,7 @@ public class LoadRevisionByVersionIndication extends LoadRevisionIndication @Override protected InternalCDORevision getRevision(CDOID id) { - return (InternalCDORevision)getRepository().getRevisionManager().getRevisionByVersion(id, referenceChunk, version); + return (InternalCDORevision)getRepository().getRevisionManager().getRevisionByVersion(id, referenceChunk, + CDORevision.DEPTH_NONE, version); } } diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionIndication.java index 7adef50aee..2a3b77e894 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LoadRevisionIndication.java @@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.io.CDODataInput; import org.eclipse.emf.cdo.common.io.CDODataOutput; +import org.eclipse.emf.cdo.common.model.CDOClassInfo; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionManager; @@ -26,10 +27,12 @@ import org.eclipse.net4j.util.collection.MoveableList; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -47,6 +50,8 @@ public class LoadRevisionIndication extends CDOReadIndication protected int referenceChunk; + protected int prefetchDepth; + protected Map<EClass, CDOFetchRule> fetchRules = new HashMap<EClass, CDOFetchRule>(); protected CDOID contextID = CDOID.NULL; @@ -73,9 +78,16 @@ public class LoadRevisionIndication extends CDOReadIndication } int size = in.readInt(); + if (size < 0) + { + size = -size; + prefetchDepth = in.readInt(); + } + if (TRACER.isEnabled()) { TRACER.format("Reading {0} IDs", size); //$NON-NLS-1$ + TRACER.format("Read prefetchDepth: {0}", prefetchDepth); //$NON-NLS-1$ } ids = new CDOID[size]; @@ -153,6 +165,11 @@ public class LoadRevisionIndication extends CDOReadIndication } } + if (prefetchDepth != 0) + { + prefetchRevisions(prefetchDepth > 0 ? prefetchDepth : Integer.MAX_VALUE, revisions, additionalRevisions); + } + getRepository().notifyReadAccessHandlers(getSession(), revisions, additionalRevisions); for (CDORevision revision : revisions) { @@ -175,7 +192,7 @@ public class LoadRevisionIndication extends CDOReadIndication protected InternalCDORevision getRevision(CDOID id) { CDORevisionManager revisionManager = getRepository().getRevisionManager(); - return (InternalCDORevision)revisionManager.getRevision(id, referenceChunk); + return (InternalCDORevision)revisionManager.getRevision(id, referenceChunk, CDORevision.DEPTH_NONE); } private void collectRevisions(InternalCDORevision revision, Set<CDOID> revisions, @@ -206,7 +223,7 @@ public class LoadRevisionIndication extends CDOReadIndication if (!CDOIDUtil.isNull(id) && !revisions.contains(id)) { InternalCDORevision containedRevision = (InternalCDORevision)revisionManager.getRevision(id, - referenceChunk); + referenceChunk, CDORevision.DEPTH_NONE); revisions.add(containedRevision.getID()); additionalRevisions.add(containedRevision); collectRevisions(containedRevision, revisions, additionalRevisions, visitedFetchRules); @@ -222,8 +239,8 @@ public class LoadRevisionIndication extends CDOReadIndication CDOID id = (CDOID)value; if (!id.isNull() && !revisions.contains(id)) { - InternalCDORevision containedRevision = (InternalCDORevision)revisionManager - .getRevision(id, referenceChunk); + InternalCDORevision containedRevision = (InternalCDORevision)revisionManager.getRevision(id, + referenceChunk, CDORevision.DEPTH_NONE); revisions.add(containedRevision.getID()); additionalRevisions.add(containedRevision); collectRevisions(containedRevision, revisions, additionalRevisions, visitedFetchRules); @@ -234,4 +251,71 @@ public class LoadRevisionIndication extends CDOReadIndication visitedFetchRules.remove(fetchRule); } + + private void prefetchRevisions(int depth, CDORevision[] revisions, List<CDORevision> additionalRevisions) + { + Map<CDOID, CDORevision> map = new HashMap<CDOID, CDORevision>(); + for (CDORevision revision : revisions) + { + map.put(revision.getID(), revision); + } + + for (CDORevision revision : additionalRevisions) + { + map.put(revision.getID(), revision); + } + + for (CDORevision revision : revisions) + { + prefetchRevision(depth, (InternalCDORevision)revision, additionalRevisions, map); + } + } + + private void prefetchRevision(int depth, InternalCDORevision revision, List<CDORevision> additionalRevisions, + Map<CDOID, CDORevision> map) + { + CDOClassInfo classInfo = revision.getClassInfo(); + for (EStructuralFeature feature : classInfo.getAllPersistentFeatures()) + { + if (feature instanceof EReference) + { + EReference reference = (EReference)feature; + if (reference.isContainment()) + { + Object value = revision.getValue(reference); + if (value instanceof CDOID) + { + CDOID id = (CDOID)value; + prefetchRevisionChild(depth, id, additionalRevisions, map); + } + else if (value instanceof Collection<?>) + { + Collection<?> c = (Collection<?>)value; + for (Object e : c) + { + CDOID id = (CDOID)e; + prefetchRevisionChild(depth, id, additionalRevisions, map); + } + } + } + } + } + } + + private void prefetchRevisionChild(int depth, CDOID id, List<CDORevision> additionalRevisions, + Map<CDOID, CDORevision> map) + { + CDORevision child = map.get(id); + if (child == null) + { + child = getRevision(id); + map.put(id, child); + additionalRevisions.add(child); + } + + if (child != null && depth > 0) + { + prefetchRevision(depth - 1, (InternalCDORevision)child, additionalRevisions, map); + } + } } diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/VerifyRevisionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/VerifyRevisionIndication.java index c07afab6d4..33e625daba 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/VerifyRevisionIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/VerifyRevisionIndication.java @@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.io.CDODataInput; import org.eclipse.emf.cdo.common.io.CDODataOutput; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; +import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.server.internal.net4j.bundle.OM; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager; @@ -56,7 +57,8 @@ public class VerifyRevisionIndication extends CDOReadIndication TRACER.format("Read ID and version: {0}v{1}", id, version); //$NON-NLS-1$ } - InternalCDORevision revision = (InternalCDORevision)revisionManager.getRevisionByVersion(id, 0, version); + InternalCDORevision revision = (InternalCDORevision)revisionManager.getRevisionByVersion(id, 0, + CDORevision.DEPTH_NONE, version); timeStamps[i] = revision.getRevised(); } } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Audit.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Audit.java index f84fda1e06..cd2f688d47 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Audit.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Audit.java @@ -54,8 +54,8 @@ public class Audit extends View implements InternalAudit checkOpen(); IRepository repository = getSession().getManager().getRepository(); setTimeStamp(repository, timeStamp); - List<CDORevision> revisions = repository.getRevisionManager().getRevisionsByTime(invalidObjects, 0, timeStamp, - false); + List<CDORevision> revisions = repository.getRevisionManager().getRevisionsByTime(invalidObjects, 0, + CDORevision.DEPTH_NONE, timeStamp, false); boolean[] existanceFlags = new boolean[revisions.size()]; for (int i = 0; i < existanceFlags.length; i++) { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java index 3c234e0c0d..cc6964866d 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java @@ -196,13 +196,13 @@ public class Repository extends Container<Object> implements InternalRepository return accessor.loadPackageUnit((InternalCDOPackageUnit)packageUnit); } - public InternalCDORevision loadRevision(CDOID id, int referenceChunk) + public InternalCDORevision loadRevision(CDOID id, int referenceChunk, int prefetchDepth) { IStoreAccessor accessor = StoreThreadLocal.getAccessor(); return accessor.readRevision(id, referenceChunk, revisionManager.getCache()); } - public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, long timeStamp) + public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp) { if (isSupportingAudits()) { @@ -223,7 +223,7 @@ public class Repository extends Container<Object> implements InternalRepository throw new IllegalStateException("No support for auditing mode"); //$NON-NLS-1$ } - public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int version) + public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version) { IStoreAccessor accessor = StoreThreadLocal.getAccessor(); if (isSupportingAudits()) @@ -231,7 +231,7 @@ public class Repository extends Container<Object> implements InternalRepository return accessor.readRevisionByVersion(id, referenceChunk, revisionManager.getCache(), version); } - InternalCDORevision revision = loadRevision(id, referenceChunk); + InternalCDORevision revision = loadRevision(id, referenceChunk, prefetchDepth); if (revision.getVersion() == version) { return revision; @@ -240,7 +240,7 @@ public class Repository extends Container<Object> implements InternalRepository throw new IllegalStateException("Cannot access object with id " + id + " and version " + version); //$NON-NLS-1$ //$NON-NLS-2$ } - public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk) + public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk, int prefetchDepth) { IStoreAccessor accessor = StoreThreadLocal.getAccessor(); List<InternalCDORevision> revisions = new ArrayList<InternalCDORevision>(); @@ -253,12 +253,13 @@ public class Repository extends Container<Object> implements InternalRepository return revisions; } - public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, long timeStamp) + public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, int prefetchDepth, + long timeStamp) { List<InternalCDORevision> revisions = new ArrayList<InternalCDORevision>(); for (CDOID id : ids) { - InternalCDORevision revision = loadRevisionByTime(id, referenceChunk, timeStamp); + InternalCDORevision revision = loadRevisionByTime(id, referenceChunk, prefetchDepth, timeStamp); revisions.add(revision); } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java index 0d195137c1..c71d85b7b3 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Session.java @@ -345,8 +345,8 @@ public class Session extends Container<IView> implements InternalSession CDOID id = (CDOID)value; if (!CDOIDUtil.isNull(id) && !revisions.contains(id)) { - InternalCDORevision containedRevision = (InternalCDORevision)revisionManager - .getRevision(id, referenceChunk); + InternalCDORevision containedRevision = (InternalCDORevision)revisionManager.getRevision(id, + referenceChunk, CDORevision.DEPTH_NONE); revisions.add(id); additionalRevisions.add(containedRevision); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContextImpl.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContextImpl.java index 12ebf5e09a..86825ca7df 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContextImpl.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContextImpl.java @@ -465,7 +465,8 @@ public class TransactionCommitContextImpl implements InternalCommitContext InternalRepository repository = transaction.getRepository(); InternalCDORevisionManager revisionManager = repository.getRevisionManager(); - CDORevision originObject = revisionManager.getRevisionByVersion(id, CDORevision.UNCHUNKED, version, loadOnDemand); + CDORevision originObject = revisionManager.getRevisionByVersion(id, CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, + version, loadOnDemand); if (originObject != null) { if (loadOnDemand) @@ -655,7 +656,7 @@ public class TransactionCommitContextImpl implements InternalCommitContext for (CDOID id : detachedObjects) { InternalCDORevision revision = (InternalCDORevision)revisionManager.getRevision(id, CDORevision.UNCHUNKED, - false); + CDORevision.DEPTH_NONE, false); if (revision != null) { detachedRevisions.add(revision); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/DelegatingCDORevisionManager.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/DelegatingCDORevisionManager.java index c9a7a984a1..c95fbc82a4 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/DelegatingCDORevisionManager.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/DelegatingCDORevisionManager.java @@ -92,45 +92,47 @@ public abstract class DelegatingCDORevisionManager extends Lifecycle implements return getDelegate().getObjectType(id); } - public CDORevision getRevision(CDOID id, int referenceChunk, boolean loadOnDemand) + public CDORevision getRevision(CDOID id, int referenceChunk, int prefetchDepth, boolean loadOnDemand) { - return getDelegate().getRevision(id, referenceChunk, loadOnDemand); + return getDelegate().getRevision(id, referenceChunk, prefetchDepth, loadOnDemand); } - public CDORevision getRevision(CDOID id, int referenceChunk) + public CDORevision getRevision(CDOID id, int referenceChunk, int prefetchDepth) { - return getDelegate().getRevision(id, referenceChunk); + return getDelegate().getRevision(id, referenceChunk, prefetchDepth); } - public CDORevision getRevisionByTime(CDOID id, int referenceChunk, long timeStamp, boolean loadOnDemand) + public CDORevision getRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp, + boolean loadOnDemand) { - return getDelegate().getRevisionByTime(id, referenceChunk, timeStamp, loadOnDemand); + return getDelegate().getRevisionByTime(id, referenceChunk, prefetchDepth, timeStamp, loadOnDemand); } - public CDORevision getRevisionByTime(CDOID id, int referenceChunk, long timeStamp) + public CDORevision getRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp) { - return getDelegate().getRevisionByTime(id, referenceChunk, timeStamp); + return getDelegate().getRevisionByTime(id, referenceChunk, prefetchDepth, timeStamp); } - public CDORevision getRevisionByVersion(CDOID id, int referenceChunk, int version, boolean loadOnDemand) + public CDORevision getRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version, + boolean loadOnDemand) { - return getDelegate().getRevisionByVersion(id, referenceChunk, version, loadOnDemand); + return getDelegate().getRevisionByVersion(id, referenceChunk, prefetchDepth, version, loadOnDemand); } - public CDORevision getRevisionByVersion(CDOID id, int referenceChunk, int version) + public CDORevision getRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version) { - return getDelegate().getRevisionByVersion(id, referenceChunk, version); + return getDelegate().getRevisionByVersion(id, referenceChunk, prefetchDepth, version); } - public List<CDORevision> getRevisions(Collection<CDOID> ids, int referenceChunk) + public List<CDORevision> getRevisions(Collection<CDOID> ids, int referenceChunk, int prefetchDepth) { - return getDelegate().getRevisions(ids, referenceChunk); + return getDelegate().getRevisions(ids, referenceChunk, prefetchDepth); } - public List<CDORevision> getRevisionsByTime(Collection<CDOID> ids, int referenceChunk, long timeStamp, - boolean loadMissingRevisions) + public List<CDORevision> getRevisionsByTime(Collection<CDOID> ids, int referenceChunk, int prefetchDepth, + long timeStamp, boolean loadOnDemand) { - return getDelegate().getRevisionsByTime(ids, referenceChunk, timeStamp, loadMissingRevisions); + return getDelegate().getRevisionsByTime(ids, referenceChunk, prefetchDepth, timeStamp, loadOnDemand); } public void revisedRevision(CDOID id, long timeStamp) diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java index 824a170a7b..652af9fee8 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/EmbeddedClientSessionProtocol.java @@ -125,13 +125,13 @@ public class EmbeddedClientSessionProtocol extends Lifecycle implements CDOSessi throw new UnsupportedOperationException(); } - public InternalCDORevision loadRevision(CDOID id, int referenceChunk) + public InternalCDORevision loadRevision(CDOID id, int referenceChunk, int prefetchDepth) { try { InternalSession session = serverSessionProtocol.getSession(); StoreThreadLocal.setSession(session); - return (InternalCDORevision)repository.getRevisionManager().getRevision(id, referenceChunk); + return (InternalCDORevision)repository.getRevisionManager().getRevision(id, referenceChunk, prefetchDepth); } finally { @@ -139,13 +139,14 @@ public class EmbeddedClientSessionProtocol extends Lifecycle implements CDOSessi } } - public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, long timeStamp) + public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp) { try { InternalSession session = serverSessionProtocol.getSession(); StoreThreadLocal.setSession(session); - return (InternalCDORevision)repository.getRevisionManager().getRevisionByTime(id, referenceChunk, timeStamp); + return (InternalCDORevision)repository.getRevisionManager().getRevisionByTime(id, referenceChunk, prefetchDepth, + timeStamp); } finally { @@ -153,13 +154,14 @@ public class EmbeddedClientSessionProtocol extends Lifecycle implements CDOSessi } } - public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int version) + public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version) { try { InternalSession session = serverSessionProtocol.getSession(); StoreThreadLocal.setSession(session); - return (InternalCDORevision)repository.getRevisionManager().getRevisionByVersion(id, referenceChunk, version); + return (InternalCDORevision)repository.getRevisionManager().getRevisionByVersion(id, referenceChunk, + prefetchDepth, version); } finally { @@ -167,7 +169,7 @@ public class EmbeddedClientSessionProtocol extends Lifecycle implements CDOSessi } } - public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk) + public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk, int prefetchDepth) { try { @@ -175,7 +177,7 @@ public class EmbeddedClientSessionProtocol extends Lifecycle implements CDOSessi StoreThreadLocal.setSession(session); @SuppressWarnings("unchecked") List<InternalCDORevision> revisions = (List<InternalCDORevision>)(List<?>)repository.getRevisionManager() - .getRevisions(ids, referenceChunk); + .getRevisions(ids, referenceChunk, prefetchDepth); return revisions; } finally @@ -184,7 +186,8 @@ public class EmbeddedClientSessionProtocol extends Lifecycle implements CDOSessi } } - public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, long timeStamp) + public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, int prefetchDepth, + long timeStamp) { try { @@ -192,7 +195,7 @@ public class EmbeddedClientSessionProtocol extends Lifecycle implements CDOSessi StoreThreadLocal.setSession(session); @SuppressWarnings("unchecked") List<InternalCDORevision> revisions = (List<InternalCDORevision>)(List<?>)repository.getRevisionManager() - .getRevisionsByTime(ids, referenceChunk, timeStamp, true); + .getRevisionsByTime(ids, referenceChunk, prefetchDepth, timeStamp, true); return revisions; } finally diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java index 4bb1f52b07..e72604c025 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ResourceTest.java @@ -14,10 +14,13 @@ package org.eclipse.emf.cdo.tests; import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.CDOState; import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.eresource.CDOResource; import org.eclipse.emf.cdo.eresource.CDOResourceFolder; import org.eclipse.emf.cdo.eresource.CDOResourceNode; import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.tests.model1.Category; +import org.eclipse.emf.cdo.tests.model1.Company; import org.eclipse.emf.cdo.tests.model1.Order; import org.eclipse.emf.cdo.tests.model1.Product1; import org.eclipse.emf.cdo.tests.model1.VAT; @@ -528,6 +531,60 @@ public class ResourceTest extends AbstractCDOTest } } + public void testPrefetchContents() throws Exception + { + { + Company company = getModel1Factory().createCompany(); + company.getCategories().add(createCategoryTree(5)); + + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + + CDOResource resource = transaction.createResource("/res1"); + resource.getContents().add(company); + + transaction.commit(); + session.close(); + } + + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + + CDOResource resource = transaction.getResource("/res1"); + resource.cdoPrefetch(CDORevision.DEPTH_INFINITE); + + Company company = (Company)resource.getContents().get(0); + System.out.println(company); + + session.close(); + } + + private Category createCategoryTree(int depth) + { + if (depth == 0) + { + return null; + } + + Category category = getModel1Factory().createCategory(); + for (int i = 0; i < 2; i++) + { + Category child = createCategoryTree(depth - 1); + if (child != null) + { + category.getCategories().add(child); + } + } + + for (int i = 0; i < 3; i++) + { + Product1 child = getModel1Factory().createProduct1(); + category.getProducts().add(child); + } + + return category; + } + /** * http://bugs.eclipse.org/208689 */ diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java index c9c0f731e6..76f6724e51 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/RevisionHolderTest.java @@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.io.CDODataInput; import org.eclipse.emf.cdo.common.io.CDODataOutput; +import org.eclipse.emf.cdo.common.model.CDOClassInfo; import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDOReferenceAdjuster; import org.eclipse.emf.cdo.common.revision.CDORevision; @@ -280,6 +281,11 @@ public class RevisionHolderTest extends AbstractCDOTest this(id, 0, CDORevision.UNSPECIFIED_DATE); } + public CDOClassInfo getClassInfo() + { + throw new UnsupportedOperationException(); + } + public EClass getEClass() { throw new UnsupportedOperationException(); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObject.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObject.java index bccc3f1d7d..c186d8a045 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObject.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/CDOObject.java @@ -4,7 +4,7 @@ * 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 */ @@ -124,6 +124,11 @@ public interface CDOObject extends EObject public CDOLock cdoWriteLock(); /** + * @since 3.0 + */ + public void cdoPrefetch(int depth); + + /** * TODO: JavaDoc */ public void cdoReload(); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java index 9c5d2b8057..f72f2188e4 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java @@ -280,7 +280,7 @@ public final class CDOUtil throw new IllegalStateException(Messages.getString("CDOUtil.0")); //$NON-NLS-1$ } - return session.getRevisionManager().getRevisionByVersion(object.cdoID(), 0, version); + return session.getRevisionManager().getRevisionByVersion(object.cdoID(), 0, CDORevision.DEPTH_NONE, version); } return revision; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java index 14dc08dfe5..7c28dcee4a 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectImpl.java @@ -147,6 +147,14 @@ public class CDOObjectImpl extends EStoreEObjectImpl implements InternalCDOObjec return null; } + /** + * @since 3.0 + */ + public void cdoPrefetch(int depth) + { + view.prefetchRevisions(id, depth); + } + public void cdoReload() { CDOStateMachine.INSTANCE.reload(this); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectWrapper.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectWrapper.java index 8da5d75519..1fc4d9ab90 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectWrapper.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOObjectWrapper.java @@ -135,6 +135,14 @@ public abstract class CDOObjectWrapper implements InternalCDOObject return FSMUtil.isInvalid(this); } + /** + * @since 3.0 + */ + public void cdoPrefetch(int depth) + { + view.prefetchRevisions(id, depth); + } + public EStructuralFeature cdoInternalDynamicFeature(int dynamicFeatureID) { // TODO Implement method CDOWrapperImpl.cdoInternalDynamicFeature() diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java index 7d93c435b4..9bec62a58d 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOStore.java @@ -18,6 +18,7 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOType; import org.eclipse.emf.cdo.common.revision.CDOList; +import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta; import org.eclipse.emf.cdo.eresource.CDOResource; @@ -371,7 +372,7 @@ public final class CDOStore implements EStore if (!listOfIDs.isEmpty()) { revisionManager.getRevisions(listOfIDs, view.getSession().options().getCollectionLoadingPolicy() - .getInitialChunkSize()); + .getInitialChunkSize(), CDORevision.DEPTH_NONE); } } } 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 5164f551d8..c1c47fd1e8 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 @@ -1249,14 +1249,14 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter } } - public InternalCDORevision loadRevision(CDOID id, int referenceChunk) + public InternalCDORevision loadRevision(CDOID id, int referenceChunk, int prefetchDepth) { int attempt = 0; for (;;) { try { - return delegate.loadRevision(id, referenceChunk); + return delegate.loadRevision(id, referenceChunk, prefetchDepth); } catch (Exception ex) { @@ -1265,14 +1265,14 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter } } - public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, long timeStamp) + public InternalCDORevision loadRevisionByTime(CDOID id, int referenceChunk, int prefetchDepth, long timeStamp) { int attempt = 0; for (;;) { try { - return delegate.loadRevisionByTime(id, referenceChunk, timeStamp); + return delegate.loadRevisionByTime(id, referenceChunk, prefetchDepth, timeStamp); } catch (Exception ex) { @@ -1281,14 +1281,14 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter } } - public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int version) + public InternalCDORevision loadRevisionByVersion(CDOID id, int referenceChunk, int prefetchDepth, int version) { int attempt = 0; for (;;) { try { - return delegate.loadRevisionByVersion(id, referenceChunk, version); + return delegate.loadRevisionByVersion(id, referenceChunk, prefetchDepth, version); } catch (Exception ex) { @@ -1297,14 +1297,14 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter } } - public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk) + public List<InternalCDORevision> loadRevisions(Collection<CDOID> ids, int referenceChunk, int prefetchDepth) { int attempt = 0; for (;;) { try { - return delegate.loadRevisions(ids, referenceChunk); + return delegate.loadRevisions(ids, referenceChunk, prefetchDepth); } catch (Exception ex) { @@ -1313,14 +1313,15 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter } } - public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, long timeStamp) + public List<InternalCDORevision> loadRevisionsByTime(Collection<CDOID> ids, int referenceChunk, int prefetchDepth, + long timeStamp) { int attempt = 0; for (;;) { try { - return delegate.loadRevisionsByTime(ids, referenceChunk, timeStamp); + return delegate.loadRevisionsByTime(ids, referenceChunk, prefetchDepth, timeStamp); } catch (Exception ex) { @@ -1329,22 +1330,6 @@ public abstract class CDOSessionImpl extends Container<CDOView> implements Inter } } - // public List<InternalCDORevision> verifyRevisions(List<InternalCDORevision> revisions) - // { - // int attempt = 0; - // for (;;) - // { - // try - // { - // return delegate.verifyRevisions(revisions); - // } - // catch (Exception ex) - // { - // handleException(++attempt, ex); - // } - // } - // } - public InternalCDORevision verifyRevision(InternalCDORevision revision, int referenceChunk) { int attempt = 0; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOAuditImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOAuditImpl.java index 0047db6172..2b15976949 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOAuditImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOAuditImpl.java @@ -98,7 +98,14 @@ public class CDOAuditImpl extends CDOViewImpl implements CDOAudit int initialChunkSize = session.options().getCollectionLoadingPolicy().getInitialChunkSize(); CDORevisionManager revisionManager = session.getRevisionManager(); - return (InternalCDORevision)revisionManager.getRevisionByTime(id, initialChunkSize, timeStamp, loadOnDemand); + return (InternalCDORevision)revisionManager.getRevisionByTime(id, initialChunkSize, CDORevision.DEPTH_NONE, + timeStamp, loadOnDemand); + } + + @Override + protected void prefetchRevisions(CDOID id, int depth, int initialChunkSize) + { + getSession().getRevisionManager().getRevisionByTime(id, initialChunkSize, depth, timeStamp); } @Override diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java index b59477f972..8ab0657e37 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewImpl.java @@ -682,7 +682,19 @@ public class CDOViewImpl extends Lifecycle implements InternalCDOView { CDORevisionManager revisionManager = session.getRevisionManager(); int initialChunkSize = session.options().getCollectionLoadingPolicy().getInitialChunkSize(); - return (InternalCDORevision)revisionManager.getRevision(id, initialChunkSize, loadOnDemand); + return (InternalCDORevision)revisionManager.getRevision(id, initialChunkSize, CDORevision.DEPTH_NONE, loadOnDemand); + } + + public void prefetchRevisions(CDOID id, int depth) + { + checkArg(depth != CDORevision.DEPTH_NONE, "Prefetch depth must not be zero"); + int initialChunkSize = session.options().getCollectionLoadingPolicy().getInitialChunkSize(); + prefetchRevisions(id, depth, initialChunkSize); + } + + protected void prefetchRevisions(CDOID id, int depth, int initialChunkSize) + { + session.getRevisionManager().getRevision(id, initialChunkSize, depth); } public InternalCDOObject getObject(CDOID id) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java index 23810ae61e..6036df78ab 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOView.java @@ -88,6 +88,11 @@ public interface InternalCDOView extends CDOView, CDOIDProvider, ILifecycle public InternalCDORevision getRevision(CDOID id, boolean loadOnDemand); + /** + * @since 3.0 + */ + public void prefetchRevisions(CDOID id, int depth); + public Object convertObjectToID(Object potentialObject); public Object convertObjectToID(Object potentialObject, boolean onlyPersistedID); |