快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
一个 方法在目标类不存在,就会被创建。如果一个方法只在源类中存在,而在目标类不存在, 就会被保留。

清单 2. 一个非常简单的 merge.xml

<?xml  version="1.0" encoding="UTF-8"?> <merge:options xmlns:merge=   "http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options">   <merge:pull    sourceGet="Method/getBody"     targetPut="Method/setBody"/> </merge:options>

区分 生成的方法

这种简单的方法有一个非常明显的问题:每次修改源类并重新生成代 码时,此前所做的修改就全部丢失了。我们需要增加某种机制来告诉 JMerge 有些方法已 经被修改过了,因此这些方法不应该被重写。要实现这种功能,可以使用 <merge:dictionaryPattern> 元素。merge:dictionaryPattern 允许您使用正则表 达式来区分 Java 元素(参见清单 3)。

清单 3. 一个简单的 dictionaryPattern

<merge:dictionaryPattern    name="generatedMember"   select="Member/getComment"   match=     "\s*@\s*(gen)erated\s*\n"/> <merge:pull    targetMarkup=     "^gencontentquot;   sourceGet="Method/getBody"    targetPut="Method/setBody"/>

dictionaryPattern 定义了一个正 则表达式,它可以匹配注释中包含 " @generated " 的成员。select 属性列出了要对这 个成员的哪些部分与在 match 属性中给出的正则表达式进行比较。dictionaryPattern 是由字符串 gen 定义的,它就是 match 属性值中圆括号中的内容。

merge:pull 元素多了一个附加属性 targetMarkup 。这个属性可以匹配 dictionaryPattern ,它必 须在应用合并规则之前对目标代码进行匹配。此处,我们正在检查的是目标代码,而不是 源代码,因此用户可以定制这些代码。当用户删除注释中的 " @generated " 标签时, dictionaryPattern 就不会与目标代码匹配,因此就不会合并这个方法体。请参见清单 4 。

清单 4. 定制代码

/**  * test case for getName  *     @generated   */ public void testSimpleGetName()  {  // because of the @generated tag,   // any code in  this method will be overridden }  /**  * test case for  getName  */ public void testSimpleSetName() {  // code  in this method will not be regenerated  }

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

时间:2011-03-26 IBM Adrian Powell

您或许会 注意到有些元素是不能定制的,任何试图定制这些代码的企图都应该被制止。为了支持这 种功能,要定义另外一个 dictionaryPattern ,它负责在源代码(而不是目标代码)中 查找其他标记,例如 @unmodifiable 。然后再定义一条 pull 规则,来检查 sourceMarkup ,而不是 targetMarkup ,这样就能防止用户删除标签或阻碍合并操作。 请参见清单5。

清单 5. 不可修改代码的 merge.xml

<merge:dictionaryPattern    name="generatedUnmodifiableMembers"   select="Member/getComment"   match=     "\s*@\s*(unmod)ifiable\s*\n"/> <merge:pull     sourceMarkup="^unmodcontentquot;    sourceGet="Member/getBody"    targetPut="Member/setBody"/>

细粒度的定制

在使用这种解决 方案一段时间之后,您将注意到有些方法在定制的代码中具有一些通用的不可修改的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号