diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.net4j/src')
3 files changed, 68 insertions, 3 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java index 56295c029c..3317903a30 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java @@ -34,6 +34,8 @@ import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.net4j.util.security.DiffieHellman.Client.Response; import org.eclipse.net4j.util.security.DiffieHellman.Server.Challenge; +import java.util.Set; + /** * @author Eike Stepper */ @@ -147,11 +149,19 @@ public class CDOServerProtocol extends SignalProtocol<InternalSession> implement sendCommitNotification(commitInfo, true); } + @Deprecated public void sendCommitNotification(CDOCommitInfo commitInfo, boolean clearResourcePathCache) throws Exception { + sendCommitNotification(commitInfo, true, null); + + } + + public void sendCommitNotification(CDOCommitInfo commitInfo, boolean clearResourcePathCache, Set<CDOID> readOnly) + throws Exception + { if (LifecycleUtil.isActive(getChannel())) { - new CommitNotificationRequest(this, commitInfo, clearResourcePathCache).sendAsync(); + new CommitNotificationRequest(this, commitInfo, clearResourcePathCache, readOnly).sendAsync(); } else { diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitNotificationRequest.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitNotificationRequest.java index 32e1d0f762..166c8963ff 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitNotificationRequest.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitNotificationRequest.java @@ -13,10 +13,12 @@ package org.eclipse.emf.cdo.server.internal.net4j.protocol; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; +import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; import java.io.IOException; +import java.util.Set; /** * @author Eike Stepper @@ -27,18 +29,34 @@ public class CommitNotificationRequest extends CDOServerRequest private boolean clearResourcePathCache; + private Set<CDOID> readOnly; + public CommitNotificationRequest(CDOServerProtocol serverProtocol, CDOCommitInfo commitInfo, - boolean clearResourcePathCache) + boolean clearResourcePathCache, Set<CDOID> readOnly) { super(serverProtocol, CDOProtocolConstants.SIGNAL_COMMIT_NOTIFICATION); this.commitInfo = commitInfo; this.clearResourcePathCache = clearResourcePathCache; + this.readOnly = readOnly; } @Override protected void requesting(CDODataOutput out) throws IOException { - out.writeCDOCommitInfo(commitInfo); // Exposes revision to client side + out.writeCDOCommitInfo(commitInfo); out.writeBoolean(clearResourcePathCache); + + if (readOnly != null) + { + out.writeInt(readOnly.size()); + for (CDOID id : readOnly) + { + out.writeCDOID(id); + } + } + else + { + out.writeInt(0); + } } } diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java index b54ce5e022..863607b836 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java @@ -14,6 +14,7 @@ package org.eclipse.emf.cdo.server.internal.net4j.protocol; import org.eclipse.emf.cdo.common.branch.CDOBranch; +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDReference; @@ -24,7 +25,9 @@ import org.eclipse.emf.cdo.common.model.EMFUtil; 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.security.CDOPermission; import org.eclipse.emf.cdo.etypes.EtypesPackage; +import org.eclipse.emf.cdo.server.IPermissionManager; import org.eclipse.emf.cdo.server.IView; import org.eclipse.emf.cdo.server.internal.net4j.bundle.OM; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; @@ -32,6 +35,7 @@ import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionDelta; import org.eclipse.emf.cdo.spi.server.InternalCommitContext; +import org.eclipse.emf.cdo.spi.server.InternalSession; import org.eclipse.emf.cdo.spi.server.InternalTransaction; import org.eclipse.emf.cdo.spi.server.InternalView; @@ -332,6 +336,7 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori respondingResult(out); respondingMappingNewObjects(out); respondingNewLockStates(out); + respondingNewPermissions(out); } } finally @@ -407,6 +412,38 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori } } + protected void respondingNewPermissions(CDODataOutput out) throws Exception + { + InternalSession session = getSession(); + IPermissionManager permissionManager = session.getManager().getPermissionManager(); + if (permissionManager != null) + { + out.writeBoolean(true); + respondingNewPermissions(out, permissionManager, session, commitContext.getNewObjects()); + respondingNewPermissions(out, permissionManager, session, commitContext.getDirtyObjects()); + } + else + { + out.writeBoolean(false); + } + } + + protected void respondingNewPermissions(CDODataOutput out, IPermissionManager permissionManager, + InternalSession session, InternalCDORevision[] revisions) throws Exception + { + CDOBranchPoint securityContext = commitContext.getBranchPoint(); + + out.writeInt(revisions.length); + for (int i = 0; i < revisions.length; i++) + { + InternalCDORevision revision = revisions[i]; + CDOPermission permission = permissionManager.getPermission(revision, securityContext, session); + + out.writeCDOID(revision.getID()); + out.writeEnum(permission); + } + } + protected InternalTransaction getTransaction(int viewID) { InternalView view = getSession().getView(viewID); |