在我们使用jet生成代码的时候,会出现一些在原有代码基础之上,增量生成代码的情况。JMerger就是jet中负责代码覆盖的类。
1.JMerger的使用:
// 模板文件所在插件项目的名称
String pluginId = "demo3";
// 模板文件在项目中的路径及文件名
String uri = Platform.getBundle(pluginId).getEntry("/").toString();
uri += "templates/demo4.jet";
// 声明 JETEmitter
JETEmitter emitter = new JETEmitter(uri);
IProgressMonitor progress = new NullProgressMonitor();
// 声明一个 Map 作为数据变量集的 container
Map argument = new HashMap();
argument.put("fileName", fileName);
argument.put("className", fileName.substring(0, fileName.indexOf(".")));
// 对当前模板进行转换并将需要输出成实际文件的内容返回以便通过输出流输出
String result = emitter.generate(progress, new Object[] { argument });
// 声明 JMerger
JMerger jmerger = new JMerger();
// 合并规则文件在项目中的路径及文件名
String uri2 = Platform.getBundle(pluginId).getEntry("/").toString();
uri2 += "/templates/emf-merge.xml";
// 声明 JControlModel,作为合并规则
JControlModel controlModel = new JControlModel(uri2);
jmerger.setControlModel(controlModel);
// 在 JMerger 中设置需要合并的源文件内容
jmerger.setSourceCompilationUnit(jmerger
.createCompilationUnitForContents(result));
// 在 JMerger 中设置需要合并的目标文件内容
jmerger.setTargetCompilationUnit(jmerger
.createCompilationUnitForInputStream(new FileInputStream(file
.getLocation().toFile())));
// 对 JMerger 中目标文件与源文件进行内容合并
jmerger.merge();
return new ByteArrayInputStream(jmerger.getTargetCompilationUnit()
.getContents().getBytes());
下面有一个连接,讲的比较详细: