diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java | 145 |
1 files changed, 33 insertions, 112 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java index 236c74455e..b61cc1cf8b 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java @@ -13,24 +13,20 @@ package org.eclipse.emf.cdo.server.internal.net4j.protocol; import org.eclipse.emf.cdo.common.branch.CDOBranch; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.lock.CDOLockState; import org.eclipse.emf.cdo.common.protocol.CDODataInput; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; -import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionKey; import org.eclipse.emf.cdo.server.IView; -import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; -import org.eclipse.emf.cdo.spi.server.InternalLockManager; -import org.eclipse.emf.cdo.spi.server.InternalSession; +import org.eclipse.emf.cdo.spi.server.InternalRepository; +import org.eclipse.emf.cdo.spi.server.InternalView; -import org.eclipse.net4j.util.WrappedException; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; -import org.eclipse.net4j.util.concurrent.TimeoutRuntimeException; + +import org.eclipse.emf.spi.cdo.CDOSessionProtocol.LockObjectsResult; import java.io.IOException; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -39,138 +35,63 @@ import java.util.List; */ public class LockObjectsIndication extends CDOServerWriteIndication { - private List<CDORevisionKey> staleRevisions = new LinkedList<CDORevisionKey>(); - - private boolean timedOut; - - private boolean passiveUpdatesEnabled; - - private long requiredTimestamp; - - private boolean staleNoUpdate; + private LockObjectsResult result; public LockObjectsIndication(CDOServerProtocol protocol) { super(protocol, CDOProtocolConstants.SIGNAL_LOCK_OBJECTS); } + protected LockObjectsIndication(CDOServerProtocol protocol, short signalID) + { + super(protocol, signalID); + } + @Override protected void indicating(CDODataInput in) throws IOException { - InternalSession session = getSession(); - passiveUpdatesEnabled = session.isPassiveUpdateEnabled(); - int viewID = in.readInt(); LockType lockType = in.readCDOLockType(); long timeout = in.readLong(); CDOBranch viewedBranch = in.readCDOBranch(); int nRevisions = in.readInt(); - CDORevisionKey[] revKeys = new CDORevisionKey[nRevisions]; + List<CDORevisionKey> revisionKeys = new LinkedList<CDORevisionKey>(); for (int i = 0; i < nRevisions; i++) { - revKeys[i] = in.readCDORevisionKey(); + revisionKeys.add(in.readCDORevisionKey()); } - List<Object> objectsToBeLocked = new ArrayList<Object>(); - boolean isSupportingBranches = getRepository().isSupportingBranches(); - for (CDORevisionKey revKey : revKeys) - { - CDOID id = revKey.getID(); - if (isSupportingBranches) - { - objectsToBeLocked.add(CDOIDUtil.createIDAndBranch(id, viewedBranch)); - } - else - { - objectsToBeLocked.add(id); - } - } - - IView view = session.getView(viewID); - InternalLockManager lockManager = getRepository().getLockManager(); - - try - { - lockManager.lock(true, lockType, view, objectsToBeLocked, timeout); - } - catch (TimeoutRuntimeException ex) - { - timedOut = true; - return; - } - catch (InterruptedException ex) - { - throw WrappedException.wrap(ex); - } - - try - { - for (CDORevisionKey revKey : revKeys) - { - checkStale(viewedBranch, revKey); - } - } - catch (IllegalArgumentException ex) - { - lockManager.unlock(true, lockType, view, objectsToBeLocked); - throw ex; - } - - // If some of the clients' revisions are stale and it has passiveUpdates disabled, - // then the locks are useless so we release them and report the stale revisions (later) - staleNoUpdate = staleRevisions.size() > 0 && !passiveUpdatesEnabled; - if (staleNoUpdate) - { - lockManager.unlock(true, lockType, view, objectsToBeLocked); - } + InternalRepository repository = getRepository(); + IView view = getView(viewID, viewedBranch); + result = repository.lock((InternalView)view, lockType, revisionKeys, viewedBranch, timeout); } - @Override - protected void responding(CDODataOutput out) throws IOException + protected IView getView(int viewID, CDOBranch viewedBranch) { - boolean lockSuccesful = !timedOut && !staleNoUpdate; - out.writeBoolean(lockSuccesful); - - if (lockSuccesful) - { - boolean clientMustWait = staleRevisions.size() > 0; - out.writeBoolean(clientMustWait); - if (clientMustWait) - { - out.writeLong(requiredTimestamp); - } - } - else - { - out.writeBoolean(timedOut); - if (!timedOut) - { - out.writeInt(staleRevisions.size()); - for (CDORevisionKey staleRevision : staleRevisions) - { - out.writeCDORevisionKey(staleRevision); - } - } - } + return getSession().getView(viewID); } - private void checkStale(CDOBranch viewedBranch, CDORevisionKey revKey) + @Override + protected void responding(CDODataOutput out) throws IOException { - CDOID id = revKey.getID(); - InternalCDORevision rev = getRepository().getRevisionManager().getRevision(id, viewedBranch.getHead(), - CDORevision.UNCHUNKED, CDORevision.DEPTH_NONE, true); - - if (rev == null) + out.writeBoolean(result.isSuccessful()); + out.writeBoolean(result.isTimedOut()); + out.writeBoolean(result.isWaitForUpdate()); + out.writeLong(result.getRequiredTimestamp()); + + CDORevisionKey[] staleRevisions = result.getStaleRevisions(); + out.writeInt(staleRevisions.length); + for (CDORevisionKey revKey : staleRevisions) { - throw new IllegalArgumentException(String.format("Object %s not found in branch %s (possibly detached)", id, - viewedBranch)); + out.writeCDORevisionKey(revKey); } - if (!revKey.equals(rev)) + CDOLockState[] newLockStates = result.getNewLockStates(); + out.writeInt(newLockStates.length); + for (CDOLockState lockState : newLockStates) { - staleRevisions.add(revKey); - requiredTimestamp = Math.max(requiredTimestamp, rev.getTimeStamp()); + out.writeCDOLockState(lockState); } } } |