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

  这一讲将详细介绍acceleo提供的模板服务,主要有九种:上下文服务、类型服务、对象服务、属性服务、需求服务、资源服务、专用服务、字符串服务和xpath服务。

一、上下文服务

  上下文服务提供了关于上下文和栈的服务。

1、get

  get(String):返回key参数在当前上下文中所引用的对象。

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

  参数:字符串key(key引用了当前上下文的对象)

  返回:key引用的对象

  详细描述:get允许通过key从当前脚本上下文中获取对象,当然前提是先通过put服务将此对象与key关联(put/get应该是通过hash操作实现的,put会在后面描述)。上下文是指当前脚本以及被其调用的子脚本。例如当某次计算非常复杂时,可以只计算一次,后将此结果值通过put与key联系起来。然后下次用到时,通过get(key)获取。如果key没有关联任何对象,则返回空对象。

  应用举例:

  <%myObjet.put(“ idOfMyObject ”)%>

  <%get(“ idOfMyObject ”).name%>

  第一条脚本命令会生成空的字符串,然后将myObjet与“ idOfMyObject ”关联。

  第二条脚本命令get(“ idOfMyObject ”).name返回的是对象myObjet的名字。

2、put

  put(String):将输入类型通过key保存。

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

  参数:字符串key(key引用了当前上下文的对象)

  返回:空

  详细描述:put通过key保存输入类型,组成(key,value)对。

  应用举例同上。

3、peek()

  peek()返回上下文栈的栈顶对象。

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

  返回:如果栈不空,返回栈顶对象,如果栈空,返回空对象。

  应用举例:(假设a是一个对象)

  <%a.push()%>: 将对象a入栈,当然生成的字符串是空的。
  <%peek().name%>: 返回对象a的名字。
  <%peek().type%>: 返回对象a的类型。
  <%pop()%>: a对象出栈,也会生成空的字符串。
  <%peek()%>: 因为此时栈已经空了,所以返回的是空对象。

4、pop()

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

  返回:空

  应用举例:

  <%a.push()%>: 将a入栈。
  <%b.push()%>: 将b入栈。
  <%pop()%>: b出栈,生成空的字符串。
  <%c.push()%>: 将c入栈。
  <%pop()%>: c出栈,生成空的字符串。
  <%pop()%>: a出栈,生成空的字符串。

5、push()

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

  返回:空

  应用举例同上。

二、类型服务

 1、adapt

  adapt(String):将输入类型转换成参数指定的类型

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

  参数:枚举string类型,值可以是EObject, String, boolean, int, double, List, ENodeList

  返回:转换后的值

  详细描述:adapt服务将输入类型转换成参数指定的类型,如果输入为空类型,则返回空对象。

  应用举例:

  <%(" 1234 ").adapt(“ int ”)%>将字符串“1234”转换成int并输出。

2、cast(建议不用)

  cast(String),类似filter服务,从输入对象列表中选择出指定的对象列表

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

  参数:string类型,值是需要选出的类型

  返回:指定类型的对象列表

  应用举例:

  <%eAllContents().cast(“Class”)%>,eAllContents服务返回输入对象的所有孩子对象,AllContents().cast(“Class”)返回的是其中的class类型或其对象。

  不建议用cast,推荐用filter。

