JET(Java Emitter Templates)项目是Eclipse下的一个子项目,用于代码生成的工作。下面演示下如何应用Jet生成自己需要的代码:
以下的例子在eclipse3.4上运行通过。在这个版本中还添加了一个jet文件的编辑器,有代码高亮显示的功能的。
一、创建JET Transformation Project 项目。
clip_p_w_picpath002
键入项目名,如“codeGen”
clip_p_w_picpath004
在随后生成的项目的文件目录结构如下:
clip_p_w_picpath006
二、各文件用途说明
1.Jet 项目的主要思路是:
参数文件(sample.xml)+模板文件(xxx.jet)文件=生成文件(.java,.xml等文件)
2. 在用JET 项目生成代码的过程中主要涉及下面3 个文件:
sample.xml文件,这个xml文件主要提供输入数据
main.jet这个是入口文件,相当于Java,C++等编程语言中的main函数,调用其他的jet文件
xxx.jet文件:这个文件是具体的模板文件,可以针对不同的代码生成功能制作不同的jet文件。
第一步:在templates 文件夹下创建新的模板文件:car.jet 内容如下:
class < c:get select="$p/@name" /> {
< c:iterate select="$p/property" var="per" >
private < c:get select="$per/@type" /> < c:get select="$per/@name" />;
</ c:iterate>
public < c:get select="$p/@name" />() {
< c:iterate select="$p/property" var="per" >
this.< c:get select="$p/@name" /> = < c:choose select="$p/@type" >
< c:when test="'String'">"< c:get select="$p/@initial" />"</ c:when>
< c:otherwise>< c:get select="$per/@initial" /></ c:otherwise>
</ c:choose>
;
</ c:iterate>
}
< c:iterate select="$p/property" var="per" >
public void set< c:get select="camelCase($per/@name)" />(< c:get select="$per/@type" />
< c:get select="$per/@name" />) {
System.out.println("In set< c:get select="camelCase($per/@name)" />()");
this.< c:get select="$per/@name" /> = < c:get select="$per/@name" />;
}
public < c:get select="$per/@type" /> get< c:get select="camelCase($per/@name)" />() {
System.out.println("In get< c:get select="camelCase($per/@name)" />()");
return < c:get select="$per/@name" />;
}
</ c:iterate>
}
第二步:在main.jet 模板文件中追加如下代码:
< c:iterate select="/app/class" var="p" >
< ws:file template="templates/car.jet" path="{$org.eclipse.jet.resource.project.name}/{$p/@name}.java" />
</ c:iterate>
第三步:修改 sample.xml 文件为如下内容:
<app>
<class name="Car">
<property name="model" type="String" initial="Honda Accord" />
<property name="horsepower" type=" int" initial="140" />
<property name="spareTires" type="boolean" initial="true" />
</class>
<class name=" Dalai">
<property name="eye" type="String" initial="1" />
<property name="leg" type=" int" initial="4" />
<property name="age" type=" int" initial="70" />
</class>
</app>
项目文件目录结构:
clip_p_w_picpath008
第四步:项目运行配置,设置如下
clip_p_w_picpath010
第五步:将产生如下的car.java 文件:
class Car {
private String model;
private int horsepower;
private boolean spareTires;
public Car() {
this.Car = Honda Accord;
this.Car = 140;
this.Car = true;
}
public void setModel(String model) {
System. out.println("In setModel()");
this.model = model;
}
public String getModel() {
System. out.println("In getModel()");
return model;
}
public void setHorsepower( int horsepower) {
System. out.println("In setHorsepower()");
this.horsepower = horsepower;
}
public int getHorsepower() {
System. out.println("In getHorsepower()");
return horsepower;
}
public void setSparetires( boolean spareTires) {
System. out.println("In setSparetires()");
this.spareTires = spareTires;
}
public boolean getSparetires() {
System. out.println("In getSparetires()");
return spareTires;
}
}
三、再做一个产生 hibernate hbm.xml 配置文件的例子。
第一步:同上一个例子,在 templates 文件夹下创建一个 hbm.xml.jet (这个文件名是任意的,只要扩展名是 jet 就可以)的模板文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="&lt; c:get select="$p/@name" />" table="< c:get select="$p/@name" />"&gt;
<id name="id" type="int">
<column name="ID" precision="6" scale="0" />
<generator class="sequence">
<param name="sequence">SEQ_TAB_CASH_EXPENSE_ACT_ID</param>
</generator>
</id>
< c:iterate select="$p/property" var="per" >
<property name="&lt; c:get select="camelCase($per/@name)" />" type="< c:get select="$per/@type" />"&gt;
<column name="&lt; c:get select="camelCase($per/@name)" />" precision="1" not-null="true" /&gt;
</property>
</ c:iterate>
</class>
</hibernate-mapping>
第二步:在 main.jet 中追加如下代码
< c:iterate select="/app/class" var="p" >
< ws:file template="templates/hbm.xml.jet" path="{$org.eclipse.jet.resource.project.name}/{$p/@name}.hbm.xml" />
</ c:iterate>
第三步:运行会产生如下文件“ Car.hbm.xml
<? xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-// Hibernate/ Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Car" table="Car">
<id name="id" type=" int">
<column name="ID" precision="6" scale="0" />
<generator class="sequence">
<param name="sequence">SEQ_TAB_CASH_EXPENSE_ACT_ID </param>
</generator>
</id>
<property name="Model" type="String">
<column name="Model" precision="1" not-null="true" />
</property>
<property name="Horsepower" type=" int">
<column name="Horsepower" precision="1" not-null="true" />
</property>
<property name=" Sparetires" type="boolean">
<column name=" Sparetires" precision="1" not-null="true" />
</property>
</class>
</hibernate-mapping>
最后文件目录如下:
clip_p_w_picpath012
四:把其他项目转换成JET项目。
第一步:新建一个普通的Java Project,项目名为:“CodeGen2”,然后按如下方式转换成JET项目。
clip_p_w_picpath014
在下一步中选择“CodeGen2”项目,如下图:
clip_p_w_picpath016
最后项目目录下多了一个templates文件夹:
clip_p_w_picpath018
修改项目的properties如下:
clip_p_w_picpath020
把上个项目的car.jet文件拷贝到templates文件夹下。
并在该文件的最顶部添加如下代码:
<%@ jet package="cn.edu.pku.pafirc" class="CarTemplate" %>
就会生成如下的文件:CarTemplate.java文件
package cn.edu.pku.pafirc;
public class CarTemplate {
protected static String nl;
public static synchronized CarTemplate create(String lineSeparator) {
nl = lineSeparator;
CarTemplate result = new CarTemplate();
nl = null;
return result;
}
public final String NL = nl == null ? (System. getProperties()
.getProperty("line.separator")) : nl;
protected final String TEXT_1 = "class <c:get select=\"$p/@name\" /> {"
+ NL
+ "<c:iterate select=\"$p/property\" var=\"per\" >"
+ NL
+ "\tprivate <c:get select=\"$per/@type\" /> <c:get select=\"$per/@name\" />;"
+ NL
+ "</c:iterate>"
+ NL
+ ""
+ NL
+ ""
+ NL
+ "\tpublic <c:get select=\"$p/@name\" />() {"
+ NL
+ "\t<c:iterate select=\"$p/property\" var=\"per\" >"
+ NL
+ "\t\tthis.<c:get select=\"$p/@name\" /> = <c:choose select=\"$p/@type\" >"
+ NL
+ "\t\t<c:when test=\"'String'\">\"<c:get select=\"$p/@initial\" />\"</c:when>"
+ NL
+ "\t\t<c:otherwise><c:get select=\"$per/@initial\" /></c:otherwise>"
+ NL
+ "\t\t</c:choose>"
+ NL
+ ";"
+ NL
+ "\t</c:iterate>"
+ NL
+ "\t}"
+ NL
+ ""
+ NL
+ "<c:iterate select=\"$p/property\" var=\"per\" >"
+ NL
+ "\tpublic void set<c:get select=\"camelCase($per/@name)\" />(<c:get select=\"$per/@type\" />"
+ NL
+ "\t<c:get select=\"$per/@name\" />) {"
+ NL
+ "\t\tSystem.out.println(\"In set<c:get select=\"camelCase($per/@name)\" />()\");"
+ NL
+ "\t\tthis.<c:get select=\"$per/@name\" /> = <c:get select=\"$per/@name\" />;"
+ NL
+ "\t}"
+ NL
+ "\t"
+ NL
+ "\tpublic <c:get select=\"$per/@type\" /> get<c:get select=\"camelCase($per/@name)\" />() {"
+ NL
+ "\t\tSystem.out.println(\"In get<c:get select=\"camelCase($per/@name)\" />()\");"
+ NL + "\t\treturn <c:get select=\"$per/@name\" />;" + NL + "\t}"
+ NL + "\t" + NL + "</c:iterate>" + NL + "" + NL + "" + NL + ""
+ NL + "}";
public String generate(Object argument) {
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(TEXT_1);
return stringBuffer.toString();
}
}
获取sampl.xml文件的内容,作为参数传入generate(Object argument)就是产生需要的最终Java文件。