Model to Text工具Acceleo使用教程(六)——模板服务

  本讲开始详细介绍acceleo提供的剩余七种服务。

一、对象服务

1、eAllContents

  eAllContents():返回当前对象的所有孩子对象

  接受类型:EMF对象

  返回:家族对象列表

  详细描述:此服务返回了所有直接或间接的孩子对象,不区分类型,即返回所有类型的对象。

  应用举例:假设a,b,c,d,e是对象,a包含b,c,b包含d,d包含e,则

  <%a.eAllContents()%>: 返回 {b, c, d, e}
  <%b.eAllContents()%>: 返回 {d, e}
  <%e.eAllContents()%>: 返回空对象

2、eAllContents

  eAllContents(String):返回指定类型的对象

  接受类型:EMF对象

  参数:stirng类型,值为需要返回对象的类型

  返回:家族对象列表

  应用举例:假设p是包,a是其中的class,此类包含三个属性:int b, int c, 和 boolean d。包p中还有另一个类e,它有三个属性:int f,string g,和对象h,则

  <%p.eAllContents()%>: 返回 {a,b, c, d,e, f,g,h}
  <%p.eAllContents(“ Class ”)%>: 返回 {a, e}
  <%p.eAllContents(“ String ”)%>: 返回 {g}
  <%a.eAllContents(“ int ”)%>: 返回 {b, c, f}
  <%a.eAllContents(“ String ”)%>: 返回空列表

3、eClass

  eClass():返回类型的类

  接受类型:EMF对象

  返回:类型的类

  详细描述:此服务返回与当前类型对应的元模型中的类,类似于java语言中提供的class属性。

  应用举例:

  <%if (a.eClass().name == “ Class ”) {%> 中间指令<%}%>,只有当a是一个类时才执行中间指令。

4、eContainer

  eContainer():返回父亲对象

  接受类型:EMF对象

  返回:父亲对象

  详细描述:此服务将返回父亲对象,而不管父亲是什么类型,如果父亲是空,返回空

  应用举例:假设a是类,包含了b属性,则

  <%b.eContainer()%>: 返回 a
  <%a.eContainer()%>: 返回空对象

5、eContainer

  eContainer(String):返回指定类型的父亲对象

  接受类型:EMF对象

  参数:string类型,值为需要返回的父亲对象的类型

  返回:指定类型的父亲对象

  应用举例:假设p是包,包含了类a,a中有字符串属性b,则

  <%a.eContainer(“ Package ”)%>: 返回 “p”
  <%b.eContainer(“ Package ”)%>: 返回 “p”
  <%p.eContainer(“ Package ”)%>: 返回空对象
  <%a.eContainer(“ String ”)%>: 返回空对象

6、eContainingFeature

  eContainingFeature():返回父亲包含的特征

  接受类型:EMF对象

  返回:父亲包含的特征

  应用举例:<%eContainingFeature()%>

7、eContainmentFeature

  eContainmentFeature(),类似于eContainingFeature()

8、eContents

  eContents():返回类型的直接孩子对象(区别于eAllContents

  接受类型:EMF对象

  返回:直接孩子对象列表

  应用举例:假设p是包,包含类a,a中有属性b,c,则

  <%a.eContents()%>: 返回 {b, c,}
  <%p.eContents()%>: 返回 {a}
  <%b.eContents()%>: 返回空

9、eCrossReferences

  eCrossReferences():返回所有引用类型对象

  接受类型:EMF对象

  返回:引用对象列表

  应用举例:类a继承b, b实现了掊接口c。a中包含属性d,e,则

  <%a.eCrossReferences()%>返回{b,c}

10、eResource

  eResource():返回包含模型的文件的路径

  接受类型:EMF对象

  返回:模型文件路径

11、eResourceName

  eResourceName():返回模型文件名字(包含扩展名)

  接受类型:EMF对象

  返回:模型文件名字

  应用举例:如果此服务应用于“C:/Obeo/models/MyModel.xmi” 中的某个对象上,则返回 “MyModel.xmi”。

12、getRootContainer

  getRootContainer():返回包含当前对象的顶层对象

  接受类型:EMF对象

  返回:顶层对象

  应用举例:如果a包含b, b包含c,则

  <%c.getRootContainer()%>返回a

13、load

  load(String):加载模型并返回其根对象

  接受类型:EMF对象

  参数:模型文件路径

  返回:模型文件的顶层对象

  应用举例:

  <%load(“ //UML2_LIBRARIES/UML2PrimitiveTypes.library.uml2 ”)%>返回UML2模型的根元素。

二、属性服务

  属性是以key=value的形式保存在文件中的,文件扩展名为.properties,属性首先寻找当前目录下的key,如找不到,再在模板中寻找,如果仍找不到,返回Empty feature evaluation异常。如果发现多个key,则只使用第一次找到的那个value。为了使用reflective的预览特性,属性文件必须和模板文件在同一个目录下

1、getBestProperty

  getBestProperty(String):返回与参数最接近的key的值 

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:string类型,值为key(属性的标识符)

  返回:最接近的属性值

  详细描述:此服务首先在属性文件中寻找key,如找不到,用一个更小的key寻找,直到找到为此,先在属性文件中找,后在模板中找,如最终扔找不到,返回Empty feature evaluation异常。

  应用举例:给定一个key “aa.bb.cc.dd”, 如果getProperty(“aa.bb.cc.dd”)返回空,则用getProperty(“aa.bb.cc”)继续,如仍找不到,则用getProperty(“aa.bb”)……如此反复

  可以利用此性质,为一系列相同前缀的属性设置默认属性值,这样这些属性就至少有一个属性值

2、getProperty

  getProperty(String):返回key的value

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:string类型,值为key(属性的标识符)

  返回:key的属性值

3、getProperty

  getProperty(String,String):在指定文件中,寻找key的关联属性值

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:string类型,值为文件的名字(不包含扩展名)

     string类型,值为key(属性的标识符)

  返回:key的属性值

 三、需求服务

1、delete

  delete(String):删除条件指定的列表元素

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:条件表达式

  返回:满足条件表达式的元素列表

  应用举例:<%eAllContents(“ Class ”).delete(“ attributes.nSize() == 0 ”))%去掉了没有属性的class。

  不建议使用delete服务,建议使用[],[]是xpath语法,用于过滤元素

2、delete

  delete(String,String):删除两个参数相等时对应的元素

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:string类型,条件表达式的左边

     string类型,条件表达式的右边

  返回:满足条件表达式的元素列表

   应用举例:<%eAllContents(“ Class ”).delete(“ attributes.nSize() ”, “ 0 ”)%>去年了没有属性的class。同上,也不建议使用

3、evaluate

  evaluate(String):表达式求值

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:string类型,值为表达式

  返回:表达式的计算结果

  应用举例:<%evaluate(eAllContents(“ Class ”).attributes.nSize().sep(“ + ”).toString())%>返回了所有类的属性的个数。

4、select

  select(String):根据指定条件选择对象

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:string类型,值为表达式

  返回:满足条件的对象列表

  应用举例:<%eAllContents(“ Class ”).select(“ attributes.nSize() == 0 ”)%>返回所有没有属性的类。

  不建议使用selete服务,建议使用[]

5、select

  select(String,String):删除两个参数相等时对应的元素

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:string类型,条件表达式的左边

     string类型,条件表达式的右边

  返回:满足条件表达式的元素列表

   应用举例:<%eAllContents(“ Class ”).selete(“ attributes.nSize() ”, “ 0 ”)%>过滤所有没有属性的class。同上,也不建议使用

四、资源服务

1、getFileContent

  getFileContent(String):以string的形式返回文件的内容

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:string类型,值文件的路径

  返回:文件的内容

  详细描述:如果文件为空或无法访问,返回空的buffer。

  应用举例:<%getFileContent(“ C:/Obeo/models/MyModel.xmi ”)%>返回了MyModel.xmi的内容。

2、getChainPath

  getChainPath():返回根链(chain)路径

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:根链路径

  应用举例:<%getChainPath()%>

五、专用服务

  专用服务是acceleo专用的语法服务。

1、i

  i():返回当前迭代索引

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  返回:当前迭代索引

  应用举例:public void method(<%for (parameters) {%><%if (i() != 0) {%>, <%}%><%type%> <%name%><%}%>) {..

2、args

  args(int):脚本调用传递参数时,获取参数值

  接受类型:ENode(也就是所有对象类型:int, double, boolean, String, ENodeList, EObject)

  参数:参数索引

  返回:指定索引的参数值

  应用举例:假如通过<%myScript (“ test ”, “ otherTest ”)%>调用myScript脚本,则在脚本myScript中<%script type=“ Property ” name=“ myScript ”%>,<%args(0)%>表示参数“test”,<%args(1)%>表示参数“otherTest ”,而<%args(6)%>是空参数“”。

六、总结

  本讲又介绍九种服务中的五种服务,后文将介绍最后的两种服务,并将为该教程画上圆满的句号。

posted @ 2012-05-23 15:56  程序员姜小白  阅读(2502)  评论(0编辑  收藏  举报