邋遢居

我的Java天堂

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks
Jmerge的使用初步(一)

EMF框架中最终会根据模型生成代码,还可以反复生成。还能使你自己编辑的内容不丢失。够好玩的吧。那么这部分是怎么实现的呢?看过一点EMF介绍就可以知道EMF是通过JET完成代码生成的动作的。在《使用 Eclipse Modeling Framework 进行建模》这个系列的文章就可以了解到这一点。在该系列文章的第三部分还可以了解到使用JMerge 可以实现“成的代码插入现有的代码中,或者允许以后的开发人员来定制所生成的代码,而不需要在重新生成代码时重新编写任何内容。”这样的功能。

他是通过创建Junit 测试类作例子的。他说过的东西我就不啰嗦了。我只是把我个人在看了他文章后的一些东西整理一下。

好,现在进入正题。

首先我们来说一说JMerge这个名字。Merge这个单词是合并的意思。前面加了一个“J”不用多说,肯定表示Java了(完全是参考Junit,log4j……)。那么我就大胆 猜测这个工具是用来合并Java代码的。既然是合并就应该符合下图描述的动作。Jmerge-Name.jpg

合并肯定是把两个东西和成一个。所以图中的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, truefalse, 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 实现后就不难发现他的还是使用的第一种。

关于具体如何定制合并规则和使用条件打算在下一篇中写。



posted on 2006-05-01 08:01 Jet Geng 阅读(2524) 评论(0)  编辑  收藏 所属分类: EclipseEMF

只有注册用户登录后才能发表评论。


网站导航: