JET(Java Emitter Templates)项目是Eclipse下的一个子项目,用于代码生成的工作。下面演示下如何应用Jet生成自己需要的代码:
以下的例子在eclipse3.4上运行通过。在这个版本中还添加了一个jet文件的编辑器,有代码高亮显示的功能的。
一、创建JET Transformation Project
项目。
键入项目名,如“codeGen”
在随后生成的项目的文件目录结构如下:
二、各文件用途说明
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>
项目文件目录结构:
第四步:项目运行配置,设置如下
第五步:将产生如下的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="<
c:get select="$p/@name" />" table="<
c:get select="$p/@name" />">
<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="<
c:get select="camelCase($per/@name)" />" type="<
c:get select="$per/@type" />">
<column name="<
c:get select="camelCase($per/@name)" />" precision="1" not-null="true" />
</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>
最后文件目录如下:
四:把其他项目转换成JET项目。
第一步:新建一个普通的Java Project,项目名为:“CodeGen2”,然后按如下方式转换成JET项目。
在下一步中选择“CodeGen2”项目,如下图:
最后项目目录下多了一个templates文件夹:
修改项目的properties如下:
把上个项目的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文件。