在EMF框架中最終會(huì)根據(jù)模型生成代碼,還可以反復(fù)生成。還能使你自己編輯的內(nèi)容不丟失。夠好玩的吧。那么這部分是怎么實(shí)現(xiàn)的呢?看過一點(diǎn)EMF介紹就可以知道EMF是通過JET完成代碼生成的動(dòng)作的。在《使用?Eclipse?Modeling?Framework?進(jìn)行建模》這個(gè)系列的文章就可以了解到這一點(diǎn)。在該系列文章的第三部分還可以了解到使用JMerge 可以實(shí)現(xiàn)“成的代碼插入現(xiàn)有的代碼中,或者允許以后的開發(fā)人員來定制所生成的代碼,而不需要在重新生成代碼時(shí)重新編寫任何內(nèi)容。”這樣的功能。
他是通過創(chuàng)建Junit 測試類作例子的。他說過的東西我就不啰嗦了。我只是把我個(gè)人在看了他文章后的一些東西整理一下。
好,現(xiàn)在進(jìn)入正題。
首先我們來說一說JMerge這個(gè)名字。Merge這個(gè)單詞是合并的意思。前面加了一個(gè)“J”不用多說,肯定表示Java了(完全是參考Junit,log4j……)。那么我就大膽
猜測這個(gè)工具是用來合并Java代碼的。既然是合并就應(yīng)該符合下圖描述的動(dòng)作。
合并肯定是把兩個(gè)東西和成一個(gè)。所以圖中的Java Source A 和Java Source B就分別代表需要合并的部分了。最后的Result of Merge就是合并后的那一個(gè)結(jié)果了。應(yīng)為我們合并的是Java代碼。這些代碼如何合并,也就是我們期望的合并結(jié)果是什么樣的。圖中的Rule of merge就是代表的這部分信息。
在下面使用Jmerge的代碼中
清單 1.
調(diào)用 JMerge
?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?}
我們可以很容易的找出它們的對(duì)應(yīng)物。
我們先從JMerger的創(chuàng)建開始看起吧。
uri += "templates/merge.xml";
JMerger jmerger = new JMerger();
JControlModel controlModel = new JControlModel( uri );
jmerger.setControlModel( controlModel );
這里用一個(gè)名為為為為叫merge.xml
的文件作為為為為輸輸輸input
參數(shù)創(chuàng)創(chuàng)竄新建了一個(gè)JControlModel
對(duì)象。傳傳
傳給JMerger
對(duì)象。做完這些后又調(diào)調(diào)用了
setSourceCompilationUnit
和
setTargetCompilationUnit
方法。他們們們
們的類類
類型都是IDOMCompilationUnit
(用
過的朋友都會(huì)知道他就代表了一個(gè)Java
文件
)。很榮榮容易就會(huì)想起他們
們肯定就是Java
Source A
和Java
Source B
了至于Rule
of merge
可以通過
過調(diào)用
merger.merge()
后的
getContents
()方法獲
。獲得
除了這種調(diào)用
方式外還有一個(gè)更
簡單
的調(diào)用方式:
String
contents = merger.execute(null, new String[] { mergeXML,
source,target });
看了
execute
實(shí)現(xiàn)后就
不難
發(fā)現(xiàn)他的還
是使用的第一
種。
關(guān)于具體如何定制合并規(guī)則
和使用條件打算在下一篇中寫。