summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/whiteboard/WhiteboardClient.java')
-rw-r--r--src/com/isode/stroke/whiteboard/WhiteboardClient.java149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/com/isode/stroke/whiteboard/WhiteboardClient.java b/src/com/isode/stroke/whiteboard/WhiteboardClient.java
new file mode 100644
index 0000000..7b7bb10
--- /dev/null
+++ b/src/com/isode/stroke/whiteboard/WhiteboardClient.java
@@ -0,0 +1,149 @@
+/* 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 java.util.ArrayList;
+import java.util.List;
+
+import com.isode.stroke.elements.WhiteboardDeleteOperation;
+import com.isode.stroke.elements.WhiteboardInsertOperation;
+import com.isode.stroke.elements.WhiteboardOperation;
+import com.isode.stroke.elements.WhiteboardUpdateOperation;
+import com.isode.stroke.whiteboard.WhiteboardTransformer.Pair;
+
+public class WhiteboardClient {
+
+ private final List<WhiteboardOperation> localOperations_ = new ArrayList<WhiteboardOperation>();
+ private final List<WhiteboardOperation> serverOperations_ = new ArrayList<WhiteboardOperation>();
+ private final List<WhiteboardOperation> bridge_ = new ArrayList<WhiteboardOperation>();
+ private String lastSentOperationID_ = "";
+
+ public static class Result {
+ public final WhiteboardOperation client;
+ public final WhiteboardOperation server;
+ public Result(WhiteboardOperation client,WhiteboardOperation server) {
+ this.client = client;
+ this.server = server;
+ }
+ }
+
+ public WhiteboardOperation handleLocalOperationReceived(WhiteboardOperation operation) {
+ localOperations_.add(operation);
+
+ WhiteboardOperation op = null;
+ if (operation instanceof WhiteboardInsertOperation) {
+ op = new WhiteboardInsertOperation((WhiteboardInsertOperation) operation);
+ }
+ else if (operation instanceof WhiteboardUpdateOperation) {
+ op = new WhiteboardUpdateOperation((WhiteboardUpdateOperation) operation);
+ }
+ else if (operation instanceof WhiteboardDeleteOperation) {
+ op = new WhiteboardDeleteOperation((WhiteboardDeleteOperation) operation);
+ }
+
+ if (!bridge_.isEmpty()) {
+ WhiteboardOperation back = bridge_.get(bridge_.size()-1);
+ op.setParentID(back.getID());
+ }
+ bridge_.add(op);
+
+ if (lastSentOperationID_.isEmpty()) {
+ if (operation instanceof WhiteboardInsertOperation) {
+ op = new WhiteboardInsertOperation((WhiteboardInsertOperation) operation);
+ }
+ else if (operation instanceof WhiteboardUpdateOperation) {
+ op = new WhiteboardUpdateOperation((WhiteboardUpdateOperation) operation);
+ }
+ else if (operation instanceof WhiteboardDeleteOperation) {
+ op = new WhiteboardDeleteOperation((WhiteboardDeleteOperation) operation);
+ }
+
+ if (!serverOperations_.isEmpty()) {
+ WhiteboardOperation back = serverOperations_.get(serverOperations_.size()-1);
+ op.setParentID(back.getID());
+ }
+ lastSentOperationID_ = operation.getID();
+ return op;
+ }
+ else{
+ return null;
+ }
+ }
+
+ public Result handleServerOperationReceived(WhiteboardOperation operation) {
+ serverOperations_.add(operation);
+ WhiteboardOperation clientResult = null, serverResult = null;
+ if (localOperations_.size() == (serverOperations_.size()-1) ) {
+ localOperations_.add(operation);
+ clientResult = operation;
+ }
+ else if (lastSentOperationID_ == operation.getID()) {
+ //Client received confirmation about own operation and it sends next operation to server
+ if (!bridge_.isEmpty() && lastSentOperationID_ .equals(bridge_.get(0).getID())) {
+ bridge_.remove(0);
+ }
+
+ if (!bridge_.isEmpty() && lastSentOperationID_ .equals(bridge_.get(0).getParentID())) {
+ lastSentOperationID_ = bridge_.get(0).getID();
+ serverResult = bridge_.get(0);
+ }
+ if (serverResult == null) {
+ lastSentOperationID_ = "";
+ }
+ }
+ else if (!bridge_.isEmpty()) {
+ WhiteboardOperation temp;
+ Pair opPair = WhiteboardTransformer.transform(bridge_.get(0), operation);
+ temp = opPair.first;
+
+ bridge_.set(0, opPair.second);
+ String previousID = bridge_.get(0).getID();
+ for (int i = 1; i < bridge_.size(); ++i) {
+ opPair = WhiteboardTransformer.transform(bridge_.get(i), temp);
+ temp = opPair.first;
+ bridge_.set(i, opPair.second);
+ bridge_.get(i).setParentID(previousID);
+ previousID = bridge_.get(i).getID();
+ }
+
+ WhiteboardOperation localBack = localOperations_.get(localOperations_.size()-1);
+ temp.setParentID(localBack.getID());
+ localOperations_.add(temp);
+ clientResult = temp;
+ }
+
+ return new Result(clientResult, serverResult);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Client\n");
+ for (WhiteboardOperation op : localOperations_) {
+ builder.append(op.getID());
+ builder.append(' ');
+ builder.append(op.getPos());
+ builder.append('\n');
+ }
+ builder.append("Server\n");
+ for (WhiteboardOperation op : serverOperations_) {
+ builder.append(op.getID());
+ builder.append(' ');
+ builder.append(op.getPos());
+ builder.append('\n');
+ }
+ return builder.toString();
+ }
+
+ public void print() {
+ System.out.println(this);
+ }
+
+}