八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  232 随笔 :: 0 文章 :: 3015 评论 :: 11 Trackbacks

用过EMF的人想必都对它的代码生成功能印象深刻吧,有没有想过这是怎样实现的呢?

代码生成一般是通过写好的模板,在用户输入一些限制条件后,由程序把这两者结合起来得到需要的代码。EMF也是这样,它内置了一些模板(放在 org.eclipse.emf.codegen.ecore里),我们通过Java Interface或XML Schema文件建立ecore模型后(这一步由org.eclipse.emf.codegen.ui支持),插件 org.eclipse.emf.codegen帮我们生成model、edit、editor和test这几个新的插件,这些生成的插件就可以被用来构 造应用程序了。

EMF使用JET(Java Emitter Templates)进行代码生成,JET使用的模板文件与JSP格式几乎完全一致,像JSP里有application这样的隐含变量一样,在JET模 板文件里可以使用argument这个隐含变量,它代表用户的输入参数(对EMF来说就是ecore模型)。下面是一个最简单的带有参数的模板文件 hello.txtjet,JET模板文件的扩展名一般是要生成文件类型再加上jet。

<%@ jet package="hello" class="GreetingTemplate" %>
Hello, 
<%=argument%>!


只要给这个模板文件一个参数,JET就能帮我们生成一个字符串,其内容是“Hello,参数!”。如果我们定义一个.javajet的模板,配合适当的参数,再把生成的字符串保存为文件,就得到了java代码,EMF的代码生成过程就是如此。

自己实现代码生成器的过程如下:创建一个Plugin项目,编写模板文件.javajet,一般放在templates目录下;定义元模型,这个元 模型要与模板相匹配,模板的argument一般就是元模型最外层的container;构造一个用户界面,让用户可以构造元模型的实例;提供一个 Action比如按钮,用户按下即开始生成代码。

代码的生成是由JETEmitter完成的,它会在workbench里先生成一个.JETEmitter项目,把模板转换为java类(这个过程类似JSP转换为Servlet),然后调用这些类的generate()方法得到结果。

我做了一个生成.txt文件的生成器插件,点此下载。安装后在Eclipse主菜单里选File->New->Others,在New对话框里选择Sample Wizards下的Echo filename text file,新建的文本文件内容里会包含文件名。

因为用途有限,JET的资料不是很多,这里有两篇:链接1链接2,其中后者在EMF的帮助里也找得到。

最后补充一个Tip,在plugin里访问一个相对路径文件的方法如下:

String base = Platform.getBundle(pluginId).getEntry("/").toString();
String relativeUri 
= "templates/echo.txtjet";
JETEmitter emitter 
= new JETEmitter(base + relativeUri, getClass().getClassLoader());

更正(08/23),上面说的方法只对JETEmitter有效,得到的路径是Platform内部路径而非本地路径,这里提供另一个方式可以得到本地路径:

Platform.asLocalURL(Platform.getBundle(pluginId).getEntry("/log4j.properties"))
posted on 2005-08-16 00:33 八进制 阅读(3972) 评论(13)  编辑 收藏 所属分类: EclipseEMF

评论

你好!
用google搜gef的资料搜到了你的blog上,发现你的文章对我的帮助非常大。
赫赫,感觉大牛们似乎都认识,你这里有竹笋炒肉的链接,他那里有车东的链接。
希望能email或者msn联系,因为现在正在做的事情(Eclipse插件开发)需要帮助。
谢谢!
email:hopeshared@tom.com
msn: hopeshared_lee@hotmail.com
  回复  引用    

#2楼 [楼主] 2005-08-17 10:06 八进制      
你好,我的邮件地址是bjzhanghao(AT)21cn.com,欢迎讨论。
  回复  引用  查看    

#3楼  2005-08-17 15:53 youth [未注册用户]
请问,jet还有一个扩展部分,jmerge的应用,能不能指点一下呢。研究了半天,还是很晕
  回复  引用    

#4楼 [楼主] 2005-08-24 09:51 八进制      
不好意思,还没有研究过。
  回复  引用  查看    

#5楼  2005-11-15 13:01 jwang [未注册用户]
jet再ECLIPSE3.0以后没有BUG,但是再WSAD5.1.1的时候有个大BUG,不过ECLIPSE官方网站有人给出解决方案,我已经使用了,没有问题,可以修复那个BUG
  回复  引用    

不错~~~加油~~IBM的精英~
  回复  引用    

如果这个算作灌水我很抱歉我的确不明白~~如果联系我~MSN:JING83729@HOTMAIL.COM
  回复  引用    

#8楼  2006-09-14 21:09 shipeng [未注册用户]
八进制,你好!我对你研究的EMF,GMF,JET非常感兴趣,尤其是在MDA方面。最近正好有个项目迫切需要用到这方面的东西,能share一下你的经验么。我的邮箱shipeng@cn.ibm.com
sametime: shipeng@cn.ibm.com
迫切希望CRL的大牛帮我指点一下!
  回复  引用    

#9楼 [楼主] 2007-06-18 16:58 八进制      
新版的JET和以前大不一样了,这里有一个介绍http://www.ibm.com/developerworks/opensource/library/os-ecl-jet/?S_TACT=105AGX52&S_CMP=cn-a-os
  回复  引用  查看    

#10楼  2007-09-26 19:24 cliff4 [未注册用户]
我的代码转化插件,在我测试运行的时候,可正常生成代码,
可是我把插件导出后,作为插件运行却不行,
感觉问题在于路径上,但不知道怎样解决,请赐教。
  回复  引用    

#11楼  2007-09-26 19:25 cliff4 [未注册用户]
我的邮箱是cliff4@21cn.com
谢谢
  回复  引用    

#12楼  2008-06-18 09:31 新手cc [未注册用户]
@cliff4
请问你的代码是如何转化为插件的?
希望大牛们能够赐教!
  回复  引用    

#13楼  2008-08-13 14:02 pfzhan [未注册用户]
谢谢八进制的分享
  回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-01-07 22:09 编辑过


相关链接: