快速业务通道

使用EMF进行建模,第3部分:使用Eclipse的JMerge定制生成的代码和编辑器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
代码 (例如跟踪和日志记录代码)。此时我们既不希望禁止生成代码,也不希望全部生成整个 方法的代码,而是希望能够让用户定制一部分代码。

要实现这种功能,可以将前 面的 pull 目标替用清单 6 来代替。

清单 6. 细粒度的定制代码

<!-- if target is generated, transfer --> <!--  change to sourceMarkup if the source is the standard --> <merge:pull   targetMarkup="^gencontentquot;    sourceGet="Method/getBody"   sourceTransfer=     "(\s*// \s*begin-user-code.*?//\s*end-user-code\s*)\n"    targetPut="Method/setBody"/>

这样会只重写字符串 " // begin- user-code " 之前和 " // end user-code " 之后的内容,因此就可以在定制代码中保留 二者之间的内容。在上面的正则表达式中, "?" 表示在目标代码中,除了要替换的内容 之外,其他内容全部保留。您可以实现与 JavaDoc 注释类似的功能,这样就可以拷贝注 释,同时为用户定制预留了空间。请参见清单 7。

清单 7. 细粒度的 JavaDoc 定 制

<!-- copy comments except between the begin-user-doc    and end-user-doc tags --> <merge:pull   sourceMarkup="^gencontentquot;  sourceGet="Member/getComment"   sourceTransfer="(\s*<!--\s*begin-user-doc.*?end-user-doc\s*-->\s*)\n"  targetMarkup="^gencontentquot;   targetPut="Member/setComment"/>

要支持这种注释,首先要修改开始 标签和结束标签,使其遵循 HTML 注释语法,这样它们就不会出现在所生成的 JavaDoc 中;然后修改 sourceGet 和 targetPut 属性,以便使用 "Member/ getComment" 和 "Member/ setComment" 。JMerge 允许您在细粒度级别上存取 Java 代码的不同部分。( 更多内容请参见 附录 A)。

下一步

到现在为止,我们已经介绍了如何转 换方法体,但是 JMerge 还可以处理域、初始化、异常、返回值、import 语句以及其他 Java 元素。它们也采用类似的基本思想,可能只需稍加修改即可。参考 plugins/org.eclipse.emf.codegen_1.1.0/test/merge.xml 就可以知道如何使用这些功 能(我使用的是 Eclipse 2.1,因此如果您使用的是其他版本的 Eclipse,那么 ecore 插件的版本可能会不同)。这个例子非常简单,其中并没有使用 sourceTransfer 标记, 但是该例显示了处理异常、标志和其他 Java 元素的方法。

更复杂的例子请参见 EMF 使用 JMerge 的方法: plugins/org.eclipse.emf.codegen.ecore_1.1.0/templates/emf-merge.xml 。从这个例 子中可以看出 EMF 只允许部分定制 JavaDoc,但是采用上面介绍的一些技巧,就可以为 方法体添加支持(这样可以增强 JET 的功能)。

使用EMF进行建模,第3部分:使用Eclipse的JMerge定制生成的代码和编辑器(4)

时间:2011-03-26 IBM Adrian Powell

附录 A:有效的目标选项

在 dictionaryPattern 和 pull 规则中,我们已经使用了 " Member/getComment " 和 " Member/getBody " 以及它们的 setter 方法,但是还有很多其他可用的选项。 JMerge 支持 org.eclipse.jdt.core.jdom.IDOM* 中定义的任何类的匹配和取代。所有可 用的选项如表 1 所示。

表 1. 有效的目标选项

类型 方法 注释
CompilationUnit getHeader/setHeader
getNa me/setName
Field getInitializer/setInitializer 不包含 "="
getName/setName 变量名
getName/setName 类名
Import getName/setName 要么是一个完全限定的 类型名,要么是一个随需应变的包
Initializer getName/setName  
getBody/setBody  
Member getComment/setComment  
getFlags/setFlags 例如: abstract, final, native 等。
Method addException  
addParameter  
getBody/setBody  
getName/setName  
getParameterNames/setParameterNames  
getParameterTypes/setParameterTypes  
getReturnType/setReturnType  
Package getName/setName  
Type addSuperInterface  
getName/setName  
getSuperclass/setSuperclass  
getSuperInterfaces/setSuperInterfaces  

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号