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)%>是空参数“”。
六、总结
本讲又介绍九种服务中的五种服务,后文将介绍最后的两种服务,并将为该教程画上圆满的句号。