在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
实现后就不难发现他的还是使用的第一种。
关于具体如何定制合并规则和使用条件打算在下一篇中写。