JET2的初步了解

 

JET 是指定模板输出工件的语言。实现一些应用程序的模板集合被称为蓝图(blueprint)(用我们的术语)。JET 范例可以用下列等式表示:

参数 + 蓝图 = 所需的工件

 

 

 

1.JET项目结构:

 

jet工程的结构图

 

 

 

sample.xml:

 

1.JET标签:

1)控制标签:

 

main.jet:控制文件,这些文件控制代码生成的执行。main.jet是工程提供的一个类似入口的控制文件。

dump.jet:也是控制文件,由main.jet调用,可以具体看代码。

 

ws:file

该标签属于蓝图的 control 部分,它初始化一个模板。例如:

 

 

<ws:file template="templates/house.java.jet"
path="{$org.eclipse.jet.resource.project.name}/house1.java">

 

将在输入模型上运行 house.java.jet 模板并将结果转储在 $(Project Root)/house1.java 中。{$org.eclipse.jet.resource.project.name} 是一个动态 XPath 表达式,用 org.eclipse.jet.resource.project.name 变量的值替换部分字符串。该变量是由 JET 引擎定义的。

 

 

c:get

该标签将输出 XPath 表达式的结果。例如,Pre<c:get select="/app/@middle" />Post 将输出 PreHelloPost。注意 select 参数将使用 XPath 表达式。要在期望静态字符串的参数中使用 XPath 表达式,可以通过将表达式封装在括号({ 和 })中来调用动态 XPath 表达式。

 

c:iterate

该标签将遍历具有特定名称的节点,为每个节点执行 iterate 的主体。例如:

 

 

<c:iterate select="/app/person" var="currNode" delimiter="," > 
Name = <c:get select="$currNode/@name" />
</c:iterate> 

 

 

将输出 Name = Chris, Name = Nick, Name = Lee, Name = Yasmary。

 

iterate 标签通常也用于控制模板的其实标记。例如,如果要为模型中的每个人创建 Java™ 类,可使用如下代码:

 

 

<c:iterate select="/app/person" var="currPerson">
<ws:file template="templates/PersonClass.java.jet"
path="{$org.eclipse.jet.resource.project.name}/{$currPerson/@name}.java"/>
</c:iterate>

 

这将创建四个 Java 类文件:Chris.java、Nick.java、Lee.java 和 Yasmary.java。注意启动标记 path 属性中的

 

{$currPerson/@name} 字符串。既然 path 参数不需要 XPath 表达式(像 select 参数一样),{...} 字符告知 JET 引擎通过计算 XPath 表达式代替这部分字符串。$currPerson/@name 告诉引擎用 currPerson 节点(是定义在 iterate 标签中的变量)的 name 属性来代替其字符串。

 

此外,在 PersonClass.java.jet 模板中,它可以引用定义在 iterate 标签中的 currPerson 节点变量。例如,假设 PersonClass.java.jet 如下所示:

 

 

class <c:get select="$currPerson/@name" />Person { 
	public String getName() { 
		return "<c:get select="$currPerson/@name" />"; 
	}
	public void shout() {
		System.out.println("Hello!!!"); 
	} 
}

 

 

c:choose 和 c:when

这些标签允许模板根据值有条件地转储文本

 

 

<c:iterate select="/app/person" var="p" >
	<c:choose select="$p/@gender" > 
		<c:when test="'Male'" > Brother </c:when>
		<c:when test="'Female'" > Sister </c:when> 
	</c:choose>
</c:iterate>

 将输出:

 

 

Brother 
Brother 
Brother 
Sister

注意 c:when 标签需要 test 参数,这需要一个 XPath 表达式。既然我们要通过一个常量比较 select 参数,可用单引号 ('') 包含常量。

 

c:set

 

该标签允许模板动态更改输入模型的属性。一个例子是:在一个字符串以多个方式映射输出文本时,像 Chris 可能映射到ChrischrisChrisClassCHRIS_CONSTANT 等。c:set 将其内容设置为指定的属性。下面的例子为每个人存储名为className 的属性并在名字之后简单添加词 Class

 

 

<c:iterate select="/app/person" var="p" >
	<c:set select="$p" name="className" >
	<c:get select="$p/@name" />Class</c:set>
</c:iterate>

 

 这个有点那啥哈,修改模板的内容。

 

setVariable

该标签允许模板声明和使用一个全局变量,使用 XPath 的全部能力来在任何时候操纵该变量。例如,假设要输出在输入模型中提供了多少个 person 节点。可以利用以下代码:

 

 

<c:setVariable select="0" var="i" />
	<c:iterate select="/app/person" var="p" >
		<c:setVariable select="$i+1" var="i" />
	</c:iterate> 
Number of people = <c:get select="$i" />.
 

 

 

输出 Number of people = 4。

可以使用 get 输出变量,如上例所示。

有超过 45 个标签,这使输出文本具有强大的表现力。表现力大多源于存在条件逻辑、动态更改输入模型和控制执行流的标签。

 

 

2.JET相关的扩展点:多半是不怎么用

JET 是可扩展的通过使用 Eclipse 的扩展点机制。以下是 JET 提供的六个扩展点。

org.eclipse.jet.tagLibraries

该扩展点负责定义标记库。JET 已经包含四个标记库(控制、格式、工作空间、Java),如果您要添加自己的标签功能,可从这里入手。

org.eclipse.jet.xpathFunctions

这允许在 JET XPath 执行时启用自定义 XPath 表达式。一个 JET 中这样的例子是:通过扩展该扩展点,在 XPath 表达式中使用 camelcase(参见 JET 源代码中的 CamelCaseFunction)。

org.eclipse.jet.transform

用于声明您的插件在提供 JET 转换。这是更改您使用什么来启动模板(取代 main.jet)的位置。

org.eclipse.jet.modelInspectors

这允许您定义检查器,使得 JET XPath 引擎来将加载的 Java 对象解释为 XPath 节点。检查器是将对象适配为 XPath 信息模型。作为例子,JET 使用一个模型来浏览 Eclipse 工作空间。注意这是临时 API,并可能随时间而发生变化。

org.eclipse.jet.modelLoaders

这允许您定义 JET 转换和从文件系统加载的 JET <c:load> 标签以怎样的方式使用模型。作为示例,JET 提供模型加载器 loader org.eclipse.jet.resource,将加载 Eclipse IResource(文件,文件夹或项目)并允许通过该资源导航 Eclipse 工作空间。

org.eclipse.jet.deployTransforms

这允许您来将一个 JET 转换打包为一个用于简单发行的插件(包)。这可以被 UI 用来查看哪些转换可用。

 

你可能感兴趣的:(JE)