3、current

  current()返回当前对象。

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

  输出:当前对象

  详细描述:类似于java中的this,保存当前对象指针。current()的输入可以显示,但在script或for中也可以隐式给出。在script中,current()返回的是(<%script type=“ object ”..%>)中指定的对象,在for中,current()返回的是本次迭代的对象。current()可以用于比较对象,如果输入为空,则返回空对象。

  应用举例:

  <%for (eAllContents(“ Attribute ”) {%>
    <%eAllContents(“ Class ”)[name == ' ” + current().name + “ ' ].name%>
  <%}%>

  此例中,只有class名与当前迭代属性名相同时,输出类名。

4、current

  current(ENode)返回当前对象。

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

  参数:对象所在层次,如果是整数,0表示当前层,1表示上一层,2表示上上层……,当然也可以是字符串

  返回:指定层次的对象

  应用举例:

  <%for (eAllContents(“ Package ”)) {%>
    <%for (eAllContents(“ Class ”)) {%>
      <%for (attributes) {%>
        <%current(0).name%>
        <%current(1).name%> == <%current(“Class”).name%>
        <%current(2).name%> == <%current(“Package”).name%>
      <%}%>
    <%}%>
  <%}%>

  current(0) 表示 attributes
  current(1) 表示 classes
  current(2) and current(“Package”) 表示 packages

5、debug

  在控制台中简短显示当前对象信息。

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

  返回:当前对象

  详细描述:debug服务显示当前对象的类型和值,它调用了trace服务。

6、filter

  Filter(String):从接受对象列表中筛选出参数指定的对象,类似于cast服务。

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

  参数:字符串类型,值为筛选对象的类型

  返回:参数指定的类型列表

  应用举例:

  <%eAllContents().filter(“ Class ”)%>返回当前类型的所有孩子类型中的class或对象。

7、minimize

  minimize():删除接受类型中的所有重复对象,不建议使用

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

  返回:唯一对象列表

  详细说明:调用了toString服务来比较对象,如果接受类型为空,则返回空。

  应用举例:假设a, b, c, d, e为对象

  {a, a, b, b, b, c, d, e, e, e, e},minimize() 返回的结果是 {a, b, c, d, e}。

8、nContains

  nContains(ENode):表示一个元素是否为接受类型列表中。

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

  参数:想要寻找的元素

  返回:如果列表中存在此元素,返回true,否则false。

  应用举例:对于一个对象列表{a, b, c}

  nContains(a) 返回 “true”
  nContains(d) 返回 “false”

9、nFirst

  nFirst():返回列表的首元素

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

  返回:列表的首元素

  详细描述:此服务调用了nGet(0)服务。

  应用举例:同样对于上一例中的对象列表,此服务返回a

10、nGet

  nGet(String):类似于get(String),返回与key关联的对象,不建议使用

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

  参数:字符串类型,值为关联对象的key

  返回:当前上下文中与key关联的对象

  应用举例:

  <%myObjet.nPut(“ idOfMyObject ”)%> 
  <%nGet(“ idOfMyObject ”).name%> 参考get与put服务。

11、nGet

  nGet(int):根据参数索引,返回对象列表中的指定对象

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

  参数:int索引

  返回:指定索引的对象

  详细描述:如果类型列表为空或索引越界,则返回空对象。

  应用举例:

  如果一个模型包含三个类:“c1”, “c2” 和 “c3”, “eAllContents(“Class”)”返回了这些类的列表,则<%eAllContents(“ Class ”).nGet(0).name%> 与 <%eAllContents(“ Class ”).nGet(1).name% > 分别返回是c1和c2。

12、nGet

  nGet(int, int):根据参数索引,返回列表中的子列表。

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

  参数:int begin: 子列表的起始索引

     int end: 子列表的终止索引

  返回:指定范围内的对象

  应用举例:

  同样对于上面的例子,<%eAllContents(“ Class ”).nGet(0,1).name.sep(",")%> 返回的是 “c1,c2”

            <%eAllContents(“ Class ”).nGet(1,2).name.sep(",")%> 返回的是 “c2,c3”

13、nLast

  nLast():返回对象列表的最后一个对象

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

  返回:列表的最后一个对象

  应用举例:

  同样用8中的例子,用此服务返回的结果是“c”。

14、nMinimize

  nMinimize():删除列表的重复元素

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

  返回:唯一对象的列表

  应用举例同7。

15、nPeek

  nPeek(),同peek(),建议使用peek()

16、nPop

  nPop(),同pop(),建议使用pop()

17、nPush

  nPush(),同push(),建议使用push()

18、nPut

  nPut(),同put(),建议使用put()

19、nReverse

  nReverse():将对象列表逆序

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

  返回:逆序后的对象列表

  应用举例:{a, b, c}调用此服务后,返回{c, b, a}。

20、nSize

  nSize():返回对象列表的大小

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

  返回:对象列表的对象个数

  应用举例:

  <%eAllContents(“ Class ”).nSize()%>返回接受类型列表中class的个数。

  如果类中至少有一个属性,此服务还可用于方法的生成,如在<%if (attributes.nSize() > 0) {%> 和 <%}%>之间添加生成的方法。

21、nSort

  nSort():将对象列表排序

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

  返回:排序后的对象列表

  详细描述:将对象列表从低到高排序,其中调用了toString方法,相当于进行了字符串排序。

  应用举例:

  {“class”, “attribute”, “5”, “stereotype”, “class”}调用此服务后返回{ “5”, “attribute”, "class", “class”, “stereotype”}。

22、nSort

  nSort(String):根据指定字符串表达式排序

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

  参数:string表达式

  返回:排序后的对象列表

  应用举例:

  对象列表{d, a, c, f, b, e}的名字假设是{“class”, “attribute”, “5”, “stereotype”, “class”},则<%nSort(name)%>返回结果是{ “5”, “attribute”, "class", “class”, “stereotype”}。

23、reverse

  reverse(),同nReverse(),建议使用nReverse()

24、sep

  sep(String):在对象列表的每两个对象之间增加区分符。

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

  参数:string区分符

  返回:添加区分符后的对象列表

  详细描述:对应对象列表只有一个对象,则不添加区分符;如果对象列表为空,则返回空。

  应用举例:{a, b, c},应用sep("\t")后返回{a, “\t”, b, “\t”, c}。

25、sepStr

  sepStr(String),同sep(String),建议使用sep(String)

26、sort

  sort(),同nSort(),建议使用nSort()

27、sort

  sort(String),同nSort(String),建议使用nSort(String)

28、toString

  toString():将对象转换为字符串

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

  返回:对象的字符串形式

  详细描述:类似于java中的toString(),将对象转换为字符串。

  应用举例:假设a,b,c是EMF对象,mylist是对象列表{a,b,c}

  <%eAllContents().nSize().toString()%>返回是对象个数的字符串形式

  <%a.toString()%>返回了对象a的描述信息,即“package_of_a.type_of_a (attribut1: valeur1, attribut2: valeur2, ..) ”

  <%myList.toString()%>返回了每个对象的描述信息,即“package_of_a.type_of_a(attribut1a: valeur1a, attribut2a: valeur2a, ..) package_of_b.type_of_b (attribut1b: valeur1b, attribut2b:valeur2b, ..) package_of_c.type_of_c (attribut1c: valeur1c, attribut2c: valeur2c, ..) ”

29、trace

  trace():显示当前对象的简要描述。

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

  返回:对象的简要描述(类型和值)

  应用举例:假设a是一个类

  <%a.trace()%>输出的是[numberOfTheTrace] type = class value = “a”。

30、trace

  trace(String):根据参数,显示对象的指定信息

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

  参数:字符串类型,值为要显示的信息名

  返回:对象的指定描述信息

  应用举例:

  <%for (attributes){%>
    <%trace(“ name ”)%>
  <%}%>

  显示了所有属性的名字。

31、until

  until(String,String):调用参数指定的对象

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

  参数:String link: 对象类型链接

     String type: 对象类型

  返回:寻找到的对象

  详细描述:此服务递归寻找type的link,直到找到为止。

  应用举例:

  a,b,c分别是类A,B,C的实例,container是class类型的link,c.container 返回 b,b.container 返回 a,a.container 返回 null。

  <%c.until(“ container ”, “ A ”).name%>: 生成了a的名字
  <%a.until(“ container ”, “ A ”)%>: 生成了a的名字
  <%b.until(“ container ”, “ C ”)%>: 生成空的字符串

二、总结

  本讲详细讲解了模板服务中的两种服务:上下文服务和类型服务,剩余的七种服务将在下文给出讲解。

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