当前位置: 首页 > news >正文

Model to Text工具Acceleo使用教程(三)——一个简单的代码生成模块

  前面对Acceleo的知识背景和基本架构进行了讲解,接下来就将开始模型到代码的生成了。本讲将逐步讲解一个简单的代码生成模块(UML to Html)。Acceleo的代码生成是基于模板的,所以有了输入模型(如UML)后,需要建立对应模型的模板,然后生成代码。原理如图1所示。

图1 基于模板的Acceleo

1、新建项目

  首先,切换到Acceleo视图,新建generator project。此处,我们可以命名为“acceleo.uml2.gen.xhtml”。接下来,我们需要输入模型。

2、建立模型

  目前,可用的建模工具有很多,Acceleo提供了很好的机制来兼容这些不同的建模工具,可以兼容ArgoUML, Poseidon, Umbrello or Rational Rose等。更多兼容工具请参考点击此处。

  此处,我们暂时用Topcased新建了一个UML2模型,可以点击下载WebLog_fr.uml。

  注意:Acceleo也兼容UML1.3/1.4,用户可以通过Acceleo-->Convert EMF转为将其转换为UML2。

3、建立模板

  有了模型之后,我们就需要建立模板来将模型转换成代码了。通过 Empty Generator新建空的模板。

  因为我们的源模型是UML2,所以我们在Registry values选择UML2的URI(统一资源标识符),假设此处我们想要为每个class生成一个文件,需要在type values选择uml.class。完成后就生成了一个空的模板,如图2所示。

图2 空的UMl2模板

4、生成代码

  在生成代码之前,先介绍acceleo的一种特殊的编辑器 reflective editor,它提供了一种模型的树状结构视图,并集成了Acceleo的几乎所有功能。我们将在此编辑器下将UML2模型生成HTML。在acceleo中,可以通过 Open As->Acceleo XMI打开此编辑器。

  接下来比较重要的一步,就是将模型与模板绑定,即指定模型用哪个模板。在reflective editor下,任意选择一个目标结点,通过Acceleo -> Select Template为此模型结点指定模板,当指定成功后,在outline视图中,相应结点(如此处的class)会变成带右箭头的图标,如图3所示。图3表示class的模板绑定成功,可以将class生成代码。

图3 模板绑定成功后,相关结点图标变成箭头

  当然,前面我们建立的模板是空的,所以class生成的代码也是空的。所以需要将模板写全,图4是写全后的模板,可以点击此处下载sample template from UML2 to XHTML。关于的模板的更多语法,大家可以参考documentation section 和 sample generator modules。

图4 UML to HTML的模板

  当模板写全并保存后,通过Acceleo -> Reload Template 更新模板。如此反复,直到模板能够满足自己的要求。

  最后也就是最重要的一步,就是生成代码了。通过Acceleo -> Generate files可以将代码生成到文件中(此处,我们设置文件保存在doc文件夹下)。我们可以看到,acceleo为每个class生成了一个文件,如图5所示。

图5 class模板生成的html代码

5、批量代码生成

  上面完成了单个模板到代码的生成,如果模型很多呢?不用担心,acceleo提供了批量生成的功能,即链文件(chain files)。

  • 新建项目:New -> Project -> Simple -> Simple Project
  • 新建链:New -> Chain
  • 定制元模型,如第3步所示。
  • 选择链的模型、模板和名字。
  • 在新建的.chain文件下,右击执行Launch,文件即自动生成了。

6、总结

  本讲从一个简单的代码生成器(UML to HTML)开始,介绍了其使用流程,并讲了批量模型生成的情况,下一讲我们开始介绍acceleo模板的语法,以便大家设计自己需要的模板。

 

 

 

转载于:https://www.cnblogs.com/jpcflyer/archive/2012/05/21/2512036.html

相关文章:

  • UVa11426 最大公约数之和(正版)
  • mac os下通过命令行的方式编译c++代码并在xcode里引用
  • 房地产英语 Real estate词汇
  • 根据Forms名找出其所归属的权限组
  • oss web直传
  • dd-wrt达到300Mbps的关键设置
  • 跨域
  • [转载] 考试经验——2011下半年信息系统项目管理师论文52分者谈论文写作经验...
  • 『TensorFlow』TFR数据预处理探究以及框架搭建
  • shell开发基础:准备100万条测试数据在MYSQL中
  • 十个生成模型(GANs)的最佳案例和原理 | 代码+论文
  • Linux中如何让进程(或正在运行的程序)到后台运行?[zz]
  • Spring Boot快速入门(一):Hello Spring Boot
  • 一致性hash
  • LabView和DLL中的参数问题
  • ----------
  • hexo+github搭建个人博客
  • 分享一款快速APP功能测试工具
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Java编程基础24——递归练习
  • Java基本数据类型之Number
  • k8s如何管理Pod
  • Lucene解析 - 基本概念
  • PAT A1050
  • Python学习之路13-记分
  • swift基础之_对象 实例方法 对象方法。
  • 码农张的Bug人生 - 见面之礼
  • 使用docker-compose进行多节点部署
  • 收藏好这篇,别再只说“数据劫持”了
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习JavaScript数据结构与算法 — 树
  • 【干货分享】dos命令大全
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Semaphore
  • ![CDATA[ ]] 是什么东东
  • (6)添加vue-cookie
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (三)uboot源码分析
  • (四)Linux Shell编程——输入输出重定向
  • (转)JAVA中的堆栈
  • (转)使用VMware vSphere标准交换机设置网络连接
  • *1 计算机基础和操作系统基础及几大协议
  • .bat批处理出现中文乱码的情况
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Mobi域名介绍
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET Framework杂记
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .Net多线程总结
  • .NET构架之我见
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)