專利名稱:網(wǎng)站開(kāi)發(fā)的系統(tǒng)和方法
本專利申請(qǐng)請(qǐng)求在1998年2月4日登記題為“網(wǎng)站開(kāi)發(fā)的系統(tǒng)和方法”美國(guó)NO60/073,766的臨時(shí)申請(qǐng)的利益,其內(nèi)容作為參照加入本專利。在此被充分揭示。
1.發(fā)明的背景本發(fā)明通常涉及層次結(jié)構(gòu)的文件系統(tǒng),尤其是涉及能用作網(wǎng)站開(kāi)發(fā)工具的文件管理的系統(tǒng)和方法。
背景技術(shù):
的描述因特網(wǎng)在商務(wù)上起著很大的作用,大多數(shù)公司傾向于擁有網(wǎng)站。許多網(wǎng)站需要經(jīng)常修改,通常由數(shù)十位研究者以特定的過(guò)程進(jìn)行。因此,經(jīng)常不間斷地保持網(wǎng)站內(nèi)容不斷更新、精確而且良好集成是比原始設(shè)計(jì)和開(kāi)發(fā)網(wǎng)站更大的挑戰(zhàn)。因物網(wǎng)站可以逐日、逐時(shí)、逐分地由數(shù)以百計(jì)的人進(jìn)行更新。類似地,因特網(wǎng)的內(nèi)容的研究者常常提出新的內(nèi)容,或者對(duì)現(xiàn)有的內(nèi)容作出改變,而且除非新的內(nèi)容迅速地集成進(jìn)去,作為基本通訊資源的因特網(wǎng)的效用是有限的。
當(dāng)網(wǎng)的研究者的數(shù)量以指數(shù)方式增加時(shí),大的網(wǎng)站面臨許多問(wèn)題。這些網(wǎng)站的大小與內(nèi)容迅速地增加,當(dāng)網(wǎng)站交通和因特網(wǎng)增長(zhǎng)時(shí),網(wǎng)站必須更頻繁地更新。隨著研究者數(shù)量的增加,隨著網(wǎng)站內(nèi)容的大小與復(fù)雜度的增加,對(duì)網(wǎng)站的經(jīng)理(“網(wǎng)站主管”-“webmaster”)要監(jiān)視每個(gè)變化和完成質(zhì)量控制變得越來(lái)越困難。
由于網(wǎng)站開(kāi)發(fā)的復(fù)雜性,對(duì)一個(gè)中央系統(tǒng)有必要管理和控制網(wǎng)站的開(kāi)發(fā)。已知的管理和控制網(wǎng)站開(kāi)發(fā)的系統(tǒng)包括軟件配置管理系統(tǒng),文件管理系統(tǒng)和數(shù)據(jù)庫(kù)發(fā)布(publishing)系統(tǒng)。
關(guān)于那樣的已知網(wǎng)站開(kāi)發(fā)系統(tǒng)具有若干不足之處。例如,由于維護(hù)一個(gè)網(wǎng)站常常需要數(shù)十甚至數(shù)百個(gè)人的努力。希望有網(wǎng)站研究者并行地進(jìn)行工作。軟件配置的管理系統(tǒng)不允許研究者同時(shí)對(duì)網(wǎng)站的同一區(qū)域進(jìn)行改變。此外,沒(méi)有一個(gè)已知的系統(tǒng)允許并行工作的研究者分別測(cè)試他們自己的工作而不實(shí)際作出對(duì)網(wǎng)站的改變。因此,沖突的改變可能適到網(wǎng)站,引起該網(wǎng)站崩潰。
因?yàn)檠芯空咴趥€(gè)人的角度無(wú)法預(yù)見(jiàn)他們的工作在與其他研究工作結(jié)合起來(lái)時(shí)的效果,已知的系統(tǒng)依靠網(wǎng)站主管集成送到網(wǎng)站的所有改變,并檢查改變的錯(cuò)誤。網(wǎng)站主管也要保證研究者只改變他們授權(quán)改變的內(nèi)容一但是,該網(wǎng)站主管經(jīng)常成為網(wǎng)站開(kāi)發(fā)過(guò)程的瓶頸,因?yàn)樵摼W(wǎng)站主管必須對(duì)網(wǎng)站的改變的工作做所有集成和測(cè)試。集成多個(gè)用戶的工作是手工工作而且是耗時(shí)的,大量時(shí)間耗費(fèi)在錯(cuò)誤排除與解決沖突方面,而極少時(shí)間放在設(shè)計(jì)、革新和策略研究上。此外,在研究者準(zhǔn)備好將改變送給網(wǎng)站主管以前,網(wǎng)站主管不能容易地監(jiān)視在此改變上研究者的進(jìn)展。因此,此網(wǎng)站主管不能及早校正錯(cuò)誤,也不能確定研究者在如何進(jìn)展。
已知網(wǎng)站開(kāi)發(fā)系統(tǒng)的另一個(gè)缺點(diǎn)是它們不跟蹤文件版本的歷史。因?yàn)榫W(wǎng)站文件不斷地增加、刪除、改變、移動(dòng)和更名,知道誰(shuí)在何時(shí)做出文件的版本是有用的。借助訪問(wèn)以前的版本用戶能很容易地找出引起錯(cuò)誤的改變,回到以前的版本并識(shí)別新的錯(cuò)誤。此外,已知的網(wǎng)站開(kāi)發(fā)系統(tǒng)不允許即時(shí)訪問(wèn)網(wǎng)站分部或整個(gè)網(wǎng)站的任何以前版本。在網(wǎng)站崩潰或分派不合適或不精確信息的情況,立即轉(zhuǎn)回到網(wǎng)站的任何以前的版本的能力是致命性故障的恢復(fù)工具。
因此希望有一個(gè)網(wǎng)站開(kāi)發(fā)系統(tǒng),它允許研究者不必把改變送到網(wǎng)站上就能判斷他們的那些改變是否適合整個(gè)網(wǎng)站。此外,希望有一個(gè)網(wǎng)站開(kāi)發(fā)系統(tǒng),它允許研究者訪問(wèn)一個(gè)文件、網(wǎng)站分部或整個(gè)網(wǎng)站的以前版本,并且允許網(wǎng)站主管檢驗(yàn)研究者的進(jìn)展,更容易地將改變送到網(wǎng)站中。
發(fā)明的概述本發(fā)明提供文件管理的一個(gè)系統(tǒng)和方法。那樣系統(tǒng)的一種使用是可作為網(wǎng)站開(kāi)發(fā)工具。
本發(fā)明的系統(tǒng)由層次結(jié)構(gòu)的文件系統(tǒng)組成,它被稱為區(qū)域(“area”),有三類區(qū)域工作區(qū)域、構(gòu)架(staging)區(qū)域和編輯區(qū)域。工作區(qū)域是可修改文件系統(tǒng),在工作區(qū)域中用戶可以建立、刪除、增加和修改文件及目錄。在一個(gè)實(shí)施例中,一個(gè)工作區(qū)域是現(xiàn)有網(wǎng)站的一個(gè)虛擬拷貝和用戶對(duì)該網(wǎng)站的個(gè)人視界。
架構(gòu)區(qū)域是一個(gè)只讀文件系統(tǒng),它支持選擇版本的操作。各工作區(qū)域的各個(gè)用戶借助于將他們的工作區(qū)的內(nèi)容提交到架構(gòu)區(qū)域能集成他們的工作。架構(gòu)區(qū)域中,開(kāi)發(fā)者能比較他們的工作,觀察他們作的變化如何互相配合。
編輯區(qū)域是一個(gè)只讀文件系統(tǒng)。架構(gòu)區(qū)域的內(nèi)容被虛擬地拷貝到編輯區(qū)域,以建立該架構(gòu)區(qū)域的內(nèi)容的凍結(jié)的只讀的映象。在一個(gè)實(shí)施例中,一個(gè)編輯區(qū)域的內(nèi)容表示一個(gè)網(wǎng)站的編輯的內(nèi)容。
在一個(gè)實(shí)施例中,各區(qū)域共享目錄樹(shù),以致每當(dāng)建立一個(gè)區(qū)域時(shí),那個(gè)目錄和文件不必有物理上的拷貝。這就允許很快地建立區(qū)域并且提供系統(tǒng)資源的有效使用。與每個(gè)文件和目錄相聯(lián)系的是歷史對(duì)象,它儲(chǔ)存有關(guān)在每個(gè)區(qū)域中存在的文件或目錄的內(nèi)容的信息。
在另一個(gè)實(shí)施例中,本發(fā)明跟蹤每個(gè)文件和目錄的內(nèi)容的歷史。這就允許該系統(tǒng)很容易地比較一個(gè)文件與另一個(gè)文件,比較一個(gè)目錄與另一個(gè)目錄,以識(shí)別它們是否相同或相關(guān)。
在又一個(gè)實(shí)施例中,本發(fā)明的系統(tǒng)包括一個(gè)HTTP協(xié)議虛擬化模塊,它使一個(gè)網(wǎng)站服務(wù)器好象多個(gè)網(wǎng)站服務(wù)器那樣運(yùn)行。這使每個(gè)區(qū)域在HTTP協(xié)議層上是一個(gè)完全的網(wǎng)站而不必對(duì)每個(gè)區(qū)域具有分別的網(wǎng)站服務(wù)器。
附圖的簡(jiǎn)介
圖1示出了按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)用于網(wǎng)站開(kāi)發(fā)的計(jì)算機(jī)網(wǎng)絡(luò)。
圖2示出了按照本發(fā)明的一個(gè)實(shí)施例開(kāi)發(fā)網(wǎng)站內(nèi)容的開(kāi)發(fā)流程(從一個(gè)開(kāi)發(fā)者的視角看)。
圖3示出按照本發(fā)明的一個(gè)實(shí)施例的分支的例子。
圖4示出了按照本發(fā)明的一個(gè)實(shí)施例一個(gè)主分支的初始內(nèi)容的例子。
圖5示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)主分支的例子。
圖6示出按照本發(fā)明的主分支的另一個(gè)例子。
圖7示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)主分支和一個(gè)子分支的例子。
圖8示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)區(qū)域的目錄樹(shù)的例子。
圖9是按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)工作區(qū)域?qū)ο蟮膱D示。
圖10示出按照本發(fā)明的一個(gè)實(shí)施例導(dǎo)出一個(gè)代(generation)ID的方法。
圖11示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)族系樹(shù)的例子。
圖12是按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)目錄的圖示。
圖13示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)網(wǎng)站開(kāi)發(fā)模塊。
圖14示出按照本發(fā)明的一個(gè)實(shí)施例工作區(qū)域創(chuàng)建模塊的操作。
圖15示出按照本發(fā)明的一個(gè)實(shí)施例架構(gòu)區(qū)域創(chuàng)建模塊的操作。
圖16a-b示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)編輯區(qū)域創(chuàng)建模塊的操作。
圖17a-c示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)分支創(chuàng)建模塊的操作。
圖18a-d示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)增加條目模塊的操作。
圖19示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)增加直接模塊的操作。
圖20示出按照本發(fā)明的一個(gè)實(shí)施例刪除直接參照模塊的操作。
圖21a-b示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)參照計(jì)數(shù)模塊的操作。
圖22示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)讀目錄模塊的操作。
圖23a-b示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)刪除條目模塊的操作。
圖24a-b示出按照本發(fā)明的一個(gè)實(shí)施例一個(gè)編輯文件模塊的操作。
圖25示出按照本發(fā)明的一個(gè)實(shí)施例改名模塊的操作。
圖26a-b示出按照本發(fā)明的一個(gè)實(shí)施例產(chǎn)生目錄路徑的操作。
圖27示出按照本發(fā)明的一個(gè)實(shí)施例產(chǎn)生基名字模塊的操作。
圖28a-c示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)提交模塊的操作。
圖29示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)沖突檢查模塊的操作。
圖30a-b示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)比較目錄模塊的操作。
圖31a-b示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)比較文件模塊的操作。
圖32示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)區(qū)域刪除模塊的操作。
圖33a-b示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)鎖定模塊的一個(gè)操作。
圖34示出按照本發(fā)明的一個(gè)實(shí)施例的一個(gè)鎖定模塊的另一個(gè)操作。
圖35示出按照本發(fā)明的一個(gè)實(shí)施例在網(wǎng)絡(luò)(Web)瀏覽器、HTTP協(xié)議虛擬化模塊和網(wǎng)站服務(wù)器之間的通信路徑。
圖36a-b示出按照本發(fā)明的一個(gè)實(shí)施例的HTTP協(xié)議虛擬化模塊的一個(gè)操作。
圖37示出按照本發(fā)明的一個(gè)實(shí)施例的HTTP協(xié)議虛擬化模塊的另一個(gè)操作。
圖38示出按照本發(fā)明的一個(gè)實(shí)施例的HTTP協(xié)議虛擬化模塊的又一個(gè)操作。
最佳實(shí)施例的詳細(xì)描述本發(fā)明將針對(duì)網(wǎng)站開(kāi)發(fā)描述,但熟悉專業(yè)領(lǐng)域的人認(rèn)識(shí)到,此發(fā)明能以另外的形式實(shí)施。
圖1示出一個(gè)用于網(wǎng)站開(kāi)發(fā)的計(jì)算機(jī)網(wǎng)絡(luò)。在一個(gè)可以是傳統(tǒng)的個(gè)人計(jì)算機(jī)的開(kāi)發(fā)工作站110上,網(wǎng)站開(kāi)發(fā)者增加、刪除、編輯和檢查用于網(wǎng)站的文件。開(kāi)發(fā)工作站110經(jīng)由如因特網(wǎng)那樣的計(jì)算機(jī)網(wǎng)絡(luò)120連結(jié)到開(kāi)發(fā)服務(wù)器130。
開(kāi)發(fā)服務(wù)器包括一個(gè)網(wǎng)站服務(wù)器145,處理從開(kāi)發(fā)工作站110來(lái)的對(duì)網(wǎng)站內(nèi)容的請(qǐng)求。開(kāi)發(fā)服務(wù)器還包括傳統(tǒng)的后備存儲(chǔ)器160,如WINDOWS NT文件系統(tǒng)(可從微軟公司購(gòu)得),其中物理上存儲(chǔ)網(wǎng)站文件。
開(kāi)發(fā)服務(wù)器130還包括一個(gè)傳統(tǒng)的存儲(chǔ)器150(例如RAM)和一個(gè)傳統(tǒng)的處理器140,它借助于執(zhí)行網(wǎng)站開(kāi)發(fā)軟件模塊135實(shí)現(xiàn)本發(fā)明的網(wǎng)站開(kāi)發(fā)方法。如下所述,該網(wǎng)站開(kāi)發(fā)模塊儲(chǔ)存在存儲(chǔ)器150中。如下所述,儲(chǔ)存在存儲(chǔ)器150的還有一個(gè)HTTP協(xié)議虛擬化模塊137,處理器140執(zhí)行此模塊使網(wǎng)站服務(wù)器145好象有多個(gè)網(wǎng)站服務(wù)器那樣運(yùn)行。
開(kāi)發(fā)服務(wù)器130通過(guò)網(wǎng)絡(luò)165連接到一個(gè)網(wǎng)站制作服務(wù)器170。網(wǎng)絡(luò)165可以是與網(wǎng)絡(luò)120同一個(gè)網(wǎng)絡(luò),或者也可以是不同的網(wǎng)絡(luò)。該網(wǎng)站制作服務(wù)器170連到因特網(wǎng)或企業(yè)內(nèi)部網(wǎng)175,當(dāng)一個(gè)網(wǎng)站準(zhǔn)備在萬(wàn)維網(wǎng)(World WideWed)或企業(yè)內(nèi)部網(wǎng)上發(fā)布時(shí),該開(kāi)發(fā)服務(wù)器130將該網(wǎng)站發(fā)送到網(wǎng)站制作服務(wù)器170,它提供到網(wǎng)站的因特網(wǎng)或企業(yè)內(nèi)部網(wǎng)的訪問(wèn)。
一個(gè)網(wǎng)站由文件系統(tǒng)的內(nèi)容組成。本發(fā)明的網(wǎng)站開(kāi)發(fā)系統(tǒng)由一個(gè)層次結(jié)構(gòu)文件系統(tǒng)的集合組成。這些文件系統(tǒng)的每一個(gè)是一個(gè)環(huán)境,它管理各個(gè)文件并提供處理它們的手段。在執(zhí)行時(shí),該網(wǎng)站開(kāi)發(fā)軟件模塊135是該文件系統(tǒng)的一個(gè)部分,它使文件的大多數(shù)管理與處理能實(shí)現(xiàn)。后備存儲(chǔ)器160是物理上儲(chǔ)存文件和對(duì)應(yīng)的無(wú)數(shù)據(jù)(如所有者的識(shí)別、組的識(shí)別、訪問(wèn)控制文件名、修改時(shí)間、創(chuàng)建時(shí)間等)的地方。在一個(gè)實(shí)施例中,該文件看起來(lái)能存在各備存儲(chǔ)器的160以外的驅(qū)動(dòng)器中(即使它們物理上儲(chǔ)存在后備存儲(chǔ)器160中)。
一個(gè)層次結(jié)構(gòu)的文件系統(tǒng)包括一個(gè)長(zhǎng)著文件和符號(hào)連結(jié)的目錄樹(shù)。在該目錄樹(shù)的頂部是根目錄,所有其他目錄直接或間接地起源于此。
一個(gè)文件系統(tǒng)可以是能修改的或只讀的。一個(gè)能修改的文件系統(tǒng)支持在文件上的讀操作(如得到根目錄、讀目錄、查閱目錄、讀文件、得到屬性、讀符號(hào)連結(jié)等)和修改操作(如創(chuàng)建目錄、創(chuàng)建文件、創(chuàng)建符號(hào)連結(jié)、設(shè)置屬性、刪除文件、刪除目錄、文件改名、目錄改名、寫文件等)、一個(gè)典型的硬盤驅(qū)動(dòng)卷是能修改文件系統(tǒng)的例子。
一個(gè)只讀文件系統(tǒng)只支持讀操作。只讀文件系統(tǒng)的兩個(gè)例子是CD ROM卷和將寫保持片撥到寫保護(hù)位置的軟盤。
如上所述,本發(fā)明的網(wǎng)站開(kāi)發(fā)系統(tǒng)由層次結(jié)構(gòu)的文件系統(tǒng)組成。某些層次結(jié)構(gòu)文件系統(tǒng)是能修改的,能建立構(gòu)成網(wǎng)站內(nèi)容的文件。其他一些文件使從另外文件系統(tǒng)來(lái)的文件能被比較以協(xié)調(diào)網(wǎng)站的開(kāi)發(fā),又另外的文件包括組成網(wǎng)站內(nèi)容的完工文件。
本發(fā)明的層次結(jié)構(gòu)文件系統(tǒng)有別于傳統(tǒng)的文件系統(tǒng)的一個(gè)方面是,除了讀和/或修改操作以外,本發(fā)明的某些文件系統(tǒng)支持選擇版本操作,如下面所討論,此操作使能處理二個(gè)或更多的相關(guān)文件系統(tǒng)。借助于在按本發(fā)明的相關(guān)文件集合上完成讀、修改和版本操作來(lái)建立一個(gè)網(wǎng)站的內(nèi)容。
本發(fā)明的一個(gè)層次結(jié)構(gòu)文件系統(tǒng)稱作為“區(qū)域”,有三種類型的區(qū)域工作區(qū)域、架構(gòu)區(qū)域和編輯區(qū)域。一個(gè)工作區(qū)域是可修改的文件系統(tǒng),而架構(gòu)區(qū)域和編輯區(qū)域是只讀的文件系統(tǒng)。
一個(gè)工作區(qū)域從現(xiàn)有文件的虛擬拷貝開(kāi)始(除非沒(méi)有現(xiàn)有文件,此時(shí)工作區(qū)域從空開(kāi)始)。換言之,一個(gè)工作區(qū)域開(kāi)始就具有與作為網(wǎng)站指定的文件系統(tǒng)相同的內(nèi)容。一個(gè)工作區(qū)域是開(kāi)發(fā)者對(duì)一個(gè)網(wǎng)站的視界,每一個(gè)從事網(wǎng)站研究的人是在工作區(qū)域中工作的。在工作區(qū),開(kāi)發(fā)者自由地增加、刪除或修改網(wǎng)站內(nèi)容,并觀察他們的改變?nèi)绾闻浜系秸麄€(gè)網(wǎng)站的內(nèi)容。增加、刪除和修改操作的細(xì)節(jié)在下面討論。一個(gè)研究者在一個(gè)工作區(qū)域所作的改變不影響網(wǎng)站或其他研究者在另外的工作區(qū)域的工作。如下所述,這是因?yàn)槊恳粋€(gè)區(qū)域是分別的文件系統(tǒng)。
開(kāi)發(fā)者借助于將他們的工作區(qū)域的內(nèi)容提交到架構(gòu)區(qū)域在架構(gòu)區(qū)域集成他們的工作。此提交操作是上面提到的選擇版本操作之一,將在下面詳細(xì)討論。架構(gòu)區(qū)域是網(wǎng)站對(duì)分支上所有用戶可用的共享視界(分支將在下面討論)。換言之,一個(gè)架構(gòu)區(qū)域是沿著一條分支對(duì)所有用戶可以訪問(wèn)的文件系統(tǒng)。一個(gè)架構(gòu)區(qū)域持有若干開(kāi)發(fā)者的工作區(qū)域的工作并允許開(kāi)發(fā)者共享和集成他們的改變。在架構(gòu)區(qū)域,開(kāi)發(fā)者能比較他們的工作并觀察他們的改變?nèi)绾位ハ嗯浜?。此比較操作是選擇版本操作的另一個(gè)操作。將在下面討論。
在架構(gòu)區(qū)域收集的工作能虛擬地拷貝回到各自工作區(qū)域,使這些工作區(qū)隨著該架構(gòu)區(qū)域當(dāng)前狀態(tài)而更新,此當(dāng)前狀態(tài)隨著不同的研究者從工作區(qū)域提交新的內(nèi)容而改變。此拷貝是“虛擬”的,因?yàn)閰^(qū)域共享目錄樹(shù),所以此目錄樹(shù)沒(méi)有必要在物理上拷貝。當(dāng)在架構(gòu)區(qū)域中收集的工作被認(rèn)為是最終的,它們內(nèi)容能被發(fā)布以建立網(wǎng)站的一個(gè)編輯。從一個(gè)編輯建立一個(gè)工作區(qū)域并發(fā)布一個(gè)架構(gòu)區(qū)域是下面討論的另一個(gè)選擇版本操作。
一個(gè)架構(gòu)區(qū)域的內(nèi)容被虛擬地拷貝到一個(gè)編輯區(qū)域以建立網(wǎng)站的一個(gè)編輯。而且,虛擬拷貝意味著此編輯參照與架構(gòu)區(qū)域相同的目錄樹(shù)。因?yàn)橐粋€(gè)編輯是一個(gè)只讀文件系統(tǒng),它是沿著單個(gè)分支整個(gè)網(wǎng)站在一個(gè)特殊點(diǎn)的凍結(jié)的映象。
編輯的內(nèi)容能被虛擬地拷貝回到工作區(qū)域,并用作為網(wǎng)站進(jìn)一步開(kāi)發(fā)的基礎(chǔ)。編輯也可以作為案卷,允許用戶即時(shí)調(diào)用文件及整個(gè)目錄,或重構(gòu)該網(wǎng)站的整個(gè)過(guò)去版本。
圖2是從開(kāi)發(fā)者的角度看概括了從工作區(qū)域編輯的開(kāi)發(fā)流程。一個(gè)開(kāi)發(fā)者在工作區(qū)域編輯、增加或刪除文件(步驟210)。開(kāi)發(fā)者然后將他的工作區(qū)域的內(nèi)容提交到架構(gòu)區(qū)域(步驟220)。在架構(gòu)區(qū)域,該研究者的工作區(qū)域的內(nèi)容與其他研究者的工作區(qū)域的內(nèi)容相集成(步驟230)。如果提交到架構(gòu)區(qū)域集成得很好,得到了認(rèn)可,則架構(gòu)區(qū)域中的內(nèi)容被發(fā)布到一個(gè)編輯(步驟240),否則,那些研究者繼續(xù)編輯他們的文件,直到被認(rèn)可(步驟210)。
按照一個(gè)實(shí)施例,網(wǎng)站的開(kāi)發(fā)可以沿著開(kāi)發(fā)的若干分支劃分。從一個(gè)開(kāi)發(fā)者的角度來(lái)看,一個(gè)分支是對(duì)單個(gè)網(wǎng)站的一條開(kāi)發(fā)路徑。如圖3所示,單個(gè)分支300包括工作區(qū)域310、架構(gòu)區(qū)域320和一個(gè)或多個(gè)做成案卷的網(wǎng)站編輯330。分支可以包括子分支,所以開(kāi)發(fā)小組可以保持各分支互相分離。內(nèi)容可以被各分支和子分支共享。
沿著各分支劃分網(wǎng)站開(kāi)發(fā)的例子是對(duì)當(dāng)前的網(wǎng)站具有一個(gè)分支,對(duì)該網(wǎng)站的新版本具有另外的分支。另外的例子是對(duì)不同的區(qū)域或?qū)Σ煌目蛻艟哂胁煌拈_(kāi)發(fā)分支,使網(wǎng)站適合特定的區(qū)域或客戶。
當(dāng)網(wǎng)站開(kāi)發(fā)軟件模塊裝入開(kāi)發(fā)服務(wù)器時(shí),建立了一個(gè)主分支。如圖4所示,主分支400原先包括一個(gè)空架構(gòu)區(qū)域420和空編輯430。主分支原先還包括一個(gè)空工作區(qū)域410。工作區(qū)域可以在主分支建立時(shí)或晚些時(shí)后建立,用戶可以推遲建立工作區(qū)域,直到用戶準(zhǔn)備好定義該工作區(qū)域的屬性(例如,能訪問(wèn)該工作區(qū)域的人)。
如果在網(wǎng)站開(kāi)發(fā)軟件模塊安裝以前已存在一個(gè)網(wǎng)站,則若尚不存在工作區(qū)域,就建立一個(gè)空的工作區(qū)域410。如圖5所示,原先網(wǎng)站的內(nèi)容510被拷貝到空的工作區(qū)域410、再拷貝到空的架構(gòu)區(qū)域420,再發(fā)布到一個(gè)初始編輯440。
借助于將最新的編輯的內(nèi)容虛擬地拷貝到新的工作區(qū)域而建立主分支以外的另外的工作區(qū)域。圖6說(shuō)明了在主分支上從編輯440建立了三個(gè)工作區(qū)域600。工作區(qū)域600的內(nèi)容提交到架構(gòu)區(qū)域610,而架構(gòu)區(qū)域610的內(nèi)容發(fā)布成新的編輯620。
在主分支外還能建立子分支。圖7示出了在主分支外建立子分支。一個(gè)編輯710從父分支720被用作為該子分支730的初始編輯725。然后,初始編輯725的內(nèi)容被虛擬地拷貝到在子分支730中的工作區(qū)域740、架構(gòu)區(qū)域750和新的編輯、注意能以同樣的方式獨(dú)立于其他子分支建立子分支。在子分支做的工作獨(dú)立于且平行于較高分支所做的工作。
借助于虛擬地將該子分支上編輯的內(nèi)容拷貝到較高分支的工作區(qū)域,將在子分支上建立的工作被加入到較高分支中。從子分支的內(nèi)容與從其他工作區(qū)域來(lái)的內(nèi)容互相集成,且作為在較高分支上的新的編輯發(fā)布。
現(xiàn)在已經(jīng)敘述了該網(wǎng)站開(kāi)發(fā)系統(tǒng)的總體概念和典型的用途,將描述按照本發(fā)明的系統(tǒng)的特定實(shí)現(xiàn)。
每個(gè)分別的工作區(qū)域、架構(gòu)區(qū)域和編輯由一個(gè)或多個(gè)樹(shù)形結(jié)構(gòu)的文件或目錄組成。圖8示出對(duì)于一個(gè)區(qū)域的目錄樹(shù),其中目錄1是根目錄。各區(qū)域能共享同一目錄樹(shù)。事實(shí)上,當(dāng)現(xiàn)有的區(qū)域被拷貝做成新的區(qū)域時(shí),新區(qū)域僅僅是參照與現(xiàn)有區(qū)域同一根目錄。借助于建立一個(gè)代表該區(qū)域的對(duì)象,建立了每個(gè)分別的工作區(qū)域、架構(gòu)區(qū)域和編輯區(qū)域,對(duì)象具有名字段、對(duì)象ID字段、代(generation)ID字段、目錄字段和分支字段。名字段包括該工作區(qū)域的名。目錄字段識(shí)別指定工作區(qū)域、架構(gòu)區(qū)域或編輯區(qū)域的目錄樹(shù)的根目錄。分支字段指出該工作區(qū)域所在的分支。圖9示出一個(gè)工作區(qū)域?qū)ο蟮膱D形表示。注意,在建立一個(gè)工作區(qū)域時(shí)作出目錄樹(shù)的虛擬拷貝而非真實(shí)拷貝,因?yàn)楣ぷ鲄^(qū)域?qū)ο笾赶蛄爽F(xiàn)有的目錄樹(shù)。
每個(gè)工作區(qū)域、架構(gòu)區(qū)域和編輯區(qū)域具有二個(gè)與其他不同的識(shí)別符,在本專利中一個(gè)稱為“ID”,另一個(gè)稱為“對(duì)象ID”。對(duì)象ID識(shí)別表示該區(qū)域的對(duì)象,一旦對(duì)象ID分配給一個(gè)對(duì)象,此對(duì)象ID不能改變。每個(gè)區(qū)域也用與其他不同的代ID識(shí)別。它指出一個(gè)區(qū)域與其他區(qū)域如何相關(guān)。對(duì)指定區(qū)域的代ID能改變,也將在下面討論(例如,當(dāng)一個(gè)架構(gòu)區(qū)域被發(fā)布到一個(gè)編輯)。代ID放在代ID字段,對(duì)象ID放在對(duì)象ID字段。
注意,目錄、文件、歷史對(duì)象(下面討論)和其他對(duì)象也指定對(duì)象ID,它們一旦設(shè)定后保持不變。
一個(gè)代ID包括一個(gè)與其他不同的序列或數(shù)組。一個(gè)代ID不僅唯一地識(shí)別一個(gè)區(qū)域,如上所述還指出一個(gè)區(qū)域與其他區(qū)域如何相關(guān)。例如,在圖7中子分支中的初始編輯是直接從父分支中的編輯2導(dǎo)出。子分支中的工作區(qū)域直接從子分支的初始編輯導(dǎo)出,間接地從父分支中的編輯2導(dǎo)出。
一個(gè)代ID包括一個(gè)唯一識(shí)別它的數(shù)和導(dǎo)出該代ID的代ID的數(shù)。例如,如果1是指定給一個(gè)區(qū)域的唯一的數(shù),而0是指定給另一個(gè)區(qū)域的唯一的數(shù),則從這些區(qū)域?qū)С龅膮^(qū)域的代ID是它自己唯一的數(shù)(例如4)和數(shù)0或1。
圖10說(shuō)明了從父代ID導(dǎo)出指定給新區(qū)域的代ID的方法,其中父代ID是指定給新區(qū)域的直接父親的。使用傳統(tǒng)的順序算法(如1,2,3,4)或隨機(jī)地產(chǎn)生與其他不同的辦法得到與其他不同的數(shù)(1000)。然后取出與父代ID相關(guān)的唯一的數(shù)組成名數(shù)序列(1010)。隨后,父代ID串聯(lián)剛生成的唯一的數(shù)產(chǎn)生一數(shù)組或數(shù)序列。
區(qū)域之間的關(guān)系也用一族系樹(shù)表示。族系樹(shù)是一個(gè)數(shù)據(jù)結(jié)構(gòu),該樹(shù)的每個(gè)節(jié)點(diǎn)代表不同的代(即區(qū)域,注意在本專利申請(qǐng)中,區(qū)域常稱作代)。
圖11示出一個(gè)族系樹(shù)的例子。代G0代表初始編輯。代G2代表一個(gè)工作區(qū)域(“工作區(qū)域1”),代G3代表另一個(gè)工作區(qū)域(“工作區(qū)域2”),代G1代表一個(gè)編輯(“編輯1”),代G4代表一個(gè)架構(gòu)區(qū)域。族系樹(shù)示出,G1,G2,G3直接從G0導(dǎo)出,即G1,G2和G3具有與G0相同的根目錄。G4間接從G0導(dǎo)出,直接從G1導(dǎo)出,因此也具有與G0相同的根目錄。
圖12示出了一個(gè)目錄1200的圖示。對(duì)每個(gè)其目錄改變的代,該目錄包括一個(gè)代頁(yè)1280,它是列出對(duì)應(yīng)于該代頁(yè)1280的代的目錄的內(nèi)容的對(duì)象。于是,一個(gè)目錄有效地包括在每一代的目錄的內(nèi)容的映象,在上述代目錄已經(jīng)改變。即使目錄在不同區(qū)域具有不同的內(nèi)容,代頁(yè)1280允許不同的區(qū)域參照相同的目錄。
在圖12中示出的目錄1200中,目錄頁(yè)1280指出條目“m”被加到代G0中的目錄1200中,條目“n”被加到代G2中的目錄1200中;“p”被加到代G3的目錄1200中。注意,假設(shè)沒(méi)有內(nèi)容從目錄1200中刪除,目錄頁(yè)1280不僅包括加到一特定代的內(nèi)容,而且包括加到導(dǎo)出該特定代的代的內(nèi)容。例如,在圖10中示出的族系樹(shù)應(yīng)用于此例。在代G0中目錄d1包含條目“m”。在代G2中條目“n”加到目錄1200,因此,由于G2由G0導(dǎo)出,目錄1200將條目“m”和“n”包含在代G2中(假設(shè)“m”不被刪除)。在代G3中,條目“p”加到目錄d1中,因此,目錄1200包括條目“p”和“m”。注意,G3不從G2導(dǎo)出,因而目錄1200不將條目“n”包括在代G3中。
在一個(gè)實(shí)施例中,如果一個(gè)目錄在一個(gè)特定代中沒(méi)有改變,該目錄將不包括該代的代頁(yè)。一旦一個(gè)目錄在一個(gè)代中改變,對(duì)于該代的代頁(yè)被加到該目錄中。
在目錄中每個(gè)條目與一個(gè)歷史對(duì)象相關(guān)。歷史對(duì)象指出文件或目錄的內(nèi)容被編輯或修改的代。換言之,一個(gè)歷史對(duì)象指出在目錄中一個(gè)條目的歷史。一個(gè)歷史對(duì)象包括對(duì)一個(gè)代ID的字段1225,和指向一個(gè)文件或目錄的指針的內(nèi)容字段1230。在圖12所示的例子中,歷史對(duì)象h0指出,在代g0中條目n包含與文件f1相關(guān)的內(nèi)容。歷史對(duì)象h0還指出,在代G2中條目n包含與文件f2(不是文件f1)相關(guān)的內(nèi)容。在內(nèi)容字段1230中列出的條目指向文件f2的實(shí)際內(nèi)容1235。如果f2是一個(gè)目錄,它將指向另外的目錄,如目錄1200。此內(nèi)容包括“以前字段”1240,它具有與該目錄中列出的條目相關(guān)的先前的文件或目錄的指針。例如,f2指向具有內(nèi)容“B”的文件的指針和指向f1的指針1240,意味著在代G2以前,條目“m”具有f1的內(nèi)容。
圖13示出按照本發(fā)明的一個(gè)實(shí)施例的網(wǎng)站開(kāi)發(fā)軟件模塊135,它能建立和處理工作區(qū)域、架構(gòu)區(qū)域和編輯區(qū)域。此網(wǎng)站開(kāi)發(fā)軟件模塊135包括一個(gè)工作流子系統(tǒng)1300,一個(gè)版本子系統(tǒng)1305和一個(gè)對(duì)象子系統(tǒng)1310。工作流子系統(tǒng)建立和管理工作區(qū)域、架構(gòu)區(qū)域、編輯區(qū)域和分支。版本子系統(tǒng)管理和控制下列功能,如修改和編輯文件及目錄;比較文件;比較目錄;將工作區(qū)域的內(nèi)容提交到架構(gòu)區(qū)域;以及檢查文件和目錄的沖突。對(duì)象子系統(tǒng)管理對(duì)象在服務(wù)器的主存儲(chǔ)器及在盤中的分布。對(duì)象子系統(tǒng)可以作為傳統(tǒng)的不變的對(duì)象存儲(chǔ)和高速緩存子系統(tǒng)來(lái)實(shí)現(xiàn)。
工作流子系統(tǒng)包括一個(gè)工作區(qū)域建立模塊1312,一架構(gòu)區(qū)域建立模塊1314,一個(gè)編輯區(qū)域建立模塊1316,一個(gè)分支建立模塊1346,和一個(gè)區(qū)域刪除模塊1342。版本子系統(tǒng)1305包括一個(gè)提交模塊1336,一個(gè)沖突檢查模塊1338,一個(gè)比較模塊1340,一個(gè)加條目模塊1318,參照計(jì)數(shù)模塊1320,增加直接參照模塊1322,刪除直接參照模塊1324,讀目錄模塊1326,刪除條目模塊1328,編輯文件模塊1330,改名模塊1332,產(chǎn)生目錄路徑模塊1334,鎖定模塊1344,代ID模塊1348。這些在工作流子系統(tǒng)和版本子系統(tǒng)中的模塊使能建立和處理區(qū)域、文件、目錄和用于開(kāi)發(fā)網(wǎng)站的其他對(duì)象。
工作流和版本子系統(tǒng)用C++編程語(yǔ)言來(lái)實(shí)現(xiàn)。在工作流子系統(tǒng)和版本子系統(tǒng)中的模塊的操作在下面敘述。
如上所述,工作區(qū)域是借助于將以前編輯的內(nèi)容虛擬地拷貝到工作區(qū)而建立的(在主分支中的第一個(gè)工作區(qū)域初始是空的情況除個(gè))。圖14示出為從一個(gè)編輯建立工作區(qū)域時(shí)工作區(qū)域建立模塊1312的操作,該編輯隨意地稱為“編輯e”。模塊1312獲得編輯e的根目錄和代ID(步驟1410)。然后模塊1312從代ID模塊1348得新的代ID(步驟1420),后者從編輯e的代ID導(dǎo)出。代ID模塊1348借助于完成圖11中示出的過(guò)程導(dǎo)出新的代ID。模塊1312也得出該工作區(qū)域的新對(duì)象ID(它是與其他不同的隨機(jī)或順序產(chǎn)生的數(shù))。
模塊1312建立一個(gè)代表該工作區(qū)域的對(duì)象,它具有名字段、根目錄字段、對(duì)象ID字段、代ID字段和分支字段(步驟1430)。該模塊將工作區(qū)域名填入名字段,將編輯e的根目錄填入目錄字段,從由步驟1420導(dǎo)出的代ID填入代ID字段,將對(duì)象ID填入對(duì)象ID字段,并將工作區(qū)域所在的分支識(shí)別填入分支字段中(步驟1440)。于是,該對(duì)象指出,工作區(qū)域是具有相同的編輯e的根目錄并具有導(dǎo)出的代ID的數(shù)據(jù)結(jié)構(gòu)。注意,編輯e的內(nèi)容沒(méi)有物理上的拷貝以建立工作區(qū)域。更確切地,建立一個(gè)對(duì)象指出,新建立的工作區(qū)域初始具有與編輯e相同的數(shù)據(jù)結(jié)構(gòu)。
圖15示出為了從稱為e編輯建立一個(gè)架構(gòu)區(qū)域,架構(gòu)區(qū)域建立模塊1314的操作。為建立一個(gè)架構(gòu)區(qū)域,模塊1314獲得編輯e的代ID(步驟1510),然后從代ID模塊1348獲得從編輯e的代ID導(dǎo)出的一個(gè)新的代ID(步驟1520)。模塊1314對(duì)該架構(gòu)區(qū)域還得出新的目錄ID(一個(gè)唯一的隨機(jī)或順序產(chǎn)生的數(shù))。
模塊1314建立表示該架構(gòu)區(qū)域的對(duì)象(步驟1530),它具有一個(gè)名字段、一個(gè)根目錄字段、一個(gè)代ID字段、一個(gè)對(duì)象ID字段及一個(gè)分支字段。模塊1314將架構(gòu)區(qū)域的名填入名字段,將編輯e的根目錄填入根目錄字段,將在步驟1520得到的代ID填入代ID字段,將在步驟1525獲得的對(duì)象ID填入對(duì)象ID字段,并將該架構(gòu)區(qū)域所在的分支識(shí)別填入分支字段(步驟1540)。
有時(shí)希望具有多個(gè)架構(gòu)區(qū)域。例如,除了一個(gè)公共的架構(gòu)區(qū)域以外還希望有數(shù)個(gè)專用的架構(gòu)區(qū)域,只有選中的用戶能提交內(nèi)容給它。只要多次完成上述架構(gòu)區(qū)域建立方法就能建立多個(gè)架構(gòu)區(qū)域。
圖16a-b示出了為了從一個(gè)隨意標(biāo)記為“S”的架構(gòu)區(qū)域的內(nèi)容建立一個(gè)編輯,編輯建立模塊1316的操作。模塊1316在步驟1610得到代ID和架構(gòu)區(qū)域S的根目錄。模塊也得到對(duì)編輯e的唯一對(duì)象ID(步驟1615)。模塊1316在步驟1625建立一個(gè)代表新編輯的對(duì)象,它具有一個(gè)名字段、一個(gè)根目錄字段,一個(gè)代ID字段,和一個(gè)分支字段。模塊1316在步驟1630將該新編輯的名填入名字段,將架構(gòu)區(qū)域S的代ID填入代ID字段,將架構(gòu)區(qū)域S的根目錄填入根目錄字段,將在步驟1625中獲得的對(duì)象ID填入對(duì)象ID字段,將該編輯所在的分支的識(shí)別填入分支字段。
采取該架構(gòu)區(qū)域的代ID,從本質(zhì)上模塊1316就將架構(gòu)區(qū)域S轉(zhuǎn)換到新的編輯。因而,當(dāng)建立編輯時(shí),編輯建立模塊1316在步驟1640獲得新的代ID,并在步驟1650將其指定給該架構(gòu)區(qū)域。
圖17a-17c示出分支建立模塊1346的操作。為了建立一個(gè)分支,模塊1346在步驟1705判斷,該建立的分支是否是主分支。若該分支不是主分支,模塊1346在步驟1710從其上分出新分支的父本分支上得到稱為“編輯b”的基本編輯的代ID。編輯“b”可以是父分支上的任何編輯。隨后,模塊1346在步驟1715從代ID模塊1348得到一個(gè)從編輯b的代ID導(dǎo)出的新代ID。隨后用如編輯b同樣的根目錄和在步驟1715得到的代ID,在步驟1720建立一個(gè)稱為“編輯e”的初始編輯。此外在步驟1730可以建立零個(gè)以上的工作區(qū)域,每個(gè)具有與編輯e相同的根目錄以及從編輯e的代ID導(dǎo)出的一個(gè)不同的代ID。可以在分支建立時(shí)或其后建立工作區(qū)域。在步驟1740建立一個(gè)架構(gòu)區(qū)域,它具有與編輯e相同的根目錄,并具有從編輯e的代ID導(dǎo)出的代ID。按照對(duì)于圖14-16討論的方法,建立了編輯e、工作區(qū)域和架構(gòu)區(qū)域。
回到步驟1705,若建立的分支是主分支,模塊1346在步驟1750獲得一個(gè)根的代ID,稱其為g0。一個(gè)根的代ID是使用傳統(tǒng)的產(chǎn)生唯一數(shù)字的程序產(chǎn)生的數(shù),它不是從其他的代ID導(dǎo)出的。模塊1346隨后在步驟1755、1760建立稱為d0的空目錄和對(duì)該目錄的稱為h0的歷史對(duì)象。模塊1346在步驟1765將一個(gè)輸入項(xiàng)加到歷史對(duì)象中,指出該歷史對(duì)象在代g0中與目錄d0相關(guān)。此輸入項(xiàng)可用記號(hào)(g0,d0)來(lái)表示。
在建立該歷史對(duì)象以后,模塊1346在步驟1770建立一個(gè)初始的編輯,它具有根目錄d0和根的代g0。該模塊還在步驟1775建立一個(gè)架構(gòu)區(qū)域和一個(gè)或多個(gè)工作區(qū)域,每個(gè)均具有與初始編輯相同的根目錄(即空目錄)和從該根的代導(dǎo)出的不同的代ID。注意,工作區(qū)域不必在分支建立時(shí)建立,它們可以在以后建立。
加條目模塊1318使能把諸如文件和目錄的對(duì)象加到工作區(qū)域或架構(gòu)區(qū)域。圖18a-d示出為了把一個(gè)具有內(nèi)容“f”的條目“n”加到一個(gè)區(qū)域“a”的目錄“d”中,加條目模塊1318的操作。區(qū)域可以是工作區(qū)域或架構(gòu)區(qū)域,條目n可以是文件或目錄。條目f也能是文件或目錄。為了增加此條目,模塊1318在步驟1805識(shí)別對(duì)區(qū)域a的代ID(稱之為g)。然后模塊1318在步驟1810讀出目錄d并在步驟1815判斷,對(duì)于代g是否有代頁(yè)。如果對(duì)目錄d沒(méi)有代頁(yè),模塊1318在步驟1820借助于拷貝最密切相關(guān)的并具有代頁(yè)的父代(“最匹配的代”)的代頁(yè)對(duì)目錄d建立一個(gè)代頁(yè)。在找到代g的代頁(yè)或建立代頁(yè)以后,模塊1318在步驟1825掃描該代頁(yè)的內(nèi)容的名為“n”的條目,在步驟1835判斷,條目n是否存在于代g的目錄d中。如果在代g的目錄d中找不到名為“n”的條目,則模塊1318在步驟1840中用歷史對(duì)象中的一個(gè)輸入項(xiàng)建立一個(gè)歷史對(duì)象,指出內(nèi)容“f”在代g中與條目n相關(guān)。隨后模塊1813在步驟1845將一個(gè)用標(biāo)記(n,h)表示的輸入項(xiàng)加到代頁(yè)“g”中,指出文件“n”與歷史對(duì)象“h”相關(guān)。注意,將條目n加到目錄d,條目n既沒(méi)有虛擬地也沒(méi)有物理上拷貝到目錄d中。目錄d僅僅是參照條目n。
當(dāng)條目n已經(jīng)加到目錄中時(shí),步驟1835中的問(wèn)題答案是肯定的,但是條目n的更新版本代替了現(xiàn)有的版本(即新的內(nèi)容現(xiàn)與條目n相關(guān))。如果是這樣的情況,模塊1318在步驟1850將掃描與文件“n”相關(guān)的歷史對(duì)象的內(nèi)容,找出在其中條目改變的最新代。隨后模塊1318在步驟1855判斷條目n在代g中是否已改變(即模塊1318判斷,條目n在區(qū)域中是否已改變,因?yàn)閰^(qū)域具有代ID g)。如果條目n在代g中沒(méi)有改變,則模塊1318在步驟1860加一個(gè)輸入項(xiàng)到歷史對(duì)象中,指出內(nèi)容f在代g中與文件n相關(guān)。條目f具有一個(gè)指示條目“n”以前內(nèi)容的字段(即條目f包括指向條目n以前內(nèi)容的指針)。模塊1318在步驟1865設(shè)置條目f的以前的字段,以指向在最匹配的代中“n”的內(nèi)容。
參照步驟1855,如果條目n在代g中被改變,則模塊1318在步驟1870改變與代g相關(guān)的歷史條目項(xiàng),以反映出在代g中條目n的內(nèi)容是條目f。于是,模塊1318在步驟1875設(shè)置條目f的“以前字段”指向在代g中的n的以前的內(nèi)容。
為了回收資源,一個(gè)對(duì)象(若一個(gè)目錄,一個(gè)文件,一個(gè)歷史對(duì)象)若不能從任何區(qū)域訪問(wèn)就從存儲(chǔ)部件物理上予以刪除。從一個(gè)區(qū)域中增加和刪除一個(gè)對(duì)象可以是虛擬的。因?yàn)榻?jīng)常是只存儲(chǔ)該對(duì)象的一個(gè)物理拷貝。因此,為了判斷一個(gè)對(duì)象的物理拷貝是否應(yīng)該刪除,必須知道該對(duì)象是否在任何哪一個(gè)區(qū)域中能被訪問(wèn)。如果一個(gè)對(duì)象能從一個(gè)區(qū)域被訪問(wèn),它在該區(qū)域被“參照”。為判斷一個(gè)對(duì)象是否能從任何哪一個(gè)區(qū)域被訪問(wèn),對(duì)每一個(gè)對(duì)象保持一個(gè)參照計(jì)數(shù),參照計(jì)數(shù)指出該對(duì)象能從多少個(gè)區(qū)域被訪問(wèn)。如果一個(gè)對(duì)象的計(jì)數(shù)為0,就能刪除該對(duì)象。
為了能計(jì)算參照計(jì)數(shù),每一個(gè)對(duì)象與一個(gè)“參照表”和一個(gè)“反參照表”相聯(lián)系。參照表指出一個(gè)對(duì)象被加入的目錄,對(duì)每個(gè)參照的目錄指出,在哪個(gè)代該對(duì)象被加到該目錄中。尤其是,每當(dāng)一對(duì)象被加到一個(gè)目錄中,在參照表中加一個(gè)輸入項(xiàng),指出在哪個(gè)代該對(duì)象被加到該目錄中。
一個(gè)反參照表指出該對(duì)象從目錄中被刪除,對(duì)每個(gè)參照的目錄指出在哪個(gè)代中該對(duì)象從該目錄中被刪除。尤其是每當(dāng)一個(gè)對(duì)象從一個(gè)目錄刪除時(shí),在反參照表中加入一個(gè)輸入項(xiàng),指出在哪個(gè)目錄及代中從目錄中刪除該對(duì)象。
增加直接參照模塊1322將輸入項(xiàng)加到參照表中。圖19示出了當(dāng)一個(gè)對(duì)象(如一個(gè)文件、一個(gè)目錄或一個(gè)歷史對(duì)象)被加到區(qū)域“a”中的一個(gè)目錄中時(shí)增加直接參照模塊1322的操作。當(dāng)對(duì)象c被加到目錄d,加上d時(shí)c的直接參照。換言之,c的參照表指出,c被加到目錄d中。為了增加一個(gè)直接參照,增加直接參照模塊1322在步驟1910得到區(qū)域a的代,為方便起見(jiàn)稱為“g”。然后,增加直接參照模塊1322在步驟1920判斷在對(duì)象c的參照表中是否有一個(gè)輸入項(xiàng),它指出對(duì)象c在代g中被加到目錄d中。為方便起見(jiàn),那樣的輸入項(xiàng)用標(biāo)記(g,d)表示。如果(g,d)不在對(duì)象c的參照表中,則在步驟1930該輸入項(xiàng)被加到參照表中。
在(g,d)被加到參照表以后,或如果(g,d)已經(jīng)在參照表中,增加直接參照模塊1322在步驟1940判斷,該(g,d)是否在反參照表中。如果對(duì)象c曾在代g中從目錄p中刪除,輸入項(xiàng)(g,d)將在反參照表中。如果該輸入項(xiàng)(g,d)不在對(duì)象c的反參照表中,則增加直接參照的過(guò)程完成。如果輸入項(xiàng)(g,d)在反參照表中,在步驟1950將該項(xiàng)從反參照表中刪除。此外,對(duì)于每個(gè)從代g直接導(dǎo)出的第一個(gè)代(稱它為gi),在步驟1960將輸入項(xiàng)(gi,d)加到反參照表中。上一步驟的原因是被導(dǎo)出的代是從與其父代同樣的內(nèi)容開(kāi)始的。因此,如果一個(gè)對(duì)象在一個(gè)代中能被訪問(wèn),它也能從由該代導(dǎo)出的子代中被訪問(wèn),除非該對(duì)象是子代導(dǎo)出以后被加到父目錄的,或者除非該對(duì)象特定地從子代中被刪除。結(jié)果,如果一個(gè)對(duì)象在已有現(xiàn)成的子代的代中被加到目錄中,則反參照表必須指出,該對(duì)象不能從現(xiàn)有的子代中訪問(wèn),因?yàn)樵诂F(xiàn)有的子代被導(dǎo)出時(shí),該對(duì)象不是父代的部分。當(dāng)然,該對(duì)象也能使用在圖18a-d示出與描述的方法加到該子代中。
刪除直接參照模塊1324將項(xiàng)加入到反參照表中。圖20說(shuō)明了當(dāng)一個(gè)對(duì)象“c”在區(qū)域“a”中從一個(gè)目錄″d″中被刪除時(shí),刪除直接參照模塊1324的操作。刪除直接參照模塊1324在步驟2010查明區(qū)域a的代ID(為方便起見(jiàn)稱為“g”)。然后,刪除直接參照模塊1324在步驟2020判斷,是否有一個(gè)輸入項(xiàng)在對(duì)象的參照表中,它指出對(duì)象c以前在代g中被加到目錄d中。那樣的項(xiàng)用標(biāo)記(g,d)表示。如果(g,d)不在參照表中,則處理完成,因?yàn)閷?duì)象c在代g中從未有對(duì)目錄d的直接參照。因此沒(méi)有參照需要?jiǎng)h除。
如果(g,d)在參照表中,在步驟2030它從對(duì)象c的表中被刪除。此外,對(duì)于每一個(gè)由g導(dǎo)出稱為gi的子代,如果輸入項(xiàng)(gi,d)不在反參照表中,此項(xiàng)在步驟2040被加到該參照表中。這一步驟的理由是該參照表指出,如果對(duì)象c能從現(xiàn)有的子代中可被訪問(wèn),盡管它從父代中被刪除,它仍然可從現(xiàn)有的子代中訪問(wèn)。
在步驟2040以后,刪除直接參照模塊1324在步驟2050判斷,輸入項(xiàng)(g,d)是否在反參照表中。如果該輸入項(xiàng)尚未在反參照表中,在步驟2060中被加到反參照表中。否則刪除直接參照的過(guò)程已完成。雖然,該輸入項(xiàng)(g,d)應(yīng)當(dāng)未在反參照表中,在該輸入項(xiàng)在早些時(shí)后被錯(cuò)誤地加到反參照表中的情況下,刪除直接參照模塊1324作出這樣的判斷。
參照計(jì)數(shù)模塊1320對(duì)一個(gè)條目計(jì)算參照數(shù)。為此,參照計(jì)數(shù)模塊1320保存二個(gè)元組的表P,它初始是空的。參照計(jì)數(shù)模塊1320使用初始設(shè)置為0的整數(shù)n來(lái)表示對(duì)條目f所做參照的數(shù)。
圖21a-b示出為了計(jì)算一個(gè)條目f的參照計(jì)數(shù)參數(shù)計(jì)數(shù)模塊的操作。參照計(jì)數(shù)模塊在步驟2110,2120取出對(duì)條目f的參照表與反參照表。參照計(jì)數(shù)模塊在步驟2125得到族系樹(shù)(回憶一下,本發(fā)明的所有區(qū)域能被組織成族系)的根節(jié)點(diǎn)的代ID,為方便起見(jiàn)稱為“g”。參照計(jì)數(shù)模塊1320在步驟2130找到代g的參照表中的所有項(xiàng)。例如,若條目f在代g中被加到目錄d1,將在參照表中有項(xiàng)(g,d1),而且參照計(jì)數(shù)模塊1320將找到此項(xiàng)。對(duì)于每個(gè)代g的項(xiàng),參照計(jì)數(shù)模塊1320在步驟2130將一個(gè)項(xiàng)(條目名,+)加到表P中,其中“條目名”是在代g中參照的條目名?!?”意味著該項(xiàng)是在參照表中(與反參照表相反)。例如,如果在條目f的參照表找到項(xiàng)(g,d1),則項(xiàng)(d1,+)被加到表P中。如果表P已經(jīng)包括帶有相同條目名的項(xiàng)(如d1,-),則參照計(jì)數(shù)模塊保證該項(xiàng)被設(shè)成(條目名,+)。
參照計(jì)數(shù)模塊1320還搜索反參照模塊,在步驟2140找出在代g的反參照表中的所有項(xiàng)。對(duì)于在代g的反參照模塊中的每一個(gè)項(xiàng),參照計(jì)數(shù)模塊1320在步驟2140加一個(gè)項(xiàng)(條目名,-)到表P中,此外“-”意味著該條目在反參照表中。如果表P已經(jīng)包括一個(gè)帶有相同條目名的項(xiàng),該參照計(jì)數(shù)模塊保證將該項(xiàng)設(shè)成(條目名,-)。
參照計(jì)數(shù)模塊然后在步驟2050對(duì)每一個(gè)帶有“+”的表P中的項(xiàng)做n=n+1?;叵胍幌麻_(kāi)始將n設(shè)成0。然后參照計(jì)數(shù)模塊在步驟2160判斷,代g是否有任何子代(即由代g導(dǎo)出的代)。如果沒(méi)有,參照計(jì)數(shù)在步驟2170完成,n是對(duì)條目f的參照數(shù)。如果代g具有子代,對(duì)每個(gè)子代參照計(jì)數(shù)模塊在步驟2180設(shè)置g等于子代的代ID并返回到步驟2130。
圖22示出為在一個(gè)區(qū)域“a”中讀出一個(gè)目錄“d”的內(nèi)容,讀目錄模塊1326的操作。讀目錄模塊1326在步驟2210得到區(qū)域“a”的代,稱為“g”。該目錄模塊1326在步驟2220分析該目錄,判斷對(duì)代g是否有代頁(yè)。如果在區(qū)域a中目錄d已經(jīng)被修改,就有對(duì)代g的代頁(yè)。如果對(duì)代g有一個(gè)代頁(yè),讀目錄模塊1320在步驟2230返回代頁(yè)“g”上的項(xiàng)的表。否則,讀目錄在步驟2240返回在最密切相關(guān)的父代頁(yè)(最匹配的代頁(yè))的代頁(yè)上的項(xiàng)的表。
使用圖12示出的目錄敘述讀目錄模塊的操作的例子。為了在一個(gè)具有代G3的區(qū)域中讀該目錄的內(nèi)容,該目錄模塊1326返回在代頁(yè)G3中項(xiàng)的表,它在本例中是項(xiàng)(m,h0)。
假設(shè)在圖12中的代以圖10所示的方式互相聯(lián)系。為了在代G4中讀目錄d的內(nèi)容,讀目錄模塊1326判斷,對(duì)G4是否有代頁(yè)。因?yàn)闆](méi)有對(duì)G4的代頁(yè),讀目錄模擬1326搜索最匹配的代頁(yè)。G1是G4最密切的父代,但沒(méi)有對(duì)G1的代頁(yè)。GO是下一個(gè)最密切的父代,因?yàn)閷?duì)GO有代頁(yè),在GO代頁(yè)中項(xiàng)的表作為G4中目錄的內(nèi)容被返回。
圖23a-b示出當(dāng)條目“a”在具有代ID“g”的區(qū)域“a”中被刪除時(shí),刪除條目模塊1328的操作。條目n可以是在目錄中的任何對(duì)象,如一個(gè)文件或另一個(gè)目錄。為了從一個(gè)目錄d刪除一個(gè)條目,按照對(duì)應(yīng)于圖22中所述的方法在步驟2310中讀出目錄d。刪除條目模塊1328在步驟2320判斷在目錄d中是否有對(duì)于代g的代頁(yè)。如果沒(méi)有,在步驟2330借助于從最密切的父代(最匹配的代)拷貝該代頁(yè)建立對(duì)代g的代頁(yè)。
刪除條目模塊1328在步驟2330判斷,在代頁(yè)“g”中是否對(duì)條目有一個(gè)項(xiàng)。如果沒(méi)有,刪除條目模塊1328在步驟2330指出發(fā)生一個(gè)錯(cuò)誤,因?yàn)闂l目n不在代g中的目錄d中,因此不能從代g中的目錄中刪除。
回到步驟2330,如果在代頁(yè)g中對(duì)條目n有一個(gè)項(xiàng),刪除條目模塊1328在步驟2350得到對(duì)應(yīng)n的歷史對(duì)象,刪除條目模塊1328在步驟2355判斷,該歷史對(duì)象是否指出條目在代g中被修改。換言之,刪除條目模塊1328判斷,歷史對(duì)象是否包括用“g”作為代的項(xiàng)。
如果條目n在代g中沒(méi)有改變,刪除條目模塊1328在步驟2370將一個(gè)項(xiàng)加到歷史對(duì)象中,指出條目n在代g中從目錄d中刪除。因?yàn)樵诖诉^(guò)程中條目n的刪除是虛擬的,加上此項(xiàng)有效地在代g中從目錄d刪除了條目n。此項(xiàng)用標(biāo)記(g,z)代表,其中z表示一個(gè)對(duì)象,它指出一個(gè)條目已被刪除。如果z對(duì)象沒(méi)有對(duì)條目n建立,刪除條目模塊1328建立一個(gè)z對(duì)象。
參照步驟2355,如果條目n在代g中已被改變,刪除條目模塊1328在步驟2360在對(duì)應(yīng)代g的歷史對(duì)象中改變?cè)擁?xiàng),指出n在代g中被從目錄d中刪除(即該項(xiàng)變成(g,z))。如果z對(duì)象尚未存在,刪除條目模塊1328建立此對(duì)象。
如圖12中示出的文件內(nèi)容1235,z對(duì)象也有一個(gè)字段,指示一個(gè)條目以有的內(nèi)容。此字段被稱為“以前字段”。在步驟2360或2370以后,在步驟2380z對(duì)象中的以前被設(shè)置成指向在代g中n的以前內(nèi)容。
圖24a-b示出了為了在具有代ID“g”的工作區(qū)域“a”編輯在目錄“d”中的文件“n”,編輯文件模塊1320的操作。該編輯文件模塊1320在步驟2405接受對(duì)文件“n”的寫命令。編輯文件模塊1320隨后在步驟2410獲得對(duì)文件n的歷史對(duì)象,并在步驟2420判斷在代g中文件n是否已被改變(即有無(wú)帶代g的項(xiàng) )。若是,編輯文件模塊在步驟2430將所有對(duì)文件“n”的改變寫到在代g中與文件n相關(guān)的內(nèi)容中。
如果歷史對(duì)象沒(méi)有一個(gè)帶有代g的項(xiàng),編輯文件模塊1320在步驟2440尋找?guī)е钇ヅ浯捻?xiàng)。編輯文件模塊1320隨后在步驟2450拷貝與步驟2440中的項(xiàng)相關(guān)的稱為f1的文件,并在步驟2460將所有改變寫到f1的新拷貝中,后者稱為f2。在步驟2470將一個(gè)項(xiàng)加到歷史對(duì)象中,指出在代g中文件n的內(nèi)容就是文件f2的內(nèi)容。換言之,編輯文件模塊1320將用標(biāo)記(g,f2)表示的項(xiàng)加到歷史對(duì)象中。
圖25示出為了將區(qū)域a中目錄d1的一個(gè)條目n1(可以是文件或目錄)改名為目錄d2的條目n2,改名模塊1332的操作。改名模塊1332在步驟2510得到目錄d1中條目n1的歷史對(duì)象,稱之為h1。注意,如果不存在那樣的歷史對(duì)象,改名模塊1332向用戶報(bào)告發(fā)生一個(gè)錯(cuò)誤。在得到此歷史對(duì)象以后,改名模塊1332在步驟2520判斷,在目錄d2中是否存在名為n2的條目。如果存在,改名模塊在步驟2533判斷對(duì)條目n2是否有任何改寫保護(hù)。在一個(gè)實(shí)施例中,對(duì)目錄有改寫保護(hù),但對(duì)文件沒(méi)有。如果存在改寫保護(hù),改名模塊在步驟2527報(bào)告,在目錄d2中已存在條目n2。如果沒(méi)有改寫保護(hù),改名模塊1332在步驟2530按照在圖23a-b中圖示和描述的方法從目錄d2刪除條目n2。
一旦現(xiàn)有的條目n2從目錄d2中被刪除,或者在d2中不存在條目n2,改名模塊1332在步驟2540將名為n2的新條目加到目錄d2中。改名模塊1332將歷史對(duì)象h1與目錄d2的條目n2相聯(lián)系。在條目n2的內(nèi)容的“以前字段”中,改名模塊1332指出,n1是n2的“改名前輩”(如下所定義)。注意,如果d1=d2,改名過(guò)程相同。
圖26a-b示出,為了對(duì)區(qū)域a中的目標(biāo)d產(chǎn)生一個(gè)全名路徑,產(chǎn)生目錄路徑模塊1334的操作。產(chǎn)生目錄路徑模塊1334在區(qū)域a讀出目錄d,并識(shí)別目錄d的父目錄,稱以為pd。根據(jù)本發(fā)明的一個(gè)實(shí)施例,父目錄是與在一個(gè)目錄中輸入項(xiàng)“¨”相聯(lián)系的。在本實(shí)施例中,產(chǎn)生目錄路徑模塊1334對(duì)應(yīng)輸入項(xiàng)“¨”來(lái)識(shí)別該目錄。
模塊1334在區(qū)域a讀目錄Pd,并對(duì)目錄d尋找輸入項(xiàng)。然后,模塊1334識(shí)別目錄d作為目錄路徑中的名。
此算法重復(fù)進(jìn)行,直到達(dá)到根目錄。具體說(shuō)來(lái),上述對(duì)于目錄d的方法對(duì)Pd重復(fù)進(jìn)行,隨后對(duì)目錄Pd的父目錄等等,直到達(dá)到根目錄。找到的名就是目錄路徑上的名。在目錄路徑名中,找到名字的次序是從最后的到第一個(gè)。
圖27示出為了在區(qū)域“a”中產(chǎn)生目錄“d”中歷史對(duì)象“h”的基本名,產(chǎn)生基本名模塊1335的操作。產(chǎn)生基本名模塊1335在步驟2710讀出對(duì)應(yīng)于目錄d中區(qū)域a的代頁(yè)。產(chǎn)生基本模塊1335在步驟2720識(shí)別帶有歷史對(duì)象h的輸入項(xiàng)。在輸入項(xiàng)中對(duì)應(yīng)于歷史對(duì)象h的條目名是要找的基本名。例如,如果在區(qū)域a中從目錄d中找到輸入項(xiàng)(n,h),則“n”是歷史對(duì)象h的基本名。
圖28a-c示出了在具有代IDg的架構(gòu)區(qū)域?qū)в袣v史對(duì)象h和內(nèi)容f的條目“n”提交給目錄d,提交模塊1336的操作。提交操作用于將一個(gè)工作區(qū)域的內(nèi)容提交到一個(gè)架構(gòu)區(qū)域。因?yàn)橐粋€(gè)文件的內(nèi)容由它的歷史對(duì)象所定義,一個(gè)文件的歷史對(duì)象是實(shí)際提交給架構(gòu)區(qū)域的。按照?qǐng)D26和27圖示和描述的方法提交模塊1336在步驟2805借助于在區(qū)域a計(jì)算目錄d的全路徑名和歷史對(duì)象的基本名得到歷史對(duì)象h的全路徑。提交模塊1336在步驟2810判斷,在該架構(gòu)區(qū)域是否有帶著相同全路徑名的對(duì)應(yīng)條目。借助于重復(fù)地讀目錄(用讀目錄模塊1326)判斷在該架構(gòu)區(qū)域中是否有與歷史對(duì)象h相同全路徑名的另外的對(duì)象。
如果在該架構(gòu)區(qū)域中沒(méi)有相應(yīng)的條目,提交模塊1336在步驟2830查明是否在該架構(gòu)區(qū)域中存在由步驟2805計(jì)算的目錄路徑。如果沒(méi)有,在步驟2835建立該目錄路徑,且在步驟2840將文件f標(biāo)記成凍結(jié)的。在步驟2830或2840以后,提交模塊1336調(diào)用的條目模塊1318在區(qū)域a中將帶有內(nèi)容f的條目加到目錄d中(步驟2845)。提交模塊1336把項(xiàng)(g,f)加到歷史對(duì)象中(步驟2840)。
然后,提交模塊1336在步驟2855判斷,條目f是否為目錄。若不是,提交過(guò)程完成。若條目f是一個(gè)目錄,則在工作區(qū)域提交模塊1336對(duì)每個(gè)子目錄di將一個(gè)輸入項(xiàng)(g,di)加到與di相關(guān)的歷史對(duì)象中。此步驟保證,當(dāng)一個(gè)目錄被提交給架構(gòu)區(qū)域時(shí),它的子目錄也被提交。
回到步驟2810,如果在該架構(gòu)區(qū)域有相應(yīng)的條目,提交模塊1336在步驟2815調(diào)用沖突檢查模塊1338(在下面敘述)來(lái)判斷在稱為hs的對(duì)應(yīng)歷史對(duì)象和歷史對(duì)象h之間是否有沖突。如果a)h和hs是相同或b)h是從hs導(dǎo)出或c)hs從h導(dǎo)出,則h與hs沒(méi)有沖突。如果在h和對(duì)應(yīng)歷史對(duì)象hs之間沒(méi)有沖突,提交模塊1336進(jìn)到步驟2840。否則,提交模塊1336在步驟2820判斷,允許現(xiàn)有文件被改寫的改寫模塊是否有效。如果有效,提交模塊1336進(jìn)入步驟2840。否則,由于碰撞提交失敗。
圖29示出為了在分支b的區(qū)域atarget中檢查文件ftarget對(duì)文件freference的沖突,沖突檢查模塊1338的操作。沖突檢查模塊1338在步驟2910判斷ftarget在分支b中是否被鎖定。如果只有分支中的一個(gè)工作區(qū)域能提交一個(gè)文件到架構(gòu)區(qū),該文件在該分支中被鎖定。鎖定一個(gè)文件提供了避免沖突的方法。如果ftarget在分支b中被鎖定,沖突檢查模塊1338在步驟2920判斷,是否對(duì)ftarget的鎖定被不同于atarget的區(qū)域擁有。若是,就存在沖突,而且ftarget不能提交給區(qū)域atarget。
如果ftarget在分支b中未被鎖定,或如果對(duì)ftarget的鎖定被atarget擁有,沖突檢查模塊在步驟2930確定,ftarget和freference是否指向相同的內(nèi)容(即ftarget和freference是同一個(gè))。如果它們指向同一個(gè)內(nèi)容,沖突檢查模塊1338發(fā)現(xiàn)不存在沖突。如果二個(gè)文件沒(méi)有同一內(nèi)容,沖突檢查模塊1338在步驟2940判斷,freference是否為ftarget的先輩(如同名的先輩。從先輩拷貝或從先輩改名,如下所述)。如果freference是先輩,則沒(méi)有沖突,因?yàn)閒target似乎是freference希望的修改。否則存在沖突。
圖30a-b示出了為了將區(qū)域atarget中的目錄dtarget與區(qū)域areference中的目錄dreference比較,比較目錄模塊1340的操作。為了比較,比較目錄模塊1340在步驟3005按照?qǐng)D22示出和敘述的方法讀出在區(qū)域atarget中目錄dtarget的內(nèi)容。沖突檢查模塊也在步驟3010按照?qǐng)D22示出和敘述的方法讀出在區(qū)域areference中目錄dreference的內(nèi)容。
比較目錄模塊1340在步驟3015中識(shí)別在目錄dtarget中的第一個(gè)條目,并判斷在目錄dreference中是否有一個(gè)條目具有與目錄dtarget中的第一個(gè)條目相同的名字。如果沒(méi)有,比較目錄模塊1340在步驟3045報(bào)告,在dreference中沒(méi)有與dtarget中被識(shí)別的條目匹配的條目,并進(jìn)到步驟3050。否則,比較目錄模塊1340在步驟3025判斷,是否具有相同名字的二個(gè)條目具有相同的內(nèi)容。借助于審閱每個(gè)條目的歷史對(duì)象來(lái)做這樣的比較,如果在區(qū)域areference中dreference的歷史對(duì)象指向與區(qū)域atarget中dtarget的歷史對(duì)象相同的內(nèi)容,則兩個(gè)目錄的內(nèi)容是相同的。如果內(nèi)容是相同的,比較目錄模塊1340在步驟3030報(bào)告,該條目具有相同的名和內(nèi)容,且比較目錄模塊1340進(jìn)到步驟3050。如果內(nèi)容不相同,比較目錄模塊1340在步驟3035報(bào)告,名相同,但內(nèi)容不同,比較目錄模塊1340進(jìn)到步驟3050。
在步驟3050,比較目錄模塊1340在步驟3050確定。是否有另外的條目在dtarget中。
如果在dtarget中有另外的條目,比較目錄模塊1340在步驟3053識(shí)別下一個(gè)條目并回到步驟3020。如果在dtarget中沒(méi)有條目,比較目錄模塊1340在步驟3055識(shí)別dreference中的第一個(gè)條目。比較目錄模塊1340在步驟3060判斷,被識(shí)別的條目是否與dtarget中的某一個(gè)條目有相同的名。若不是,比較目錄模塊1340在步驟3065報(bào)告,在dtarget中被識(shí)別的條目不匹配dreference中的任何條目,進(jìn)到步驟3067。如果被識(shí)別的條目具有與dtarget中的條目相同的名字,該被識(shí)別的條目已經(jīng)在步驟3020找到,于是比較目錄模塊1340進(jìn)到步驟3067。
在步驟3067,比較目錄模塊1340判斷,是否在dreference有其他條目。如果答案是在dreference中沒(méi)有其他條目,比較dtarget與dreference的過(guò)程完成。否則,比較目錄模塊1340在步驟3070取得dreference中的下一個(gè)條目且回到步驟3060。
比較文件模塊1341比較文件(不同于比較目錄模塊,后者比較目錄)。文件當(dāng)提交到架構(gòu)區(qū)域時(shí)被比較。此外,網(wǎng)站開(kāi)發(fā)者可能希望在他們對(duì)應(yīng)的工作區(qū)域比較文件。
比較文件包括審視一個(gè)文件的先輩。一個(gè)文件可能具有的三種類型的先輩是“同名先輩”、“從先輩拷貝”和“從先輩改名”。
“同名先輩”是稱之為f的文件的前版本,它具有與文件f(即“f”)相同的名,其中“同名先輩”先前被提交給與文件f相同的區(qū)域。一個(gè)文件的“以前字段”(如圖12中的字段1240)指向該文件的“同名先輩”。
一個(gè)被稱為f的文件的“從先輩拷貝”是一個(gè)文件,其內(nèi)容是被拷貝到文件f。一個(gè)文件上的拷貝或反向操作可在工作區(qū)域用“從先輩拷貝”產(chǎn)生一個(gè)文件。若操作改寫了一個(gè)現(xiàn)有文件就發(fā)生這種情況。例如,設(shè)文件e不是在架構(gòu)區(qū)域的一個(gè)文件。該文件u是在工作區(qū)域的一個(gè)文件,它與文件e2沖突。如果文件u借助于用文件e2的內(nèi)容的拷貝替代文件u的內(nèi)容而被更新了,老文件u是更新后文件u的“同名先輩”,文件e2是更新后的文件u的“從先輩拷貝”。文件e2可以從另外區(qū)域或另外分支的文件。文件e2也能夠是在文件u的版本歷史中的文件,或者是在另外一個(gè)分支上另外文件的版本歷史上的一個(gè)文件。如果一個(gè)文件具有“從先輩拷貝”,該文件的“以前字段”(如圖12中字段1240)指向“從先輩拷貝”,也指向“同名先輩”。
一個(gè)文件〔稱為f〕的“從先輩改名”是一個(gè)文件,文件f是從那個(gè)文件改名而得。如果一個(gè)文件有“從先輩改名”,該文件的“以前字段”指向“從先輩改名”和“同名先輩”。
圖31a-b示出,為了將目錄dtarget中的文件Ftarget與目錄dreference中的文件freference作比較,比較文件模塊1341的操作。比文件模塊1341在步驟3110查找稱為f1的文件,它包括在目錄dtarget中ftarget的內(nèi)容。注意,F(xiàn)target和f1的差別是Ftarget是在目錄中該文件的名,而f1是在目錄dtargetFtarget的實(shí)際內(nèi)容。Ftatget與f1之間的差別類似于在圖12中示出的目錄中名為“m”的文件和在代G0中文件“m”的內(nèi)容“A”之間的差別。
比較文件模塊1341在步驟3120查找稱為fr的文件,它包含在dreference中Freference的內(nèi)容。比較模塊隨后在步驟3130判斷fr與f1是否等同。若是,則比較文件模塊1341在步驟3140報(bào)告,F(xiàn)reference與Ftarget是相同的。
如果fr和f1不相同,比較文件模塊1341在步驟3145判斷,F(xiàn)reference是否為Ftarget的一個(gè)先輩。回想一下,每個(gè)文件的內(nèi)容包含一個(gè)指向文件的“同名先輩”(如以前的內(nèi)容)的指針(在“以前字段”中),如果文件具有“從先輩拷貝”或“從先輩改名”指針針向那個(gè)先輩。比較模塊往后查遍f1和它的先輩們的“以前字段”以搜索fr。如果fr出現(xiàn)在一個(gè)查找的“以前字段”中,則Freference是Ftarget的一個(gè)先輩。比較文件模塊1341在步驟3050報(bào)告,F(xiàn)target是Freference的一個(gè)修改。
如果Freference不是Ftarget的一個(gè)先輩,比較文件模塊1341在步驟3155判斷,F(xiàn)target是否為Freference的一個(gè)先輩。具體地,比較模塊往后查遍fr和它的先輩們的“以前字段”以搜索f1。如果f1出現(xiàn)在查找的一個(gè)“以前字段”中,比較文件模塊1341在步驟3160報(bào)告,F(xiàn)reference是Ftarget的一個(gè)修改。否則,比較文件模塊1341在步驟3165判斷,是否有某個(gè)文件是Ftarget和Freference兩者的先輩。如果有某個(gè)公共文件,比較文件模塊1341在步驟3170報(bào)告,F(xiàn)reference和Ftarget具有共同的先輩;如果沒(méi)有一個(gè)共同的文件,它在步驟3175報(bào)告,F(xiàn)target與Freference不相關(guān)。
區(qū)域刪除模塊1342刪除那些用戶或系統(tǒng)管理不再需要的區(qū)域。圖31示出了刪除一個(gè)區(qū)域“a”區(qū)域刪除模塊的操作。區(qū)域刪除模塊在步驟3210取出對(duì)區(qū)域a的目錄樹(shù),再在步驟3230找出任何無(wú)子節(jié)點(diǎn)(即目錄),為方便起見(jiàn)稱之為“c節(jié)點(diǎn)”區(qū)域刪除模塊1342在步驟3240調(diào)用刪除條目模塊1328從父目錄中刪除c節(jié)點(diǎn)。區(qū)域刪除模塊1342還在步驟3240調(diào)用刪除直接參照模塊1324,從C節(jié)點(diǎn)的參照表中刪除對(duì)父目錄的參照。然后區(qū)域刪除模塊1342在步驟3260調(diào)用參照計(jì)數(shù)模塊1320判斷,參照計(jì)否為0,若是0,在步驟3270中從存儲(chǔ)器中刪除與C節(jié)點(diǎn)相關(guān)的物理對(duì)象。否則,與C節(jié)點(diǎn)相關(guān)的物理對(duì)象不從存儲(chǔ)器中刪除,因?yàn)?,雖然C節(jié)點(diǎn)已從區(qū)域a上刪除,它仍存在于其他區(qū)域。在判斷參照計(jì)數(shù)以后,在步驟3280判斷,在該區(qū)域中是否還留下任何節(jié)點(diǎn)。若有,模塊1342返回到步驟3230。否則,區(qū)域刪除過(guò)程完成。
圖32a-b和34示出鎖定模塊1346的操作。圖33a-b示出為了在沿分支b的區(qū)域a中建立目錄d中條目f的一個(gè)鎖,鎖定模塊1346的操作。為了建立那樣的鎖,鎖定模塊1346在步驟3310確定在區(qū)域a中目錄d中條目f的全路徑名。隨后在步驟3320判斷,是否有其他鎖具有相同的全路徑名。若是,鎖定模塊1346在步驟3350報(bào)告,鎖定建立模塊失敗,因?yàn)橛幸粵_突鎖。如果沒(méi)有其他鎖有同樣的全路徑名,鎖定模塊1346在步驟3330建立一個(gè)鎖,它包括在步驟3310識(shí)別的全路徑名,并在步驟3340作為鎖的擁有者用區(qū)域a標(biāo)志該鎖。
圖34示出為了判斷區(qū)域a中目錄d的一個(gè)條目是否被鎖定,鎖定模塊1346的操作。鎖定模塊1346在步驟3410確定在區(qū)域a中目錄d的條目f的全路徑名,隨后在步驟3420判斷,分支b是否有帶有相同全路徑名的鎖。若沒(méi)有,鎖定模塊在步驟3430報(bào)告,條目未被鎖定。否則,鎖定模塊在步驟3440報(bào)告,條目f被鎖定。
現(xiàn)在已經(jīng)敘述了網(wǎng)站開(kāi)發(fā)軟件,下面將敘述按照本發(fā)明HTTP協(xié)議的虛擬化模塊137(“虛擬化模塊137”)。
每個(gè)區(qū)域看來(lái)是在HTTP協(xié)議層上的一個(gè)完全的網(wǎng)站。為了實(shí)現(xiàn)此目的而不必對(duì)每個(gè)區(qū)域有分別的網(wǎng)站服務(wù)器,虛擬模塊137使單個(gè)網(wǎng)站服務(wù)器表現(xiàn)得好象多個(gè)網(wǎng)站服務(wù)器那樣。這就大大地減少了開(kāi)發(fā)和維護(hù)的費(fèi)用,而允許每個(gè)區(qū)域?yàn)樵贖TTP協(xié)議層上的完全的網(wǎng)站。
圖35示出了在一個(gè)開(kāi)發(fā)工作站110上的網(wǎng)絡(luò)(Web)瀏覽器、虛擬化模塊137、及網(wǎng)站服務(wù)器145之間的通信路徑。在開(kāi)發(fā)工作站110上的網(wǎng)絡(luò)瀏覽器將所有的或有選擇的(如下討論取決于連接的類型)對(duì)網(wǎng)站內(nèi)容的請(qǐng)求導(dǎo)向虛擬化模塊137。需要的話,虛擬化模塊137改變請(qǐng)求的目錄路徑,使目錄路徑取決于發(fā)出請(qǐng)求的區(qū)域(此區(qū)域稱為“觀察區(qū)域”--“Viewing area”)或其他希望的位置(如下所述)。換言之,發(fā)送到虛擬化模塊137的HTTP請(qǐng)求在需要時(shí)被重新定向到對(duì)應(yīng)于觀察區(qū)域或其他希望的位置。
在處理HTTP請(qǐng)求以后,虛擬化模塊137將HTTP請(qǐng)求轉(zhuǎn)送到網(wǎng)站服務(wù)器145,它從請(qǐng)示指定的位置取出所請(qǐng)求的文檔。網(wǎng)站服務(wù)器145將此所請(qǐng)示的文檔(若找不到是錯(cuò)誤信號(hào))送回到虛擬化模塊137,它又將所請(qǐng)求的文檔(或錯(cuò)誤信號(hào))轉(zhuǎn)送回網(wǎng)絡(luò)瀏覽器。
虛擬化模塊137使用映射規(guī)則來(lái)判斷是否和如何改變一個(gè)HHTP請(qǐng)求。映射規(guī)則將一個(gè)表達(dá)式映射到另一個(gè)表達(dá)式。映射規(guī)則被等式分成兩邊。映射規(guī)則的左手邊是規(guī)則表達(dá)式,它定義需被相匹配為一個(gè)變量模式的部分。映射規(guī)則的規(guī)則表達(dá)式符合在數(shù)學(xué)和計(jì)算機(jī)科學(xué)領(lǐng)域中規(guī)則表達(dá)式的很好確定的規(guī)則,而且在一個(gè)實(shí)施例中,在映射規(guī)則中使用的規(guī)則表達(dá)式和在UNIX操作系統(tǒng)中的規(guī)則表達(dá)式(如regex(5)擴(kuò)展的規(guī)則表達(dá)式)同樣方法應(yīng)用。
映射規(guī)則的右手邊是替代表達(dá)式(即代替左手邊規(guī)則表達(dá)式的表達(dá)式)。在替代表達(dá)式中,記號(hào)$N(N是“1”、“2”、…“9”)表示左手邊的模式的前十個(gè)部分,它們用規(guī)則表達(dá)式的括號(hào)符()分開(kāi)(如$1代表左手邊的第一個(gè)模式,$2代表左手邊的第二個(gè)模式,等)。
HTTP請(qǐng)求修改以下面的次序分成三個(gè)部分區(qū)域前綴/文檔根前綴/請(qǐng)求文件之名模塊137借助于改變文檔根前綴和請(qǐng)求的區(qū)域前綴將HTTP請(qǐng)求重新定向。文檔根前綴是“文檔根”的路徑名,其中文檔根是對(duì)網(wǎng)站服務(wù)器的源目錄。文檔根是文件系統(tǒng)中的目錄,在此目錄下網(wǎng)站服務(wù)器尋找所請(qǐng)求的文件(除非指定的其他情況)。文檔根也能看作它的根目錄的網(wǎng)站服務(wù)器的標(biāo)記。
一個(gè)區(qū)域的頂層目錄不必是文檔根。一個(gè)開(kāi)發(fā)者可以設(shè)置一個(gè)區(qū)域,使得一個(gè)區(qū)域的頂層目錄不對(duì)應(yīng)于網(wǎng)站服務(wù)器的文檔根。對(duì)網(wǎng)站服務(wù)器實(shí)際的文檔根可以在頂層區(qū)域目錄下存留任意數(shù)的目錄。
對(duì)一個(gè)區(qū)域的文檔根可以用專門的映射規(guī)則來(lái)規(guī)定。在一個(gè)實(shí)施例中,每個(gè)分支有一組映射規(guī)則,在此實(shí)施例中,沿著一個(gè)特定分支的每個(gè)區(qū)域具有用專門的’_docroot’映射規(guī)則規(guī)定的同樣的文檔根。
對(duì)一特定分支的文檔案,一個(gè)映射規(guī)則的例子如下所述_docroot=/directory A/directiry B如果原始的URL請(qǐng)求是GET/documents/index.html,文檔根前綴將附在原始請(qǐng)求的第一個(gè)“/”前面。換言之,前綴/目錄A/目錄B將附在“/documents/index.html前面。
有這樣的情況,希望使用其他前綴替代文檔根前綴。
這種情況包括一個(gè)開(kāi)發(fā)者在文檔根目錄外配置內(nèi)容目錄,使用內(nèi)容目錄的別名,或者在區(qū)域?qū)討?yīng)用任意的轉(zhuǎn)換。對(duì)這些特殊情況存在映射規(guī)則,如果該請(qǐng)求與這些特殊映射規(guī)則相匹配,映射規(guī)則的替代表達(dá)式(右手邊)是將前綴附到請(qǐng)求上而不是附到文檔根前綴上。例如,假設(shè)下面是對(duì)特殊分支的映射規(guī)則
/special(.*)=/Foo$l如果原始請(qǐng)求是GET/speciai/index.html,前綴“/Foo”被加到“/index.html”。
區(qū)域前綴被附在文檔根前綴的前面,或者(如果合適的話)附在替代文檔根前綴的專門的前綴前面。借助于解碼與原始請(qǐng)求一起傳過(guò)來(lái)的“cookie”導(dǎo)出區(qū)域前綴。一個(gè)cookie是少量網(wǎng)絡(luò)游覽器存儲(chǔ)并傳到虛擬化模塊137的少量不變的數(shù)據(jù)。一個(gè)cookie能包括各種類型的信息(例如,用戶的識(shí)別符,用戶會(huì)話的識(shí)別符(“session ID”,端口號(hào)等)一個(gè)那樣的類型可以是觀察區(qū)域的路徑的識(shí)別符。在一個(gè)實(shí)施例中,cookie包括實(shí)際的區(qū)域前綴。在另一個(gè)實(shí)施例中,虛擬化模塊從cookie取出另外類型的信息,如會(huì)話ID或端口號(hào),而且在外部檢查表中檢查出該區(qū)域前綴,該表把取出的信息類型映射到區(qū)域前綴。
為繼續(xù)文檔前綴例子,如果從帶著原始請(qǐng)求傳輸?shù)腸ookie導(dǎo)出的區(qū)域前綴是“/iw-mount/default/main/workarea/joe”,變換以后的請(qǐng)求如下GET/iw-mount/default/main/workarea/joe/directory A/directory B/document/index.html。
無(wú)論網(wǎng)絡(luò)瀏覽器把所有HTTP請(qǐng)求導(dǎo)向虛擬化模塊137或者在某些方面取決于包含在子系統(tǒng)中HTML文檔中的連接的類型。至少有三種不同的連結(jié)類型包含在HTML文檔中,即一個(gè)相對(duì)連結(jié),一個(gè)絕對(duì)連結(jié)和一完全合格連結(jié)。完全合格連結(jié)包括一個(gè)明確的協(xié)議規(guī)定和一個(gè)明確的主機(jī)名,其后跟著到文檔的全路徑。一個(gè)絕對(duì)連結(jié)既不包含協(xié)議規(guī)定,也不包含主機(jī)名,但確實(shí)包含一個(gè)到文檔的全路徑。一個(gè)絕對(duì)連結(jié)一般以最初的斜杠(“/”)開(kāi)始。相對(duì)連結(jié)類似于絕對(duì)連結(jié),但其特征是有開(kāi)始的斜杠字符(“/”),它表示該路徑是相對(duì)于當(dāng)前文檔的連結(jié)。換言之,相對(duì)連結(jié)具有除了被請(qǐng)求文檔的真實(shí)名以外當(dāng)前文檔的相同全路徑名。
虛擬化模塊能處理所有三種連結(jié)。如果儲(chǔ)存在系統(tǒng)100中的HTML內(nèi)容需要完全合格連接的虛擬化,網(wǎng)絡(luò)瀏覽器配置成能將所有請(qǐng)求送到虛擬化模塊137。許多公共的網(wǎng)絡(luò)瀏覽器支持帶有配置設(shè)置的特征。按照一個(gè)實(shí)施例,如果網(wǎng)站不需要管理完全合格連結(jié),該網(wǎng)絡(luò)瀏覽器只傳送絕對(duì)和相對(duì)HTML連結(jié)到虛擬化模塊137。網(wǎng)站服務(wù)器通常不需要對(duì)絕對(duì)和相對(duì)連結(jié)作專門的配置,來(lái)自動(dòng)地發(fā)送請(qǐng)求到虛擬化模塊137。
圖36a-b示出了為了處理絕對(duì)和相對(duì)請(qǐng)求虛擬化模塊137的操作。虛擬化模塊137在步驟3610從一個(gè)開(kāi)發(fā)工作站110上的網(wǎng)絡(luò)瀏覽器接收一個(gè)HTTP請(qǐng)求,且在步驟3620從該請(qǐng)求中取出統(tǒng)一資源定位符(Uniform ResourceLocator-URL)的地址。虛擬化模塊137還在步驟3630取出與URL地址一起發(fā)送的cookie。
然后虛擬化模塊137在步驟3640判斷該請(qǐng)求是絕對(duì)請(qǐng)求或者相對(duì)請(qǐng)求。在一個(gè)請(qǐng)求實(shí)施例中,這些請(qǐng)求由下述事實(shí)區(qū)分,一個(gè)相對(duì)HTML請(qǐng)求在它被虛擬化模塊137處理以前(這是由網(wǎng)絡(luò)瀏覽器自動(dòng)完成的)總是附有一個(gè)區(qū)域前綴,但一個(gè)絕對(duì)HTML請(qǐng)求在被虛擬化模塊137處理以前不附有區(qū)域前綴。如果請(qǐng)求是相對(duì)的,該請(qǐng)求已被指向正確的文件系統(tǒng)和目錄(即,從這些文件系統(tǒng)和目錄訪問(wèn)觀察文檔),而且虛擬化模塊137在步驟3690將請(qǐng)求傳送到網(wǎng)站服務(wù)器。
如果該請(qǐng)求是絕對(duì)請(qǐng)求,虛擬化模塊137在步驟3650搜索對(duì)應(yīng)于觀察區(qū)域存留的分支的映射規(guī)則,并在步驟3660中選擇適當(dāng)?shù)那熬Y(一個(gè)文檔根前綴或者根據(jù)映射規(guī)則的一個(gè)專門前綴(如上所述))。虛擬化模塊137在步驟3670按照適當(dāng)?shù)挠成湟?guī)則將所選的前綴附加到初始請(qǐng)求或那里的一個(gè)部分。
虛擬化模塊137在步驟3680取出或從cookie導(dǎo)出(如前面所討論)該區(qū)域前綴并將其附加到在步驟3670附加的前綴的前面。該請(qǐng)求的路徑或其一部分已經(jīng)完成,因而模塊137在步驟3690將修改后的請(qǐng)求導(dǎo)向網(wǎng)站服務(wù)器145。
圖37示出虛擬模塊137處理完全合格連結(jié)的方法。虛擬模塊137在步驟3710接收從一個(gè)開(kāi)發(fā)工作站110上的一個(gè)網(wǎng)絡(luò)瀏覽器來(lái)的HTTP請(qǐng)求,并在步驟3720從該請(qǐng)求取出URL和cookie。
虛擬模塊137隨后在步驟3730通過(guò)映射規(guī)則搜索完全合格請(qǐng)求,并判斷,該請(qǐng)求是否匹配映射規(guī)則的規(guī)則表達(dá)式。若不是,在步驟3780該請(qǐng)求被送到網(wǎng)站服務(wù)器。如果是,虛擬化模塊137在步驟3756將由映射規(guī)則得出的前綴按照映射規(guī)則附到該請(qǐng)求或其部分上。
虛擬化模塊137在步驟3760從cookie取出或?qū)С?如上所討論)區(qū)域前綴,并在步驟3770將其附在在步驟3750附上的前綴前面。該請(qǐng)求的路徑完全了,虛擬化模塊137在步驟3780將被修改的請(qǐng)求導(dǎo)向網(wǎng)站服務(wù)器145。
虛擬化模塊137動(dòng)態(tài)地聯(lián)接從外部網(wǎng)站服務(wù)器來(lái)的內(nèi)容。在某些情況,如果該文檔未駐留在原先搜索的位置(如觀察區(qū)域)虛擬化模塊使文檔請(qǐng)求能被動(dòng)態(tài)地重新導(dǎo)向到外部網(wǎng)站服務(wù)器。如果一個(gè)文檔請(qǐng)求帶著HTTP錯(cuò)誤碼’404 File not found(文件未找到)’,此虛擬化模塊137搜索映射規(guī)則,而且如果找到匹配,它按照匹配規(guī)則改變?cè)撜?qǐng)求。改變后的請(qǐng)求隨后被指定的外部目標(biāo)網(wǎng)站服務(wù)器。
虛擬化模塊137也提供從不現(xiàn)分支內(nèi)容的動(dòng)態(tài)聯(lián)接。在某些情況,網(wǎng)站的內(nèi)容能被分解到不同的開(kāi)發(fā)分支中。在這些情況,如果虛擬化模塊137收到錯(cuò)誤碼’404 File not found’,虛擬化模塊137就用另外分支的文檔根前綴替代現(xiàn)有的文檔根前綴。然后將改變后的請(qǐng)求發(fā)送到網(wǎng)站服務(wù)器145。
圖28示出為了完成基于位置或基于分支的動(dòng)態(tài)聯(lián)接,虛擬化模塊的操作。虛擬化模塊137從網(wǎng)站服務(wù)器145接收HTTP請(qǐng)求的結(jié)果。從此結(jié)果虛擬化模塊判斷,請(qǐng)求文檔是否被找到。若是,虛擬化模塊在步驟3825將請(qǐng)求的文檔送到初始將請(qǐng)求發(fā)送給虛擬化模塊137的網(wǎng)絡(luò)瀏覽器。如果文檔未找到,虛擬化模塊在步驟3830搜索映射規(guī)則,在步驟3840判斷,發(fā)送到網(wǎng)站服務(wù)器的HTTP請(qǐng)求或其部分是否與任何一個(gè)規(guī)則的左手邊匹配。若是,該請(qǐng)求在步驟3850按照該映射規(guī)則被改變,并在步驟3860被送到適當(dāng)?shù)木W(wǎng)站服務(wù)器。
熟悉本專業(yè)的人能理解,本發(fā)明能以其他特定形式實(shí)現(xiàn)而不背離其精神與內(nèi)在的特點(diǎn)。網(wǎng)站開(kāi)發(fā)者正是實(shí)際應(yīng)用這里揭示的本發(fā)明的許多人之一。這里揭示的發(fā)明的其他應(yīng)用包括開(kāi)發(fā)源程序碼、媒體文件(如CD-ROM多媒體)、媒體發(fā)動(dòng)機(jī)等。因此,本發(fā)明揭示的內(nèi)容僅是示例性的,而不是對(duì)下面權(quán)利要求宣布的發(fā)明范圍的限制。
權(quán)利要求
1.一種開(kāi)發(fā)網(wǎng)站的方法在一個(gè)工作區(qū)域編輯一個(gè)選擇對(duì)象;將所述工作區(qū)域的內(nèi)容提交到一架構(gòu)區(qū)域;將所述工作區(qū)域的所述內(nèi)容與提交到所述架構(gòu)區(qū)域的其他內(nèi)容集成;判斷所述的其他內(nèi)容是否與所述工作區(qū)域的所述內(nèi)容沖突;和響應(yīng)于不是與所述工作區(qū)域的所述內(nèi)容有沖突的所述其他沖突,使該架構(gòu)區(qū)域的內(nèi)容進(jìn)入網(wǎng)站的一個(gè)編輯。
2.一種文件管理系統(tǒng),包括一個(gè)工作區(qū)域,所述工作區(qū)域是具有讀和寫操作的文件系統(tǒng),使一個(gè)用戶能在所述工作區(qū)域編輯文件;一個(gè)架構(gòu)區(qū)域,所述架構(gòu)區(qū)域是一個(gè)具有讀和版本操作的文件系統(tǒng),適合于接收所述工作區(qū)域的內(nèi)容;和一個(gè)編輯區(qū)域,所述編輯區(qū)域是一個(gè)具有讀操作的文件系統(tǒng),適合于接收所述架構(gòu)區(qū)域的內(nèi)容。
3.如權(quán)利要求2所述的系統(tǒng),其特征在于,進(jìn)一步包括多個(gè)工作區(qū)域,而且所述架構(gòu)區(qū)域適合于接收并檢查在多個(gè)工作區(qū)域中的二個(gè)或多個(gè)工作區(qū)域的內(nèi)容中的沖突。
4.在具有多個(gè)文件系統(tǒng)的系統(tǒng)中,一種保持在每個(gè)文件系統(tǒng)中的一個(gè)條目的內(nèi)容的識(shí)別符的方法,并且所述條目包括在該文件系統(tǒng)中,其特征在于,所述方法包括使所述歷史對(duì)象與所述條目關(guān)聯(lián);和對(duì)包括所述條目的文件系統(tǒng),在所述所述歷史對(duì)象中保持一個(gè)項(xiàng),指出所述內(nèi)容與在那個(gè)文件系統(tǒng)中的所述條目相關(guān)聯(lián)。
5.如權(quán)利要求4所述的方法,其特征在于,進(jìn)一步包括響應(yīng)于使新內(nèi)容與多個(gè)文件系統(tǒng)之一中的所述條目相關(guān)聯(lián),改變對(duì)應(yīng)所述文件系統(tǒng)的歷史對(duì)象的一個(gè)項(xiàng),指出所述條目具有所述的內(nèi)容;和將在所述新內(nèi)容中的參照加到以前的內(nèi)容中。
6.如權(quán)利要求5所述的方法,其特征在于,進(jìn)一步包括借助于判斷在一個(gè)第二條目中的內(nèi)容是否為所述條目的以前的內(nèi)容,判斷所述的第二個(gè)條目是否與所述條目沖突。
全文摘要
一種文件管理的系統(tǒng)與方法包括層次結(jié)構(gòu)文件系統(tǒng),稱之為“區(qū)域”。有三類區(qū)域工作區(qū)域、架構(gòu)區(qū)域和編輯區(qū)域。工作區(qū)域是可修改文件系統(tǒng),在工作區(qū)域中用戶可建立、編輯和刪除文件及目錄。架構(gòu)區(qū)域是只讀文件系統(tǒng),它支持選擇版本操作。工作區(qū)域的諸多用戶可以借助于將它們的工作區(qū)域的內(nèi)容提交給架構(gòu)區(qū)域來(lái)集成他們的工作。在架構(gòu)區(qū)域中開(kāi)發(fā)者能比較他們的工作并看到他們的工作如何相互配合。一個(gè)編輯是只讀文件系統(tǒng)。架構(gòu)區(qū)域的內(nèi)容被虛擬地拷貝到一個(gè)編輯中,建立架構(gòu)區(qū)域內(nèi)容的一個(gè)凍結(jié)的、只讀的映象。本系統(tǒng)和方法的對(duì)文件管理的一種使用是作為網(wǎng)站開(kāi)發(fā)工具。
文檔編號(hào)G06F9/44GK1318168SQ99804877
公開(kāi)日2001年10月17日 申請(qǐng)日期1999年2月4日 優(yōu)先權(quán)日1998年2月4日
發(fā)明者R·納卡諾, T·T·W·伊, B·H·帕克, S·L·巴爾, J·S·希亞, G·赫奇, K·科克倫 申請(qǐng)人:英特沃汶股份有限公司