Beispiel #1
0
 public override IList<WaveletOperation> ApplyAndReturnReverse(IWaveletData target)
 {
     WaveletOperation reverse = new NoOp(CreateReverseContext(target));
     Apply(target);
     return new ReadOnlyCollection<WaveletOperation>(new[] {reverse});
 }
Beispiel #2
0
        /// <summary>
        ///     Transforms a pair of operations.
        /// </summary>
        /// <param name="clientOperation">The client's operation.</param>
        /// <param name="serverOperation">The server's operation.</param>
        /// <returns>The resulting transformed client and server operations.</returns>
        public static OperationPair<WaveletOperation> Transform(WaveletOperation clientOperation,
            WaveletOperation serverOperation)
        {
            Preconditions.CheckNotNull(clientOperation);
            Preconditions.CheckNotNull(serverOperation);

            if (clientOperation is WaveletBlipOperation && serverOperation is WaveletBlipOperation)
            {
                var clientWaveBlipOp = (WaveletBlipOperation) clientOperation;
                var serverWaveBlipOp = (WaveletBlipOperation) serverOperation;

                if (clientWaveBlipOp.BlipId.Equals(serverWaveBlipOp.BlipId))
                {
                    // Transform document operations
                    BlipOperation clientBlipOp = clientWaveBlipOp.BlipOp;
                    BlipOperation serverBlipOp = serverWaveBlipOp.BlipOp;

                    OperationPair<BlipOperation> transformedBlipOps = Transform(clientBlipOp, serverBlipOp);

                    clientOperation = new WaveletBlipOperation(clientWaveBlipOp.BlipId,
                        transformedBlipOps.ClientOperation);
                    serverOperation = new WaveletBlipOperation(serverWaveBlipOp.BlipId,
                        transformedBlipOps.ServerOperation);
                }
            }
            else
            {
                if (serverOperation is RemoveParticipantOperation)
                {
                    var serverRemoveOp = serverOperation as RemoveParticipantOperation;
                    CheckParticipantRemoval(serverRemoveOp, clientOperation);

                    if (clientOperation is RemoveParticipantOperation)
                    {
                        var clientRemoveOp = clientOperation as RemoveParticipantOperation;
                        if (clientRemoveOp.ParticipantId.Equals(serverRemoveOp.ParticipantId))
                        {
                            clientOperation = new NoOp(clientRemoveOp.Context);
                            serverOperation = new NoOp(serverRemoveOp.Context);
                        }
                    }
                    else if (clientOperation is AddParticipantOperation)
                    {
                        CheckParticipantRemovalAndAddition(serverRemoveOp, clientOperation as AddParticipantOperation);
                    }
                }
                else if (serverOperation is AddParticipantOperation)
                {
                    var serverAddOp = serverOperation as AddParticipantOperation;

                    if (clientOperation is AddParticipantOperation)
                    {
                        var clientAddOp = clientOperation as AddParticipantOperation;

                        if (clientAddOp.ParticipantId.Equals(serverAddOp.ParticipantId))
                        {
                            clientOperation = new NoOp(clientAddOp.Context);
                            serverOperation = new NoOp(serverAddOp.Context);
                        }
                    }
                    else if (clientOperation is RemoveParticipantOperation)
                    {
                        CheckParticipantRemovalAndAddition(
                            clientOperation as RemoveParticipantOperation,
                            serverOperation as AddParticipantOperation);
                    }
                }
            }

            // Apply identity transform by default
            return new OperationPair<WaveletOperation>(clientOperation, serverOperation);
        }