在正式讲ArbitraryGen通过模板生成Java代码的功能使用之前,我们先了大致解一下它生成代码的流程。
ArbitraryGen通过模板生成代码的大致的处理流程是:ArbitraryGen将数据源转换成特定格式的数据注入到已经加载了模板的模板引擎中生成目标代码。
配置
根据上述的生成代码的基本流程,首先,我们需要配置数据源文件格式
arbitraryGen {
templateDir "${project.rootDir.getAbsolutePath()}/ArbitraryGen/template-libs"
srcDir "${project.projectDir.absolutePath}/ag-datasrc"
destDir "$buildDir/generated/source/ag-gen"
scriptEngine {
enable true
format "e"
}
}
上述配置中配置了ArbitraryGen将扫描${project.projectDir.absolutePath}/ag-datasrc目录下的所有.e后缀的XML格式的文件用于作为代码生成的数据源。
数据源
ArbitraryGen中默认支持的数据源是XML格式的文件,上面的配置中配置的是“.e”后缀的XML格式文件
数据源示例文件内容:
package="cc.suitalk.arbitrarygen.demo.e"
delegateTag="event-delegate"
delegate="RxEventCollection"
tag="event">
上述的数据源文件中,根节点的属性中的package是用于指定该数据源文件中生成的所有Java类的package,delegateTag指定用于处理该数据源文件的模板的“快照”,delegate用于指定了delegateTag将生成的文件名,tag则用于指定将被处理的一级子节点对应模板的“快照”。
注:“快照”与模板的映射关系由模板库目录下的template-mapping.properties指定
template-mapping.properties文件内容如下:
# The relationship mapping for template and tag
#
# Just read hybrids generate code engine to know more.
#
table=VigorDBItem.vigor-template
hybrid-table=VigorDBItem.hybrid-template
event=event.vigor-template
event-delegate=event-delegate.vigor-template
vigor-delegate=VDBInfoDelegate.vigor-template
模板
event.vigor-template模板文件:
package ;
import cc.suitalk.event.rx.RxEvent;
public final class extends RxEvent {
public final static String ID = "AGEvent.";
public final static = ;
public final static = ;
public final static = ;
public final static = ;
/**
* The value can be :
*
* {@link #};
* {@link #};
*/
public = ;
public () {
this.action = ID;
}
public (Callback callback) {
this.action = ID;
this.callback = callback;
}
public Result result = new Result();
public final static class Result {
/**
* The value can be :
*
* {@link #};
* {@link #};
*/
public = ;
}
}
event-delegate.vigor-template模板文件:
package ;
/**
* Generated by ScriptTemplateAGEngine.
*
* @author AlbieLiang
*
* @since
*/
public final class {
public final static String ID = "AGEvent.";
public static void logOutTestEvents() {
for (var i = 0; i < this.event.length; i++) {
var item = this.event[i];%>
// Event :
}%>
}
}
生成的代码
在ArbitraryGen中,delegate指定生成的文件我们称之为源数据文件的委派处理类,上述的示例中生成的委派处理类RxEventCollection.java只是一个示例,没有实质的代码逻辑,其生成的代码如下:
package cc.suitalk.arbitrarygen.demo.e;
/**
* Generated by ScriptTemplateAGEngine.
*
* @author AlbieLiang
*
* @since 2017-03-26 22:32:29
*/
public final class RxEventCollection {
public final static String ID = "AGEvent.RxEventCollection";
public static void logOutTestEvents() {
// Event : DefaultEvent
// Event : TestEvent
// Event : XmlThirdEvent
// Event : XmlFourthEvent
}
}
上述示例中数据源文件生成的“Event”类有4个,分别是:DefaultEvent.java、TestEvent.java、XmlThirdEvent.java和XmlFourthEvent.java,下面指贴上生成出来的XmlFourthEvent.java文件代码,其它的3个文件,可以在demo程序中查看
XmlFourthEvent.java代码如下:
package cc.suitalk.arbitrarygen.demo.e;
import cc.suitalk.event.rx.RxEvent;
public final class XmlFourthEvent extends RxEvent {
public final static String ID = "AGEvent.XmlFourthEvent";
public final static int ERR_CODE_NORMAL = 0;
public final static int ERR_TYPE_NORMAL = 0;
public final static int ERR_TYPE_NET = 1;
/**
* The value can be :
*
* {@link #ERR_CODE_NORMAL};
*/
public int errCode;
/**
* The value can be :
*
* {@link #ERR_TYPE_NORMAL};
* {@link #ERR_TYPE_NET};
*/
public int errType = 0;
public XmlFourthEvent() {
this.action = ID;
}
public XmlFourthEvent(Callback callback) {
this.action = ID;
this.callback = callback;
}
public Result result = new Result();
public final static class Result {
public String result;
}
}
注:如果数据源文件中的delegateTag或delegate为空的时候,将不生成委派类,上述介绍为模板功能的使用演示,使用者可以根据具体情况做相应的调整。