diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java | 39 |
1 files changed, 30 insertions, 9 deletions
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 425e265b72..f22baaedec 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 @@ -75,6 +75,7 @@ import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; +import org.eclipse.emf.cdo.spi.common.revision.BaseCDORevision; import org.eclipse.emf.cdo.spi.common.revision.DetachedCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDOList; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; @@ -587,10 +588,7 @@ public class Repository extends Container<Object> implements InternalRepository, InternalCDORevision target = loadRevisionTarget(id, branchPoint, referenceChunk, accessor); if (target != null) { - if (referenceChunk == UNCHUNKED) - { - target.setUnchunked(); - } + target = normalizeRevision(target, info, referenceChunk); CDOBranch branch = branchPoint.getBranch(); long revised = loadRevisionRevised(id, branch); @@ -614,12 +612,9 @@ public class Repository extends Container<Object> implements InternalRepository, } else { - if (referenceChunk == UNCHUNKED) - { - revision.setUnchunked(); - } - revision.freeze(); + + revision = normalizeRevision(revision, info, referenceChunk); info.setResult(revision); } } @@ -627,6 +622,32 @@ public class Repository extends Container<Object> implements InternalRepository, return null; } + private InternalCDORevision normalizeRevision(InternalCDORevision revision, RevisionInfo info, int referenceChunk) + { + if (info instanceof RevisionInfo.Available) + { + RevisionInfo.Available availableInfo = (RevisionInfo.Available)info; + + CDOBranchVersion availableBranchVersion = availableInfo.getAvailableBranchVersion(); + if (availableBranchVersion instanceof BaseCDORevision) + { + BaseCDORevision availableRevision = (BaseCDORevision)availableBranchVersion; + if (availableRevision.equals(revision)) + { + ensureChunks(availableRevision, referenceChunk); + return availableRevision; + } + } + } + + if (referenceChunk == UNCHUNKED) + { + revision.setUnchunked(); + } + + return revision; + } + private InternalCDORevision loadRevisionTarget(CDOID id, CDOBranchPoint branchPoint, int referenceChunk, IStoreAccessor accessor) { CDOBranch branch = branchPoint.getBranch(); |