diff options
author | isikm | 2008-06-15 12:39:10 +0000 |
---|---|---|
committer | isikm | 2008-06-15 12:39:10 +0000 |
commit | 334959402c95e159868cda435a30716d3c4d36b4 (patch) | |
tree | a7d74df8c030298b5899f993d2cd0bc53f6095e0 | |
parent | 0fb6f45c50f7a46baa425ec430efc1410c8cb25c (diff) | |
download | org.eclipse.ecf-334959402c95e159868cda435a30716d3c4d36b4.tar.gz org.eclipse.ecf-334959402c95e159868cda435a30716d3c4d36b4.tar.xz org.eclipse.ecf-334959402c95e159868cda435a30716d3c4d36b4.zip |
fixed deletions to properly apply algorithm on deletion vs. deletion transformations - next up are changes to ColaDeletion and ColaInsertion to deal with transformations involving one operation from each class
-rw-r--r-- | framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java b/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java index 56ee0a059..b3fed71d6 100644 --- a/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java +++ b/framework/bundles/org.eclipse.ecf.docshare/src/org/eclipse/ecf/docshare/cola/ColaDeletion.java @@ -39,18 +39,76 @@ public class ColaDeletion implements TransformationStrategy { ColaUpdateMessage remoteTransformedMsg = remoteIncomingMsg; if (remoteTransformedMsg.isDeletion()) { + final int noOpLength = 0; if (remoteTransformedMsg.getOffset() < localAppliedMsg.getOffset()) { + if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) < localAppliedMsg.getOffset()) { + //no overlap - remote OK as is, local needs modification localAppliedMsg.setOffset(localAppliedMsg.getOffset() - remoteTransformedMsg.getLengthOfReplacedText()); + } else if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) < (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText())) { + //remote del at lower index reaches into locally applied del, local del reaches further out - //shorten remote del appropriately, move and shorten local del left + //--> shorten remote del appropriately, move and shorten local del left remoteTransformedMsg.setLengthOfReplacedText((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) - localAppliedMsg.getOffset()); localAppliedMsg.setLengthOfReplacedText((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) - localAppliedMsg.getOffset()); + localAppliedMsg.setOffset(remoteTransformedMsg.getOffset());//TODO verify! + + } else if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) >= (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText())) { + + //remote del at lower index, remote del fully extends over local del + //--> shorten remote by local.lengthOfReplacedText, make local no-op + remoteTransformedMsg.setLengthOfReplacedText(remoteTransformedMsg.getLengthOfReplacedText() - localAppliedMsg.getLengthOfReplacedText()); + //TODO verify whether this is equivalent to setting no-op, otherwise declare a noop boolean field for ColaDeletions localAppliedMsg.setOffset(remoteTransformedMsg.getOffset()); - }//TODO remove this comment : too tired to continue 2008-06-15 00:42h + localAppliedMsg.setLengthOfReplacedText(noOpLength); + } + } else if (remoteTransformedMsg.getOffset() == localAppliedMsg.getOffset()) { + + if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) < (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText())) { + //start indices are equal, remote is shorter --> make remote no-op + remoteTransformedMsg.setLengthOfReplacedText(noOpLength); + //--> shorten localOp to only delete non-overlapping region + localAppliedMsg.setLengthOfReplacedText(localAppliedMsg.getLengthOfReplacedText() - remoteTransformedMsg.getLengthOfReplacedText()); + } else if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) == (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText())) { + //same endIndex, i.e. same deletion + //--> make remote op be no-op + remoteTransformedMsg.setLengthOfReplacedText(noOpLength); + //--> make local op appear as no-op + localAppliedMsg.setLengthOfReplacedText(noOpLength); + } else if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) > (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText())) { + //remote del extends over local del + //-->shorten remote del by length of local del, index/offset does not need to be updated + remoteTransformedMsg.setLengthOfReplacedText(remoteTransformedMsg.getLengthOfReplacedText() - localAppliedMsg.getLengthOfReplacedText()); + //-->make local del appear as no-op + localAppliedMsg.setLengthOfReplacedText(noOpLength); + } + } else if (remoteTransformedMsg.getOffset() > localAppliedMsg.getOffset()) { + + if (remoteTransformedMsg.getOffset() > (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText())) { + + //move remote deletion left by length of local deletion + remoteTransformedMsg.setOffset(remoteTransformedMsg.getOffset() - localAppliedMsg.getLengthOfReplacedText()); + + } else if ((remoteTransformedMsg.getOffset() + remoteTransformedMsg.getLengthOfReplacedText()) < (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText())) { + + //remote is fully contained in/overlapping with local del + //--> remote is no-op + remoteTransformedMsg.setLengthOfReplacedText(noOpLength); + //-->local needs to be shortened by length of remote + localAppliedMsg.setLengthOfReplacedText(localAppliedMsg.getLengthOfReplacedText() - remoteTransformedMsg.getLengthOfReplacedText()); + + } else if (remoteTransformedMsg.getOffset() < (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText())) { + + //remote del starts within local del, but extends further + //-->shorten remote by overlap and move left to index of local del + remoteTransformedMsg.setLengthOfReplacedText(remoteTransformedMsg.getLengthOfReplacedText() - (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText()) - remoteTransformedMsg.getOffset()); + remoteTransformedMsg.setOffset(localAppliedMsg.getOffset()); + //-->shorten local applied message + localAppliedMsg.setLengthOfReplacedText(localAppliedMsg.getLengthOfReplacedText() - (localAppliedMsg.getOffset() + localAppliedMsg.getLengthOfReplacedText()) - remoteTransformedMsg.getOffset()); + } } } //-------------------------- |