專利名稱:基于操作效果關(guān)系的選擇性撤銷方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計(jì)算機(jī)支持的協(xié)同工作(Computer Support Cooperative Work)技術(shù) 領(lǐng)域,具體涉及一種基于操作效果關(guān)系的選擇性撤銷方法,該方法可以使得用戶在分布式 協(xié)同應(yīng)用程序中,任意地撤銷操作日志中的任何歷史操作。本發(fā)明利用操作之間的操作效 果關(guān)系,自動(dòng)地處理用戶操作之間的復(fù)雜的Do-Undo關(guān)系,在各個(gè)協(xié)同站點(diǎn)間實(shí)現(xiàn)數(shù)據(jù)的 一致性維護(hù)。
背景技術(shù):
Undo是交互式應(yīng)用程序不可或缺的重要功能之一。許多日常的單用戶應(yīng)用程序, 包括文本編輯器、編程軟件、設(shè)計(jì)工具、Web瀏覽器等都允許用戶按時(shí)間順序撤消最近的若 干個(gè)歷史操作。Undo通常用于用戶層面的錯(cuò)誤恢復(fù),比如修正拼寫錯(cuò)誤等。同時(shí)由于Undo 機(jī)制能撤消錯(cuò)誤操作所帶來的不良影響,它也可以鼓勵(lì)用戶探索不熟悉的應(yīng)用程序功能。與單用戶應(yīng)用程序中的Undo機(jī)制相比,在協(xié)同應(yīng)用程序中實(shí)現(xiàn)Undo機(jī)制需要面 臨很多的技術(shù)挑戰(zhàn)。當(dāng)用戶分布地并行工作時(shí),由于并發(fā)性,本地和遠(yuǎn)程操作可能會被任意 地交叉執(zhí)行。而用戶的Undo請求可能是指撤消最后一個(gè)本地操作或也可能是指撤銷最后 一個(gè)在本地執(zhí)行的操作(可能是本地產(chǎn)生操作,也可能是遠(yuǎn)程站點(diǎn)產(chǎn)生操作)。用戶要撤銷 的是最后一個(gè)本地操作時(shí),該操作執(zhí)行后可能又有其它的遠(yuǎn)程操作已經(jīng)在本地被執(zhí)行。因 此,該操作的定義上下文已經(jīng)不是當(dāng)前的文檔狀態(tài),撤銷該操作也就不能靠簡單地執(zhí)行其 逆操作來完成。而用戶要撤銷最后一個(gè)遠(yuǎn)程操作時(shí),系統(tǒng)則要準(zhǔn)確無誤地判定要撤銷是哪 個(gè)用戶所執(zhí)行的哪個(gè)操作。否則,該Undo請求在不同的站點(diǎn)上就可能會有不同的執(zhí)行效 果,引起不可預(yù)測的系統(tǒng)行為。在分布式的協(xié)同環(huán)境中,由于用戶要撤銷操作的定義狀態(tài)可能已不是當(dāng)前的文檔 狀態(tài),協(xié)同環(huán)境下的Undo機(jī)制需要支持Selective Undo以撤消操作日志中任何所選操作 的操作效果。由于操作轉(zhuǎn)換技術(shù)可以對任意的一對操作進(jìn)行轉(zhuǎn)換以交換其執(zhí)行順序,操作 轉(zhuǎn)換技術(shù)是在分布式協(xié)同系統(tǒng)中實(shí)現(xiàn)Selective Undo非常理想和有效的工具。操作轉(zhuǎn)換 的這種特性使得去除某個(gè)歷史操作的效果并重新安排操作日志中操作的執(zhí)行順序成為可 能。在極端情況下,借助操作轉(zhuǎn)換技術(shù)我們甚至可以任意地組織歷史操作的執(zhí)行順序,有選 擇性地保留需要的操作效果,去除不需要的操作效果。
發(fā)明內(nèi)容
本發(fā)明的目的在于提出一種基于操作效果關(guān)系的選擇性撤銷方法,具體是構(gòu)建一 個(gè)可以選擇性撤銷任何歷史操作的算法框架。該算法框架包括操作之間Do-Undo關(guān)系的跟 蹤、程序的控制算法、處理本地Do/Undo操作、處理遠(yuǎn)程Do/Undo操作、整合本地操作及整合 遠(yuǎn)程操作。下面先介紹一些相關(guān)的基本概念。具有高交互性的協(xié)同應(yīng)用程序的一個(gè)重要目標(biāo)就是本地操作的高響應(yīng)性,即本地操作的無延遲執(zhí)行。實(shí)現(xiàn)操作的無延遲執(zhí)行的一個(gè)重要手段就數(shù)據(jù)的全復(fù)制式結(jié)構(gòu),即每 個(gè)站點(diǎn)保留一份數(shù)據(jù)副本,用戶的操作在本地可以立即執(zhí)行,然后發(fā)送給其它站點(diǎn)。每個(gè)站 點(diǎn)擁有一個(gè)用以記錄歷史操作的操作日志H和用以緩存其它未處理的來自于其它站點(diǎn)遠(yuǎn) 程操作的接收隊(duì)列RQ。在分布式系統(tǒng)中,基于狀態(tài)向量(State Vector)的邏輯時(shí)間戳被廣泛用來判別操 作之間的因果關(guān)系(Causal Relationship)。一個(gè)時(shí)間戳是一個(gè)向量,向量的每一維表示一 個(gè)站點(diǎn),而向量中這一維上的值表示已經(jīng)執(zhí)行了這個(gè)站點(diǎn)中的操作的數(shù)量。每個(gè)站點(diǎn)擁有 一個(gè)代表本地狀態(tài)的狀態(tài)向量sv。由于來自同一個(gè)站點(diǎn)的操作都是順序執(zhí)行的,于是一個(gè) 時(shí)間戳可以表示在該時(shí)間戳的狀態(tài)下已執(zhí)行了哪些操作,如果一個(gè)時(shí)間戳中所有已執(zhí)行的 操作都包含在另一個(gè)時(shí)間戳的已執(zhí)行操作中,則兩個(gè)時(shí)間戳滿足因果關(guān)系,否則是并發(fā)關(guān) 系。如果兩個(gè)操作ol和o2具有因果先于關(guān)系,則記為ol — o2 ;如果兩個(gè)操作ol和o2具 有并發(fā)關(guān)系,則記為ol I I 02。每個(gè)操作產(chǎn)生后,本地站點(diǎn)的狀態(tài)向量會作為邏輯時(shí)間戳附在 該操作上。一種Undo方案首先要解決如何在操作日志中選擇要撤銷的歷史操作。操作日志 中的操作可以使用其下標(biāo)i來索引,例如H[i]。在基于向量時(shí)間戳的系統(tǒng)中,給定一個(gè)已存 在的向量時(shí)間戳v,我們可以在操作日志中找到一個(gè)唯一與之對應(yīng)的歷史操作H[i]。我們 用符號imdo(i)來表示用戶要撤銷操作日志中第i個(gè)操作。操作之間Do-Undo關(guān)系的跟蹤每個(gè)操作o是一個(gè)具有如下屬性的九元組(id,type,pos,char,v,dv,tv,ov,uv) 0. id是產(chǎn)生操作o的站點(diǎn)id ;o. type是操作的類型,為ins或者del ;o. pos是o的操作位 置;o. char是o插入或刪除效果字符。另外的5個(gè)屬性都與向量時(shí)間戳有關(guān)系,它們分別 是 o.V:o的向量時(shí)間戳集合; o. dv 由依賴于o的操作的向量時(shí)間戳構(gòu)成的集合; o. tv 由效果字符與o的效果字符沖突的操作的向量時(shí)間戳構(gòu)成的集合; o. ov 如果o是一個(gè)Undo操作,則o. ov是它要撤銷的原始操作的向量時(shí)間戳; 否則,0.0V = 0; o. uv 如果o曾經(jīng)被某個(gè)操作0'撤銷,則o. UV = 0' . v ;否則,0. uv = 0。我們用上述這些向量時(shí)間戳來跟蹤操作之間的相互關(guān)系。比如,若操作0'撤銷了 操作0,那么0.UV = 0' .V并且0' .0V = 0.Vo同時(shí),它們效果字符的操作位置相同,故 0' .tv = o.v,并且0'在操作日志中緊跟著0存放。如果多個(gè)操作刪除了同一效果字符 或者它們撤銷了同一個(gè)原始操作,那么,它們在H中將被合并為一個(gè)操作0而且o. V是這些 操作的向量時(shí)間戳構(gòu)成的集合。我們定義三個(gè)用以判定兩個(gè)操作之間操作效果序的操作符。操作符< e 給定任意的兩個(gè)操作ol和02,當(dāng)ol和o2定義在相同的文檔狀態(tài)上 時(shí),ol < e o2如果下述三個(gè)條件之一成立(l)ol. pos < o2. pos ;(2) ol. pos = o2. pos, ol. type = ins, o2. type = del ;(3) ol. pos = o2. pos, ol. type = o2. type = ins, ol. id < o2. id。
當(dāng)ol和02定義在相鄰的文檔狀態(tài)上時(shí),ol < e o2如果下述兩個(gè)條件之一成立(l)ol. pos < o2. pos ;(2)ol. pos = o2. pos, ol. type = o2. type = del。操作符> e :> e是與操作符< e對稱的操作符。給定任意的兩個(gè)操作ol和02, 當(dāng)ol和o2定義在相同的文檔狀態(tài)上時(shí),ol > e o2如果下述三個(gè)條件之一成立(l)ol. pos > o2. pos ;(2)ol. pos = o2. pos, ol. type = del, o2. type = ins ;(3) ol. pos = o2. pos, ol. type = o2. type = ins, ol. id > o2. id。當(dāng)ol和o2定義在相鄰的文檔狀態(tài)上時(shí),ol > e o2如果下述兩個(gè)條件之一成立(l)ol. pos > o2. pos ;(2)ol. pos = o2. pos, ol. type = o2. type = ins。操作符=e 任意給定兩個(gè)操作ol和o2,ol = e o2如果ol. pos = o2. pos并且 下述的兩個(gè)條件之一成立(l)ol和o2定義在相同的文檔狀態(tài)上,ol. type = o2. type = del ;(2)ol和o2定義在相鄰的文檔狀態(tài)上,ol. type與o2. type不同。本發(fā)明提出的基于操作效果關(guān)系的選擇性撤銷方法,利用操作效果序跟蹤操作之 間的Do-Undo關(guān)系,并利用歷史操作之間的操作效果關(guān)系處理本地和遠(yuǎn)程的Do/Undo操作。 其控制算法包含三個(gè)線程L、R和N。線程N(yùn)用來接收遠(yuǎn)程操作,線程L和R分別用來處理本 地和遠(yuǎn)程的Do/Undo操作。其中處理本地和遠(yuǎn)程的Do/Undo操作的算法分別包含兩個(gè)Do/ Undo integrateL 禾口 integrateR。本發(fā)明提出的選擇性撤銷方法分為兩部分對本地Do/Undo操作的處理和對遠(yuǎn)程 Do/Undo操作的處理。對本地Do/Undo操作的處理流程為1)若本地操作為Do操作,程序執(zhí)行本地操作,然后調(diào)用integrateL過程將本地 Do操作按操作效果序添加到操作日志中;2)若本地操作為Undo操作,根據(jù)該操作與其原始操作之間的操作效果序產(chǎn)生該 操作的逆操作,記錄該操作與其原始操作之間的Do-Undo關(guān)系后按照處理Do操作的方式進(jìn) 行整合處理。 對遠(yuǎn)程Do/Undo操作的處理流程為1)若遠(yuǎn)程操作為Do操作,調(diào)用integrateR過程產(chǎn)生一個(gè)可以在當(dāng)前文檔狀態(tài)正 確執(zhí)行的操作形式,執(zhí)行該操作并將其添加到操作日志中;2)若遠(yuǎn)程操作為Undo操作,掃描操作日志來定位其原始操作,如果其原始操作已 經(jīng)被該遠(yuǎn)程操作的并發(fā)操作所撤銷,則將該遠(yuǎn)程操作與其效果等價(jià)的并發(fā)操作進(jìn)行合并, 否則記錄該遠(yuǎn)程操作與其原始操作之間的Do-Undo關(guān)系。然后,按照處理遠(yuǎn)程Do操作的方 式處理該Undo操作。本發(fā)明提出的選擇性撤銷方法可以使得在多個(gè)用戶進(jìn)行實(shí)時(shí)編輯的分布式協(xié)同 系統(tǒng)中,用戶可以選擇性地撤銷操作日志中的任何歷史操作,本發(fā)明可以自動(dòng)處理用戶之 間的操作沖突,在各個(gè)用戶間實(shí)現(xiàn)數(shù)據(jù)的一致性維護(hù)。所說的操作效果序,是指根據(jù)操作效果字符之間的相對位置關(guān)系來對所有的操作進(jìn)行比較、排序和存儲。所說的線程L,在觸發(fā)本地操作(Do或Undo操作)后被激活。任何的操作(Do或 Undo操作)在本地站點(diǎn)執(zhí)行后,先由線程L將其添加到操作日志中。隨后,該操作會被廣播 給其它遠(yuǎn)程站點(diǎn)。所說的線程N(yùn),在一個(gè)遠(yuǎn)程操作到達(dá)本地站點(diǎn)后被激活。當(dāng)接收到某個(gè)遠(yuǎn)程操作 后,該操作會被線程N(yùn)添加到接收隊(duì)列RQ中。所說的線程R,在系統(tǒng)不在忙于處理本地操作時(shí)(處理本地操作的線程L的優(yōu)先級 高于處理遠(yuǎn)程操作的線程R),它將被激活來處理因果就緒的遠(yuǎn)程操作(Do或Undo操作)。所說的integrateL過程,被線程L調(diào)用,將一個(gè)新產(chǎn)生的本地操作o按照操作效 果序添加到操作日志H中。所說的integrateR過程,被線程R調(diào)用,具有兩重目標(biāo)第一個(gè)目標(biāo)是轉(zhuǎn)換某個(gè)遠(yuǎn) 程操作o使得轉(zhuǎn)換后得到的操作可以正確地在當(dāng)前文檔狀態(tài)上執(zhí)行;第二個(gè)目標(biāo)是將o添 加到操作日志H中的某個(gè)恰當(dāng)?shù)奈恢胟,以使得H在轉(zhuǎn)換后仍然保持操作效果序。下面具體介紹基于操作效果關(guān)系的選擇性撤銷方法中所涉及到的各個(gè)算法。1、程序的控制算法每個(gè)站點(diǎn)上運(yùn)行三個(gè)主要的并發(fā)線程,線程L、N和R,其中線程L和R分別用來處 理本地和遠(yuǎn)程操作。任何的操作(Do或Undo操作)在本地站點(diǎn)執(zhí)行后,先由線程L將其添 加到操作日志中。隨后,該操作會被廣播給其它遠(yuǎn)程站點(diǎn)。當(dāng)接收到某個(gè)遠(yuǎn)程操作后,該操 作會被線程N(yùn)添加到接收隊(duì)列RQ中。線程R每次處理RQ中一個(gè)因果就緒的操作。H中的 所有操作按照操作效果序排列。
Algorithm 5站點(diǎn)j上的控制算法
sv
(線程L、調(diào)用算法1處理本地提交的操作o (線程m接收遠(yuǎn)程操作o:
RQ ^ RQ-o (線程n~)
if中存在因果就緒的遠(yuǎn)程操作o then
調(diào)用算法2處理操作0 endif2、處理本地Do/Undo操作任何本地操作要么是一個(gè)普通的Do操作,要么是某個(gè)歷史操作的Undo操作。當(dāng) 一個(gè)本地操作被提交后,無論是哪種情況,線程L都會被觸發(fā)來處理這個(gè)本地操作。如算法1所示,當(dāng)操作o是一個(gè)Do操作時(shí),它將被直接在本地?cái)?shù)據(jù)副本上執(zhí)行。 執(zhí)行完后,站點(diǎn)k的狀態(tài)向量sv的第k個(gè)元素將加1,以表示站點(diǎn)k執(zhí)行了一個(gè)新的操作。 然后,操作o的向量時(shí)間戳將被置為sv。當(dāng)操作o被添加到本地的操作日志H中后,它將被 廣播到其它的遠(yuǎn)程站點(diǎn)。integrateUo)過程用來將操作o按操作效果序添加到操作日志 H中。
當(dāng)操作o是一個(gè)Undo操作undo⑴時(shí),線程L會首先檢查它的原始操作H[i]是 否已經(jīng)被其它操作撤銷或者被其它操作所依賴(第6行)。如果操作o已經(jīng)被撤銷或被其 它操作依賴,那么,線程L將會拒絕這個(gè)Undo操作請求。否則的話,它將產(chǎn)生H[i]的逆操 作0',調(diào)整站點(diǎn)的狀態(tài)向量sv,并用sv來標(biāo)記0'。為了跟蹤Do-Undo操作之間的關(guān)系, o' .ov被置為其原始操作的向量時(shí)間戳(第12行),而H[i]的uv屬性則被置為0' .v(第 13 行)。這之后,操作o ’將被看作一個(gè)普通的Do操作來處理本地執(zhí)行后,被添加到操作 日志H中,然后再被廣播到其它遠(yuǎn)程站點(diǎn)。
3、處理遠(yuǎn)程Do/Undo操作
當(dāng)系統(tǒng)不在忙于處理本地操作時(shí),線程R將被觸發(fā)來處理因果就緒的遠(yuǎn)程操作 (Do或Undo操作)。線程R將首先檢查o. ov來判定o是否為Undo操作。根據(jù)ov的定義, 如果o. ov為空,則o是一個(gè)Undo操作;否則,o就是普通的Do操作。如果o是Do操作(第13至15行),它將被integrateR(0)處理,該過程有兩方 面的作用(1)轉(zhuǎn)換操作o使得o包含其所有并發(fā)操作的效果,得到一個(gè)可以在當(dāng)前文檔狀 態(tài)上正確執(zhí)行的操作0'。如果轉(zhuǎn)換后的操作不是空操作,則在當(dāng)前文檔狀態(tài)上執(zhí)行操作 o'。(2)將o'按照操作效果序添加到操作日志H中。如果0是此(10操作,線程R首先掃描H來找到它的原始操作H[i](根據(jù)條件H[i]. vn o.ov不為空)。然后,檢查H[i]是否已經(jīng)被o的并發(fā)操作撤銷。如果H[i]已經(jīng)被撤 銷,那么首先需要找到它的Undo操作H[j](根據(jù)條件H[j].v n H[i].uv不為空),并將o.v 合并到H[j]. v之中。因?yàn)橐粋€(gè)操作只能被撤銷一次,所以操作o不需要再次被執(zhí)行。然而, 本站點(diǎn)的狀態(tài)向量sv仍然需要被調(diào)整,以反映o的操作效果已經(jīng)被包含到本地?cái)?shù)據(jù)副本這 一事實(shí)。如果H[i]還沒有被撤銷,那么將H[i].uv置為o. v,并將H[i].v合并到o. ov中。 然后,類似于對Do操作的處理,操作o將被轉(zhuǎn)換并添加到H中。4、整合本地操作integrateL (o)(算法3)被線程L調(diào)用來將一個(gè)新產(chǎn)生的本地操作o按照操作效 果序添加到H中。有兩種情況需要考慮情況1 操作o是普通的Do操作,那么o. ov為空肯定滿足。我們將o自右向左地 與H中的操作進(jìn)行交換轉(zhuǎn)換,直到找到一個(gè)操作H[i]使得H[i] ^e o。在這一過程中,對 于每一個(gè)H[i],如果H[i] > e o,則需要將0的效果包含進(jìn)H[i]中(第5至7行)。如果 H[i] <e o或者H[i] =e o,則需要將o插入到H[i]之后,并將o在H中的插入位置保存 在k中。如果H[i] = e o,H[i]和o的效果字符沖突,這時(shí)候我們將o. tv置為H[i]. v來 標(biāo)記這種情況。此外,如果o. type = del,o必然是刪除了 H[i]之前插入的效果字符。也 就是說,操作o依賴于H[i]。所以,我們將H[i]. dv置為o. v來指示這種依賴關(guān)系,并使得 H[i]不會被撤銷。
情況2 操作o是Undo操作,這時(shí)需要在H中找到一個(gè)目標(biāo)操作使得H[i]. v n o. OV為空。然后,將0插在H[i]的后面,因?yàn)檫@兩個(gè)操作具有相同的效果字符,并將o.tv置 為H[i].v來表示這種關(guān)系。此外,為了反映操作o的操作效果,我們需要調(diào)整H在插入位 置之后的操作的操作位置(第19至22行)。
Algorithm 3 integrateL(o) integrateR(o) (4)被線程R調(diào)用,其具有兩重目標(biāo)(或作用)第一個(gè)目標(biāo)(作 用)是轉(zhuǎn)換操作o使得轉(zhuǎn)換后得到的0'可以正確地在當(dāng)前文檔狀態(tài)上執(zhí)行;第二個(gè)目標(biāo) (作用)是將O添加到H中的某個(gè)恰當(dāng)?shù)奈恢胟,以使得H在轉(zhuǎn)換后仍然保持操作效果序。 根據(jù)o. tv是否為空,我們將這個(gè)算法分為兩種情況來討論(I)o. tv為空這種情況下,不存在一個(gè)時(shí)序上先于o且其效果字符與o的效果字 符沖突的操作。根據(jù)遠(yuǎn)程操作的執(zhí)行條件,操作o在執(zhí)行前必然是因果就緒(causally-ready) 的,故所有時(shí)序上先于o的操作的效果肯定都已包含在操作日志H中。我們首先考慮并發(fā)操作的情況。對于每一個(gè)滿足H[i] | o的H[i],如果H[i] < e o,我們就將H[i]的操作效果包含進(jìn)o (第7行)。注意第6行的條件H[i]. tv不為空,這個(gè)條件意味著存在某個(gè)已經(jīng)檢查過的操作 H[j](即H[j] <e o' ),j<i,滿足H[j]的效果字符與H[i]的效果字符沖突。在這種
12情況下,H[j] <e 且H[j] = e H[i],因此H[i] <e of隱含地成立。
Algorithm 4 integrateR(o) : d 與此同時(shí),為了完成使H保持操作效果序的目標(biāo),我們一直掃描H直到找到某個(gè)滿
足 H[i] ≥ e o 的 H[i]
當(dāng)0' =e H[i]時(shí),0'和H[i]必然刪除了同一效果字符。這時(shí), 13我們將o轉(zhuǎn)換為一個(gè)空操作,并將o. v合并到H[i]. v中。現(xiàn)在我們考慮那些時(shí)序上先于0的前繼操作。這時(shí),掃描H直到遇到某個(gè)滿足H[i] >eo'條件的前繼操作(第15至18行)。然后,將0'添加到H中的位置i。因?yàn)槲覀儾?需要將o與它的前繼操作進(jìn)行包含轉(zhuǎn)換,那些按操作效果序排在o之前的前繼操作直接跳 過即可。(II)O' .tv不為空這種情況下,必然存在某個(gè)H[i],使得H[i] —o且H[i] = e o。這個(gè)條件覆蓋了 o是Undo操作的情況。為了使H保持操作效果序,o需要插入到H中緊跟H[i]的位置。如果不存在效果 字符與H[i]的效果字符沖突的o的并發(fā)操作的話,我們可以直接將o. pos置為H[i]. pos, 并將o插入到H中的位置(i+1)處(第22行)。否則,我們就需要將o與這些并發(fā)操作做包含轉(zhuǎn)換(第23至34行)。類似于第 3至19行的步驟,我們掃描H直到找到某個(gè)滿足H[k]彡e o'條件的H[k]。當(dāng)H[k] = e H[i]時(shí),如果.type = ins,則必定是和H[k]在H[i]刪除的位置并發(fā)地插入了新 的效果字符。這種情況下,我們將操作H[k]與0'按照它們的站點(diǎn)優(yōu)先級來排序(這里采 用站點(diǎn)id來比較優(yōu)先級)。如果0' 47 6 =如1,則必定是機(jī)《和0'并發(fā)地刪除了同 一效果字符。這種情況下,0' .v被合并進(jìn)H[k],并返回一個(gè)空操作。這個(gè)空操作既不需 要執(zhí)行也不需要添加到操作日志H中。
圖1為示例4中操作的產(chǎn)生和執(zhí)行順序及執(zhí)行結(jié)果。
具體實(shí)施例方式下面結(jié)合四個(gè)有代表性的Undo示例進(jìn)一步詳細(xì)介紹本發(fā)明方法。示例1 給定一個(gè)文檔狀態(tài)“a”,首先執(zhí)行操作ol = del(0,a)和o2 = ins(0,b), 其中ol — o2。然后,Undo操作ol。執(zhí)行操作ol 和 o2 之后,操作日志 H= [ol,o2] = [del (0,a),ins (0,b)],其中 ol =e o2。操作ol的逆操作ol = ins(0,a)。執(zhí)行ol后,文檔狀態(tài)被正確地更新為“ab”。 該例并不涉及遠(yuǎn)程操作,操作執(zhí)行完后,線程L將調(diào)用算法3(integrateL)將ol的逆操作 按照操作效果序添加到操作日志中,操作日志被更新為[del (0,a),ins(0, a),ins(l, b)]。示例2 給定一個(gè)文檔狀態(tài)“a”,首先有兩個(gè)并發(fā)的操作ol = del(0, a)和o2 = ins(0,b)被執(zhí)行。然后,Undo操作ol。因?yàn)闂l件ol| |o2和o2 < e ol滿足且ol和o2定義在相同的文檔狀態(tài)上,在最終 的結(jié)果狀態(tài)中操作o2的效果字符應(yīng)該先于ol的效果字符。在執(zhí)行完操作ol和o2后,根 據(jù)算法4,操作日志H= [o2,ol' ] = [ins(0,b),del(l,a)]。通過執(zhí)行ol'的逆操作 ins(l,a)得到正確的結(jié)果狀態(tài)“ba”。示例3 給定一個(gè)文檔狀態(tài)“ab”,首先執(zhí)行兩個(gè)滿足ol — o2條件的操作ol = del(0, a)和o2 = del(0, b)。然后,有兩個(gè)用戶同時(shí)并發(fā)地分別Undo操作ol和o2,即 undo (ol) | |undo(o2)。執(zhí)行操作ol和o2后,操作日志為[del (0,a),del (0,b)]。根據(jù)undo執(zhí)行的順序,有兩種情況需要考慮。(1) undo (ol)先于undo (o2)執(zhí)行執(zhí)行完ol的逆操作后文檔狀態(tài)和操作日志分 別為 “a” 和[del(0, a), ins(0, a), del(l, b)]。這時(shí),通過執(zhí)行 o2 的逆操作 ins(l, b)來 Undo操作o2。最后文檔狀態(tài)和操作日志分別為“ab”和[del (0,a),ins (0,a),del (1,b), ins(1, b)]。(2) undo (o2)先于undo (ol)執(zhí)行執(zhí)行o2的逆操作ins (0,b)后,文檔狀態(tài)和操 作日志分別為[del(0, a), del(0, b),ins(0, b)]。執(zhí)行完ol的逆操作ins(0, a)后,文檔 狀態(tài)和操作日志分別為“ab”和[del (0,a),ins (0,a),del (1,b),ins (1,b)]。在兩種情況 下,我們都可以得到正確的結(jié)果狀態(tài)“ab”。示例4 給定一個(gè)文檔狀態(tài)“a”,首先執(zhí)行兩個(gè)具有相同操作效果的操作ol = del (0,a)和 o2 = del (0,a)。然后 Undo 操作 ol 禾P (或)o2。該示例所描述的情形如圖1所示。以站點(diǎn)1為例執(zhí)行操作ol和03后,文檔狀態(tài) 為“a”而操作日志H= [ol :del(0, a), o3 :ins(0, a)]。當(dāng)站點(diǎn)1接收到操作o2后,該操 作會被轉(zhuǎn)換為空操作qp。根據(jù)算法4的處理過程,該操作在操作日志中會與操作ol進(jìn)行合 并。因此,這時(shí)文檔狀態(tài)仍然是“a”而H變?yōu)閇ol/o2 :del(0,a), o3 :ins(0, a)]。當(dāng)操作 o4到達(dá)時(shí),它的原始操作o2(已經(jīng)與ol合并為同一個(gè)操作)已經(jīng)被(操作o3)撤銷。這 時(shí),文檔狀態(tài)保持不變而H = [ol/o2 :del (0,a),o3/o4 :ins (0,a)]。站點(diǎn)2上的執(zhí)行過程 和站點(diǎn)1類似。所以,Undo操作ol和(或)o2會產(chǎn)生唯一的正確結(jié)果“a”。
權(quán)利要求
基于操作效果關(guān)系的選擇性撤銷方法,其特征在于利用操作效果序跟蹤操作之間的Do-Undo關(guān)系,并利用歷史操作之間的操作效果關(guān)系處理本地和遠(yuǎn)程的Do/Undo操作;其控制算法包含三個(gè)線程L、R和N線程N(yùn)用來接收遠(yuǎn)程操作,線程L和R分別用來處理本地和遠(yuǎn)程的Do/Undo操作;其中處理本地和遠(yuǎn)程的Do/Undo操作的算法分別包含兩個(gè)Do/Undo操作整合過程integrateL和integrateR;整個(gè)選擇性撤銷方法分為兩部分對本地Do/Undo操作的處理和對遠(yuǎn)程Do/Undo操作的處理;其中對本地Do/Undo操作的處理流程為1)若本地操作為Do操作,程序執(zhí)行本地操作,然后調(diào)用integrateL過程將本地Do操作按操作效果序添加到操作日志中;2)若本地操作為Undo操作,根據(jù)該操作與其原始操作之間的操作效果序產(chǎn)生該操作的逆操作,記錄該操作與其原始操作之間的Do-Undo關(guān)系后按照處理Do操作的方式進(jìn)行整合處理;對遠(yuǎn)程Do/Undo操作的處理流程為1)若遠(yuǎn)程操作為Do操作,調(diào)用integrateR過程產(chǎn)生一個(gè)可以在當(dāng)前文檔狀態(tài)正確執(zhí)行的操作形式,執(zhí)行該操作并將其添加到操作日志中;2)若遠(yuǎn)程操作為Undo操作,掃描操作日志來定位其原始操作,如果其原始操作已經(jīng)被該遠(yuǎn)程操作的并發(fā)操作所撤銷,則將該遠(yuǎn)程操作與其效果等價(jià)的并發(fā)操作進(jìn)行合并,否則記錄該遠(yuǎn)程操作與其原始操作之間的Do-Undo關(guān)系。然后,按照處理遠(yuǎn)程Do操作的方式處理該Undo操作。
2.根據(jù)權(quán)利要求1所述的選擇性撤銷方法,其特征在于假設(shè)當(dāng)前站點(diǎn)id為k,其狀態(tài) 向量為sv,當(dāng)前操作日志為H,則線程L的執(zhí)行流程如下Algorithm 1線程/:在站點(diǎn)fe上處理本地操作ο 1 if ο是一個(gè)Do操作then
3.根據(jù)權(quán)利要求1所述的選擇性撤銷方法,其特征在于假設(shè)當(dāng)前站點(diǎn)接收到來自其它站點(diǎn)r的遠(yuǎn)程操作0,當(dāng)前站點(diǎn)的接收隊(duì)列為RQ,則線程N(yùn)的執(zhí)行結(jié)果是將ο按照操作達(dá)到 順序添加到RQ中。
4.根據(jù)權(quán)利要求1所述的選擇性撤銷方法,其特征在于假設(shè)當(dāng)前站點(diǎn)RQ中的某個(gè)來自 站點(diǎn)r的遠(yuǎn)程操作ο已經(jīng)因果就緒,當(dāng)前站點(diǎn)的狀態(tài)向量為sv,當(dāng)前站點(diǎn)的操作日志為H, 則線程R的執(zhí)行流程如下
5.根據(jù)權(quán)利要求1所述的選擇性撤銷方法,其特征在于對于給定的一個(gè)新產(chǎn)生的本地 操作0,當(dāng)前站點(diǎn)的操作日志為H,則過程integrateUo)的執(zhí)行流程如下
6.根據(jù)權(quán)利要求1所述的選擇性撤銷方法,其特征在于對于給定的一個(gè)因果就緒的遠(yuǎn) 程操作O,當(dāng)前站點(diǎn)的操作日志為H,則過程IntegrateR(O)的執(zhí)行流程如下
全文摘要
本發(fā)明屬于計(jì)算機(jī)支持的協(xié)同工作技術(shù)領(lǐng)域,具體是一種基于操作效果關(guān)系的選擇性撤銷方法。包括操作之間Do-Undo關(guān)系的跟蹤、程序的控制算法、處理本地Do/Undo操作、處理遠(yuǎn)程Do/Undo操作、整合本地操作及整合遠(yuǎn)程操作。Undo是分布式交互協(xié)同應(yīng)用程序不可或缺的重要功能之一。本發(fā)明可以支持用戶撤消操作日志中的任何操作,在各個(gè)用戶間實(shí)現(xiàn)數(shù)據(jù)的一致性維護(hù)。
文檔編號G06F11/34GK101853199SQ20101017617
公開日2010年10月6日 申請日期2010年5月13日 優(yōu)先權(quán)日2010年5月13日
發(fā)明者李杜, 邵斌, 顧寧 申請人:復(fù)旦大學(xué)