Jelke,
Here's my attempt at implementing your situation using the base wave
primitives - BufferedDocOp, Composer and Transformer:
public class Main {
public static void main(String[] args) throws OperationException {
// A server document. It contains "15"
final BufferedDocOp serverInitial = new
DocOpBuilder().characters("15").build();
dump("server initial state", serverInitial);
// First client submits an edit against "15", replacing it with "16"
final BufferedDocOp client1edit = new
DocOpBuilder().deleteCharacters("15").characters("16").build();
dump("client 1's edit", client1edit);
// As this is the first edit against "15" the server has seen, it
will
// compose without issue
final BufferedDocOp serverIntermediate =
Composer.compose(serverInitial, client1edit);
dump("server intermediate state", serverIntermediate);
// Second client submits an edit against "15", replacing it with
"17"
final BufferedDocOp client2edit = new
DocOpBuilder().deleteCharacters("15").characters("17").build();
// Composing directly, without transformation
BufferedDocOp untransformedServerState =
Composer.compose(serverIntermediate, client2edit);
dump("untransformed server state", untransformedServerState);
// Transforming the server history stack (which contains
client1edit) against the new edit
final OperationPair<BufferedDocOp> transformed =
Transformer.transform(client2edit, client1edit);
dump("transformed client state", transformed.clientOp());
dump("transformed server state", transformed.serverOp());
final BufferedDocOp serverFinal =
Composer.compose(serverIntermediate, transformed.clientOp());
dump("transformed + composed server final state", serverFinal);
}
private static void dump(String context, BufferedDocOp op) {
System.out.println(context + ": " + DocOpUtil.toConciseString(op));
}
}
Here is the resulting output:
server initial state: ++"15";
client 1's edit: --"15"; ++"16";
server intermediate state: ++"16";
untransformed server state: ++"17";
transformed client state: ++"17"; __2;
transformed server state: __2; ++"16";
transformed + composed server final state: ++"1716";
Transforming the second edit against the history stack is required so that
the deletes of the two deletes are merged.
hth,
brett
On Mon, Nov 30, 2009 at 12:05 AM, Jelke J. van Hoorn <[email protected]>wrote:
> Hi,
>
> I was looking the "under the hood" vidieo of Google IO 2009. And I'm
> wondering what happens in the following situation:
>
> On the server a piece of text is lets say "15" and two clients alter
> the same piece in "16" and "17" respectively.
> What would be the outcome of the transforms? There is no unambigeous
> way to cope with this edit I think.
>
> Grtz Jelke
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "Wave Protocol" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected]<wave-protocol%[email protected]>
> .
> For more options, visit this group at
> http://groups.google.com/group/wave-protocol?hl=en.
>
>
>
--
Brett Morgan http://domesticmouse.livejournal.com/
--
You received this message because you are subscribed to the Google Groups "Wave
Protocol" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/wave-protocol?hl=en.