summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/whiteboard/WhiteboardTransformer.java')
-rw-r--r--src/com/isode/stroke/whiteboard/WhiteboardTransformer.java264
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);
+ }
+
+
+}