發(fā)布于:2021-01-16 10:51:24
0
163
0
Eclipse建??蚣埽‥MF)允許從一種非常集中和緊湊的模型語言Ecore生成Java實體。我們喜歡將生成的實體視為“類固醇上的javabean”,它們提供了額外的功能,例如更改通知和反射訪問,而且生成的實體遵循相同的模板,非常類似于javabean(這里有更多關(guān)于EMF的信息)。這允許為不同的用例提供框架,這些用例適用于所有EMF實體。
這種框架的一個例子是EMFStore,EMF實體的服務(wù)器解決方案或“模型存儲庫”。EMFStore允許對實體進(jìn)行并行和分布式編輯,支持連續(xù)的脫機工作。這意味著客戶機可以修改可用的實體,直到它決定一組更改是一致的并且應(yīng)該與其他客戶機共享。通過EMFStore對EMF模型實體的交互式合并的支持,解決了兩個客戶機之間潛在的沖突更改。
試試看!
EMFStore模型庫是一個無頭框架。它通常與定制應(yīng)用程序集成,為EMF實體提供協(xié)作和版本控制。但是,由于方法調(diào)用在視覺上對理解框架的使用沒有幫助,EMFStore還提供了一個現(xiàn)成的示例應(yīng)用程序。這個應(yīng)用程序基于EMF客戶機平臺,EMF的一個通用UI框架。示例客戶機提供了創(chuàng)建模型實體、修改它們以及與EMFStore服務(wù)器同步所有更改的功能。對于這個示例客戶機,您只需要自己的EMF模型和生成的實體就可以試用EMFStore了。
要安裝和運行EMFStore、EMF客戶機平臺并找到示例模型,這里和這里都有文檔。本文使用的示例模型包含保齡球游戲中的實體,例如球員或聯(lián)盟。但是,實體可以來自任何類型的域。
在EMFStore中嘗試的第一件事是為您的模型創(chuàng)建一些實體。一種簡單的方法是使用提供的示例客戶機。EMFStore將實體組織到項目中。示例客戶機提供了一個navigator視圖,其中顯示了所有項目以及包含的實體。編輯器視圖允許您修改所創(chuàng)建實體的所有屬性和引用。使用示例客戶機,您可以在EMFStore服務(wù)器上共享項目之前在本地創(chuàng)建項目(請參見下面的圖1)。
圖1:示例客戶端允許您創(chuàng)建和修改實體
一旦在本地創(chuàng)建了項目,就可以在EMFStore服務(wù)器上共享它。其他客戶端可以簽出共享項目。甚至可以在同一個客戶機上多次簽出同一個項目,例如,為了訪問它的不同版本(參見下面的圖2)。
圖2:EMFStore允許您創(chuàng)建同一項目的多個簽出
與EMFStore共享項目后,將跟蹤應(yīng)用于模型實體的所有更改。要了解其工作原理,可以添加新的模型實體或更改屬性值。這些更改可以通過示例客戶機、自定義客戶機或?qū)嶓w的API(使用setter方法)進(jìn)行。默認(rèn)情況下,更改僅在本地項目中可見。一旦一組一致的更改完成,就可以將它們提交到EMFStore服務(wù)器。示例客戶機將使用一個默認(rèn)對話框,提示用戶輸入提交消息,描述應(yīng)用的更改。此外,提交對話框允許在將更改傳輸?shù)紼MFStore服務(wù)器之前對其進(jìn)行詳細(xì)檢查。提交也可以在沒有任何UI交互的情況下觸發(fā)(見下文)。
圖3:默認(rèn)提交對話框允許查看應(yīng)用的更改并添加描述它們的注釋
提交完成后,其他客戶機可以觸發(fā)更新以從EMFStore服務(wù)器接收最新更改。同樣,示例客戶機將顯示一個對話框,詳細(xì)描述應(yīng)用的更改。此工作流將自動生成所有實體的非常詳細(xì)的歷史記錄。示例客戶機提供了一個查看項目所有早期版本的視圖(參見下面的圖4)。在此視圖中,還可以簽出項目的特定版本。
圖4:歷史視圖允許查看和重新創(chuàng)建項目的所有版本
使用此工作流(提交/更新),任意數(shù)量的客戶端可以在實體(應(yīng)用程序的數(shù)據(jù))上協(xié)作。所有更改都可以在本地完成,即使沒有服務(wù)器連接。如前所述,客戶機之間可能存在沖突的更改。例如,兩個客戶端可以同時為一個實體設(shè)置不同的名稱。為了解決這個沖突,EMFStore服務(wù)器支持模型實體的交互式合并。示例客戶機包括一個用于沖突解決和交互式合并的默認(rèn)UI(參見圖5)。
圖5:如果客戶機之間發(fā)生沖突,合并對話框允許選擇要應(yīng)用的更改
示例客戶機提供了其他功能,例如用于管理對不同服務(wù)器的訪問的存儲庫瀏覽器。示例客戶機的所有UI組件都可以在自定義應(yīng)用程序中重用。這樣,就可以高效地創(chuàng)建一個支持所有特性的初始運行版本。使用EMFStore服務(wù)器的API,這里描述的所有特性也可以在沒有默認(rèn)UI組件的情況下使用。我們將在“API”一節(jié)中更詳細(xì)地描述這個API。
幕后
EMFStore的用例與SVN、CVS或Git等源代碼管理系統(tǒng)(SCM)非常相似。但是,從技術(shù)角度來看,EMFStore的工作原理是不同的。如果對EMF模型實體應(yīng)用了Git等版本控制系統(tǒng),則需要將它們序列化為文件,例如XMI。在提交或更新期間,將比較這些文件以計算應(yīng)用的更改(差異化)。在SCMs中,這個過程是基于行的。雖然它對于原始用例、管理代碼非常有效,但是這種技術(shù)對于模型和模型實體有著明顯的缺點(參見基于操作的模型演化,Maximilian K?gel,Dr.Hut Verlag,ISBN:978-3843900812)。
原因主要是SCM管理文件和文本,但它不考慮模型本身。例如,如果兩個客戶機創(chuàng)建對同一模型實體的引用,SCM可能會檢測到?jīng)_突,因為序列化中的相同行已更改。但是,從模型的角度來看,添加引用可能根本不是沖突。SCM的第二個問題是交互式合并支持,它同樣是基于文本而不是基于模型的。由于實體上的更改(如添加引用)可能會更改序列化中完全不同的位置,因此基于文本的模型實體合并非常困難且容易出錯。對于許多最終用戶應(yīng)用程序,基于文本的合并無論如何都不是一種選擇。
為了解決這些問題,EMFStore使用了EMF模型實體的一個特性。EMF提供了通知實體上所有更改的功能,例如,更改屬性或添加引用。EMFStore的客戶機組件在本地記錄所有這些更改。一旦觸發(fā)了提交,就不需要任何差異??蛻魴C已經(jīng)知道本地應(yīng)用了哪些更改。因此,只需將更改傳輸?shù)椒?wù)器。這同樣適用于更新。
記錄更改創(chuàng)建了另一個主要優(yōu)勢,因為它比區(qū)分文件更精確。如果發(fā)生沖突,EMFStore可以考慮模型實體級別的信息。應(yīng)用的更改不是文件中任意行中的更改–它是對實體的操作,例如“在Y和X之間添加了引用Z”。此附加信息允許更精確地檢測沖突(請參閱上面的參考書)。在發(fā)生沖突的情況下,用戶可以通過在模型實體級別上顯示更改的UI來獲得支持,這比合并文本文件更具信息性。沖突檢測和解決策略甚至可以被調(diào)整,例如,包括特定于域的規(guī)則。最后,EMFStore還提供了一個歷史記錄,它比標(biāo)準(zhǔn)的SCM更詳細(xì)(例如,可以跟蹤應(yīng)用更改的順序)。
API
在“試試看!“,我們基于一個可擴展的示例客戶機來描述最重要的用例。但是,EMFStore也可以獨立于示例客戶機使用,并且可以集成到現(xiàn)有的應(yīng)用程序中。為了向您展示如何做到這一點,我們將介紹emfstoreapi中的一些示例。查看emfstoreapi的詳細(xì)文檔以了解更多信息。
客戶機上的項目在允許您訪問和創(chuàng)建項目的工作區(qū)中進(jìn)行管理。項目由ProjectSpace管理,ProjectSpace的實體包含元信息,例如項目名稱或跟蹤的更改。以下代碼示例檢索當(dāng)前工作區(qū)并創(chuàng)建新的本地項目:
Workspace workspace = WorkspaceManager.getInstance().getCurrentWorkspace(); ProjectSpace projectSpace = workspace.createLocalProject("ProjectName", "Project Description");
下一步是用模型實體填充本地項目。在EMF中,實體是由包含層次結(jié)構(gòu)構(gòu)成的(參見前面的教程示例)。以下調(diào)用將新實體添加到項目中:
projectSpace.getProject().getModelElements().add(myEntity);
使用getter和setter方法對實體進(jìn)行常規(guī)更改,使EMFStore對客戶端透明。如果將新實體添加到其他實體中,它們也會自動添加到項目中。下面的代碼示例更改一個實體的屬性,并將一個新實體添加到另一個實體中。
myEntity.setName(“xxx”); myEntity.getChildren().add(newObject);
創(chuàng)建的項目僅在本地可用,但在下面的代碼示例中,它與EMFStore服務(wù)器共享,因此可用于其他客戶端。要管理與EMFStore服務(wù)器的連接,將創(chuàng)建一個UserSession,其中包含訪問控制的憑據(jù)、服務(wù)器地址和端口。
Usersession usersession = EMFStoreClientUtil.createUsersession("super", "super", "localhost", 8080); projectSpace.shareProject(usersession);
一旦項目在EMFStore服務(wù)器上共享,其他客戶端就可以通過簽出來檢索它。在這種情況下,用戶通常從從服務(wù)器檢索到的可用項目列表中進(jìn)行選擇。下面的代碼示例檢索可用項目的列表,并選擇第一個項目進(jìn)行簽出。
ListprojectList = workspace.getRemoteProjectList(usersession); workspace.checkout(usersession, projectList.get(0));
一旦項目在多個客戶機上共享,就可以同步更改。第一步是對模型實體應(yīng)用更改,例如。someElement.setName(“新名稱”)。這些更改將自動記錄并發(fā)送到EMFStore服務(wù)器:
projectSpace.commit(logMessage, null, new ConsoleProgressMonitor());
反過來,可以從觸發(fā)更新的服務(wù)器檢索更改:
projectSpace.update();
使用share、checkout、commit和update功能,您可以創(chuàng)建一個自定義客戶機,通過EMFStore服務(wù)器同步其數(shù)據(jù)(模型實體)。API提供了許多附加功能,例如檢索當(dāng)前更改的列表或?qū)㈨椖繝顟B(tài)重置為特定版本。
結(jié)論
EMFStore模型存儲庫是一種運行時技術(shù),允許您協(xié)作修改EMF模型實體。使用EMF客戶機平臺提供的示例客戶機,它幫助測試最重要的用例。與現(xiàn)有的源代碼管理系統(tǒng)相比,EMFStore模型存儲庫不直接處理文件,而是在模型級別對實體進(jìn)行版本化。這使得EMF模型實體的精確沖突檢測以及交互式合并成為可能。EMFStore的所有功能也可以通過API觸發(fā)。這允許將EMFStore集成到定制客戶機中,無論是否使用UI。EMFStore是一個開源框架(Eclipse公共許可證)。源代碼、版本和文檔都可以在線獲得。