diff options
Diffstat (limited to 'src/com/isode/stroke/whiteboard/WhiteboardTransformer.java')
-rw-r--r-- | src/com/isode/stroke/whiteboard/WhiteboardTransformer.java | 264 |
1 files changed, 264 insertions, 0 deletions
diff --git a/src/com/isode/stroke/whiteboard/WhiteboardTransformer.java b/src/com/isode/stroke/whiteboard/WhiteboardTransformer.java new file mode 100644 index 0000000..4d20498 --- /dev/null +++ b/src/com/isode/stroke/whiteboard/WhiteboardTransformer.java @@ -0,0 +1,264 @@ +/* Copyright (c) 2016, Isode Limited, London, England. + * All rights reserved. + * + * Acquisition and use of this software and related materials for any + * purpose requires a written license agreement from Isode Limited, + * or a written license from an organisation licensed by Isode Limited + * to grant such a license. + * + */ +package com.isode.stroke.whiteboard; + +import com.isode.stroke.elements.WhiteboardDeleteOperation; +import com.isode.stroke.elements.WhiteboardInsertOperation; +import com.isode.stroke.elements.WhiteboardOperation; +import com.isode.stroke.elements.WhiteboardUpdateOperation; + +public final class WhiteboardTransformer { + + public static final class Pair { + public final WhiteboardOperation first; + public final WhiteboardOperation second; + public Pair(WhiteboardOperation first,WhiteboardOperation second) { + this.first = first; + this.second = second; + } + public Pair() { + this(new WhiteboardOperation(),new WhiteboardOperation()); + } + } + + private WhiteboardTransformer() { + // Static class so constructor is private + } + + public static Pair transform(WhiteboardOperation clientOp,WhiteboardOperation serverOp) { + if (clientOp instanceof WhiteboardInsertOperation) { + WhiteboardInsertOperation clientInsert = (WhiteboardInsertOperation) clientOp; + if (serverOp instanceof WhiteboardInsertOperation) { + WhiteboardInsertOperation serverInsert = (WhiteboardInsertOperation) serverOp; + return transform(clientInsert, serverInsert); + } + else if (serverOp instanceof WhiteboardUpdateOperation) { + WhiteboardUpdateOperation serverUpdate = (WhiteboardUpdateOperation) serverOp; + return transform(clientInsert, serverUpdate); + } + else if (serverOp instanceof WhiteboardDeleteOperation) { + WhiteboardDeleteOperation serverDelete = (WhiteboardDeleteOperation) serverOp; + return transform(clientInsert, serverDelete); + } + } + else if (clientOp instanceof WhiteboardUpdateOperation) { + WhiteboardUpdateOperation clientUpdate = (WhiteboardUpdateOperation) clientOp; + if (serverOp instanceof WhiteboardInsertOperation) { + WhiteboardInsertOperation serverInsert = (WhiteboardInsertOperation) serverOp; + return transform(clientUpdate, serverInsert); + } + else if (serverOp instanceof WhiteboardUpdateOperation) { + WhiteboardUpdateOperation serverUpdate = (WhiteboardUpdateOperation) serverOp; + return transform(clientUpdate, serverUpdate); + } + else if (serverOp instanceof WhiteboardDeleteOperation) { + WhiteboardDeleteOperation serverDelete = (WhiteboardDeleteOperation) serverOp; + return transform(clientUpdate, serverDelete); + } + } + else if (clientOp instanceof WhiteboardDeleteOperation) { + WhiteboardDeleteOperation clientDelete = (WhiteboardDeleteOperation) clientOp; + if (serverOp instanceof WhiteboardInsertOperation) { + WhiteboardInsertOperation serverInsert = (WhiteboardInsertOperation) serverOp; + return transform(clientDelete, serverInsert); + } + else if (serverOp instanceof WhiteboardUpdateOperation) { + WhiteboardUpdateOperation serverUpdate = (WhiteboardUpdateOperation) serverOp; + return transform(clientDelete, serverUpdate); + } + else if (serverOp instanceof WhiteboardDeleteOperation) { + WhiteboardDeleteOperation serverDelete = (WhiteboardDeleteOperation) serverOp; + return transform(clientDelete, serverDelete); + } + } + return new Pair(); + } + + public static Pair transform(WhiteboardInsertOperation clientOp,WhiteboardInsertOperation serverOp) { + WhiteboardInsertOperation first = new WhiteboardInsertOperation(serverOp); + first.setParentID(clientOp.getID()); + WhiteboardInsertOperation second = new WhiteboardInsertOperation(clientOp); + second.setParentID(serverOp.getID()); + if (clientOp.getPos() <= serverOp.getPos()) { + first.setPos(first.getPos()+1); + } + else { + second.setPos(second.getPos()+1); + } + return new Pair(first,second); + } + + public static Pair transform(WhiteboardUpdateOperation clientOp,WhiteboardUpdateOperation serverOp) { + + WhiteboardUpdateOperation first = new WhiteboardUpdateOperation(serverOp); + first.setParentID(clientOp.getID()); + + WhiteboardUpdateOperation second; + if (clientOp.getPos() == serverOp.getPos()) { + second = new WhiteboardUpdateOperation(serverOp); + second.setID(clientOp.getID()); + second.setParentID(serverOp.getID()); + } + else { + second = new WhiteboardUpdateOperation(clientOp); + second.setParentID(serverOp.getID()); + } + + if (clientOp.getPos() < serverOp.getPos() && clientOp.getNewPos() > serverOp.getPos()) { + first.setPos(first.getPos()-1); + if (clientOp.getNewPos() >= serverOp.getNewPos()) { + first.setNewPos(first.getNewPos()-1); + } + } + else if (clientOp.getNewPos() >= serverOp.getNewPos()) { + first.setNewPos(first.getNewPos()-1); + } + if (serverOp.getPos() < clientOp.getPos() && serverOp.getNewPos() > clientOp.getPos()) { + second.setPos(second.getPos()-1); + if (serverOp.getNewPos() >= clientOp.getNewPos()) { + second.setNewPos(second.getNewPos()-1); + } + } + else if (serverOp.getNewPos() >= clientOp.getNewPos()) { + second.setNewPos(second.getNewPos()-1); + } + return new Pair(first,second); + } + + public static Pair transform(WhiteboardUpdateOperation clientOp,WhiteboardInsertOperation serverOp) { + WhiteboardInsertOperation first = new WhiteboardInsertOperation(serverOp); + first.setParentID(clientOp.getID()); + WhiteboardUpdateOperation second = new WhiteboardUpdateOperation(clientOp); + second.setParentID(serverOp.getID()); + if (serverOp.getPos() <= clientOp.getPos()) { + second.setPos(second.getPos()+1); + } + return new Pair(first, second); + } + + public static Pair transform(WhiteboardInsertOperation clientOp,WhiteboardUpdateOperation serverOp) { + WhiteboardUpdateOperation first = new WhiteboardUpdateOperation(serverOp); + first.setParentID(clientOp.getID()); + WhiteboardInsertOperation second = new WhiteboardInsertOperation(clientOp); + second.setParentID(serverOp.getID()); + if (serverOp.getPos() >= clientOp.getPos()) { + first.setPos(first.getPos()+1); + } + return new Pair(first,second); + } + + public static Pair transform(WhiteboardDeleteOperation clientOp, WhiteboardDeleteOperation serverOp) { + WhiteboardDeleteOperation first = new WhiteboardDeleteOperation(serverOp); + first.setParentID(clientOp.getID()); + WhiteboardDeleteOperation second = new WhiteboardDeleteOperation(clientOp); + second.setParentID(serverOp.getID()); + if (clientOp.getPos() == -1) { + second.setPos(-1); + } + if (serverOp.getPos() == -1) { + first.setPos(-1); + } + if (clientOp.getPos() < serverOp.getPos()) { + first.setPos(first.getPos()-1); + } + else if (clientOp.getPos() > serverOp.getPos()) { + second.setPos(second.getPos()-1); + } + else { + first.setPos(-1); + second.setPos(-1); + } + return new Pair(first, second); + } + + public static Pair transform(WhiteboardInsertOperation clientOp, WhiteboardDeleteOperation serverOp) { + WhiteboardDeleteOperation first = new WhiteboardDeleteOperation(serverOp); + first.setParentID(clientOp.getID()); + WhiteboardInsertOperation second = new WhiteboardInsertOperation(clientOp); + second.setParentID(serverOp.getID()); + if (clientOp.getPos() <= serverOp.getPos()) { + first.setPos(first.getPos()+1); + } + else if (serverOp.getPos() != -1) { + second.setPos(second.getPos()-1); + } + return new Pair(first, second); + } + + public static Pair transform(WhiteboardDeleteOperation clientOp, WhiteboardInsertOperation serverOp) { + WhiteboardInsertOperation first = new WhiteboardInsertOperation(serverOp); + first.setParentID(clientOp.getID()); + WhiteboardDeleteOperation second = new WhiteboardDeleteOperation(clientOp); + second.setParentID(serverOp.getID()); + if (serverOp.getPos() <= clientOp.getPos()) { + second.setPos(second.getPos()+1); + } + else if (clientOp.getPos() != -1) { + first.setPos(first.getPos()-1); + } + return new Pair(first, second); + } + + public static Pair transform(WhiteboardUpdateOperation clientOp, WhiteboardDeleteOperation serverOp) { + WhiteboardDeleteOperation first = new WhiteboardDeleteOperation(serverOp); + first.setParentID(clientOp.getID()); + WhiteboardUpdateOperation updateOp = new WhiteboardUpdateOperation(clientOp);; + WhiteboardOperation second = updateOp; + second.setParentID(serverOp.getID()); + if (clientOp.getPos() == serverOp.getPos()) { + WhiteboardDeleteOperation deleteOp = new WhiteboardDeleteOperation(); + second = deleteOp; + second.setPos(-1); + second.setID(clientOp.getID()); + second.setParentID(serverOp.getID()); + deleteOp.setElementID(serverOp.getElementID()); + } + else if (clientOp.getPos() > serverOp.getPos() && clientOp.getNewPos() <= serverOp.getPos()) { + second.setPos(second.getPos()-1); + } + else if (clientOp.getPos() < serverOp.getPos() && clientOp.getNewPos() >= serverOp.getPos()) { + updateOp.setNewPos(updateOp.getNewPos()-1); + } + else if (clientOp.getPos() > serverOp.getPos()) { + second.setPos(second.getPos() - 1); + updateOp.setNewPos(updateOp.getNewPos()-1); + } + return new Pair(first, second); + } + + public static Pair transform(WhiteboardDeleteOperation clientOp, WhiteboardUpdateOperation serverOp) { + WhiteboardUpdateOperation updateOp = new WhiteboardUpdateOperation(serverOp); + WhiteboardOperation first = updateOp; + first.setParentID(clientOp.getID()); + WhiteboardDeleteOperation second = new WhiteboardDeleteOperation(clientOp); + second.setParentID(serverOp.getID()); + if (clientOp.getPos() == serverOp.getPos()) { + WhiteboardDeleteOperation deleteOp = new WhiteboardDeleteOperation(); + first = deleteOp; + first.setPos(-1); + first.setID(serverOp.getID()); + first.setParentID(clientOp.getID()); + deleteOp.setElementID(clientOp.getElementID()); + } + else if (clientOp.getPos() < serverOp.getPos() && clientOp.getPos() >= serverOp.getNewPos()) { + first.setPos(first.getPos()-1); + } + else if (clientOp.getPos() > serverOp.getPos() && clientOp.getPos() <= serverOp.getNewPos()) { + updateOp.setNewPos(updateOp.getNewPos()-1); + } + else if (clientOp.getPos() < serverOp.getPos()) { + first.setPos(first.getPos()-1); + updateOp.setNewPos(updateOp.getNewPos()-1); + } + return new Pair(first, second); + } + + +} |