Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorisikm2008-06-14 20:50:45 +0000
committerisikm2008-06-14 20:50:45 +0000
commit3391a6904f71b5c60aaf0caaca545f4c91c12e0a (patch)
treecedaf58f87075525d0dcf6539fbfa8b2cff81500
parentfec753d113c21c3f4965a9bed28098032e567343 (diff)
downloadorg.eclipse.ecf-3391a6904f71b5c60aaf0caaca545f4c91c12e0a.tar.gz
org.eclipse.ecf-3391a6904f71b5c60aaf0caaca545f4c91c12e0a.tar.xz
org.eclipse.ecf-3391a6904f71b5c60aaf0caaca545f4c91c12e0a.zip
fixed ColaInsertion, correctly works against single and multiple character insertions now - previous versions contain major flaw/bug - no operational transformation of queued up/unack local ops, that is being done now - next up is fixing deletions and making them work with insertions
-rw-r--r--framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaInsertion.java45
1 files changed, 6 insertions, 39 deletions
diff --git a/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaInsertion.java b/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaInsertion.java
index 5dedd0e80..2806db55b 100644
--- a/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaInsertion.java
+++ b/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaInsertion.java
@@ -39,54 +39,21 @@ public class ColaInsertion implements TransformationStrategy {
ColaUpdateMessage remoteTransformedMsg = remoteIncomingMsg;
if (localAppliedMsg.isInsertion()) {
- // check for full on collision - this is comparable to equal
- // insertion
- // pos. with single chars
- if ((remoteTransformedMsg.getOffset() >= localAppliedMsg.getOffset()) && (remoteTransformedMsg.getOffset() < (localAppliedMsg.getOffset() + localAppliedMsg.getText().length()))) {
- // determine what to modify and how
+ if (remoteTransformedMsg.getOffset() < localAppliedMsg.getOffset()) {
+ //coopt(remote(low),local(high)) --> (remote(low),local(low + high))
+ localAppliedMsg.setOffset(localAppliedMsg.getOffset() + remoteTransformedMsg.getOffset());
+ } else if (remoteTransformedMsg.getOffset() == localAppliedMsg.getOffset()) {
if (localMsgHighPrio) {
-
- int localMsgEndIndex = localAppliedMsg.getOffset() + localAppliedMsg.getText().length();
- remoteTransformedMsg.setOffset(localMsgEndIndex);
-
+ remoteTransformedMsg.setOffset(remoteTransformedMsg.getOffset() + localAppliedMsg.getText().length());
} else {
- // localMsg if of lesser prio
- // update both operations accordingly
-
- remoteTransformedMsg.setOffset(localAppliedMsg.getOffset());
-
- // TODO is this necessary? I think so ...
- /*
- * appliedLocalMsg.setOffset(appliedLocalMsg.getOffset() +
- * transformedRemote.getText().length());
- */
+ localAppliedMsg.setOffset(localAppliedMsg.getOffset() + remoteTransformedMsg.getText().length());
}
-
- } else if (remoteTransformedMsg.getOffset() < localAppliedMsg.getOffset()) {
-
- /*
- * appliedLocalMsg.setOffset(appliedLocalMsg.getOffset() +
- * transformedRemote.getText().length());
- */
-
} else if (remoteTransformedMsg.getOffset() > localAppliedMsg.getOffset()) {
-
remoteTransformedMsg.setOffset(remoteTransformedMsg.getOffset() + localAppliedMsg.getText().length());
}
- } else if (localAppliedMsg.isDeletion()) {
- // TODO determine which cases are interesting to a remote insertion
- // when running into a local, already applied deletion:
- // the following seems to be the only case of relevance here
- if (localAppliedMsg.getOffset() < remoteTransformedMsg.getOffset()) {
- // move remote insertion to the left
- remoteTransformedMsg.setOffset(remoteTransformedMsg.getOffset() - localAppliedMsg.getLength());
- }
}
- remoteTransformedMsg.remoteOperationsCount += 1;
- localAppliedMsg.remoteOperationsCount += 1;
-
Trace.exiting(Activator.PLUGIN_ID, DocshareDebugOptions.METHODS_EXITING, this.getClass(), "getOperationalTransform", remoteTransformedMsg); //$NON-NLS-1$
return remoteTransformedMsg;
}

Back to the top