diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java index 9b3f19187a..ec3f221e34 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java @@ -15,9 +15,13 @@ import org.eclipse.emf.cdo.common.CDOCommonView; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionHandler; import org.eclipse.emf.cdo.common.revision.CDORevisionManager; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; +import org.eclipse.emf.cdo.server.IUnit; +import org.eclipse.emf.cdo.server.IUnitManager; import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; @@ -29,6 +33,7 @@ import org.eclipse.emf.cdo.spi.server.InternalView; import org.eclipse.net4j.util.AdapterUtil; import org.eclipse.net4j.util.ObjectUtil; import org.eclipse.net4j.util.lifecycle.Lifecycle; +import org.eclipse.net4j.util.om.monitor.OMMonitor; import org.eclipse.net4j.util.options.IOptionsContainer; import org.eclipse.net4j.util.registry.HashMapRegistry; import org.eclipse.net4j.util.registry.IRegistry; @@ -57,9 +62,11 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio private String durableLockingID; - private InternalRepository repository; + private final InternalRepository repository; - private Set<CDOID> changeSubscriptionIDs = new HashSet<CDOID>(); + private final Set<CDOID> changeSubscriptionIDs = new HashSet<CDOID>(); + + private final Set<CDOID> openUnitRoots = new HashSet<CDOID>(); private boolean lockNotificationsEnabled; @@ -155,7 +162,7 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio List<CDORevision> oldRevisions = getRevisions(invalidObjects); setBranchPoint(branchPoint); List<CDORevision> newRevisions = getRevisions(invalidObjects); - + Iterator<CDORevision> it = newRevisions.iterator(); for (CDORevision oldRevision : oldRevisions) { @@ -169,7 +176,7 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio // Fix for Bug 369646: ensure that revisions are fully loaded repository.ensureChunks((InternalCDORevision)newRevision, CDORevision.UNCHUNKED); repository.ensureChunks((InternalCDORevision)oldRevision, CDORevision.UNCHUNKED); - + CDORevisionDelta delta = newRevision.compare(oldRevision); allChangedObjects.add(delta); } @@ -199,6 +206,64 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio this.durableLockingID = durableLockingID; } + public boolean openUnit(CDOID rootID, boolean create, CDORevisionHandler revisionHandler, OMMonitor monitor) + { + IUnitManager unitManager = repository.getUnitManager(); + IUnit unit = unitManager.getUnit(rootID); + + if (create) + { + if (unit != null) + { + return false; + } + + unit = unitManager.createUnit(rootID, this, revisionHandler); + } + else + { + if (unit == null) + { + return false; + } + + int xxx; // TODO Use monitor? + unit.open(this, revisionHandler); + } + + openUnitRoots.add(rootID); + return true; + } + + private boolean isInOpenUnit(CDOID id) + { + if (openUnitRoots.isEmpty()) + { + return false; + } + + if (openUnitRoots.contains(id)) + { + return true; + } + + int xxx; // TODO Remember object->unit relationship for modified objects?! + + InternalCDORevision revision = getRevision(id); + if (revision != null) + { + CDOID parentID = revision.getResourceID(); + if (CDOIDUtil.isNull(parentID)) + { + parentID = (CDOID)revision.getContainerID(); + } + + return isInOpenUnit(parentID); + } + + return false; + } + /** * @since 2.0 */ @@ -227,7 +292,17 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio return false; } - return changeSubscriptionIDs.contains(id); + if (changeSubscriptionIDs.contains(id)) + { + return true; + } + + if (repository.isSupportingUnits()) + { + return isInOpenUnit(id); + } + + return false; } /** |