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 ”)%>: 生成空的字符串
二、总结
本讲详细讲解了模板服务中的两种服务:上下文服务和类型服务,剩余的七种服务将在下文给出讲解。