Eclipse Modeling Framework(EMF)中包含了一个开放源代码的工具 JMerge(org.eclipse.emf.codegen.merge.java.JMerger),这个工具可以使代码生成更加灵活,可定制性更好。本文使用一个例子来展示如何将 JMerge 添加到一个应用程序中,并为不同的环境定制 JMerge 的行为。
前面几篇文章介绍了有关 Eclipse 的 Java Emitter Templates (JET)和代码生成的知识,在那几篇文章中,您已经看到如何通过使用模板和代码生成器来节省时间,并实现模式级的代码重用。然而在大部分情况中,这都还不够。您需要能够将所生成的代码插入现有的代码中,或者允许以后的开发人员来定制所生成的代码,而不需要在重新生成代码时重新编写任何内容。理想情况下,代码生成器的创建者希望可以支持今后开发人员所有的需求:从修改方法的实现、修改各种方法签名,到修改所生成类的继承结构。这是一个非常有趣的问题,目前还没有很好的通用解决方案;但是有一个很好的纯 Java 的解决方案,称为 JMerge(Java Merge)。应用场景:现在想允许用户定制所生成的测试类;然而在原有类的接口发生变化时,仍然需要重新生成代码。要实现这种功能,可以使用 JMerge。
从插件中调用 JMerge 的代码非常简单:
private static final String JMerger_Config = "com/yapulan/jfes/jmerge/merge.xml";
// 模板生成的文件
File src = new File("generated-jmergesrc/com/yapulan/jfes/jmerge/Hello.java.gen");
// 生成的代码文件
File target = new File("generated-jmergesrc/com/yapulan/jfes/jmerge/Hello.java");
JControlModel model = new JControlModel();
ASTFacadeHelper astFacadeHelper = new ASTFacadeHelper() {
Map<String, String> options;
@SuppressWarnings("unchecked")
@Override
public Map getJavaCoreOptions() {
if (logger.isDebugEnabled()) {
logger.debug("getJavaCoreOptions() - start");
}
if (options == null) {
options = new HashMap<String, String>();
options.put(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_6);
options.put(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_6);
options.put(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_1_6);
options.put(JavaCore.COMPILER_PB_ASSERT_IDENTIFIER, JavaCore.ERROR);
options.put(JavaCore.COMPILER_PB_ENUM_IDENTIFIER, JavaCore.ERROR);
options.put(JavaCore.COMPILER_CODEGEN_INLINE_JSR_BYTECODE, JavaCore.ENABLED);
options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED);
Map cfo = DefaultCodeFormatterConstants.getEclipseDefaultSettings();
options.putAll(cfo);
options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_AFTER_PACKAGE, "1");
}
if (logger.isDebugEnabled()) {
logger.debug("getJavaCoreOptions() - end");
}
return options;
}
};
ClassLoader loader = Thread.currentThread().getContextClassLoader();
model.initialize(astFacadeHelper, UtilTools.saveUrlAsFile(loader.getResourceAsStream(JMerger_Config)).getPath());
JMerger jMerger = new JMerger(model);
jMerger.setSourceCompilationUnit(jMerger.createCompilationUnitForInputStream(new FileInputStream(src)));
jMerger.setTargetCompilationUnit(jMerger.createCompilationUnitForInputStream(new FileInputStream(target)));
jMerger.merge();
String contents = jMerger.getTargetCompilationUnit().getContents();
这会创建一个新的 JMerger 实例,以及一个 URI merge.xml,设置要合并的来源和目标,并调用 merger.merge()。然后合并的内容就可以展开为 merger.getTargetCompilationUnit()。
merge.xml:
<?xml version="1.0" encoding="UTF-8"?>
<merge:options
xmlns:merge="http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options">
<merge:dictionaryPattern name="generatedMember"
select="Member/getComment" match="\s*@\s*(gen)erated\s*\n" />
<merge:dictionaryPattern name="generatedUnmodifiableMembers"
select="Member/getComment" match="\s*@\s*(unmod)ifiable\s*\n" />
<merge:pull sourceMarkup="^unmod$" sourceGet="Member/getFlags"
targetPut="Member/setFlags" />
<!-- if target is generated, transfer -->
<!-- change to sourceMarkup if the source is the standard -->
<merge:pull targetMarkup="^gen$" sourceGet="Method/getBody"
sourceTransfer="(\s*//\s*begin-user-code.*?//\s*end-user-code\s*)\n"
targetPut="Method/setBody" />
<!--
copy comments except between the begin-user-doc and end-user-doc tags
-->
<merge:pull sourceMarkup="^gen$" sourceGet="Type/getComment"
sourceTransfer="(\s*<!--\s*begin-user-doc.*?end-user-doc\s*-->\s*)\n"
targetMarkup="^gen$" targetPut="Type/setComment" />
<!-- force transfer of all unmodifiable elements -->
<merge:pull sourceMarkup="^unmod$" sourceGet="Method/getBody"
targetPut="Method/setBody" />
</merge:options>
sourceGet 必需的。该值必须是 附录 A 中列出的一个选项,如 "Member/getBody"。
targetPut 必需的。该值必须是 附录 A 中列出的一个选项,如 "Member/setBody"。
sourceMarkup 可选的。用来在触发 merge:pull 规则之前过滤必须匹配源代码的 dictionaryPatterns 。格式如 "^dictionaryName$",也可以使用 "|" 将多个 dictionaryPatterns 合并在一行中。
targetMarkup 可选的。用来在触发 merge:pull 规则之前过滤必须匹配目标代码的 dictionaryPatterns。格式如 "^dictionaryName$",也可以使用 "|" 将多个 dictionaryPatterns 合并在一行中。
sourceTransfer 可选的。一个正则表达式,指定要传递给目标代码的源代码的数量。
Hello.java.gen:
/**
* 辅助文件头部分,不可修改。
* @generated
*/
public class Hello {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String aa;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void say() {
System.out.println("测试不容许修改代码!");
// begin-user-code
// end-user-code
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @unmodifiable
*/
public void sayHelloTo(String name) {
System.out.println("测试不容许修改代码!" + name);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @unmodifiable
*/
public void sayHelloTo1(String name) {
System.out.println("测试不容许修改代码!" + name);
}
public void test() {
}
}
Hello.java:
public class Hello {
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public String aa;
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public void say() {
System.out.println("测试不容许修改代码!");
// begin-user-code
System.out.println("添加11111任何代码!");
// end-user-code
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @unmodifiable
*/
public void sayHelloTo(String name) {
System.out.println("测试不容许修改代码!" + name);
}
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @unmodifiable
*/
public void sayHelloTo1(String name) {
System.out.println("测试不容许修改代码!" + name);
}
public void test() {
}
}
分享到:
相关推荐
emf-sdo-xsd-SDK-2.3.2.zip
GUI设计,emf,gef,visual editor
emf-sdo-SDK-2.2.0(2) eclipse 可视化 界面设计。 因为size太大,所以分成了2部分,另一部分在 emf-sdo-SDK-2.2.0(1)里面。 emf-sdo-SDK-2.2.0(1)的下载地址: http://download.csdn.net/source/1002774
Eclipse 3.6.1(Helios)的插件。emf-runtime-2.6.1.7z。
struts emf-sdo-xsd-SDK-2.0.1.zip
eclipse plugin 最新 emf-runtime 版本2.10.1 (eclipse modeling framework,emf)
emf-sdo-xsd-SDK-2.4.0.zip emf是Eclipse modeling framework组建框架的缩写;SDO是服务数据对象的缩写,它是Java程序的一种数据编程框架;emf-sdo-xsd-SDK-2.4.0.zip是Eclipse编程器的组成员之一。
图形界面插件 emf-sdo-runtime-2.2.0.zip
emf-runtime-2.6.1开源IDE Eclipse VE的相关组件
myeclipse ,swing ,chajian,解压,添加
eclipse可视化插件安装必备插件之一:emf-sdo-runtime-2.2.0。eclipse全部可视化插件正确配置是eclipse-SDK-3.2-win32,emf-sdo-runtime-2.2.0,GEF-runtime-3.2,VE-runtime-1.2,VE-SDK-1.2
EMF,安装eclipse插件所需要jar包 含xsd等完整包
emf-sdo-SDK-2.2.0(1) eclipse 可视化插件。 因为size太大,所以分成了2部分。还有一部分在 emf-sdo-SDK-2.2.0(2)。 emf-sdo-SDK-2.2.0(2)的下载地址: http://download.csdn.net/source/1002804
Eclipse 插件Eclipse 插件Eclipse 插件Eclipse 插件Eclipse 插件Eclipse 插件
这是一款实现java可视化的软件,有了它才能安装你想要的Visual Editor
emf-sdo-xsd-Examples
emf-sdo-runtime-2.1.zip