diff options
author | isikm | 2008-06-14 20:50:45 +0000 |
---|---|---|
committer | isikm | 2008-06-14 20:50:45 +0000 |
commit | 3391a6904f71b5c60aaf0caaca545f4c91c12e0a (patch) | |
tree | cedaf58f87075525d0dcf6539fbfa8b2cff81500 | |
parent | fec753d113c21c3f4965a9bed28098032e567343 (diff) | |
download | org.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.java | 45 |
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; } |