public override IList<WaveletOperation> ApplyAndReturnReverse(IWaveletData target) { WaveletOperation reverse = new NoOp(CreateReverseContext(target)); Apply(target); return new ReadOnlyCollection<WaveletOperation>(new[] {reverse}); }
/// <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); }