在EMF框架中最終會根據模型生成代碼,還可以反復生成。還能使你自己編輯的內容不丟失。夠好玩的吧。那么這部分是怎么實現的呢?看過一點EMF介紹就可以知道EMF是通過JET完成代碼生成的動作的。在《使用?Eclipse?Modeling?Framework?進行建模》這個系列的文章就可以了解到這一點。在該系列文章的第三部分還可以了解到使用JMerge
可以實現“成的代碼插入現有的代碼中,或者允許以后的開發人員來定制所生成的代碼,而不需要在重新生成代碼時重新編寫任何內容。”這樣的功能。
他是通過創建Junit
測試類作例子的。他說過的東西我就不啰嗦了。我只是把我個人在看了他文章后的一些東西整理一下。
好,現在進入正題。
首先我們來說一說JMerge這個名字。Merge這個單詞是合并的意思。前面加了一個“J”不用多說,肯定表示Java了(完全是參考Junit,log4j……)。那么我就大膽
猜測這個工具是用來合并Java代碼的。既然是合并就應該符合下圖描述的動作。
合并肯定是把兩個東西和成一個。所以圖中的Java
Source A 和Java Source
B就分別代表需要合并的部分了。最后的Result
of
Merge就是合并后的那一個結果了。應為我們合并的是Java代碼。這些代碼如何合并,也就是我們期望的合并結果是什么樣的。圖中的Rule
of merge就是代表的這部分信息。
在下面使用Jmerge的代碼中
清單 1.
調用 JMerge
?1?
??//?
?2?
????????JMerger?merger?=?getJMerger();
?3?
????????
?4?
????????//?set?source
?5?
????????merger.setSourceCompilationUnit(
?6?
????????????????merger.createCompilationUnitForContents(generated));
?7?
????????
?8?
????????//?set?target
?9?
????????merger.setTargetCompilationUnit(
10?
????????????????merger.createCompilationUnitForInputStream(?
11?
????????????????????????new?FileInputStream(target.getLocation().toFile())));
12?
????????
13?
????????//?merge?source?and?target
14?
????????merger.merge();
15?
16?
????????//?extract?merged?contents
17?
????????InputStream?mergedContents?=?new?ByteArrayInputStream(
18?
????????????????merger.getTargetCompilationUnit().getContents().getBytes());
19?
????????????????
20?
????????//?overwrite?the?target?with?the?merged?contents
21?
????????target.setContents(mergedContents,?true,?false,?monitor);
22?
????????//?
23?
24?
//?
25?
private?JMerger?getJMerger()?{
26?
????????//?build?URI?for?merge?document
27?
????????String?uri?=?
28?
???????????Platform.getPlugin(PLUGIN_ID).getDescriptor().getInstallURL().toString();
29?
????????uri?+=?"templates/merge.xml";
30?
????????????????
31?
????????JMerger?jmerger?=?new?JMerger();
32?
????????JControlModel?controlModel?=?new?JControlModel(?uri?);
33?
????????jmerger.setControlModel(?controlModel?);
34?
????????return?jmerger;
35?
}
我們可以很容易的找出它們的對應物。
我們先從JMerger的創建開始看起吧。
uri += "templates/merge.xml";
JMerger jmerger = new JMerger();
JControlModel controlModel = new JControlModel( uri );
jmerger.setControlModel( controlModel );
這里用一個名為為為為叫merge.xml
的文件作為為為為輸輸輸input
參數創創竄新建了一個JControlModel
對象。傳傳傳給JMerger
對象。做完這些后又調調用了
setSourceCompilationUnit
和
setTargetCompilationUnit
方法。他們們們們的類類類型都是IDOMCompilationUnit
(用過的朋友都會知道他就代表了一個Java
文件
)。很榮榮容易就會想起他們們肯定就是Java
Source A
和Java
Source B
了至于Rule
of merge
可以通過過調用merger.merge()
后的getContents
()方法獲獲得
。
除了這種調用
方式外還有一個更簡單
的調用方式:
String
contents = merger.execute(null, new String[] { mergeXML,
source,target });
看了 execute
實現后就不難發現他的還是使用的第一種。
關于具體如何定制合并規則和使用條件打算在下一篇中寫。